Merge "Always use SizeSpecDefaultImpl on TV" into udc-dev
diff --git a/apct-tests/perftests/multiuser/Android.bp b/apct-tests/perftests/multiuser/Android.bp
index c967e51..45c6b8c 100644
--- a/apct-tests/perftests/multiuser/Android.bp
+++ b/apct-tests/perftests/multiuser/Android.bp
@@ -31,6 +31,9 @@
     ],
     platform_apis: true,
     test_suites: ["device-tests"],
-    data: ["trace_configs/*"],
+    data: [
+        ":MultiUserPerfDummyApp",
+        "trace_configs/*",
+    ],
     certificate: "platform",
 }
diff --git a/apct-tests/perftests/packagemanager/Android.bp b/apct-tests/perftests/packagemanager/Android.bp
index 81cec91..b6ea54d 100644
--- a/apct-tests/perftests/packagemanager/Android.bp
+++ b/apct-tests/perftests/packagemanager/Android.bp
@@ -33,7 +33,59 @@
 
     test_suites: ["device-tests"],
 
-    data: [":perfetto_artifacts"],
+    data: [
+        ":QueriesAll4",
+        ":QueriesAll31",
+        ":QueriesAll43",
+        ":QueriesAll15",
+        ":QueriesAll27",
+        ":QueriesAll39",
+        ":QueriesAll11",
+        ":QueriesAll23",
+        ":QueriesAll35",
+        ":QueriesAll47",
+        ":QueriesAll9",
+        ":QueriesAll19",
+        ":QueriesAll1",
+        ":QueriesAll5",
+        ":QueriesAll40",
+        ":QueriesAll20",
+        ":QueriesAll32",
+        ":QueriesAll48",
+        ":QueriesAll16",
+        ":QueriesAll28",
+        ":QueriesAll44",
+        ":QueriesAll12",
+        ":QueriesAll24",
+        ":QueriesAll36",
+        ":QueriesAll6",
+        ":QueriesAll2",
+        ":QueriesAll41",
+        ":QueriesAll21",
+        ":QueriesAll37",
+        ":QueriesAll49",
+        ":QueriesAll17",
+        ":QueriesAll29",
+        ":QueriesAll33",
+        ":QueriesAll45",
+        ":QueriesAll13",
+        ":QueriesAll25",
+        ":QueriesAll7",
+        ":QueriesAll3",
+        ":QueriesAll30",
+        ":QueriesAll42",
+        ":QueriesAll10",
+        ":QueriesAll26",
+        ":QueriesAll38",
+        ":QueriesAll18",
+        ":QueriesAll22",
+        ":QueriesAll34",
+        ":QueriesAll46",
+        ":QueriesAll14",
+        ":QueriesAll8",
+        ":QueriesAll0",
+        ":perfetto_artifacts",
+    ],
 
     certificate: "platform",
 
diff --git a/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java b/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java
index 0b35101..cbd602f 100644
--- a/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java
+++ b/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java
@@ -45,11 +45,13 @@
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.adservices.data.adselection.CustomAudienceSignals;
-import com.android.adservices.service.adselection.AdDataArgument;
-import com.android.adservices.service.adselection.AdSelectionConfigArgument;
-import com.android.adservices.service.adselection.AdWithBidArgument;
-import com.android.adservices.service.adselection.CustomAudienceBiddingSignalsArgument;
-import com.android.adservices.service.adselection.CustomAudienceScoringSignalsArgument;
+import com.android.adservices.service.adselection.AdCounterKeyCopier;
+import com.android.adservices.service.adselection.AdCounterKeyCopierNoOpImpl;
+import com.android.adservices.service.adselection.AdDataArgumentUtil;
+import com.android.adservices.service.adselection.AdSelectionConfigArgumentUtil;
+import com.android.adservices.service.adselection.AdWithBidArgumentUtil;
+import com.android.adservices.service.adselection.CustomAudienceBiddingSignalsArgumentUtil;
+import com.android.adservices.service.adselection.CustomAudienceScoringSignalsArgumentUtil;
 import com.android.adservices.service.js.IsolateSettings;
 import com.android.adservices.service.js.JSScriptArgument;
 import com.android.adservices.service.js.JSScriptArrayArgument;
@@ -106,6 +108,14 @@
     private static final Instant ACTIVATION_TIME = CLOCK.instant();
     private static final Instant EXPIRATION_TIME = CLOCK.instant().plus(Duration.ofDays(1));
     private static final AdSelectionSignals CONTEXTUAL_SIGNALS = AdSelectionSignals.EMPTY;
+    private static final AdCounterKeyCopier AD_COUNTER_KEY_COPIER_NO_OP =
+            new AdCounterKeyCopierNoOpImpl();
+
+    private final AdDataArgumentUtil mAdDataArgumentUtil =
+            new AdDataArgumentUtil(AD_COUNTER_KEY_COPIER_NO_OP);
+    private final AdWithBidArgumentUtil mAdWithBidArgumentUtil =
+            new AdWithBidArgumentUtil(mAdDataArgumentUtil);
+
     @Rule
     public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
 
@@ -437,7 +447,7 @@
         List<AdData> adDataList = getSampleAdDataList(numOfAds, "https://ads.example/");
         ImmutableList.Builder<JSScriptArgument> adDataListArgument = new ImmutableList.Builder<>();
         for (AdData adData : adDataList) {
-            adDataListArgument.add(AdDataArgument.asScriptArgument("ignored", adData));
+            adDataListArgument.add(mAdDataArgumentUtil.asScriptArgument("ignored", adData));
         }
         AdSelectionSignals perBuyerSignals = generatePerBuyerSignals(numOfAds);
         AdSelectionSignals auctionSignals = AdSelectionSignals.fromString("{\"auctionSignal1"
@@ -455,7 +465,7 @@
                 .add(jsonArg("perBuyerSignals", perBuyerSignals))
                 .add(jsonArg("trustedBiddingSignals", trustedBiddingSignals))
                 .add(jsonArg("contextualSignals", CONTEXTUAL_SIGNALS))
-                .add(CustomAudienceBiddingSignalsArgument.asScriptArgument(
+                .add(CustomAudienceBiddingSignalsArgumentUtil.asScriptArgument(
                         "customAudienceBiddingSignal", customAudienceSignals))
                 .build();
         InputStream testJsInputStream = sContext.getAssets().open(
@@ -485,7 +495,8 @@
         ImmutableList.Builder<JSScriptArgument> adWithBidArrayArgument =
                 new ImmutableList.Builder<>();
         for (AdWithBid adWithBid : adWithBidList) {
-            adWithBidArrayArgument.add(AdWithBidArgument.asScriptArgument("adWithBid", adWithBid));
+            adWithBidArrayArgument.add(
+                    mAdWithBidArgumentUtil.asScriptArgument("adWithBid", adWithBid));
         }
         AdTechIdentifier seller = AdTechIdentifier.fromString("www.example-ssp.com");
         AdSelectionSignals sellerSignals = AdSelectionSignals.fromString("{\"signals\":[]}");
@@ -507,12 +518,12 @@
 
         ImmutableList<JSScriptArgument> args = ImmutableList.<JSScriptArgument>builder()
                 .add(arrayArg("adsWithBids", adWithBidArrayArgument.build()))
-                .add(AdSelectionConfigArgument.asScriptArgument(adSelectionConfig,
+                .add(AdSelectionConfigArgumentUtil.asScriptArgument(adSelectionConfig,
                         "adSelectionConfig"))
                 .add(jsonArg("sellerSignals", sellerSignals))
                 .add(jsonArg("trustedScoringSignals", trustedScoringSignalsJson))
                 .add(jsonArg("contextualSignals", CONTEXTUAL_SIGNALS))
-                .add(CustomAudienceScoringSignalsArgument.asScriptArgument(
+                .add(CustomAudienceScoringSignalsArgumentUtil.asScriptArgument(
                         "customAudienceScoringSignal", customAudienceSignals))
                 .build();
         InputStream testJsInputStream = sContext.getAssets().open(
diff --git a/apct-tests/perftests/settingsprovider/AndroidManifest.xml b/apct-tests/perftests/settingsprovider/AndroidManifest.xml
index 9509c83..82f882a 100644
--- a/apct-tests/perftests/settingsprovider/AndroidManifest.xml
+++ b/apct-tests/perftests/settingsprovider/AndroidManifest.xml
@@ -19,7 +19,8 @@
 
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
     <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
-    <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG" />
+    <uses-permission android:name="android.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG" />
+    <uses-permission android:name="android.permission.READ_WRITE_SYNC_DISABLED_MODE_CONFIG" />
 
     <application>
         <uses-library android:name="android.test.runner" />
diff --git a/apex/jobscheduler/framework/java/android/app/JobSchedulerImpl.java b/apex/jobscheduler/framework/java/android/app/JobSchedulerImpl.java
index 776d913..3cfddc6 100644
--- a/apex/jobscheduler/framework/java/android/app/JobSchedulerImpl.java
+++ b/apex/jobscheduler/framework/java/android/app/JobSchedulerImpl.java
@@ -65,8 +65,12 @@
     @NonNull
     @Override
     public JobScheduler forNamespace(@NonNull String namespace) {
+        namespace = sanitizeNamespace(namespace);
         if (namespace == null) {
-            throw new IllegalArgumentException("namespace cannot be null");
+            throw new NullPointerException("namespace cannot be null");
+        }
+        if (namespace.isEmpty()) {
+            throw new IllegalArgumentException("namespace cannot be empty");
         }
         return new JobSchedulerImpl(this, namespace);
     }
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java b/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java
index b8847ad..d59d430 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java
@@ -270,6 +270,9 @@
      * otherwise. Attempting to update a job scheduled in another namespace will not be possible
      * but will instead create or update the job inside the current namespace. A JobScheduler
      * instance dedicated to a namespace must be used to schedule or update jobs in that namespace.
+     *
+     * <p class="note">Since leading and trailing whitespace can lead to hard-to-debug issues,
+     * they will be {@link String#trim() trimmed}. An empty String (after trimming) is not allowed.
      * @see #getNamespace()
      */
     @NonNull
@@ -287,6 +290,15 @@
         throw new RuntimeException("Not implemented. Must override in a subclass.");
     }
 
+    /** @hide */
+    @Nullable
+    public static String sanitizeNamespace(@Nullable String namespace) {
+        if (namespace == null) {
+            return null;
+        }
+        return namespace.trim().intern();
+    }
+
     /**
      * Schedule a job to be executed.  Will replace any currently scheduled job with the same
      * ID with the new information in the {@link JobInfo}.  If a job with the given ID is currently
diff --git a/apex/jobscheduler/framework/java/com/android/server/job/JobSchedulerInternal.java b/apex/jobscheduler/framework/java/com/android/server/job/JobSchedulerInternal.java
index c956bf5..64b2423 100644
--- a/apex/jobscheduler/framework/java/com/android/server/job/JobSchedulerInternal.java
+++ b/apex/jobscheduler/framework/java/com/android/server/job/JobSchedulerInternal.java
@@ -16,6 +16,7 @@
 
 package com.android.server.job;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.job.JobInfo;
 import android.app.job.JobParameters;
@@ -59,6 +60,19 @@
     void reportAppUsage(String packageName, int userId);
 
     /**
+     * @return {@code true} if the given notification is associated with any user-initiated jobs.
+     */
+    boolean isNotificationAssociatedWithAnyUserInitiatedJobs(int notificationId,
+            int userId, @NonNull String packageName);
+
+    /**
+     * @return {@code true} if the given notification channel is associated with any user-initiated
+     * jobs.
+     */
+    boolean isNotificationChannelAssociatedWithAnyUserInitiatedJobs(String notificationChannel,
+            int userId, String packageName);
+
+    /**
      * Report a snapshot of sync-related jobs back to the sync manager
      */
     JobStorePersistStats getPersistStats();
diff --git a/apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java b/apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java
index 3fc87d3..ce381b6 100644
--- a/apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java
+++ b/apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java
@@ -22,7 +22,7 @@
 import android.app.AppOpsManager;
 import android.app.AppOpsManager.PackageOps;
 import android.app.IActivityManager;
-import android.app.IUidObserver;
+import android.app.UidObserver;
 import android.app.usage.UsageStatsManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -716,11 +716,7 @@
         return true;
     }
 
-    private final class UidObserver extends IUidObserver.Stub {
-        @Override
-        public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
-        }
-
+    private final class UidObserver extends android.app.UidObserver {
         @Override
         public void onUidActive(int uid) {
             mHandler.onUidActive(uid);
@@ -740,10 +736,6 @@
         public void onUidCachedChanged(int uid, boolean cached) {
             mHandler.onUidCachedChanged(uid, cached);
         }
-
-        @Override
-        public void onUidProcAdjChanged(int uid) {
-        }
     }
 
     private final class AppOpsWatcher extends IAppOpsCallback.Stub {
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java b/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java
index 4477e94..8bd3d127 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java
@@ -1925,6 +1925,20 @@
         return null;
     }
 
+    @GuardedBy("mLock")
+    boolean isNotificationAssociatedWithAnyUserInitiatedJobs(int notificationId, int userId,
+            String packageName) {
+        return mNotificationCoordinator.isNotificationAssociatedWithAnyUserInitiatedJobs(
+                notificationId, userId, packageName);
+    }
+
+    @GuardedBy("mLock")
+    boolean isNotificationChannelAssociatedWithAnyUserInitiatedJobs(String notificationChannel,
+            int userId, String packageName) {
+        return mNotificationCoordinator.isNotificationChannelAssociatedWithAnyUserInitiatedJobs(
+                notificationChannel, userId, packageName);
+    }
+
     @NonNull
     private JobServiceContext createNewJobServiceContext() {
         return mInjector.createJobServiceContext(mService, this, mNotificationCoordinator,
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobNotificationCoordinator.java b/apex/jobscheduler/service/java/com/android/server/job/JobNotificationCoordinator.java
index 5a12142..f6e00ec 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobNotificationCoordinator.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobNotificationCoordinator.java
@@ -31,6 +31,7 @@
 import android.util.SparseSetArray;
 
 import com.android.server.LocalServices;
+import com.android.server.job.controllers.JobStatus;
 import com.android.server.notification.NotificationManagerInternal;
 
 class JobNotificationCoordinator {
@@ -52,16 +53,18 @@
         @NonNull
         public final UserPackage userPackage;
         public final int notificationId;
+        public final String notificationChannel;
         public final int appPid;
         public final int appUid;
         @JobService.JobEndNotificationPolicy
         public final int jobEndNotificationPolicy;
 
         NotificationDetails(@NonNull UserPackage userPackage, int appPid, int appUid,
-                int notificationId,
+                int notificationId, String notificationChannel,
                 @JobService.JobEndNotificationPolicy int jobEndNotificationPolicy) {
             this.userPackage = userPackage;
             this.notificationId = notificationId;
+            this.notificationChannel = notificationChannel;
             this.appPid = appPid;
             this.appUid = appUid;
             this.jobEndNotificationPolicy = jobEndNotificationPolicy;
@@ -84,14 +87,14 @@
             removeNotificationAssociation(hostingContext, JobParameters.STOP_REASON_UNDEFINED);
         }
         final int userId = UserHandle.getUserId(callingUid);
-        // TODO(260848384): ensure apps can't cancel the notification for user-initiated job
-        //       eg., by calling NotificationManager.cancel/All or deleting the notification channel
-        mNotificationManagerInternal.enqueueNotification(
-                packageName, packageName, callingUid, callingPid, /* tag */ null,
-                notificationId, notification, userId);
+        final JobStatus jobStatus = hostingContext.getRunningJobLocked();
+        if (jobStatus != null && jobStatus.startedAsUserInitiatedJob) {
+            notification.flags |= Notification.FLAG_USER_INITIATED_JOB;
+        }
         final UserPackage userPackage = UserPackage.of(userId, packageName);
         final NotificationDetails details = new NotificationDetails(
-                userPackage, callingPid, callingUid, notificationId, jobEndNotificationPolicy);
+                userPackage, callingPid, callingUid, notificationId, notification.getChannelId(),
+                jobEndNotificationPolicy);
         SparseSetArray<JobServiceContext> appNotifications = mCurrentAssociations.get(userPackage);
         if (appNotifications == null) {
             appNotifications = new SparseSetArray<>();
@@ -99,6 +102,11 @@
         }
         appNotifications.add(notificationId, hostingContext);
         mNotificationDetails.put(hostingContext, details);
+        // Call into NotificationManager after internal data structures have been updated since
+        // NotificationManager calls into this class to check for any existing associations.
+        mNotificationManagerInternal.enqueueNotification(
+                packageName, packageName, callingUid, callingPid, /* tag */ null,
+                notificationId, notification, userId);
     }
 
     void removeNotificationAssociation(@NonNull JobServiceContext hostingContext,
@@ -113,6 +121,9 @@
             Slog.wtf(TAG, "Association data structures not in sync");
             return;
         }
+        final String packageName = details.userPackage.packageName;
+        final int userId = UserHandle.getUserId(details.appUid);
+        boolean stripUijFlag = true;
         ArraySet<JobServiceContext> associatedContexts = associations.get(details.notificationId);
         if (associatedContexts == null || associatedContexts.isEmpty()) {
             // No more jobs using this notification. Apply the final job stop policy.
@@ -120,12 +131,63 @@
             // so the user doesn't get confused about the app state.
             if (details.jobEndNotificationPolicy == JOB_END_NOTIFICATION_POLICY_REMOVE
                     || stopReason == JobParameters.STOP_REASON_USER) {
-                final String packageName = details.userPackage.packageName;
                 mNotificationManagerInternal.cancelNotification(
                         packageName, packageName, details.appUid, details.appPid, /* tag */ null,
-                        details.notificationId, UserHandle.getUserId(details.appUid));
+                        details.notificationId, userId);
+                stripUijFlag = false;
+            }
+        } else {
+            // Strip the UIJ flag only if there are no other UIJs associated with the notification
+            stripUijFlag = !isNotificationAssociatedWithAnyUserInitiatedJobs(
+                    details.notificationId, userId, packageName);
+        }
+        if (stripUijFlag) {
+            // Strip the user-initiated job flag from the notification.
+            mNotificationManagerInternal.removeUserInitiatedJobFlagFromNotification(
+                    packageName, details.notificationId, userId);
+        }
+    }
+
+    boolean isNotificationAssociatedWithAnyUserInitiatedJobs(int notificationId,
+            int userId, String packageName) {
+        final UserPackage pkgDetails = UserPackage.of(userId, packageName);
+        final SparseSetArray<JobServiceContext> associations = mCurrentAssociations.get(pkgDetails);
+        if (associations == null) {
+            return false;
+        }
+        final ArraySet<JobServiceContext> associatedContexts = associations.get(notificationId);
+        if (associatedContexts == null) {
+            return false;
+        }
+
+        // Check if any UIJs associated with this package are using the same notification
+        for (int i = associatedContexts.size() - 1; i >= 0; i--) {
+            final JobStatus jobStatus = associatedContexts.valueAt(i).getRunningJobLocked();
+            if (jobStatus != null && jobStatus.startedAsUserInitiatedJob) {
+                return true;
             }
         }
+        return false;
+    }
+
+    boolean isNotificationChannelAssociatedWithAnyUserInitiatedJobs(String notificationChannel,
+            int userId, String packageName) {
+        for (int i = mNotificationDetails.size() - 1; i >= 0; i--) {
+            final JobServiceContext jsc = mNotificationDetails.keyAt(i);
+            final NotificationDetails details = mNotificationDetails.get(jsc);
+            // Check if the details for the given notification match and if the associated job
+            // was started as a user initiated job
+            if (details != null
+                    && UserHandle.getUserId(details.appUid) == userId
+                    && details.userPackage.packageName.equals(packageName)
+                    && details.notificationChannel.equals(notificationChannel)) {
+                final JobStatus jobStatus = jsc.getRunningJobLocked();
+                if (jobStatus != null && jobStatus.startedAsUserInitiatedJob) {
+                    return true;
+                }
+            }
+        }
+        return false;
     }
 
     private void validateNotification(@NonNull String packageName, int callingUid,
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
index d06596f..aef9dd0 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -33,6 +33,7 @@
 import android.app.ActivityManagerInternal;
 import android.app.AppGlobals;
 import android.app.IUidObserver;
+import android.app.UidObserver;
 import android.app.compat.CompatChanges;
 import android.app.job.IJobScheduler;
 import android.app.job.IUserVisibleJobObserver;
@@ -233,7 +234,7 @@
         }
     }
 
-    @VisibleForTesting
+    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
     public static Clock sUptimeMillisClock = new MySimpleClock(ZoneOffset.UTC) {
         @Override
         public long millis() {
@@ -241,7 +242,6 @@
         }
     };
 
-    @VisibleForTesting
     public static Clock sElapsedRealtimeClock = new MySimpleClock(ZoneOffset.UTC) {
         @Override
         public long millis() {
@@ -382,6 +382,16 @@
      * A mapping of which uids are currently in the foreground to their effective bias.
      */
     final SparseIntArray mUidBiasOverride = new SparseIntArray();
+    /**
+     * A cached mapping of uids to their current capabilities.
+     */
+    @GuardedBy("mLock")
+    private final SparseIntArray mUidCapabilities = new SparseIntArray();
+    /**
+     * A cached mapping of uids to their proc states.
+     */
+    @GuardedBy("mLock")
+    private final SparseIntArray mUidProcStates = new SparseIntArray();
 
     /**
      * Which uids are currently performing backups, so we shouldn't allow their jobs to run.
@@ -1158,6 +1168,14 @@
                     mDebuggableApps.remove(pkgName);
                     mConcurrencyManager.onAppRemovedLocked(pkgName, pkgUid);
                 }
+            } else if (Intent.ACTION_UID_REMOVED.equals(action)) {
+                if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
+                    synchronized (mLock) {
+                        mUidBiasOverride.delete(pkgUid);
+                        mUidCapabilities.delete(pkgUid);
+                        mUidProcStates.delete(pkgUid);
+                    }
+                }
             } else if (Intent.ACTION_USER_ADDED.equals(action)) {
                 final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
                 synchronized (mLock) {
@@ -1233,29 +1251,27 @@
         return pkg;
     }
 
-    final private IUidObserver mUidObserver = new IUidObserver.Stub() {
+    final private IUidObserver mUidObserver = new UidObserver() {
         @Override public void onUidStateChanged(int uid, int procState, long procStateSeq,
                 int capability) {
-            mHandler.obtainMessage(MSG_UID_STATE_CHANGED, uid, procState).sendToTarget();
+            final SomeArgs args = SomeArgs.obtain();
+            args.argi1 = uid;
+            args.argi2 = procState;
+            args.argi3 = capability;
+            mHandler.obtainMessage(MSG_UID_STATE_CHANGED, args).sendToTarget();
         }
 
         @Override public void onUidGone(int uid, boolean disabled) {
             mHandler.obtainMessage(MSG_UID_GONE, uid, disabled ? 1 : 0).sendToTarget();
         }
 
-        @Override public void onUidActive(int uid) throws RemoteException {
+        @Override public void onUidActive(int uid) {
             mHandler.obtainMessage(MSG_UID_ACTIVE, uid, 0).sendToTarget();
         }
 
         @Override public void onUidIdle(int uid, boolean disabled) {
             mHandler.obtainMessage(MSG_UID_IDLE, uid, disabled ? 1 : 0).sendToTarget();
         }
-
-        @Override public void onUidCachedChanged(int uid, boolean cached) {
-        }
-
-        @Override public void onUidProcAdjChanged(int uid) {
-        }
     };
 
     public Context getTestableContext() {
@@ -1530,16 +1546,21 @@
                     jobStatus.getNumPreviousAttempts(),
                     jobStatus.getJob().getMaxExecutionDelayMillis(),
                     /* isDeadlineConstraintSatisfied */ false,
-                    /* isCharging */ false,
-                    /* batteryNotLow */ false,
-                    /* storageNotLow */false,
+                    /* isChargingSatisfied */ false,
+                    /* batteryNotLowSatisfied */ false,
+                    /* storageNotLowSatisfied */false,
                     /* timingDelayConstraintSatisfied */ false,
-                    /* isDeviceIdle */ false,
+                    /* isDeviceIdleSatisfied */ false,
                     /* hasConnectivityConstraintSatisfied */ false,
                     /* hasContentTriggerConstraintSatisfied */ false,
-                    0,
+                    /* jobStartLatencyMs */ 0,
                     jobStatus.getJob().isUserInitiated(),
-                    /* isRunningAsUserInitiatedJob */ false);
+                    /* isRunningAsUserInitiatedJob */ false,
+                    jobStatus.getJob().isPeriodic(),
+                    jobStatus.getJob().getMinLatencyMillis(),
+                    jobStatus.getEstimatedNetworkDownloadBytes(),
+                    jobStatus.getEstimatedNetworkUploadBytes(),
+                    jobStatus.getWorkCount());
 
             // If the job is immediately ready to run, then we can just immediately
             // put it in the pending list and try to schedule it.  This is especially
@@ -1960,9 +1981,14 @@
                     cancelled.isConstraintSatisfied(JobInfo.CONSTRAINT_FLAG_DEVICE_IDLE),
                     cancelled.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY),
                     cancelled.isConstraintSatisfied(JobStatus.CONSTRAINT_CONTENT_TRIGGER),
-                    0,
+                    /* jobStartLatencyMs */ 0,
                     cancelled.getJob().isUserInitiated(),
-                    /* isRunningAsUserInitiatedJob */ false);
+                    /* isRunningAsUserInitiatedJob */ false,
+                    cancelled.getJob().isPeriodic(),
+                    cancelled.getJob().getMinLatencyMillis(),
+                    cancelled.getEstimatedNetworkDownloadBytes(),
+                    cancelled.getEstimatedNetworkUploadBytes(),
+                    cancelled.getWorkCount());
         }
         // If this is a replacement, bring in the new version of the job
         if (incomingJob != null) {
@@ -1978,8 +2004,14 @@
         }
     }
 
-    void updateUidState(int uid, int procState) {
+    void updateUidState(int uid, int procState, int capabilities) {
+        if (DEBUG) {
+            Slog.d(TAG, "UID " + uid + " proc state changed to "
+                    + ActivityManager.procStateToString(procState)
+                    + " with capabilities=" + ActivityManager.getCapabilitiesSummary(capabilities));
+        }
         synchronized (mLock) {
+            mUidProcStates.put(uid, procState);
             final int prevBias = mUidBiasOverride.get(uid, JobInfo.BIAS_DEFAULT);
             if (procState == ActivityManager.PROCESS_STATE_TOP) {
                 // Only use this if we are exactly the top app.  All others can live
@@ -1993,6 +2025,12 @@
             } else {
                 mUidBiasOverride.delete(uid);
             }
+            if (capabilities == ActivityManager.PROCESS_CAPABILITY_NONE
+                    || procState == ActivityManager.PROCESS_STATE_NONEXISTENT) {
+                mUidCapabilities.delete(uid);
+            } else {
+                mUidCapabilities.put(uid, capabilities);
+            }
             final int newBias = mUidBiasOverride.get(uid, JobInfo.BIAS_DEFAULT);
             if (prevBias != newBias) {
                 if (DEBUG) {
@@ -2013,6 +2051,23 @@
         }
     }
 
+    /**
+     * Return the current {@link ActivityManager#PROCESS_CAPABILITY_ALL capabilities}
+     * of the given UID.
+     */
+    public int getUidCapabilities(int uid) {
+        synchronized (mLock) {
+            return mUidCapabilities.get(uid, ActivityManager.PROCESS_CAPABILITY_NONE);
+        }
+    }
+
+    /** Return the current proc state of the given UID. */
+    public int getUidProcState(int uid) {
+        synchronized (mLock) {
+            return mUidProcStates.get(uid, ActivityManager.PROCESS_STATE_UNKNOWN);
+        }
+    }
+
     @Override
     public void onDeviceIdleStateChanged(boolean deviceIdle) {
         synchronized (mLock) {
@@ -2276,6 +2331,9 @@
             filter.addDataScheme("package");
             getContext().registerReceiverAsUser(
                     mBroadcastReceiver, UserHandle.ALL, filter, null, null);
+            final IntentFilter uidFilter = new IntentFilter(Intent.ACTION_UID_REMOVED);
+            getContext().registerReceiverAsUser(
+                    mBroadcastReceiver, UserHandle.ALL, uidFilter, null, null);
             final IntentFilter userFilter = new IntentFilter(Intent.ACTION_USER_REMOVED);
             userFilter.addAction(Intent.ACTION_USER_ADDED);
             getContext().registerReceiverAsUser(
@@ -2807,15 +2865,19 @@
                         break;
 
                     case MSG_UID_STATE_CHANGED: {
-                        final int uid = message.arg1;
-                        final int procState = message.arg2;
-                        updateUidState(uid, procState);
+                        final SomeArgs args = (SomeArgs) message.obj;
+                        final int uid = args.argi1;
+                        final int procState = args.argi2;
+                        final int capabilities = args.argi3;
+                        updateUidState(uid, procState, capabilities);
+                        args.recycle();
                         break;
                     }
                     case MSG_UID_GONE: {
                         final int uid = message.arg1;
                         final boolean disabled = message.arg2 != 0;
-                        updateUidState(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+                        updateUidState(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY,
+                                ActivityManager.PROCESS_CAPABILITY_NONE);
                         if (disabled) {
                             cancelJobsForUid(uid,
                                     /* includeSourceApp */ true,
@@ -3650,6 +3712,30 @@
         }
 
         @Override
+        public boolean isNotificationAssociatedWithAnyUserInitiatedJobs(int notificationId,
+                int userId, String packageName) {
+            if (packageName == null) {
+                return false;
+            }
+            synchronized (mLock) {
+                return mConcurrencyManager.isNotificationAssociatedWithAnyUserInitiatedJobs(
+                        notificationId, userId, packageName);
+            }
+        }
+
+        @Override
+        public boolean isNotificationChannelAssociatedWithAnyUserInitiatedJobs(
+                String notificationChannel, int userId, String packageName) {
+            if (packageName == null || notificationChannel == null) {
+                return false;
+            }
+            synchronized (mLock) {
+                return mConcurrencyManager.isNotificationChannelAssociatedWithAnyUserInitiatedJobs(
+                        notificationChannel, userId, packageName);
+            }
+        }
+
+        @Override
         public JobStorePersistStats getPersistStats() {
             synchronized (mLock) {
                 return new JobStorePersistStats(mJobs.getPersistStats());
@@ -3966,6 +4052,18 @@
             return JobScheduler.RESULT_SUCCESS;
         }
 
+        /** Returns a sanitized namespace if valid, or throws an exception if not. */
+        private String validateNamespace(@Nullable String namespace) {
+            namespace = JobScheduler.sanitizeNamespace(namespace);
+            if (namespace != null) {
+                if (namespace.isEmpty()) {
+                    throw new IllegalArgumentException("namespace cannot be empty");
+                }
+                namespace = namespace.intern();
+            }
+            return namespace;
+        }
+
         private int validateRunUserInitiatedJobsPermission(int uid, String packageName) {
             final int state = getRunUserInitiatedJobsPermissionState(uid, packageName);
             if (state == PermissionChecker.PERMISSION_HARD_DENIED) {
@@ -4013,9 +4111,7 @@
                 return result;
             }
 
-            if (namespace != null) {
-                namespace = namespace.intern();
-            }
+            namespace = validateNamespace(namespace);
 
             final long ident = Binder.clearCallingIdentity();
             try {
@@ -4046,9 +4142,7 @@
                 return result;
             }
 
-            if (namespace != null) {
-                namespace = namespace.intern();
-            }
+            namespace = validateNamespace(namespace);
 
             final long ident = Binder.clearCallingIdentity();
             try {
@@ -4087,9 +4181,7 @@
                 return result;
             }
 
-            if (namespace != null) {
-                namespace = namespace.intern();
-            }
+            namespace = validateNamespace(namespace);
 
             final long ident = Binder.clearCallingIdentity();
             try {
@@ -4126,7 +4218,8 @@
             final long ident = Binder.clearCallingIdentity();
             try {
                 return new ParceledListSlice<>(
-                        JobSchedulerService.this.getPendingJobsInNamespace(uid, namespace));
+                        JobSchedulerService.this.getPendingJobsInNamespace(uid,
+                                validateNamespace(namespace)));
             } finally {
                 Binder.restoreCallingIdentity(ident);
             }
@@ -4138,7 +4231,8 @@
 
             final long ident = Binder.clearCallingIdentity();
             try {
-                return JobSchedulerService.this.getPendingJob(uid, namespace, jobId);
+                return JobSchedulerService.this.getPendingJob(
+                        uid, validateNamespace(namespace), jobId);
             } finally {
                 Binder.restoreCallingIdentity(ident);
             }
@@ -4150,7 +4244,8 @@
 
             final long ident = Binder.clearCallingIdentity();
             try {
-                return JobSchedulerService.this.getPendingJobReason(uid, namespace, jobId);
+                return JobSchedulerService.this.getPendingJobReason(
+                        uid, validateNamespace(namespace), jobId);
             } finally {
                 Binder.restoreCallingIdentity(ident);
             }
@@ -4180,7 +4275,7 @@
                 JobSchedulerService.this.cancelJobsForUid(uid,
                         // Documentation says only jobs scheduled BY the app will be cancelled
                         /* includeSourceApp */ false,
-                        /* namespaceOnly */ true, namespace,
+                        /* namespaceOnly */ true, validateNamespace(namespace),
                         JobParameters.STOP_REASON_CANCELLED_BY_APP,
                         JobParameters.INTERNAL_STOP_REASON_CANCELED,
                         "cancelAllInNamespace() called by app, callingUid=" + uid);
@@ -4195,7 +4290,7 @@
 
             final long ident = Binder.clearCallingIdentity();
             try {
-                JobSchedulerService.this.cancelJob(uid, namespace, jobId, uid,
+                JobSchedulerService.this.cancelJob(uid, validateNamespace(namespace), jobId, uid,
                         JobParameters.STOP_REASON_CANCELLED_BY_APP);
             } finally {
                 Binder.restoreCallingIdentity(ident);
@@ -4891,6 +4986,25 @@
                 pw.decreaseIndent();
             }
 
+            boolean procStatePrinted = false;
+            for (int i = 0; i < mUidProcStates.size(); i++) {
+                int uid = mUidProcStates.keyAt(i);
+                if (filterAppId == -1 || filterAppId == UserHandle.getAppId(uid)) {
+                    if (!procStatePrinted) {
+                        procStatePrinted = true;
+                        pw.println();
+                        pw.println("Uid proc states:");
+                        pw.increaseIndent();
+                    }
+                    pw.print(UserHandle.formatUid(uid));
+                    pw.print(": ");
+                    pw.println(ActivityManager.procStateToString(mUidProcStates.valueAt(i)));
+                }
+            }
+            if (procStatePrinted) {
+                pw.decreaseIndent();
+            }
+
             boolean overridePrinted = false;
             for (int i = 0; i < mUidBiasOverride.size(); i++) {
                 int uid = mUidBiasOverride.keyAt(i);
@@ -4909,6 +5023,25 @@
                 pw.decreaseIndent();
             }
 
+            boolean capabilitiesPrinted = false;
+            for (int i = 0; i < mUidCapabilities.size(); i++) {
+                int uid = mUidCapabilities.keyAt(i);
+                if (filterAppId == -1 || filterAppId == UserHandle.getAppId(uid)) {
+                    if (!capabilitiesPrinted) {
+                        capabilitiesPrinted = true;
+                        pw.println();
+                        pw.println("Uid capabilities:");
+                        pw.increaseIndent();
+                    }
+                    pw.print(UserHandle.formatUid(uid));
+                    pw.print(": ");
+                    pw.println(ActivityManager.getCapabilitiesSummary(mUidCapabilities.valueAt(i)));
+                }
+            }
+            if (capabilitiesPrinted) {
+                pw.decreaseIndent();
+            }
+
             boolean uidMapPrinted = false;
             for (int i = 0; i < mUidToPackageCache.size(); ++i) {
                 final int uid = mUidToPackageCache.keyAt(i);
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
index 1e2ef77..44700c8 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
@@ -393,23 +393,27 @@
                     .setFlags(Intent.FLAG_FROM_BACKGROUND);
             boolean binding = false;
             try {
-                final int bindFlags;
+                final Context.BindServiceFlags bindFlags;
                 if (job.shouldTreatAsUserInitiatedJob()) {
-                    // TODO (191785864, 261999509): add an appropriate flag so user-initiated jobs
-                    //    can bypass data saver
-                    bindFlags = Context.BIND_AUTO_CREATE
-                            | Context.BIND_ALMOST_PERCEPTIBLE
-                            | Context.BIND_BYPASS_POWER_NETWORK_RESTRICTIONS
-                            | Context.BIND_NOT_APP_COMPONENT_USAGE;
+                    bindFlags = Context.BindServiceFlags.of(
+                            Context.BIND_AUTO_CREATE
+                                    | Context.BIND_ALMOST_PERCEPTIBLE
+                                    | Context.BIND_BYPASS_POWER_NETWORK_RESTRICTIONS
+                                    | Context.BIND_BYPASS_USER_NETWORK_RESTRICTIONS
+                                    | Context.BIND_NOT_APP_COMPONENT_USAGE);
                 } else if (job.shouldTreatAsExpeditedJob()) {
-                    bindFlags = Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND
-                            | Context.BIND_ALMOST_PERCEPTIBLE
-                            | Context.BIND_BYPASS_POWER_NETWORK_RESTRICTIONS
-                            | Context.BIND_NOT_APP_COMPONENT_USAGE;
+                    bindFlags = Context.BindServiceFlags.of(
+                            Context.BIND_AUTO_CREATE
+                                    | Context.BIND_NOT_FOREGROUND
+                                    | Context.BIND_ALMOST_PERCEPTIBLE
+                                    | Context.BIND_BYPASS_POWER_NETWORK_RESTRICTIONS
+                                    | Context.BIND_NOT_APP_COMPONENT_USAGE);
                 } else {
-                    bindFlags = Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND
-                            | Context.BIND_NOT_PERCEPTIBLE
-                            | Context.BIND_NOT_APP_COMPONENT_USAGE;
+                    bindFlags = Context.BindServiceFlags.of(
+                            Context.BIND_AUTO_CREATE
+                                    | Context.BIND_NOT_FOREGROUND
+                                    | Context.BIND_NOT_PERCEPTIBLE
+                                    | Context.BIND_NOT_APP_COMPONENT_USAGE);
                 }
                 binding = mContext.bindServiceAsUser(intent, this, bindFlags,
                         UserHandle.of(job.getUserId()));
@@ -467,7 +471,12 @@
                     job.isConstraintSatisfied(JobStatus.CONSTRAINT_CONTENT_TRIGGER),
                     mExecutionStartTimeElapsed - job.enqueueTime,
                     job.getJob().isUserInitiated(),
-                    job.shouldTreatAsUserInitiatedJob());
+                    job.shouldTreatAsUserInitiatedJob(),
+                    job.getJob().isPeriodic(),
+                    job.getJob().getMinLatencyMillis(),
+                    job.getEstimatedNetworkDownloadBytes(),
+                    job.getEstimatedNetworkUploadBytes(),
+                    job.getWorkCount());
             final String sourcePackage = job.getSourcePackageName();
             if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
                 final String componentPackage = job.getServiceComponent().getPackageName();
@@ -1431,9 +1440,14 @@
                 completedJob.isConstraintSatisfied(JobInfo.CONSTRAINT_FLAG_DEVICE_IDLE),
                 completedJob.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY),
                 completedJob.isConstraintSatisfied(JobStatus.CONSTRAINT_CONTENT_TRIGGER),
-                0,
+                mExecutionStartTimeElapsed - completedJob.enqueueTime,
                 completedJob.getJob().isUserInitiated(),
-                completedJob.startedAsUserInitiatedJob);
+                completedJob.startedAsUserInitiatedJob,
+                completedJob.getJob().isPeriodic(),
+                completedJob.getJob().getMinLatencyMillis(),
+                completedJob.getEstimatedNetworkDownloadBytes(),
+                completedJob.getEstimatedNetworkUploadBytes(),
+                completedJob.getWorkCount());
         if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
             Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_SYSTEM_SERVER, "JobScheduler",
                     getId());
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java
index 4c55dac..5246f2b 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java
@@ -188,7 +188,7 @@
             mLastReportedStatsdStablePower = stablePower;
         }
         if (mLastReportedStatsdBatteryNotLow == null
-                || mLastReportedStatsdBatteryNotLow != stablePower) {
+                || mLastReportedStatsdBatteryNotLow != batteryNotLow) {
             logDeviceWideConstraintStateToStatsd(JobStatus.CONSTRAINT_BATTERY_NOT_LOW,
                     batteryNotLow);
             mLastReportedStatsdBatteryNotLow = batteryNotLow;
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
index 3859d89..f6bdb93 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
@@ -18,15 +18,18 @@
 
 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED;
 
 import static com.android.server.job.JobSchedulerService.RESTRICTED_INDEX;
 import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.app.ActivityManager;
 import android.app.job.JobInfo;
 import android.net.ConnectivityManager;
 import android.net.ConnectivityManager.NetworkCallback;
+import android.net.INetworkPolicyListener;
 import android.net.Network;
 import android.net.NetworkCapabilities;
 import android.net.NetworkPolicyManager;
@@ -47,6 +50,7 @@
 import android.util.Pools;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.SparseBooleanArray;
 import android.util.TimeUtils;
 import android.util.proto.ProtoOutputStream;
 
@@ -98,13 +102,12 @@
             ~(ConnectivityManager.BLOCKED_REASON_APP_STANDBY
                     | ConnectivityManager.BLOCKED_REASON_BATTERY_SAVER
                     | ConnectivityManager.BLOCKED_REASON_DOZE);
-    // TODO(261999509): allow bypassing data saver & user-restricted. However, when we allow a UI
-    //     job to run while data saver restricts the app, we must ensure that we don't run regular
-    //     jobs when we put a hole in the data saver wall for the UI job
     private static final int UNBYPASSABLE_UI_BLOCKED_REASONS =
             ~(ConnectivityManager.BLOCKED_REASON_APP_STANDBY
                     | ConnectivityManager.BLOCKED_REASON_BATTERY_SAVER
-                    | ConnectivityManager.BLOCKED_REASON_DOZE);
+                    | ConnectivityManager.BLOCKED_REASON_DOZE
+                    | ConnectivityManager.BLOCKED_METERED_REASON_DATA_SAVER
+                    | ConnectivityManager.BLOCKED_METERED_REASON_USER_RESTRICTED);
     private static final int UNBYPASSABLE_FOREGROUND_BLOCKED_REASONS =
             ~(ConnectivityManager.BLOCKED_REASON_APP_STANDBY
                     | ConnectivityManager.BLOCKED_REASON_BATTERY_SAVER
@@ -113,6 +116,7 @@
                     | ConnectivityManager.BLOCKED_METERED_REASON_USER_RESTRICTED);
 
     private final ConnectivityManager mConnManager;
+    private final NetworkPolicyManager mNetPolicyManager;
     private final NetworkPolicyManagerInternal mNetPolicyManagerInternal;
     private final FlexibilityController mFlexibilityController;
 
@@ -241,6 +245,8 @@
      */
     private final List<UidStats> mSortedStats = new ArrayList<>();
     @GuardedBy("mLock")
+    private final SparseBooleanArray mBackgroundMeteredAllowed = new SparseBooleanArray();
+    @GuardedBy("mLock")
     private long mLastCallbackAdjustmentTimeElapsed;
     @GuardedBy("mLock")
     private final SparseArray<CellSignalStrengthCallback> mSignalStrengths = new SparseArray<>();
@@ -250,6 +256,8 @@
 
     private static final int MSG_ADJUST_CALLBACKS = 0;
     private static final int MSG_UPDATE_ALL_TRACKED_JOBS = 1;
+    private static final int MSG_DATA_SAVER_TOGGLED = 2;
+    private static final int MSG_UID_POLICIES_CHANGED = 3;
 
     private final Handler mHandler;
 
@@ -259,6 +267,7 @@
         mHandler = new CcHandler(AppSchedulingModuleThread.get().getLooper());
 
         mConnManager = mContext.getSystemService(ConnectivityManager.class);
+        mNetPolicyManager = mContext.getSystemService(NetworkPolicyManager.class);
         mNetPolicyManagerInternal = LocalServices.getService(NetworkPolicyManagerInternal.class);
         mFlexibilityController = flexibilityController;
 
@@ -266,6 +275,8 @@
         // network changes against the active network for each UID with jobs.
         final NetworkRequest request = new NetworkRequest.Builder().clearCapabilities().build();
         mConnManager.registerNetworkCallback(request, mNetworkCallback);
+
+        mNetPolicyManager.registerListener(mNetPolicyListener);
     }
 
     @GuardedBy("mLock")
@@ -530,6 +541,7 @@
             // All packages in the UID have been removed. It's safe to remove things based on
             // UID alone.
             mTrackedJobs.delete(uid);
+            mBackgroundMeteredAllowed.delete(uid);
             UidStats uidStats = mUidStats.removeReturnOld(uid);
             unregisterDefaultNetworkCallbackLocked(uid, sElapsedRealtimeClock.millis());
             mSortedStats.remove(uidStats);
@@ -549,6 +561,12 @@
                 mUidStats.removeAt(u);
             }
         }
+        for (int u = mBackgroundMeteredAllowed.size() - 1; u >= 0; --u) {
+            final int uid = mBackgroundMeteredAllowed.keyAt(u);
+            if (UserHandle.getUserId(uid) == userId) {
+                mBackgroundMeteredAllowed.removeAt(u);
+            }
+        }
         postAdjustCallbacks();
     }
 
@@ -666,6 +684,88 @@
         return false;
     }
 
+    private boolean isMeteredAllowed(@NonNull JobStatus jobStatus,
+            @NonNull NetworkCapabilities networkCapabilities) {
+        // Network isn't metered. Usage is allowed. The rest of this method doesn't apply.
+        if (networkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED)
+                || networkCapabilities.hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)) {
+            return true;
+        }
+
+        final int uid = jobStatus.getSourceUid();
+        final int procState = mService.getUidProcState(uid);
+        final int capabilities = mService.getUidCapabilities(uid);
+        // Jobs don't raise the proc state to anything better than IMPORTANT_FOREGROUND.
+        // If the app is in a better state, see if it has the capability to use the metered network.
+        final boolean currentStateAllows = procState != ActivityManager.PROCESS_STATE_UNKNOWN
+                && procState < ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
+                && NetworkPolicyManager.isProcStateAllowedWhileOnRestrictBackground(
+                        procState, capabilities);
+        if (DEBUG) {
+            Slog.d(TAG, "UID " + uid
+                    + " current state allows metered network=" + currentStateAllows
+                    + " procState=" + ActivityManager.procStateToString(procState)
+                    + " capabilities=" + ActivityManager.getCapabilitiesSummary(capabilities));
+        }
+        if (currentStateAllows) {
+            return true;
+        }
+
+        if ((jobStatus.getFlags() & JobInfo.FLAG_WILL_BE_FOREGROUND) != 0) {
+            final int expectedProcState = ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
+            final int mergedCapabilities = capabilities
+                    | NetworkPolicyManager.getDefaultProcessNetworkCapabilities(expectedProcState);
+            final boolean wouldBeAllowed =
+                    NetworkPolicyManager.isProcStateAllowedWhileOnRestrictBackground(
+                            expectedProcState, mergedCapabilities);
+            if (DEBUG) {
+                Slog.d(TAG, "UID " + uid
+                        + " willBeForeground flag allows metered network=" + wouldBeAllowed
+                        + " capabilities="
+                        + ActivityManager.getCapabilitiesSummary(mergedCapabilities));
+            }
+            if (wouldBeAllowed) {
+                return true;
+            }
+        }
+
+        if (jobStatus.shouldTreatAsUserInitiatedJob()) {
+            // Since the job is initiated by the user and will be visible to the user, it
+            // should be able to run on metered networks, similar to FGS.
+            // With user-initiated jobs, JobScheduler will request that the process
+            // run at IMPORTANT_FOREGROUND process state
+            // and get the USER_RESTRICTED_NETWORK process capability.
+            final int expectedProcState = ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
+            final int mergedCapabilities = capabilities
+                    | ActivityManager.PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK
+                    | NetworkPolicyManager.getDefaultProcessNetworkCapabilities(expectedProcState);
+            final boolean wouldBeAllowed =
+                    NetworkPolicyManager.isProcStateAllowedWhileOnRestrictBackground(
+                            expectedProcState, mergedCapabilities);
+            if (DEBUG) {
+                Slog.d(TAG, "UID " + uid
+                        + " UI job state allows metered network=" + wouldBeAllowed
+                        + " capabilities=" + mergedCapabilities);
+            }
+            if (wouldBeAllowed) {
+                return true;
+            }
+        }
+
+        if (mBackgroundMeteredAllowed.indexOfKey(uid) >= 0) {
+            return mBackgroundMeteredAllowed.get(uid);
+        }
+
+        final boolean allowed =
+                mNetPolicyManager.getRestrictBackgroundStatus(uid)
+                        != ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
+        if (DEBUG) {
+            Slog.d(TAG, "UID " + uid + " allowed in data saver=" + allowed);
+        }
+        mBackgroundMeteredAllowed.put(uid, allowed);
+        return allowed;
+    }
+
     /**
      * Return the estimated amount of time this job will be transferring data,
      * based on the current network speed.
@@ -859,6 +959,12 @@
         // First, are we insane?
         if (isInsane(jobStatus, network, capabilities, constants)) return false;
 
+        // User-initiated jobs might make NetworkPolicyManager open up network access for
+        // the whole UID. If network access is opened up just because of UI jobs, we want
+        // to make sure that non-UI jobs don't run during that time,
+        // so make sure the job can make use of the metered network at this time.
+        if (!isMeteredAllowed(jobStatus, capabilities)) return false;
+
         // Second, is the network congested?
         if (isCongestionDelayed(jobStatus, network, capabilities, constants)) return false;
 
@@ -1138,9 +1244,10 @@
             // but it doesn't yet satisfy the requested constraints and the old network
             // is still available and satisfies the constraints. Don't change the network
             // given to the job for now and let it keep running. We will re-evaluate when
-            // the capabilities or connection state of the either network change.
+            // the capabilities or connection state of either network change.
             if (DEBUG) {
-                Slog.i(TAG, "Not reassigning network for running job " + jobStatus);
+                Slog.i(TAG, "Not reassigning network from " + jobStatus.network
+                        + " to " + network + " for running job " + jobStatus);
             }
             return false;
         }
@@ -1389,6 +1496,26 @@
         }
     };
 
+    private final INetworkPolicyListener mNetPolicyListener = new NetworkPolicyManager.Listener() {
+        @Override
+        public void onRestrictBackgroundChanged(boolean restrictBackground) {
+            if (DEBUG) {
+                Slog.v(TAG, "onRestrictBackgroundChanged: " + restrictBackground);
+            }
+            mHandler.obtainMessage(MSG_DATA_SAVER_TOGGLED).sendToTarget();
+        }
+
+        @Override
+        public void onUidPoliciesChanged(int uid, int uidPolicies) {
+            if (DEBUG) {
+                Slog.v(TAG, "onUidPoliciesChanged: " + uid);
+            }
+            mHandler.obtainMessage(MSG_UID_POLICIES_CHANGED,
+                    uid, mNetPolicyManager.getRestrictBackgroundStatus(uid))
+                    .sendToTarget();
+        }
+    };
+
     private class CcHandler extends Handler {
         CcHandler(Looper looper) {
             super(looper);
@@ -1410,6 +1537,27 @@
                             updateAllTrackedJobsLocked(allowThrottle);
                         }
                         break;
+
+                    case MSG_DATA_SAVER_TOGGLED:
+                        removeMessages(MSG_DATA_SAVER_TOGGLED);
+                        synchronized (mLock) {
+                            mBackgroundMeteredAllowed.clear();
+                            updateTrackedJobsLocked(-1, null);
+                        }
+                        break;
+
+                    case MSG_UID_POLICIES_CHANGED:
+                        final int uid = msg.arg1;
+                        final boolean newAllowed =
+                                msg.arg2 != ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
+                        synchronized (mLock) {
+                            final boolean oldAllowed = mBackgroundMeteredAllowed.get(uid);
+                            if (oldAllowed != newAllowed) {
+                                mBackgroundMeteredAllowed.put(uid, newAllowed);
+                                updateTrackedJobsLocked(uid, null);
+                            }
+                        }
+                        break;
                 }
             }
         }
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java
index 234a93c..b9e3b76b 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java
@@ -33,7 +33,9 @@
 import android.app.job.JobInfo;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.os.Handler;
 import android.os.Looper;
+import android.os.Message;
 import android.os.UserHandle;
 import android.provider.DeviceConfig;
 import android.util.ArraySet;
@@ -66,6 +68,11 @@
             | CONSTRAINT_CHARGING
             | CONSTRAINT_IDLE;
 
+    /** List of flexible constraints a job can opt into. */
+    static final int OPTIONAL_FLEXIBLE_CONSTRAINTS = CONSTRAINT_BATTERY_NOT_LOW
+            | CONSTRAINT_CHARGING
+            | CONSTRAINT_IDLE;
+
     /** List of all job flexible constraints whose satisfaction is job specific. */
     private static final int JOB_SPECIFIC_FLEXIBLE_CONSTRAINTS = CONSTRAINT_CONNECTIVITY;
 
@@ -76,6 +83,9 @@
     private static final int NUM_JOB_SPECIFIC_FLEXIBLE_CONSTRAINTS =
             Integer.bitCount(JOB_SPECIFIC_FLEXIBLE_CONSTRAINTS);
 
+    static final int NUM_OPTIONAL_FLEXIBLE_CONSTRAINTS =
+            Integer.bitCount(OPTIONAL_FLEXIBLE_CONSTRAINTS);
+
     static final int NUM_SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS =
             Integer.bitCount(SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS);
 
@@ -130,6 +140,7 @@
     final FlexibilityAlarmQueue mFlexibilityAlarmQueue;
     @VisibleForTesting
     final FcConfig mFcConfig;
+    private final FcHandler mHandler;
     @VisibleForTesting
     final PrefetchController mPrefetchController;
 
@@ -174,9 +185,12 @@
                 }
             };
 
+    private static final int MSG_UPDATE_JOBS = 0;
+
     public FlexibilityController(
             JobSchedulerService service, PrefetchController prefetchController) {
         super(service);
+        mHandler = new FcHandler(AppSchedulingModuleThread.get().getLooper());
         mDeviceSupportsFlexConstraints = !mContext.getPackageManager().hasSystemFeature(
                 PackageManager.FEATURE_AUTOMOTIVE);
         mFlexibilityEnabled &= mDeviceSupportsFlexConstraints;
@@ -238,15 +252,16 @@
     boolean isFlexibilitySatisfiedLocked(JobStatus js) {
         return !mFlexibilityEnabled
                 || mService.getUidBias(js.getSourceUid()) == JobInfo.BIAS_TOP_APP
-                || mService.isCurrentlyRunningLocked(js)
                 || getNumSatisfiedFlexibleConstraintsLocked(js)
-                >= js.getNumRequiredFlexibleConstraints();
+                        >= js.getNumRequiredFlexibleConstraints()
+                || mService.isCurrentlyRunningLocked(js);
     }
 
     @VisibleForTesting
     @GuardedBy("mLock")
     int getNumSatisfiedFlexibleConstraintsLocked(JobStatus js) {
         return Integer.bitCount(mSatisfiedFlexibleConstraints & js.getPreferredConstraintFlags())
+                // Connectivity is job-specific, so must be handled separately.
                 + (js.getHasAccessToUnmetered() ? 1 : 0);
     }
 
@@ -267,33 +282,11 @@
                        + " constraint: " + constraint + " state: " + state);
             }
 
-            final int prevSatisfied = Integer.bitCount(mSatisfiedFlexibleConstraints);
             mSatisfiedFlexibleConstraints =
                     (mSatisfiedFlexibleConstraints & ~constraint) | (state ? constraint : 0);
-            final int curSatisfied = Integer.bitCount(mSatisfiedFlexibleConstraints);
-
-            // Only the max of the number of required flexible constraints will need to be updated
-            // The rest did not have a change in state and are still satisfied or unsatisfied.
-            final int numConstraintsToUpdate = Math.max(curSatisfied, prevSatisfied);
-
-            // In order to get the range of all potentially satisfied jobs, we start at the number
-            // of satisfied system-wide constraints and iterate to the max number of potentially
-            // satisfied constraints, determined by how many job-specific constraints exist.
-            for (int j = 0; j <= NUM_JOB_SPECIFIC_FLEXIBLE_CONSTRAINTS; j++) {
-                final ArraySet<JobStatus> jobsByNumConstraints = mFlexibilityTracker
-                        .getJobsByNumRequiredConstraints(numConstraintsToUpdate + j);
-
-                if (jobsByNumConstraints == null) {
-                    // If there are no more jobs to iterate through we can just return.
-                    return;
-                }
-
-                for (int i = 0; i < jobsByNumConstraints.size(); i++) {
-                    JobStatus js = jobsByNumConstraints.valueAt(i);
-                    js.setFlexibilityConstraintSatisfied(
-                            nowElapsed, isFlexibilitySatisfiedLocked(js));
-                }
-            }
+            // Push the job update to the handler to avoid blocking other controllers and
+            // potentially batch back-to-back controller state updates together.
+            mHandler.obtainMessage(MSG_UPDATE_JOBS).sendToTarget();
         }
     }
 
@@ -630,6 +623,44 @@
         }
     }
 
+    private class FcHandler extends Handler {
+        FcHandler(Looper looper) {
+            super(looper);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_UPDATE_JOBS:
+                    removeMessages(MSG_UPDATE_JOBS);
+
+                    synchronized (mLock) {
+                        final long nowElapsed = sElapsedRealtimeClock.millis();
+                        final ArraySet<JobStatus> changedJobs = new ArraySet<>();
+
+                        for (int o = 0; o <= NUM_OPTIONAL_FLEXIBLE_CONSTRAINTS; ++o) {
+                            final ArraySet<JobStatus> jobsByNumConstraints = mFlexibilityTracker
+                                    .getJobsByNumRequiredConstraints(o);
+
+                            if (jobsByNumConstraints != null) {
+                                for (int i = 0; i < jobsByNumConstraints.size(); i++) {
+                                    final JobStatus js = jobsByNumConstraints.valueAt(i);
+                                    if (js.setFlexibilityConstraintSatisfied(
+                                            nowElapsed, isFlexibilitySatisfiedLocked(js))) {
+                                        changedJobs.add(js);
+                                    }
+                                }
+                            }
+                        }
+                        if (changedJobs.size() > 0) {
+                            mStateChangedListener.onControllerStateChanged(changedJobs);
+                        }
+                    }
+                    break;
+            }
+        }
+    }
+
     @VisibleForTesting
     class FcConfig {
         private boolean mShouldReevaluateConstraints = false;
@@ -651,7 +682,7 @@
         static final String KEY_RESCHEDULED_JOB_DEADLINE_MS =
                 FC_CONFIG_PREFIX + "rescheduled_job_deadline_ms";
 
-        private static final boolean DEFAULT_FLEXIBILITY_ENABLED = true;
+        private static final boolean DEFAULT_FLEXIBILITY_ENABLED = false;
         @VisibleForTesting
         static final long DEFAULT_DEADLINE_PROXIMITY_LIMIT_MS = 15 * MINUTE_IN_MILLIS;
         @VisibleForTesting
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 26d6ba2..6445c3b 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
@@ -590,9 +590,10 @@
             this.sourceTag = tag;
         }
 
+        final String bnNamespace = namespace == null ? "" :  "@" + namespace + "@";
         this.batteryName = this.sourceTag != null
-                ? this.sourceTag + ":" + job.getService().getPackageName()
-                : job.getService().flattenToShortString();
+                ? bnNamespace + this.sourceTag + ":" + job.getService().getPackageName()
+                : bnNamespace + job.getService().flattenToShortString();
         this.tag = "*job*/" + this.batteryName + "#" + job.getId();
 
         this.earliestRunTimeElapsedMillis = earliestRunTimeElapsedMillis;
@@ -1131,10 +1132,25 @@
      */
     @JobInfo.Priority
     public int getEffectivePriority() {
-        final int rawPriority = job.getPriority();
+        final boolean isDemoted =
+                (getInternalFlags() & INTERNAL_FLAG_DEMOTED_BY_USER) != 0
+                        || (job.isUserInitiated()
+                        && (getInternalFlags() & INTERNAL_FLAG_DEMOTED_BY_SYSTEM_UIJ) != 0);
+        final int maxPriority;
+        if (isDemoted) {
+            // If the job was demoted for some reason, limit its priority to HIGH.
+            maxPriority = JobInfo.PRIORITY_HIGH;
+        } else {
+            maxPriority = JobInfo.PRIORITY_MAX;
+        }
+        final int rawPriority = Math.min(maxPriority, job.getPriority());
         if (numFailures < 2) {
             return rawPriority;
         }
+        if (shouldTreatAsUserInitiatedJob()) {
+            // Don't drop priority of UI jobs.
+            return rawPriority;
+        }
         // Slowly decay priority of jobs to prevent starvation of other jobs.
         if (isRequestedExpeditedJob()) {
             // EJs can't fall below HIGH priority.
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
index aca0a6e..175c8d1 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
@@ -35,7 +35,7 @@
 import android.annotation.UserIdInt;
 import android.app.ActivityManager;
 import android.app.AlarmManager;
-import android.app.IUidObserver;
+import android.app.UidObserver;
 import android.app.usage.UsageEvents;
 import android.app.usage.UsageStatsManagerInternal;
 import android.app.usage.UsageStatsManagerInternal.UsageEventListener;
@@ -382,31 +382,11 @@
                 }
             };
 
-    private class QcUidObserver extends IUidObserver.Stub {
+    private class QcUidObserver extends UidObserver {
         @Override
         public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
             mHandler.obtainMessage(MSG_UID_PROCESS_STATE_CHANGED, uid, procState).sendToTarget();
         }
-
-        @Override
-        public void onUidGone(int uid, boolean disabled) {
-        }
-
-        @Override
-        public void onUidActive(int uid) {
-        }
-
-        @Override
-        public void onUidIdle(int uid, boolean disabled) {
-        }
-
-        @Override
-        public void onUidCachedChanged(int uid, boolean cached) {
-        }
-
-        @Override
-        public void onUidProcAdjChanged(int uid) {
-        }
     }
 
     /**
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/ProcessStateModifier.java b/apex/jobscheduler/service/java/com/android/server/tare/ProcessStateModifier.java
index 3578c8a..58536675 100644
--- a/apex/jobscheduler/service/java/com/android/server/tare/ProcessStateModifier.java
+++ b/apex/jobscheduler/service/java/com/android/server/tare/ProcessStateModifier.java
@@ -20,6 +20,7 @@
 import android.annotation.NonNull;
 import android.app.ActivityManager;
 import android.app.IUidObserver;
+import android.app.UidObserver;
 import android.os.RemoteException;
 import android.util.IndentingPrintWriter;
 import android.util.Slog;
@@ -61,7 +62,7 @@
     @GuardedBy("mLock")
     private final SparseIntArray mUidProcStateBucketCache = new SparseIntArray();
 
-    private final IUidObserver mUidObserver = new IUidObserver.Stub() {
+    private final IUidObserver mUidObserver = new UidObserver() {
         @Override
         public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
             final int newBucket = getProcStateBucket(procState);
@@ -85,22 +86,6 @@
                 notifyStateChangedLocked(uid);
             }
         }
-
-        @Override
-        public void onUidActive(int uid) {
-        }
-
-        @Override
-        public void onUidIdle(int uid, boolean disabled) {
-        }
-
-        @Override
-        public void onUidCachedChanged(int uid, boolean cached) {
-        }
-
-        @Override
-        public void onUidProcAdjChanged(int uid) {
-        }
     };
 
     ProcessStateModifier(@NonNull InternalResourceService irs) {
diff --git a/boot/OWNERS b/boot/OWNERS
index 0e258d0..3fe1a41 100644
--- a/boot/OWNERS
+++ b/boot/OWNERS
@@ -2,5 +2,5 @@
 file:platform/build/soong:/OWNERS
 
 # art-team@ manages the boot image profiles for frameworks
-per-file boot-* = [email protected], [email protected], [email protected]
-per-file preloaded-classes* = [email protected], [email protected], [email protected]
+per-file boot-* = [email protected], [email protected], [email protected]
+per-file preloaded-classes* = [email protected], [email protected], [email protected]
diff --git a/boot/preloaded-classes b/boot/preloaded-classes
index d2eb4ce2..21ae134 100644
--- a/boot/preloaded-classes
+++ b/boot/preloaded-classes
@@ -211,7 +211,7 @@
 android.app.ActivityManager$RunningTaskInfo
 android.app.ActivityManager$TaskDescription$1
 android.app.ActivityManager$TaskDescription
-android.app.ActivityManager$UidObserver
+android.app.ActivityManager$MyUidObserver
 android.app.ActivityManager
 android.app.ActivityManagerInternal
 android.app.ActivityOptions$1
diff --git a/config/OWNERS b/config/OWNERS
index 74813bc..6a5df76 100644
--- a/config/OWNERS
+++ b/config/OWNERS
@@ -1,8 +1,8 @@
 include /ZYGOTE_OWNERS
 
 # art-team@ manages the boot image profiles
-per-file boot-* = [email protected], [email protected]
-per-file dirty-image-objects = [email protected], [email protected]
-per-file generate-preloaded-classes.sh = [email protected], [email protected]
-per-file preloaded-classes* = [email protected], [email protected]
+per-file boot-* = [email protected], [email protected], [email protected]
+per-file dirty-image-objects = [email protected], [email protected], [email protected]
+per-file generate-preloaded-classes.sh = [email protected], [email protected], [email protected]
+per-file preloaded-classes* = [email protected], [email protected], [email protected]
 
diff --git a/config/preloaded-classes b/config/preloaded-classes
index 5e2c021..8e50fe8 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -211,7 +211,7 @@
 android.app.ActivityManager$RunningTaskInfo
 android.app.ActivityManager$TaskDescription$1
 android.app.ActivityManager$TaskDescription
-android.app.ActivityManager$UidObserver
+android.app.ActivityManager$MyUidObserver
 android.app.ActivityManager
 android.app.ActivityManagerInternal
 android.app.ActivityOptions$1
diff --git a/core/api/current.txt b/core/api/current.txt
index 45c9bec..80abd84 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -64,8 +64,6 @@
     field public static final String BLUETOOTH_SCAN = "android.permission.BLUETOOTH_SCAN";
     field public static final String BODY_SENSORS = "android.permission.BODY_SENSORS";
     field public static final String BODY_SENSORS_BACKGROUND = "android.permission.BODY_SENSORS_BACKGROUND";
-    field public static final String BODY_SENSORS_WRIST_TEMPERATURE = "android.permission.BODY_SENSORS_WRIST_TEMPERATURE";
-    field public static final String BODY_SENSORS_WRIST_TEMPERATURE_BACKGROUND = "android.permission.BODY_SENSORS_WRIST_TEMPERATURE_BACKGROUND";
     field public static final String BROADCAST_PACKAGE_REMOVED = "android.permission.BROADCAST_PACKAGE_REMOVED";
     field public static final String BROADCAST_SMS = "android.permission.BROADCAST_SMS";
     field public static final String BROADCAST_STICKY = "android.permission.BROADCAST_STICKY";
@@ -5024,7 +5022,6 @@
     field public static final String OPSTR_ADD_VOICEMAIL = "android:add_voicemail";
     field public static final String OPSTR_ANSWER_PHONE_CALLS = "android:answer_phone_calls";
     field public static final String OPSTR_BODY_SENSORS = "android:body_sensors";
-    field public static final String OPSTR_BODY_SENSORS_WRIST_TEMPERATURE = "android:body_sensors_wrist_temperature";
     field public static final String OPSTR_CALL_PHONE = "android:call_phone";
     field public static final String OPSTR_CAMERA = "android:camera";
     field public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
@@ -13029,7 +13026,7 @@
     field @RequiresPermission(allOf={android.Manifest.permission.FOREGROUND_SERVICE_CAMERA}, anyOf={android.Manifest.permission.CAMERA}, conditional=true) public static final int FOREGROUND_SERVICE_TYPE_CAMERA = 64; // 0x40
     field @RequiresPermission(allOf={android.Manifest.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE}, anyOf={android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.CHANGE_NETWORK_STATE, android.Manifest.permission.CHANGE_WIFI_STATE, android.Manifest.permission.CHANGE_WIFI_MULTICAST_STATE, android.Manifest.permission.NFC, android.Manifest.permission.TRANSMIT_IR, android.Manifest.permission.UWB_RANGING}, conditional=true) public static final int FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE = 16; // 0x10
     field @RequiresPermission(value=android.Manifest.permission.FOREGROUND_SERVICE_DATA_SYNC, conditional=true) public static final int FOREGROUND_SERVICE_TYPE_DATA_SYNC = 1; // 0x1
-    field @RequiresPermission(allOf={android.Manifest.permission.FOREGROUND_SERVICE_HEALTH}, anyOf={android.Manifest.permission.ACTIVITY_RECOGNITION, android.Manifest.permission.BODY_SENSORS, android.Manifest.permission.BODY_SENSORS_WRIST_TEMPERATURE, android.Manifest.permission.HIGH_SAMPLING_RATE_SENSORS}) public static final int FOREGROUND_SERVICE_TYPE_HEALTH = 256; // 0x100
+    field @RequiresPermission(allOf={android.Manifest.permission.FOREGROUND_SERVICE_HEALTH}, anyOf={android.Manifest.permission.ACTIVITY_RECOGNITION, android.Manifest.permission.BODY_SENSORS, android.Manifest.permission.HIGH_SAMPLING_RATE_SENSORS}) public static final int FOREGROUND_SERVICE_TYPE_HEALTH = 256; // 0x100
     field @RequiresPermission(allOf={android.Manifest.permission.FOREGROUND_SERVICE_LOCATION}, anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}, conditional=true) public static final int FOREGROUND_SERVICE_TYPE_LOCATION = 8; // 0x8
     field public static final int FOREGROUND_SERVICE_TYPE_MANIFEST = -1; // 0xffffffff
     field @RequiresPermission(value=android.Manifest.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK, conditional=true) public static final int FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK = 2; // 0x2
@@ -55066,7 +55063,6 @@
 
   public final class AutofillManager {
     method public void cancel();
-    method public void clearAutofillRequestCallback();
     method public void commit();
     method public void disableAutofillServices();
     method @Nullable public android.content.ComponentName getAutofillServiceComponentName();
@@ -55093,7 +55089,6 @@
     method public void registerCallback(@Nullable android.view.autofill.AutofillManager.AutofillCallback);
     method public void requestAutofill(@NonNull android.view.View);
     method public void requestAutofill(@NonNull android.view.View, int, @NonNull android.graphics.Rect);
-    method @RequiresPermission(android.Manifest.permission.PROVIDE_OWN_AUTOFILL_SUGGESTIONS) public void setAutofillRequestCallback(@NonNull java.util.concurrent.Executor, @NonNull android.view.autofill.AutofillRequestCallback);
     method public void setUserData(@Nullable android.service.autofill.UserData);
     method public boolean showAutofillDialog(@NonNull android.view.View);
     method public boolean showAutofillDialog(@NonNull android.view.View, int);
@@ -55114,10 +55109,6 @@
     field public static final int EVENT_INPUT_UNAVAILABLE = 3; // 0x3
   }
 
-  public interface AutofillRequestCallback {
-    method public void onFillRequest(@Nullable android.view.inputmethod.InlineSuggestionsRequest, @NonNull android.os.CancellationSignal, @NonNull android.service.autofill.FillCallback);
-  }
-
   public final class AutofillValue implements android.os.Parcelable {
     method public int describeContents();
     method public static android.view.autofill.AutofillValue forDate(long);
@@ -55567,12 +55558,10 @@
     ctor public InlineSuggestionsRequest.Builder(@NonNull java.util.List<android.widget.inline.InlinePresentationSpec>);
     method @NonNull public android.view.inputmethod.InlineSuggestionsRequest.Builder addInlinePresentationSpecs(@NonNull android.widget.inline.InlinePresentationSpec);
     method @NonNull public android.view.inputmethod.InlineSuggestionsRequest build();
-    method @NonNull public android.view.inputmethod.InlineSuggestionsRequest.Builder setClientSupported(boolean);
     method @NonNull public android.view.inputmethod.InlineSuggestionsRequest.Builder setExtras(@NonNull android.os.Bundle);
     method @NonNull public android.view.inputmethod.InlineSuggestionsRequest.Builder setInlinePresentationSpecs(@NonNull java.util.List<android.widget.inline.InlinePresentationSpec>);
     method @NonNull public android.view.inputmethod.InlineSuggestionsRequest.Builder setInlineTooltipPresentationSpec(@NonNull android.widget.inline.InlinePresentationSpec);
     method @NonNull public android.view.inputmethod.InlineSuggestionsRequest.Builder setMaxSuggestionCount(int);
-    method @NonNull public android.view.inputmethod.InlineSuggestionsRequest.Builder setServiceSupported(boolean);
     method @NonNull public android.view.inputmethod.InlineSuggestionsRequest.Builder setSupportedLocales(@NonNull android.os.LocaleList);
   }
 
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index ed36f1c..ffbfe82 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -8,6 +8,8 @@
     field public static final String APPROVE_INCIDENT_REPORTS = "android.permission.APPROVE_INCIDENT_REPORTS";
     field public static final String BACKGROUND_CAMERA = "android.permission.BACKGROUND_CAMERA";
     field public static final String BIND_CELL_BROADCAST_SERVICE = "android.permission.BIND_CELL_BROADCAST_SERVICE";
+    field public static final String BODY_SENSORS_WRIST_TEMPERATURE = "android.permission.BODY_SENSORS_WRIST_TEMPERATURE";
+    field public static final String BODY_SENSORS_WRIST_TEMPERATURE_BACKGROUND = "android.permission.BODY_SENSORS_WRIST_TEMPERATURE_BACKGROUND";
     field public static final String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE";
     field public static final String BROADCAST_CLOSE_SYSTEM_DIALOGS = "android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS";
     field public static final String CHANGE_APP_IDLE_STATE = "android.permission.CHANGE_APP_IDLE_STATE";
@@ -150,8 +152,8 @@
     method @RequiresPermission(android.Manifest.permission.DUMP) public void waitForBroadcastIdle();
     field public static final long LOCK_DOWN_CLOSE_SYSTEM_DIALOGS = 174664365L; // 0xa692aadL
     field public static final int PROCESS_CAPABILITY_ALL_IMPLICIT = 6; // 0x6
-    field @Deprecated public static final int PROCESS_CAPABILITY_NETWORK = 8; // 0x8
     field public static final int PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK = 8; // 0x8
+    field public static final int PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK = 32; // 0x20
     field public static final int PROCESS_STATE_FOREGROUND_SERVICE = 4; // 0x4
     field public static final int PROCESS_STATE_TOP = 2; // 0x2
     field public static final int STOP_USER_ON_SWITCH_DEFAULT = -1; // 0xffffffff
@@ -336,10 +338,12 @@
   }
 
   public class Notification implements android.os.Parcelable {
+    method public boolean isUserInitiatedJob();
     method public boolean shouldShowForegroundImmediately();
     field public static final String EXTRA_MEDIA_REMOTE_DEVICE = "android.mediaRemoteDevice";
     field public static final String EXTRA_MEDIA_REMOTE_ICON = "android.mediaRemoteIcon";
     field public static final String EXTRA_MEDIA_REMOTE_INTENT = "android.mediaRemoteIntent";
+    field public static final int FLAG_USER_INITIATED_JOB = 32768; // 0x8000
   }
 
   public final class NotificationChannel implements android.os.Parcelable {
@@ -349,10 +353,10 @@
     method public void setDeleted(boolean);
     method public void setDeletedTimeMs(long);
     method public void setDemoted(boolean);
-    method public void setFgServiceShown(boolean);
     method public void setImportanceLockedByCriticalDeviceFunction(boolean);
     method public void setImportantConversation(boolean);
     method public void setOriginalImportance(int);
+    method public void setUserVisibleTaskShown(boolean);
   }
 
   public final class NotificationChannelGroup implements android.os.Parcelable {
@@ -425,7 +429,7 @@
     method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void collapsePanels();
     method public void expandNotificationsPanel();
     method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public int getLastSystemKey();
-    method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void handleSystemKey(int);
+    method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void handleSystemKey(@NonNull android.view.KeyEvent);
     method public void sendNotificationFeedback(@Nullable String, @Nullable android.os.Bundle);
     method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setExpansionDisabledForSimNetworkLock(boolean);
     method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void togglePanel();
@@ -3520,12 +3524,18 @@
   }
 
   public final class AutofillManager {
+    method public void clearAutofillRequestCallback();
+    method @RequiresPermission(android.Manifest.permission.PROVIDE_OWN_AUTOFILL_SUGGESTIONS) public void setAutofillRequestCallback(@NonNull java.util.concurrent.Executor, @NonNull android.view.autofill.AutofillRequestCallback);
     field public static final String ANY_HINT = "any";
     field public static final int FLAG_SMART_SUGGESTION_OFF = 0; // 0x0
     field public static final int FLAG_SMART_SUGGESTION_SYSTEM = 1; // 0x1
     field public static final int MAX_TEMP_AUGMENTED_SERVICE_DURATION_MS = 120000; // 0x1d4c0
   }
 
+  public interface AutofillRequestCallback {
+    method public void onFillRequest(@Nullable android.view.inputmethod.InlineSuggestionsRequest, @NonNull android.os.CancellationSignal, @NonNull android.service.autofill.FillCallback);
+  }
+
 }
 
 package android.view.contentcapture {
@@ -3649,6 +3659,11 @@
     method @NonNull public static android.view.inputmethod.InlineSuggestionInfo newInlineSuggestionInfo(@NonNull android.widget.inline.InlinePresentationSpec, @NonNull String, @Nullable String[], @NonNull String, boolean);
   }
 
+  public static final class InlineSuggestionsRequest.Builder {
+    method @NonNull public android.view.inputmethod.InlineSuggestionsRequest.Builder setClientSupported(boolean);
+    method @NonNull public android.view.inputmethod.InlineSuggestionsRequest.Builder setServiceSupported(boolean);
+  }
+
   public final class InlineSuggestionsResponse implements android.os.Parcelable {
     method @NonNull public static android.view.inputmethod.InlineSuggestionsResponse newInlineSuggestionsResponse(@NonNull java.util.List<android.view.inputmethod.InlineSuggestion>);
   }
diff --git a/core/api/test-lint-baseline.txt b/core/api/test-lint-baseline.txt
index 4a97280..cf02643 100644
--- a/core/api/test-lint-baseline.txt
+++ b/core/api/test-lint-baseline.txt
@@ -183,6 +183,10 @@
     android.telecom.ConnectionRequest does not declare a `shouldShowIncomingCallUi()` method matching method android.telecom.ConnectionRequest.Builder.setShouldShowIncomingCallUi(boolean)
 MissingGetterMatchingBuilder: android.view.Display.Mode.Builder#setResolution(int, int):
     android.view.Display.Mode does not declare a `getResolution()` method matching method android.view.Display.Mode.Builder.setResolution(int,int)
+MissingGetterMatchingBuilder: android.view.inputmethod.InlineSuggestionsRequest.Builder#setClientSupported(boolean):
+    android.view.inputmethod.InlineSuggestionsRequest does not declare a `isClientSupported()` method matching method android.view.inputmethod.InlineSuggestionsRequest.Builder.setClientSupported(boolean)
+MissingGetterMatchingBuilder: android.view.inputmethod.InlineSuggestionsRequest.Builder#setServiceSupported(boolean):
+    android.view.inputmethod.InlineSuggestionsRequest does not declare a `isServiceSupported()` method matching method android.view.inputmethod.InlineSuggestionsRequest.Builder.setServiceSupported(boolean)
 
 
 MissingNullability: android.app.Activity#onMovedToDisplay(int, android.content.res.Configuration) parameter #1:
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 3615435..08a1af4 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -2878,9 +2878,7 @@
 
         public IAccessibilityServiceClientWrapper(Context context, Looper looper,
                 Callbacks callback) {
-            mCallback = callback;
-            mContext = context;
-            mExecutor = new HandlerExecutor(new Handler(looper));
+            this(context, new HandlerExecutor(new Handler(looper)), callback);
         }
 
         public void init(IAccessibilityServiceConnection connection, int connectionId,
diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
index 6dcf331..808f25e 100644
--- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
@@ -860,10 +860,10 @@
      * <p>
      *   <strong>Generated by the system.</strong>
      * </p>
-     * @return The id.
+     * @return The id (or {@code null} if the component is not set yet).
      */
     public String getId() {
-        return mComponentName.flattenToShortString();
+        return mComponentName == null ? null : mComponentName.flattenToShortString();
     }
 
     /**
diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java
index 5d69f8b..ead238f 100644
--- a/core/java/android/animation/ValueAnimator.java
+++ b/core/java/android/animation/ValueAnimator.java
@@ -1118,10 +1118,6 @@
         if (Looper.myLooper() == null) {
             throw new AndroidRuntimeException("Animators may only be run on Looper threads");
         }
-        if (playBackwards == mResumed && mSelfPulse == !mSuppressSelfPulseRequested && mStarted) {
-            // already started
-            return;
-        }
         mReversing = playBackwards;
         mSelfPulse = !mSuppressSelfPulseRequested;
         // Special case: reversing from seek-to-0 should act as if not seeked at all.
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 2109707..521bf05 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -193,11 +193,11 @@
      */
     public static final int INSTR_FLAG_INSTRUMENT_SDK_SANDBOX = 1 << 5;
 
-    static final class UidObserver extends IUidObserver.Stub {
+    static final class MyUidObserver extends UidObserver {
         final OnUidImportanceListener mListener;
         final Context mContext;
 
-        UidObserver(OnUidImportanceListener listener, Context clientContext) {
+        MyUidObserver(OnUidImportanceListener listener, Context clientContext) {
             mListener = listener;
             mContext = clientContext;
         }
@@ -212,23 +212,9 @@
         public void onUidGone(int uid, boolean disabled) {
             mListener.onUidImportance(uid, RunningAppProcessInfo.IMPORTANCE_GONE);
         }
-
-        @Override
-        public void onUidActive(int uid) {
-        }
-
-        @Override
-        public void onUidIdle(int uid, boolean disabled) {
-        }
-
-        @Override public void onUidCachedChanged(int uid, boolean cached) {
-        }
-
-        @Override public void onUidProcAdjChanged(int uid) {
-        }
     }
 
-    final ArrayMap<OnUidImportanceListener, UidObserver> mImportanceListeners = new ArrayMap<>();
+    final ArrayMap<OnUidImportanceListener, MyUidObserver> mImportanceListeners = new ArrayMap<>();
 
     /**
      * Map of callbacks that have registered for {@link UidFrozenStateChanged} events.
@@ -794,6 +780,7 @@
             PROCESS_CAPABILITY_FOREGROUND_MICROPHONE,
             PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK,
             PROCESS_CAPABILITY_BFSL,
+            PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ProcessCapability {}
@@ -915,14 +902,6 @@
     /** @hide Process can access network despite any power saving restrictions */
     @TestApi
     public static final int PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK = 1 << 3;
-    /**
-     * @hide
-     * @deprecated Use {@link #PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK} instead.
-     */
-    @TestApi
-    @Deprecated
-    public static final int PROCESS_CAPABILITY_NETWORK =
-            PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK;
 
     /**
      * Flag used to indicate whether an app is allowed to start a foreground service from the
@@ -944,6 +923,13 @@
     public static final int PROCESS_CAPABILITY_BFSL = 1 << 4;
 
     /**
+     * @hide
+     * Process can access network at a high enough proc state despite any user restrictions.
+     */
+    @TestApi
+    public static final int PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK = 1 << 5;
+
+    /**
      * @hide all capabilities, the ORing of all flags in {@link ProcessCapability}.
      *
      * Don't expose it as TestApi -- we may add new capabilities any time, which could
@@ -953,7 +939,8 @@
             | PROCESS_CAPABILITY_FOREGROUND_CAMERA
             | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE
             | PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK
-            | PROCESS_CAPABILITY_BFSL;
+            | PROCESS_CAPABILITY_BFSL
+            | PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK;
 
     /**
      * All implicit capabilities. There are capabilities that process automatically have.
@@ -973,6 +960,7 @@
         pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0 ? 'M' : '-');
         pw.print((caps & PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK) != 0 ? 'N' : '-');
         pw.print((caps & PROCESS_CAPABILITY_BFSL) != 0 ? 'F' : '-');
+        pw.print((caps & PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK) != 0 ? 'U' : '-');
     }
 
     /** @hide */
@@ -982,6 +970,7 @@
         sb.append((caps & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0 ? 'M' : '-');
         sb.append((caps & PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK) != 0 ? 'N' : '-');
         sb.append((caps & PROCESS_CAPABILITY_BFSL) != 0 ? 'F' : '-');
+        sb.append((caps & PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK) != 0 ? 'U' : '-');
     }
 
     /**
@@ -4270,7 +4259,7 @@
                 throw new IllegalArgumentException("Listener already registered: " + listener);
             }
             // TODO: implement the cut point in the system process to avoid IPCs.
-            UidObserver observer = new UidObserver(listener, mContext);
+            MyUidObserver observer = new MyUidObserver(listener, mContext);
             try {
                 getService().registerUidObserver(observer,
                         UID_OBSERVER_PROCSTATE | UID_OBSERVER_GONE,
@@ -4294,7 +4283,7 @@
     @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS)
     public void removeOnUidImportanceListener(OnUidImportanceListener listener) {
         synchronized (this) {
-            UidObserver observer = mImportanceListeners.remove(listener);
+            MyUidObserver observer = mImportanceListeners.remove(listener);
             if (observer == null) {
                 throw new IllegalArgumentException("Listener not registered: " + listener);
             }
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index feb9b4f..d73f0cc 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -2539,7 +2539,8 @@
     public String toString() {
         return "ActivityOptions(" + hashCode() + "), mPackageName=" + mPackageName
                 + ", mAnimationType=" + mAnimationType + ", mStartX=" + mStartX + ", mStartY="
-                + mStartY + ", mWidth=" + mWidth + ", mHeight=" + mHeight;
+                + mStartY + ", mWidth=" + mWidth + ", mHeight=" + mHeight + ", mLaunchDisplayId="
+                + mLaunchDisplayId;
     }
 
     /**
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 5bedc9d..29e135f 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -41,6 +41,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.RemoteServiceException.BadForegroundServiceNotificationException;
+import android.app.RemoteServiceException.BadUserInitiatedJobNotificationException;
 import android.app.RemoteServiceException.CannotPostForegroundServiceNotificationException;
 import android.app.RemoteServiceException.CrashedByAdbException;
 import android.app.RemoteServiceException.ForegroundServiceDidNotStartInTimeException;
@@ -360,9 +361,8 @@
     /** The activities to be truly destroyed (not include relaunch). */
     final Map<IBinder, ClientTransactionItem> mActivitiesToBeDestroyed =
             Collections.synchronizedMap(new ArrayMap<IBinder, ClientTransactionItem>());
-    // List of new activities (via ActivityRecord.nextIdle) that should
-    // be reported when next we idle.
-    ActivityClientRecord mNewActivities = null;
+    // List of new activities that should be reported when next we idle.
+    final ArrayList<ActivityClientRecord> mNewActivities = new ArrayList<>();
     // Number of activities that are currently visible on-screen.
     @UnsupportedAppUsage
     int mNumVisibleActivities = 0;
@@ -563,7 +563,6 @@
         private Configuration tmpConfig = new Configuration();
         // Callback used for updating activity override config and camera compat control state.
         ViewRootImpl.ActivityConfigCallback activityConfigCallback;
-        ActivityClientRecord nextIdle;
 
         // Indicates whether this activity is currently the topmost resumed one in the system.
         // This holds the last reported value from server.
@@ -657,7 +656,6 @@
             paused = false;
             stopped = false;
             hideForNow = false;
-            nextIdle = null;
             activityConfigCallback = new ViewRootImpl.ActivityConfigCallback() {
                 @Override
                 public void onConfigurationChanged(Configuration overrideConfig,
@@ -2081,6 +2079,9 @@
             case BadForegroundServiceNotificationException.TYPE_ID:
                 throw new BadForegroundServiceNotificationException(message);
 
+            case BadUserInitiatedJobNotificationException.TYPE_ID:
+                throw new BadUserInitiatedJobNotificationException(message);
+
             case MissingRequestPasswordComplexityPermissionException.TYPE_ID:
                 throw new MissingRequestPasswordComplexityPermissionException(message);
 
@@ -2483,29 +2484,22 @@
     private class Idler implements MessageQueue.IdleHandler {
         @Override
         public final boolean queueIdle() {
-            ActivityClientRecord a = mNewActivities;
             boolean stopProfiling = false;
             if (mBoundApplication != null && mProfiler.profileFd != null
                     && mProfiler.autoStopProfiler) {
                 stopProfiling = true;
             }
-            if (a != null) {
-                mNewActivities = null;
-                final ActivityClient ac = ActivityClient.getInstance();
-                ActivityClientRecord prev;
-                do {
-                    if (localLOGV) Slog.v(
-                        TAG, "Reporting idle of " + a +
-                        " finished=" +
-                        (a.activity != null && a.activity.mFinished));
-                    if (a.activity != null && !a.activity.mFinished) {
-                        ac.activityIdle(a.token, a.createdConfig, stopProfiling);
-                        a.createdConfig = null;
-                    }
-                    prev = a;
-                    a = a.nextIdle;
-                    prev.nextIdle = null;
-                } while (a != null);
+            final ActivityClient ac = ActivityClient.getInstance();
+            while (mNewActivities.size() > 0) {
+                final ActivityClientRecord a = mNewActivities.remove(0);
+                if (localLOGV) {
+                    Slog.v(TAG, "Reporting idle of " + a + " finished="
+                            + (a.activity != null && a.activity.mFinished));
+                }
+                if (a.activity != null && !a.activity.mFinished) {
+                    ac.activityIdle(a.token, a.createdConfig, stopProfiling);
+                    a.createdConfig = null;
+                }
             }
             if (stopProfiling) {
                 mProfiler.stopProfiling();
@@ -5107,8 +5101,7 @@
             }
         }
 
-        r.nextIdle = mNewActivities;
-        mNewActivities = r;
+        mNewActivities.add(r);
         if (localLOGV) Slog.v(TAG, "Scheduling idle handler for " + r);
         Looper.myQueue().addIdleHandler(new Idler());
     }
@@ -5709,6 +5702,7 @@
         }
         if (finishing) {
             ActivityClient.getInstance().activityDestroyed(r.token);
+            mNewActivities.remove(r);
         }
         mSomeActivitiesChanged = true;
     }
@@ -5929,7 +5923,6 @@
         r.activity = null;
         r.window = null;
         r.hideForNow = false;
-        r.nextIdle = null;
         // Merge any pending results and pending intents; don't just replace them
         if (pendingResults != null) {
             if (r.pendingResults == null) {
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 265b564..b48a8fb 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -2188,7 +2188,10 @@
     public static final String OPSTR_CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD =
             "android:capture_consentless_bugreport_on_userdebug_build";
 
-    /** Access to wrist temperature body sensors. */
+    /**
+     * Access to wrist temperature body sensors.
+     * @hide
+     */
     public static final String OPSTR_BODY_SENSORS_WRIST_TEMPERATURE =
             "android:body_sensors_wrist_temperature";
 
diff --git a/core/java/android/app/ApplicationLoaders.java b/core/java/android/app/ApplicationLoaders.java
index 53b16d3..9cd99dc 100644
--- a/core/java/android/app/ApplicationLoaders.java
+++ b/core/java/android/app/ApplicationLoaders.java
@@ -157,15 +157,15 @@
      * All libraries in the closure of libraries to be loaded must be in libs. A library can
      * only depend on libraries that come before it in the list.
      */
-    public void createAndCacheNonBootclasspathSystemClassLoaders(SharedLibraryInfo[] libs) {
+    public void createAndCacheNonBootclasspathSystemClassLoaders(List<SharedLibraryInfo> libs) {
         if (mSystemLibsCacheMap != null) {
             throw new IllegalStateException("Already cached.");
         }
 
-        mSystemLibsCacheMap = new HashMap<String, CachedClassLoader>();
+        mSystemLibsCacheMap = new HashMap<>();
 
-        for (SharedLibraryInfo lib : libs) {
-            createAndCacheNonBootclasspathSystemClassLoader(lib);
+        for (int i = 0; i < libs.size(); i++) {
+            createAndCacheNonBootclasspathSystemClassLoader(libs.get(i));
         }
     }
 
diff --git a/core/java/android/app/IWallpaperManager.aidl b/core/java/android/app/IWallpaperManager.aidl
index f4373a6..ee24263 100644
--- a/core/java/android/app/IWallpaperManager.aidl
+++ b/core/java/android/app/IWallpaperManager.aidl
@@ -243,4 +243,11 @@
      * @hide
      */
     boolean lockScreenWallpaperExists();
+
+    /**
+     * Temporary method for project b/197814683.
+     * Return true if the lockscreen wallpaper always uses a WallpaperService, not a static image.
+     * @hide
+     */
+     boolean isLockscreenLiveWallpaperEnabled();
 }
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 7aedd30..f803739 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -722,6 +722,16 @@
      */
     public static final int FLAG_FSI_REQUESTED_BUT_DENIED = 0x00004000;
 
+    /**
+     * Bit to be bitwise-ored into the {@link #flags} field that should be
+     * set if this notification represents a currently running user-initiated job.
+     *
+     * This flag is for internal use only; applications cannot set this flag directly.
+     * @hide
+     */
+    @TestApi
+    public static final int FLAG_USER_INITIATED_JOB = 0x00008000;
+
     private static final List<Class<? extends Style>> PLATFORM_STYLE_CLASSES = Arrays.asList(
             BigTextStyle.class, BigPictureStyle.class, InboxStyle.class, MediaStyle.class,
             DecoratedCustomViewStyle.class, DecoratedMediaCustomViewStyle.class,
@@ -731,7 +741,8 @@
     @IntDef(flag = true, prefix = { "FLAG_" }, value = {FLAG_SHOW_LIGHTS, FLAG_ONGOING_EVENT,
             FLAG_INSISTENT, FLAG_ONLY_ALERT_ONCE,
             FLAG_AUTO_CANCEL, FLAG_NO_CLEAR, FLAG_FOREGROUND_SERVICE, FLAG_HIGH_PRIORITY,
-            FLAG_LOCAL_ONLY, FLAG_GROUP_SUMMARY, FLAG_AUTOGROUP_SUMMARY, FLAG_BUBBLE})
+            FLAG_LOCAL_ONLY, FLAG_GROUP_SUMMARY, FLAG_AUTOGROUP_SUMMARY, FLAG_BUBBLE,
+            FLAG_USER_INITIATED_JOB})
     @Retention(RetentionPolicy.SOURCE)
     public @interface NotificationFlags{};
 
@@ -4067,8 +4078,9 @@
          * notification if alerts for this notification's group should be handled by a different
          * notification. This is only applicable for notifications that belong to a
          * {@link #setGroup(String) group}. This must be called on all notifications you want to
-         * mute. For example, if you want only the summary of your group to make noise, all
-         * children in the group should have the group alert behavior {@link #GROUP_ALERT_SUMMARY}.
+         * mute. For example, if you want only the summary of your group to make noise and/or peek
+         * on screen, all children in the group should have the group alert behavior
+         * {@link #GROUP_ALERT_SUMMARY}.
          *
          * <p> The default value is {@link #GROUP_ALERT_ALL}.</p>
          */
@@ -5726,7 +5738,8 @@
         }
 
         private void bindSnoozeAction(RemoteViews big, StandardTemplateParams p) {
-            boolean hideSnoozeButton = mN.isForegroundService() || mN.fullScreenIntent != null
+            boolean hideSnoozeButton = mN.isFgsOrUij()
+                    || mN.fullScreenIntent != null
                     || isBackgroundColorized(p)
                     || p.mViewType != StandardTemplateParams.VIEW_TYPE_BIG;
             big.setBoolean(R.id.snooze_button, "setEnabled", !hideSnoozeButton);
@@ -6867,6 +6880,24 @@
     }
 
     /**
+     * @return whether this notification is associated with a user initiated job
+     * @hide
+     */
+    @TestApi
+    public boolean isUserInitiatedJob() {
+        return (flags & Notification.FLAG_USER_INITIATED_JOB) != 0;
+    }
+
+    /**
+     * @return whether this notification is associated with either a foreground service or
+     * a user initiated job
+     * @hide
+     */
+    public boolean isFgsOrUij() {
+        return isForegroundService() || isUserInitiatedJob();
+    }
+
+    /**
      * Describe whether this notification's content such that it should always display
      * immediately when tied to a foreground service, even if the system might generally
      * avoid showing the notifications for short-lived foreground service lifetimes.
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index 9615b68..746dcb6 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -32,7 +32,6 @@
 import android.provider.Settings;
 import android.service.notification.NotificationListenerService;
 import android.text.TextUtils;
-import android.util.Slog;
 import android.util.proto.ProtoOutputStream;
 
 import com.android.internal.util.Preconditions;
@@ -150,6 +149,10 @@
     private static final String ATT_CONTENT_TYPE = "content_type";
     private static final String ATT_SHOW_BADGE = "show_badge";
     private static final String ATT_USER_LOCKED = "locked";
+    /**
+     * This attribute represents both foreground services and user initiated jobs in U+.
+     * It was not renamed in U on purpose, in order to avoid creating an unnecessary migration path.
+     */
     private static final String ATT_FG_SERVICE_SHOWN = "fgservice";
     private static final String ATT_GROUP = "group";
     private static final String ATT_BLOCKABLE_SYSTEM = "blockable_system";
@@ -249,7 +252,7 @@
     // Bitwise representation of fields that have been changed by the user, preventing the app from
     // making changes to these fields.
     private int mUserLockedFields;
-    private boolean mFgServiceShown;
+    private boolean mUserVisibleTaskShown;
     private boolean mVibrationEnabled;
     private boolean mShowBadge = DEFAULT_SHOW_BADGE;
     private boolean mDeleted = DEFAULT_DELETED;
@@ -317,7 +320,7 @@
             mVibration = Arrays.copyOf(mVibration, MAX_VIBRATION_LENGTH);
         }
         mUserLockedFields = in.readInt();
-        mFgServiceShown = in.readByte() != 0;
+        mUserVisibleTaskShown = in.readByte() != 0;
         mVibrationEnabled = in.readByte() != 0;
         mShowBadge = in.readByte() != 0;
         mDeleted = in.readByte() != 0;
@@ -371,7 +374,7 @@
         dest.writeByte(mLights ? (byte) 1 : (byte) 0);
         dest.writeLongArray(mVibration);
         dest.writeInt(mUserLockedFields);
-        dest.writeByte(mFgServiceShown ? (byte) 1 : (byte) 0);
+        dest.writeByte(mUserVisibleTaskShown ? (byte) 1 : (byte) 0);
         dest.writeByte(mVibrationEnabled ? (byte) 1 : (byte) 0);
         dest.writeByte(mShowBadge ? (byte) 1 : (byte) 0);
         dest.writeByte(mDeleted ? (byte) 1 : (byte) 0);
@@ -418,8 +421,8 @@
      * @hide
      */
     @TestApi
-    public void setFgServiceShown(boolean shown) {
-        mFgServiceShown = shown;
+    public void setUserVisibleTaskShown(boolean shown) {
+        mUserVisibleTaskShown = shown;
     }
 
     /**
@@ -845,8 +848,8 @@
     /**
      * @hide
      */
-    public boolean isFgServiceShown() {
-        return mFgServiceShown;
+    public boolean isUserVisibleTaskShown() {
+        return mUserVisibleTaskShown;
     }
 
     /**
@@ -965,7 +968,7 @@
                 parser, ATT_DELETED_TIME_MS, DEFAULT_DELETION_TIME_MS));
         setGroup(parser.getAttributeValue(null, ATT_GROUP));
         lockFields(safeInt(parser, ATT_USER_LOCKED, 0));
-        setFgServiceShown(safeBool(parser, ATT_FG_SERVICE_SHOWN, false));
+        setUserVisibleTaskShown(safeBool(parser, ATT_FG_SERVICE_SHOWN, false));
         setBlockable(safeBool(parser, ATT_BLOCKABLE_SYSTEM, false));
         setAllowBubbles(safeInt(parser, ATT_ALLOW_BUBBLE, DEFAULT_ALLOW_BUBBLE));
         setOriginalImportance(safeInt(parser, ATT_ORIG_IMP, DEFAULT_IMPORTANCE));
@@ -1072,8 +1075,8 @@
         if (getUserLockedFields() != 0) {
             out.attributeInt(null, ATT_USER_LOCKED, getUserLockedFields());
         }
-        if (isFgServiceShown()) {
-            out.attributeBoolean(null, ATT_FG_SERVICE_SHOWN, isFgServiceShown());
+        if (isUserVisibleTaskShown()) {
+            out.attributeBoolean(null, ATT_FG_SERVICE_SHOWN, isUserVisibleTaskShown());
         }
         if (canShowBadge()) {
             out.attributeBoolean(null, ATT_SHOW_BADGE, canShowBadge());
@@ -1147,7 +1150,7 @@
         record.put(ATT_LIGHT_COLOR, Integer.toString(getLightColor()));
         record.put(ATT_VIBRATION_ENABLED, Boolean.toString(shouldVibrate()));
         record.put(ATT_USER_LOCKED, Integer.toString(getUserLockedFields()));
-        record.put(ATT_FG_SERVICE_SHOWN, Boolean.toString(isFgServiceShown()));
+        record.put(ATT_FG_SERVICE_SHOWN, Boolean.toString(isUserVisibleTaskShown()));
         record.put(ATT_VIBRATION, longArrayToString(getVibrationPattern()));
         record.put(ATT_SHOW_BADGE, Boolean.toString(canShowBadge()));
         record.put(ATT_DELETED, Boolean.toString(isDeleted()));
@@ -1239,7 +1242,7 @@
                 && mLights == that.mLights
                 && getLightColor() == that.getLightColor()
                 && getUserLockedFields() == that.getUserLockedFields()
-                && isFgServiceShown() == that.isFgServiceShown()
+                && isUserVisibleTaskShown() == that.isUserVisibleTaskShown()
                 && mVibrationEnabled == that.mVibrationEnabled
                 && mShowBadge == that.mShowBadge
                 && isDeleted() == that.isDeleted()
@@ -1265,8 +1268,8 @@
     public int hashCode() {
         int result = Objects.hash(getId(), getName(), mDesc, getImportance(), mBypassDnd,
                 getLockscreenVisibility(), getSound(), mLights, getLightColor(),
-                getUserLockedFields(),
-                isFgServiceShown(), mVibrationEnabled, mShowBadge, isDeleted(), getDeletedTimeMs(),
+                getUserLockedFields(), isUserVisibleTaskShown(),
+                mVibrationEnabled, mShowBadge, isDeleted(), getDeletedTimeMs(),
                 getGroup(), getAudioAttributes(), isBlockable(), mAllowBubbles,
                 mImportanceLockedDefaultApp, mOriginalImportance,
                 mParentId, mConversationId, mDemoted, mImportantConvo);
@@ -1304,7 +1307,7 @@
                 + ", mLightColor=" + mLightColor
                 + ", mVibration=" + Arrays.toString(mVibration)
                 + ", mUserLockedFields=" + Integer.toHexString(mUserLockedFields)
-                + ", mFgServiceShown=" + mFgServiceShown
+                + ", mUserVisibleTaskShown=" + mUserVisibleTaskShown
                 + ", mVibrationEnabled=" + mVibrationEnabled
                 + ", mShowBadge=" + mShowBadge
                 + ", mDeleted=" + mDeleted
@@ -1342,7 +1345,7 @@
             }
         }
         proto.write(NotificationChannelProto.USER_LOCKED_FIELDS, mUserLockedFields);
-        proto.write(NotificationChannelProto.FG_SERVICE_SHOWN, mFgServiceShown);
+        proto.write(NotificationChannelProto.USER_VISIBLE_TASK_SHOWN, mUserVisibleTaskShown);
         proto.write(NotificationChannelProto.IS_VIBRATION_ENABLED, mVibrationEnabled);
         proto.write(NotificationChannelProto.SHOW_BADGE, mShowBadge);
         proto.write(NotificationChannelProto.IS_DELETED, mDeleted);
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index d2f2c3c..80f64e0 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -726,8 +726,9 @@
      * Cancels a previously posted notification.
      *
      *  <p>If the notification does not currently represent a
-     *  {@link Service#startForeground(int, Notification) foreground service}, it will be
-     *  removed from the UI and live
+     *  {@link Service#startForeground(int, Notification) foreground service} or a
+     *  {@link android.app.job.JobInfo.Builder#setUserInitiated(boolean) user-initiated job},
+     *  it will be removed from the UI and live
      *  {@link android.service.notification.NotificationListenerService notification listeners}
      *  will be informed so they can remove the notification from their UIs.</p>
      */
@@ -740,8 +741,9 @@
      * Cancels a previously posted notification.
      *
      *  <p>If the notification does not currently represent a
-     *  {@link Service#startForeground(int, Notification) foreground service}, it will be
-     *  removed from the UI and live
+     *  {@link Service#startForeground(int, Notification) foreground service} or a
+     *  {@link android.app.job.JobInfo.Builder#setUserInitiated(boolean) user-initiated job},
+     *  it will be removed from the UI and live
      *  {@link android.service.notification.NotificationListenerService notification listeners}
      *  will be informed so they can remove the notification from their UIs.</p>
      */
@@ -754,8 +756,9 @@
      * Cancels a previously posted notification.
      *
      * <p>If the notification does not currently represent a
-     * {@link Service#startForeground(int, Notification) foreground service}, it will be
-     * removed from the UI and live
+     *  {@link Service#startForeground(int, Notification) foreground service} or a
+     *  {@link android.app.job.JobInfo.Builder#setUserInitiated(boolean) user-initiated job},
+     *  it will be removed from the UI and live
      * {@link android.service.notification.NotificationListenerService notification listeners}
      * will be informed so they can remove the notification from their UIs.</p>
      *
diff --git a/core/java/android/app/RemoteServiceException.java b/core/java/android/app/RemoteServiceException.java
index 620adbe..c5ad110 100644
--- a/core/java/android/app/RemoteServiceException.java
+++ b/core/java/android/app/RemoteServiceException.java
@@ -102,6 +102,21 @@
     }
 
     /**
+     * Exception used to crash an app process when the system finds an error in a user-initiated job
+     * notification.
+     *
+     * @hide
+     */
+    public static class BadUserInitiatedJobNotificationException extends RemoteServiceException {
+        /** The type ID passed to {@link IApplicationThread#scheduleCrash}. */
+        public static final int TYPE_ID = 6;
+
+        public BadUserInitiatedJobNotificationException(String msg) {
+            super(msg);
+        }
+    }
+
+    /**
      * Exception used to crash an app process when it calls a setting activity that requires
      * the {@code REQUEST_PASSWORD_COMPLEXITY} permission.
      *
diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java
index 29f774c..a6313db 100644
--- a/core/java/android/app/StatusBarManager.java
+++ b/core/java/android/app/StatusBarManager.java
@@ -46,6 +46,7 @@
 import android.os.UserHandle;
 import android.util.Pair;
 import android.util.Slog;
+import android.view.KeyEvent;
 import android.view.View;
 
 import com.android.internal.statusbar.AppClipsServiceConnector;
@@ -740,7 +741,7 @@
      */
     @RequiresPermission(android.Manifest.permission.STATUS_BAR)
     @TestApi
-    public void handleSystemKey(int key) {
+    public void handleSystemKey(@NonNull KeyEvent key) {
         try {
             final IStatusBarService svc = getService();
             if (svc != null) {
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index 86f6a93..658e084 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -46,6 +46,7 @@
 import android.os.SystemClock;
 import android.os.UserHandle;
 import android.util.ArraySet;
+import android.util.DebugUtils;
 import android.util.Log;
 import android.util.SparseArray;
 import android.view.Display;
@@ -111,6 +112,7 @@
     private static final String LOG_TAG = UiAutomation.class.getSimpleName();
 
     private static final boolean DEBUG = false;
+    private static final boolean VERBOSE = false;
 
     private static final int CONNECTION_ID_UNDEFINED = -1;
 
@@ -321,11 +323,18 @@
      * @hide
      */
     public void connectWithTimeout(int flags, long timeoutMillis) throws TimeoutException {
+        if (DEBUG) {
+            Log.d(LOG_TAG, "connectWithTimeout: user=" + Process.myUserHandle().getIdentifier()
+                    + ", flags=" + DebugUtils.flagsToString(UiAutomation.class, "FLAG_", flags)
+                    + ", timeout=" + timeoutMillis + "ms");
+        }
         synchronized (mLock) {
             throwIfConnectedLocked();
             if (mConnectionState == ConnectionState.CONNECTING) {
+                if (DEBUG) Log.d(LOG_TAG, "already connecting");
                 return;
             }
+            if (DEBUG) Log.d(LOG_TAG, "setting state to CONNECTING");
             mConnectionState = ConnectionState.CONNECTING;
             mRemoteCallbackThread = new HandlerThread("UiAutomation");
             mRemoteCallbackThread.start();
@@ -341,6 +350,7 @@
             // If UiAutomation is not allowed to use the accessibility subsystem, the
             // connection state should keep disconnected and not to start the client connection.
             if (!useAccessibility()) {
+                if (DEBUG) Log.d(LOG_TAG, "setting state to DISCONNECTED");
                 mConnectionState = ConnectionState.DISCONNECTED;
                 return;
             }
@@ -357,6 +367,7 @@
                 final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
                 final long remainingTimeMillis = timeoutMillis - elapsedTimeMillis;
                 if (remainingTimeMillis <= 0) {
+                    if (DEBUG) Log.d(LOG_TAG, "setting state to FAILED");
                     mConnectionState = ConnectionState.FAILED;
                     throw new TimeoutException("Timeout while connecting " + this);
                 }
@@ -1367,7 +1378,8 @@
             UserHandle userHandle) {
         try {
             if (DEBUG) {
-                Log.i(LOG_TAG, "Granting runtime permission");
+                Log.i(LOG_TAG, "Granting runtime permission (" + permission + ") to package "
+                        + packageName + " on user " + userHandle);
             }
             // Calling out without a lock held.
             mUiAutomationConnection.grantRuntimePermission(packageName,
@@ -1592,7 +1604,7 @@
     private class IAccessibilityServiceClientImpl extends IAccessibilityServiceClientWrapper {
 
         public IAccessibilityServiceClientImpl(Looper looper, int generationId) {
-            super(null, looper, new Callbacks() {
+            super(/* context= */ null, looper, new Callbacks() {
                 private final int mGenerationId = generationId;
 
                 /**
@@ -1606,10 +1618,21 @@
 
                 @Override
                 public void init(int connectionId, IBinder windowToken) {
+                    if (DEBUG) {
+                        Log.d(LOG_TAG, "init(): connectionId=" + connectionId + ", windowToken="
+                                + windowToken + ", user=" + Process.myUserHandle()
+                                + ", mGenerationId=" + mGenerationId
+                                + ", UiAutomation.mGenerationId="
+                                + UiAutomation.this.mGenerationId);
+                    }
                     synchronized (mLock) {
                         if (isGenerationChangedLocked()) {
+                            if (DEBUG) {
+                                Log.d(LOG_TAG, "init(): returning because generation id changed");
+                            }
                             return;
                         }
+                        if (DEBUG) Log.d(LOG_TAG, "setting state to CONNECTED");
                         mConnectionState = ConnectionState.CONNECTED;
                         mConnectionId = connectionId;
                         mLock.notifyAll();
@@ -1662,9 +1685,20 @@
 
                 @Override
                 public void onAccessibilityEvent(AccessibilityEvent event) {
+                    if (VERBOSE) {
+                        Log.v(LOG_TAG, "onAccessibilityEvent(" + Process.myUserHandle() + "): "
+                                + event);
+                    }
+
                     final OnAccessibilityEventListener listener;
                     synchronized (mLock) {
                         if (isGenerationChangedLocked()) {
+                            if (VERBOSE) {
+                                Log.v(LOG_TAG, "onAccessibilityEvent(): returning because "
+                                        + "generation id changed (from "
+                                        + UiAutomation.this.mGenerationId + " to "
+                                        + mGenerationId + ")");
+                            }
                             return;
                         }
                         // It is not guaranteed that the accessibility framework sends events by the
diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java
index 3a32f23..13e800e 100644
--- a/core/java/android/app/UiAutomationConnection.java
+++ b/core/java/android/app/UiAutomationConnection.java
@@ -103,6 +103,7 @@
 
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public UiAutomationConnection() {
+        Log.d(TAG, "Created on user " + Process.myUserHandle());
     }
 
     @Override
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 4d55fee..ebd525e 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -142,9 +142,6 @@
     private static final @NonNull RectF LOCAL_COLOR_BOUNDS =
             new RectF(0, 0, 1, 1);
 
-    /** Temporary feature flag for project b/197814683 */
-    private final boolean mLockscreenLiveWallpaper;
-
     /** {@hide} */
     private static final String PROP_WALLPAPER = "ro.config.wallpaper";
     /** {@hide} */
@@ -306,6 +303,7 @@
     private final Context mContext;
     private final boolean mWcgEnabled;
     private final ColorManagementProxy mCmProxy;
+    private Boolean mIsLockscreenLiveWallpaperEnabled = null;
 
     /**
      * Special drawable that draws a wallpaper as fast as possible.  Assumes
@@ -794,8 +792,6 @@
         mWcgEnabled = context.getResources().getConfiguration().isScreenWideColorGamut()
                 && context.getResources().getBoolean(R.bool.config_enableWcgMode);
         mCmProxy = new ColorManagementProxy(context);
-        mLockscreenLiveWallpaper = context.getResources()
-                .getBoolean(R.bool.config_independentLockscreenLiveWallpaper);
     }
 
     // no-op constructor called just by DisabledWallpaperManager
@@ -803,7 +799,6 @@
         mContext = null;
         mCmProxy = null;
         mWcgEnabled = false;
-        mLockscreenLiveWallpaper = false;
     }
 
     /**
@@ -827,7 +822,19 @@
      */
     @TestApi
     public boolean isLockscreenLiveWallpaperEnabled() {
-        return mLockscreenLiveWallpaper;
+        if (sGlobals == null) {
+            mIsLockscreenLiveWallpaperEnabled = SystemProperties.getBoolean(
+                    "persist.wm.debug.lockscreen_live_wallpaper", false);
+        }
+        if (mIsLockscreenLiveWallpaperEnabled == null) {
+            try {
+                mIsLockscreenLiveWallpaperEnabled =
+                        sGlobals.mService.isLockscreenLiveWallpaperEnabled();
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
+        }
+        return mIsLockscreenLiveWallpaperEnabled;
     }
 
     /**
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index bad6c77..4d3338b 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -6413,7 +6413,7 @@
     public void lockNow(@LockNowFlag int flags) {
         if (mService != null) {
             try {
-                mService.lockNow(flags, mParentInstance);
+                mService.lockNow(flags, mContext.getPackageName(), mParentInstance);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -9634,7 +9634,8 @@
      * @see #isProfileOwnerApp
      * @see #isDeviceOwnerApp
      * @param admin Which {@link DeviceAdminReceiver} this request is associate with.
-     * @param profileName The name of the profile.
+     * @param profileName The name of the profile. If the name is longer than 200 characters
+     *                    it will be truncated.
      * @throws SecurityException if {@code admin} is not a device or profile owner.
      */
     public void setProfileName(@NonNull ComponentName admin, String profileName) {
@@ -13646,8 +13647,8 @@
      * privacy-sensitive events happening outside the managed profile would have been redacted
      * already.
      *
-     * @param admin Which device admin this request is associated with. Null if the caller is not
-     *              a device admin
+     * @param admin Which device admin this request is associated with, or {@code null}
+     *              if called by a delegated app.
      * @param enabled whether security logging should be enabled or not.
      * @throws SecurityException if the caller is not permitted to control security logging.
      * @see #setAffiliationIds
@@ -13699,8 +13700,8 @@
      * it must be affiliated with the device. Otherwise a {@link SecurityException} will be thrown.
      * See {@link #isAffiliatedUser}.
      *
-     * @param admin Which device admin this request is associated with. Null if the caller is not
-     *              a device admin.
+     * @param admin Which device admin this request is associated with, or {@code null}
+     *              if called by a delegated app.
      * @return the new batch of security logs which is a list of {@link SecurityEvent},
      * or {@code null} if rate limitation is exceeded or if logging is currently disabled.
      * @throws SecurityException if the caller is not allowed to access security logging,
@@ -13857,8 +13858,8 @@
      * it must be affiliated with the device. Otherwise a {@link SecurityException} will be thrown.
      * See {@link #isAffiliatedUser}.
      *
-     * @param admin Which device admin this request is associated with. Null if the caller is not
-     *              a device admin.
+     * @param admin Which device admin this request is associated with, or {@code null}
+     *             if called by a delegated app.
      * @return Device logs from before the latest reboot of the system, or {@code null} if this API
      *         is not supported on the device.
      * @throws SecurityException if the caller is not allowed to access security logging, or
diff --git a/core/java/android/app/admin/DevicePolicyResources.java b/core/java/android/app/admin/DevicePolicyResources.java
index a498913..052f670 100644
--- a/core/java/android/app/admin/DevicePolicyResources.java
+++ b/core/java/android/app/admin/DevicePolicyResources.java
@@ -1802,14 +1802,6 @@
                     PREFIX + "UNLAUNCHABLE_APP_WORK_PAUSED_TITLE";
 
             /**
-             * Text for dialog shown when user tries to open a work app when the work profile is
-             * turned off, confirming that the user wants to turn on access to their
-             * work apps.
-             */
-            public static final String UNLAUNCHABLE_APP_WORK_PAUSED_MESSAGE =
-                    PREFIX + "UNLAUNCHABLE_APP_WORK_PAUSED_MESSAGE";
-
-            /**
              * Notification title shown when work profile is credential encrypted and requires
              * the user to unlock before it's usable.
              */
@@ -1857,6 +1849,17 @@
             public static final String WORK_PROFILE_TELEPHONY_PAUSED_TURN_ON_BUTTON =
                     PREFIX + "TURN_ON_WORK_PROFILE_BUTTON_TEXT";
 
+            public static final String MINIRESOLVER_OPEN_IN_WORK =
+                    PREFIX + "MINIRESOLVER_OPEN_IN_WORK";
+
+            public static final String MINIRESOLVER_OPEN_IN_PERSONAL =
+                    PREFIX + "MINIRESOLVER_OPEN_IN_PERSONAL";
+
+            public static final String MINIRESOLVER_USE_WORK_BROWSER =
+                    PREFIX + "MINIRESOLVER_OPEN_IN_PERSONAL";
+
+            public static final String MINIRESOLVER_USE_PERSONAL_BROWSER =
+                    PREFIX + "MINIRESOLVER_OPEN_IN_PERSONAL";
         }
 
         /**
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 8d508c0..9b0b18a 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -119,7 +119,7 @@
     void setRequiredStrongAuthTimeout(in ComponentName who, String callerPackageName, long timeMs, boolean parent);
     long getRequiredStrongAuthTimeout(in ComponentName who, int userId, boolean parent);
 
-    void lockNow(int flags, boolean parent);
+    void lockNow(int flags, String callerPackageName, boolean parent);
 
     /**
     * @param factoryReset only applicable when `targetSdk >= U`, either tries to factoryReset/fail or removeUser/fail otherwise
diff --git a/core/java/android/app/search/SearchTarget.java b/core/java/android/app/search/SearchTarget.java
index a3874f7..8132b81 100644
--- a/core/java/android/app/search/SearchTarget.java
+++ b/core/java/android/app/search/SearchTarget.java
@@ -186,16 +186,6 @@
         mAppWidgetProviderInfo = appWidgetProviderInfo;
         mSliceUri = sliceUri;
         mExtras = extras != null ? extras : new Bundle();
-
-        int published = 0;
-        if (mSearchAction != null) published++;
-        if (mShortcutInfo != null) published++;
-        if (mAppWidgetProviderInfo != null) published++;
-        if (mSliceUri != null) published++;
-        if (published > 1) {
-            throw new IllegalStateException("Only one of SearchAction, ShortcutInfo,"
-                    + " AppWidgetProviderInfo, SliceUri can be assigned in a SearchTarget.");
-        }
     }
 
     /**
diff --git a/core/java/android/companion/virtual/IVirtualDevice.aidl b/core/java/android/companion/virtual/IVirtualDevice.aidl
index 12882a2..9efdf28 100644
--- a/core/java/android/companion/virtual/IVirtualDevice.aidl
+++ b/core/java/android/companion/virtual/IVirtualDevice.aidl
@@ -39,21 +39,22 @@
 import android.os.ResultReceiver;
 
 /**
- * Interface for a virtual device.
+ * Interface for a virtual device for communication between the system server and the process of
+ * the owner of the virtual device.
  *
  * @hide
  */
 interface IVirtualDevice {
 
     /**
-     * Returns the association ID for this virtual device.
+     * Returns the CDM association ID of this virtual device.
      *
      * @see AssociationInfo#getId()
      */
     int getAssociationId();
 
     /**
-     * Returns the unique device ID for this virtual device.
+     * Returns the unique ID of this virtual device.
      */
     int getDeviceId();
 
@@ -64,55 +65,99 @@
     void close();
 
     /**
-     * Notifies of an audio session being started.
+     * Notifies that an audio session being started.
      */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
-    void onAudioSessionStarting(
-            int displayId,
-            IAudioRoutingCallback routingCallback,
+    void onAudioSessionStarting(int displayId, IAudioRoutingCallback routingCallback,
             IAudioConfigChangedCallback configChangedCallback);
 
+    /**
+     * Notifies that an audio session has ended.
+     */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     void onAudioSessionEnded();
 
+    /**
+     * Creates a new dpad and registers it with the input framework with the given token.
+     */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
-    void createVirtualDpad(
-            in VirtualDpadConfig config,
-            IBinder token);
+    void createVirtualDpad(in VirtualDpadConfig config, IBinder token);
+
+    /**
+     * Creates a new keyboard and registers it with the input framework with the given token.
+     */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
-    void createVirtualKeyboard(
-            in VirtualKeyboardConfig config,
-            IBinder token);
+    void createVirtualKeyboard(in VirtualKeyboardConfig config, IBinder token);
+
+    /**
+     * Creates a new mouse and registers it with the input framework with the given token.
+     */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
-    void createVirtualMouse(
-            in VirtualMouseConfig config,
-            IBinder token);
+    void createVirtualMouse(in VirtualMouseConfig config, IBinder token);
+
+    /**
+     * Creates a new touchscreen and registers it with the input framework with the given token.
+     */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
-    void createVirtualTouchscreen(
-            in VirtualTouchscreenConfig config,
-            IBinder token);
+    void createVirtualTouchscreen(in VirtualTouchscreenConfig config, IBinder token);
+
+    /**
+     * Creates a new navigation touchpad and registers it with the input framework with the given
+     * token.
+     */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
-    void createVirtualNavigationTouchpad(
-            in VirtualNavigationTouchpadConfig config,
-            IBinder token);
+    void createVirtualNavigationTouchpad(in VirtualNavigationTouchpadConfig config, IBinder token);
+
+    /**
+     * Removes the input device corresponding to the given token from the framework.
+     */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     void unregisterInputDevice(IBinder token);
+
+    /**
+     * Returns the ID of the device corresponding to the given token, as registered with the input
+     * framework.
+     */
     int getInputDeviceId(IBinder token);
+
+    /**
+    * Injects a key event to the virtual dpad corresponding to the given token.
+    */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     boolean sendDpadKeyEvent(IBinder token, in VirtualKeyEvent event);
+
+    /**
+    * Injects a key event to the virtual keyboard corresponding to the given token.
+    */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     boolean sendKeyEvent(IBinder token, in VirtualKeyEvent event);
+
+    /**
+    * Injects a button event to the virtual mouse corresponding to the given token.
+    */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     boolean sendButtonEvent(IBinder token, in VirtualMouseButtonEvent event);
+
+    /**
+    * Injects a relative event to the virtual mouse corresponding to the given token.
+    */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     boolean sendRelativeEvent(IBinder token, in VirtualMouseRelativeEvent event);
+
+    /**
+    * Injects a scroll event to the virtual mouse corresponding to the given token.
+    */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     boolean sendScrollEvent(IBinder token, in VirtualMouseScrollEvent event);
+
+    /**
+    * Injects a touch event to the virtual touch input device corresponding to the given token.
+    */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     boolean sendTouchEvent(IBinder token, in VirtualTouchEvent event);
 
     /**
-     * Returns all virtual sensors for this device.
+     * Returns all virtual sensors created for this device.
      */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     List<VirtualSensor> getVirtualSensorList();
@@ -126,8 +171,13 @@
     /**
      * Launches a pending intent on the given display that is owned by this virtual device.
      */
-    void launchPendingIntent(
-            int displayId, in PendingIntent pendingIntent, in ResultReceiver resultReceiver);
+    void launchPendingIntent(int displayId, in PendingIntent pendingIntent,
+            in ResultReceiver resultReceiver);
+
+    /**
+     * Returns the current cursor position of the mouse corresponding to the given token, in x and y
+     * coordinates.
+     */
     PointF getCursorPosition(IBinder token);
 
     /** Sets whether to show or hide the cursor while this virtual device is active. */
@@ -140,8 +190,12 @@
      * intent.
      */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
-    void registerIntentInterceptor(
-            in IVirtualDeviceIntentInterceptor intentInterceptor, in IntentFilter filter);
+    void registerIntentInterceptor(in IVirtualDeviceIntentInterceptor intentInterceptor,
+            in IntentFilter filter);
+
+    /**
+     * Unregisters a previously registered intent interceptor.
+     */
     @EnforcePermission("CREATE_VIRTUAL_DEVICE")
     void unregisterIntentInterceptor(in IVirtualDeviceIntentInterceptor intentInterceptor);
 }
diff --git a/core/java/android/companion/virtual/IVirtualDeviceManager.aidl b/core/java/android/companion/virtual/IVirtualDeviceManager.aidl
index 4f49b8d..07743cef5 100644
--- a/core/java/android/companion/virtual/IVirtualDeviceManager.aidl
+++ b/core/java/android/companion/virtual/IVirtualDeviceManager.aidl
@@ -101,7 +101,7 @@
      *
      * @param deviceId id of the virtual device.
      * @param sound effect type corresponding to
-     *     {@code android.media.AudioManager.SystemSoundEffect}
+     *   {@code android.media.AudioManager.SystemSoundEffect}
      */
     void playSoundEffect(int deviceId, int effectType);
 }
diff --git a/core/java/android/companion/virtual/IVirtualDeviceSoundEffectListener.aidl b/core/java/android/companion/virtual/IVirtualDeviceSoundEffectListener.aidl
index 91c209f..f284554 100644
--- a/core/java/android/companion/virtual/IVirtualDeviceSoundEffectListener.aidl
+++ b/core/java/android/companion/virtual/IVirtualDeviceSoundEffectListener.aidl
@@ -28,7 +28,7 @@
      * Called when there's sound effect to be played on Virtual Device.
      *
      * @param sound effect type corresponding to
-     *     {@code android.media.AudioManager.SystemSoundEffect}
+     *   {@code android.media.AudioManager.SystemSoundEffect}
      */
     void onPlaySoundEffect(int effectType);
 }
diff --git a/core/java/android/companion/virtual/VirtualDevice.java b/core/java/android/companion/virtual/VirtualDevice.java
index 4a09186..4ee65e0 100644
--- a/core/java/android/companion/virtual/VirtualDevice.java
+++ b/core/java/android/companion/virtual/VirtualDevice.java
@@ -26,6 +26,11 @@
 
 /**
  * Details of a particular virtual device.
+ *
+ * <p>Read-only device representation exposing the properties of an existing virtual device.
+ *
+ * <p class="note">Not to be confused with {@link VirtualDeviceManager.VirtualDevice}, which is used
+ * by the virtual device creator and allows them to manage the device.
  */
 public final class VirtualDevice implements Parcelable {
 
diff --git a/core/java/android/companion/virtual/VirtualDeviceInternal.java b/core/java/android/companion/virtual/VirtualDeviceInternal.java
new file mode 100644
index 0000000..045e4c6
--- /dev/null
+++ b/core/java/android/companion/virtual/VirtualDeviceInternal.java
@@ -0,0 +1,458 @@
+/*
+ * 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.companion.virtual;
+
+import android.annotation.CallbackExecutor;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.app.PendingIntent;
+import android.companion.virtual.audio.VirtualAudioDevice;
+import android.companion.virtual.sensor.VirtualSensor;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.hardware.display.DisplayManagerGlobal;
+import android.hardware.display.IVirtualDisplayCallback;
+import android.hardware.display.VirtualDisplay;
+import android.hardware.display.VirtualDisplayConfig;
+import android.hardware.input.VirtualDpad;
+import android.hardware.input.VirtualDpadConfig;
+import android.hardware.input.VirtualKeyboard;
+import android.hardware.input.VirtualKeyboardConfig;
+import android.hardware.input.VirtualMouse;
+import android.hardware.input.VirtualMouseConfig;
+import android.hardware.input.VirtualNavigationTouchpad;
+import android.hardware.input.VirtualNavigationTouchpadConfig;
+import android.hardware.input.VirtualTouchscreen;
+import android.hardware.input.VirtualTouchscreenConfig;
+import android.media.AudioManager;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.util.ArrayMap;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.Executor;
+import java.util.function.IntConsumer;
+
+/**
+ * An internal representation of a virtual device.
+ *
+ * @hide
+ */
+public class VirtualDeviceInternal {
+
+    private final Context mContext;
+    private final IVirtualDeviceManager mService;
+    private final IVirtualDevice mVirtualDevice;
+    private final Object mActivityListenersLock = new Object();
+    @GuardedBy("mActivityListenersLock")
+    private final ArrayMap<VirtualDeviceManager.ActivityListener, ActivityListenerDelegate>
+            mActivityListeners =
+            new ArrayMap<>();
+    private final Object mIntentInterceptorListenersLock = new Object();
+    @GuardedBy("mIntentInterceptorListenersLock")
+    private final ArrayMap<VirtualDeviceManager.IntentInterceptorCallback,
+            IntentInterceptorDelegate> mIntentInterceptorListeners =
+            new ArrayMap<>();
+    private final Object mSoundEffectListenersLock = new Object();
+    @GuardedBy("mSoundEffectListenersLock")
+    private final ArrayMap<VirtualDeviceManager.SoundEffectListener, SoundEffectListenerDelegate>
+            mSoundEffectListeners = new ArrayMap<>();
+    private final IVirtualDeviceActivityListener mActivityListenerBinder =
+            new IVirtualDeviceActivityListener.Stub() {
+
+                @Override
+                public void onTopActivityChanged(int displayId, ComponentName topActivity,
+                        @UserIdInt int userId) {
+                    final long token = Binder.clearCallingIdentity();
+                    try {
+                        synchronized (mActivityListenersLock) {
+                            for (int i = 0; i < mActivityListeners.size(); i++) {
+                                mActivityListeners.valueAt(i)
+                                        .onTopActivityChanged(displayId, topActivity);
+                                mActivityListeners.valueAt(i)
+                                        .onTopActivityChanged(displayId, topActivity, userId);
+                            }
+                        }
+                    } finally {
+                        Binder.restoreCallingIdentity(token);
+                    }
+                }
+
+                @Override
+                public void onDisplayEmpty(int displayId) {
+                    final long token = Binder.clearCallingIdentity();
+                    try {
+                        synchronized (mActivityListenersLock) {
+                            for (int i = 0; i < mActivityListeners.size(); i++) {
+                                mActivityListeners.valueAt(i).onDisplayEmpty(displayId);
+                            }
+                        }
+                    } finally {
+                        Binder.restoreCallingIdentity(token);
+                    }
+                }
+            };
+    private final IVirtualDeviceSoundEffectListener mSoundEffectListener =
+            new IVirtualDeviceSoundEffectListener.Stub() {
+                @Override
+                public void onPlaySoundEffect(int soundEffect) {
+                    final long token = Binder.clearCallingIdentity();
+                    try {
+                        synchronized (mSoundEffectListenersLock) {
+                            for (int i = 0; i < mSoundEffectListeners.size(); i++) {
+                                mSoundEffectListeners.valueAt(i).onPlaySoundEffect(soundEffect);
+                            }
+                        }
+                    } finally {
+                        Binder.restoreCallingIdentity(token);
+                    }
+                }
+            };
+    @Nullable
+    private VirtualAudioDevice mVirtualAudioDevice;
+
+    VirtualDeviceInternal(
+            IVirtualDeviceManager service,
+            Context context,
+            int associationId,
+            VirtualDeviceParams params) throws RemoteException {
+        mService = service;
+        mContext = context.getApplicationContext();
+        mVirtualDevice = service.createVirtualDevice(
+                new Binder(),
+                mContext.getPackageName(),
+                associationId,
+                params,
+                mActivityListenerBinder,
+                mSoundEffectListener);
+    }
+
+    int getDeviceId() {
+        try {
+            return mVirtualDevice.getDeviceId();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    @NonNull Context createContext() {
+        try {
+            return mContext.createDeviceContext(mVirtualDevice.getDeviceId());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    @NonNull
+    List<VirtualSensor> getVirtualSensorList() {
+        try {
+            return mVirtualDevice.getVirtualSensorList();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    void launchPendingIntent(
+            int displayId,
+            @NonNull PendingIntent pendingIntent,
+            @NonNull Executor executor,
+            @NonNull IntConsumer listener) {
+        try {
+            mVirtualDevice.launchPendingIntent(
+                    displayId,
+                    pendingIntent,
+                    new ResultReceiver(new Handler(Looper.getMainLooper())) {
+                        @Override
+                        protected void onReceiveResult(int resultCode, Bundle resultData) {
+                            super.onReceiveResult(resultCode, resultData);
+                            executor.execute(() -> listener.accept(resultCode));
+                        }
+                    });
+        } catch (RemoteException e) {
+            e.rethrowFromSystemServer();
+        }
+    }
+
+    @Nullable
+    VirtualDisplay createVirtualDisplay(
+            @NonNull VirtualDisplayConfig config,
+            @Nullable @CallbackExecutor Executor executor,
+            @Nullable VirtualDisplay.Callback callback) {
+        IVirtualDisplayCallback callbackWrapper =
+                new DisplayManagerGlobal.VirtualDisplayCallback(callback, executor);
+        final int displayId;
+        try {
+            displayId = mService.createVirtualDisplay(config, callbackWrapper, mVirtualDevice,
+                    mContext.getPackageName());
+        } catch (RemoteException ex) {
+            throw ex.rethrowFromSystemServer();
+        }
+        DisplayManagerGlobal displayManager = DisplayManagerGlobal.getInstance();
+        return displayManager.createVirtualDisplayWrapper(config, callbackWrapper,
+                displayId);
+    }
+
+    void close() {
+        try {
+            // This also takes care of unregistering all virtual sensors.
+            mVirtualDevice.close();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+        if (mVirtualAudioDevice != null) {
+            mVirtualAudioDevice.close();
+            mVirtualAudioDevice = null;
+        }
+    }
+
+    @NonNull
+    VirtualDpad createVirtualDpad(@NonNull VirtualDpadConfig config) {
+        try {
+            final IBinder token = new Binder(
+                    "android.hardware.input.VirtualDpad:" + config.getInputDeviceName());
+            mVirtualDevice.createVirtualDpad(config, token);
+            return new VirtualDpad(mVirtualDevice, token);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    @NonNull
+    VirtualKeyboard createVirtualKeyboard(@NonNull VirtualKeyboardConfig config) {
+        try {
+            final IBinder token = new Binder(
+                    "android.hardware.input.VirtualKeyboard:" + config.getInputDeviceName());
+            mVirtualDevice.createVirtualKeyboard(config, token);
+            return new VirtualKeyboard(mVirtualDevice, token);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    @NonNull
+    VirtualMouse createVirtualMouse(@NonNull VirtualMouseConfig config) {
+        try {
+            final IBinder token = new Binder(
+                    "android.hardware.input.VirtualMouse:" + config.getInputDeviceName());
+            mVirtualDevice.createVirtualMouse(config, token);
+            return new VirtualMouse(mVirtualDevice, token);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    @NonNull
+    VirtualTouchscreen createVirtualTouchscreen(
+            @NonNull VirtualTouchscreenConfig config) {
+        try {
+            final IBinder token = new Binder(
+                    "android.hardware.input.VirtualTouchscreen:" + config.getInputDeviceName());
+            mVirtualDevice.createVirtualTouchscreen(config, token);
+            return new VirtualTouchscreen(mVirtualDevice, token);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    @NonNull
+    VirtualNavigationTouchpad createVirtualNavigationTouchpad(
+            @NonNull VirtualNavigationTouchpadConfig config) {
+        try {
+            final IBinder token = new Binder(
+                    "android.hardware.input.VirtualNavigationTouchpad:"
+                            + config.getInputDeviceName());
+            mVirtualDevice.createVirtualNavigationTouchpad(config, token);
+            return new VirtualNavigationTouchpad(mVirtualDevice, token);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    @NonNull
+    VirtualAudioDevice createVirtualAudioDevice(
+            @NonNull VirtualDisplay display,
+            @Nullable Executor executor,
+            @Nullable VirtualAudioDevice.AudioConfigurationChangeCallback callback) {
+        if (mVirtualAudioDevice == null) {
+            mVirtualAudioDevice = new VirtualAudioDevice(mContext, mVirtualDevice, display,
+                    executor, callback, () -> mVirtualAudioDevice = null);
+        }
+        return mVirtualAudioDevice;
+    }
+
+    @NonNull
+    void setShowPointerIcon(boolean showPointerIcon) {
+        try {
+            mVirtualDevice.setShowPointerIcon(showPointerIcon);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    void addActivityListener(
+            @CallbackExecutor @NonNull Executor executor,
+            @NonNull VirtualDeviceManager.ActivityListener listener) {
+        final ActivityListenerDelegate delegate = new ActivityListenerDelegate(
+                Objects.requireNonNull(listener), Objects.requireNonNull(executor));
+        synchronized (mActivityListenersLock) {
+            mActivityListeners.put(listener, delegate);
+        }
+    }
+
+    void removeActivityListener(@NonNull VirtualDeviceManager.ActivityListener listener) {
+        synchronized (mActivityListenersLock) {
+            mActivityListeners.remove(Objects.requireNonNull(listener));
+        }
+    }
+
+    void addSoundEffectListener(@CallbackExecutor @NonNull Executor executor,
+            @NonNull VirtualDeviceManager.SoundEffectListener soundEffectListener) {
+        final SoundEffectListenerDelegate delegate =
+                new SoundEffectListenerDelegate(Objects.requireNonNull(executor),
+                        Objects.requireNonNull(soundEffectListener));
+        synchronized (mSoundEffectListenersLock) {
+            mSoundEffectListeners.put(soundEffectListener, delegate);
+        }
+    }
+
+    void removeSoundEffectListener(
+            @NonNull VirtualDeviceManager.SoundEffectListener soundEffectListener) {
+        synchronized (mSoundEffectListenersLock) {
+            mSoundEffectListeners.remove(Objects.requireNonNull(soundEffectListener));
+        }
+    }
+
+    void registerIntentInterceptor(
+            @NonNull IntentFilter interceptorFilter,
+            @CallbackExecutor @NonNull Executor executor,
+            @NonNull VirtualDeviceManager.IntentInterceptorCallback interceptorCallback) {
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(interceptorFilter);
+        Objects.requireNonNull(interceptorCallback);
+        final IntentInterceptorDelegate delegate =
+                new IntentInterceptorDelegate(executor, interceptorCallback);
+        try {
+            mVirtualDevice.registerIntentInterceptor(delegate, interceptorFilter);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+        synchronized (mIntentInterceptorListenersLock) {
+            mIntentInterceptorListeners.put(interceptorCallback, delegate);
+        }
+    }
+
+    void unregisterIntentInterceptor(
+            @NonNull VirtualDeviceManager.IntentInterceptorCallback interceptorCallback) {
+        Objects.requireNonNull(interceptorCallback);
+        final IntentInterceptorDelegate delegate;
+        synchronized (mIntentInterceptorListenersLock) {
+            delegate = mIntentInterceptorListeners.remove(interceptorCallback);
+        }
+        if (delegate != null) {
+            try {
+                mVirtualDevice.unregisterIntentInterceptor(delegate);
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
+        }
+    }
+
+    /**
+     * A wrapper for {@link VirtualDeviceManager.ActivityListener} that executes callbacks on the
+     * given executor.
+     */
+    private static class ActivityListenerDelegate {
+        @NonNull private final VirtualDeviceManager.ActivityListener mActivityListener;
+        @NonNull private final Executor mExecutor;
+
+        ActivityListenerDelegate(@NonNull VirtualDeviceManager.ActivityListener listener,
+                @NonNull Executor executor) {
+            mActivityListener = listener;
+            mExecutor = executor;
+        }
+
+        public void onTopActivityChanged(int displayId, ComponentName topActivity) {
+            mExecutor.execute(() -> mActivityListener.onTopActivityChanged(displayId, topActivity));
+        }
+
+        public void onTopActivityChanged(int displayId, ComponentName topActivity,
+                @UserIdInt int userId) {
+            mExecutor.execute(() ->
+                    mActivityListener.onTopActivityChanged(displayId, topActivity, userId));
+        }
+
+        public void onDisplayEmpty(int displayId) {
+            mExecutor.execute(() -> mActivityListener.onDisplayEmpty(displayId));
+        }
+    }
+
+    /**
+     * A wrapper for {@link VirtualDeviceManager.IntentInterceptorCallback} that executes callbacks
+     * on the given executor.
+     */
+    private static class IntentInterceptorDelegate extends IVirtualDeviceIntentInterceptor.Stub {
+        @NonNull private final VirtualDeviceManager.IntentInterceptorCallback
+                mIntentInterceptorCallback;
+        @NonNull private final Executor mExecutor;
+
+        private IntentInterceptorDelegate(Executor executor,
+                VirtualDeviceManager.IntentInterceptorCallback interceptorCallback) {
+            mExecutor = executor;
+            mIntentInterceptorCallback = interceptorCallback;
+        }
+
+        @Override
+        public void onIntentIntercepted(Intent intent) {
+            final long token = Binder.clearCallingIdentity();
+            try {
+                mExecutor.execute(() -> mIntentInterceptorCallback.onIntentIntercepted(intent));
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+    }
+
+    /**
+     * A wrapper for {@link VirtualDeviceManager.SoundEffectListener} that executes callbacks on the
+     * given executor.
+     */
+    private static class SoundEffectListenerDelegate {
+        @NonNull private final VirtualDeviceManager.SoundEffectListener mSoundEffectListener;
+        @NonNull private final Executor mExecutor;
+
+        private SoundEffectListenerDelegate(Executor executor,
+                VirtualDeviceManager.SoundEffectListener soundEffectCallback) {
+            mSoundEffectListener = soundEffectCallback;
+            mExecutor = executor;
+        }
+
+        public void onPlaySoundEffect(@AudioManager.SystemSoundEffect int effectType) {
+            mExecutor.execute(() -> mSoundEffectListener.onPlaySoundEffect(effectType));
+        }
+    }
+}
diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java
index b967ca9..2ca2b79bc 100644
--- a/core/java/android/companion/virtual/VirtualDeviceManager.java
+++ b/core/java/android/companion/virtual/VirtualDeviceManager.java
@@ -40,8 +40,6 @@
 import android.graphics.Point;
 import android.hardware.display.DisplayManager;
 import android.hardware.display.DisplayManager.VirtualDisplayFlag;
-import android.hardware.display.DisplayManagerGlobal;
-import android.hardware.display.IVirtualDisplayCallback;
 import android.hardware.display.VirtualDisplay;
 import android.hardware.display.VirtualDisplayConfig;
 import android.hardware.input.VirtualDpad;
@@ -55,19 +53,11 @@
 import android.hardware.input.VirtualTouchscreen;
 import android.hardware.input.VirtualTouchscreenConfig;
 import android.media.AudioManager;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
 import android.os.Looper;
 import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.util.ArrayMap;
 import android.util.Log;
 import android.view.Surface;
 
-import com.android.internal.annotations.GuardedBy;
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -79,7 +69,13 @@
 import java.util.function.IntConsumer;
 
 /**
- * System level service for managing virtual devices.
+ * System level service for creation and management of virtual devices.
+ *
+ * <p>VirtualDeviceManager enables interactive sharing of capabilities between the host Android
+ * device and a remote device.
+ *
+ * <p class="note">Not to be confused with the Android Studio's Virtual Device Manager, which allows
+ * for device emulation.
  */
 @SystemService(Context.VIRTUAL_DEVICE_SERVICE)
 public final class VirtualDeviceManager {
@@ -176,6 +172,7 @@
     public VirtualDevice createVirtualDevice(
             int associationId,
             @NonNull VirtualDeviceParams params) {
+        Objects.requireNonNull(params, "params must not be null");
         try {
             return new VirtualDevice(mService, mContext, associationId, params);
         } catch (RemoteException e) {
@@ -185,6 +182,9 @@
 
     /**
      * Returns the details of all available virtual devices.
+     *
+     * <p>The returned objects are read-only representations that expose the properties of all
+     * existing virtual devices.
      */
     @NonNull
     public List<android.companion.virtual.VirtualDevice> getVirtualDevices() {
@@ -263,11 +263,12 @@
      *
      * @param deviceId - id of the virtual audio device
      * @return Device specific session id to be used for audio playback (see
-     *     {@link android.media.AudioManager.generateAudioSessionId}) if virtual device has
-     *     {@link VirtualDeviceParams.POLICY_TYPE_AUDIO} set to
-     *     {@link VirtualDeviceParams.DEVICE_POLICY_CUSTOM} and Virtual Audio Device
-     *     is configured in context-aware mode.
-     *     Otherwise {@link AUDIO_SESSION_ID_GENERATE} constant is returned.
+     *   {@link AudioManager#generateAudioSessionId}) if virtual device has
+     *   {@link VirtualDeviceParams#POLICY_TYPE_AUDIO} set to
+     *   {@link VirtualDeviceParams#DEVICE_POLICY_CUSTOM} and Virtual Audio Device
+     *   is configured in context-aware mode. Otherwise
+     *   {@link AudioManager#AUDIO_SESSION_ID_GENERATE} constant is returned.
+     *
      * @hide
      */
     public int getAudioPlaybackSessionId(int deviceId) {
@@ -286,11 +287,12 @@
      *
      * @param deviceId - id of the virtual audio device
      * @return Device specific session id to be used for audio recording (see
-     *     {@link android.media.AudioManager.generateAudioSessionId}) if virtual device has
-     *     {@link VirtualDeviceParams.POLICY_TYPE_AUDIO} set to
-     *     {@link VirtualDeviceParams.DEVICE_POLICY_CUSTOM} and Virtual Audio Device
-     *     is configured in context-aware mode.
-     *     Otherwise {@link AUDIO_SESSION_ID_GENERATE} constant is returned.
+     *   {@link AudioManager#generateAudioSessionId}) if virtual device has
+     *   {@link VirtualDeviceParams#POLICY_TYPE_AUDIO} set to
+     *   {@link VirtualDeviceParams#DEVICE_POLICY_CUSTOM} and Virtual Audio Device
+     *   is configured in context-aware mode. Otherwise
+     *   {@link AudioManager#AUDIO_SESSION_ID_GENERATE} constant is returned.
+     *
      * @hide
      */
     public int getAudioRecordingSessionId(int deviceId) {
@@ -307,10 +309,11 @@
     /**
      * Requests sound effect to be played on virtual device.
      *
-     * @see android.media.AudioManager#playSoundEffect(int)
+     * @see AudioManager#playSoundEffect(int)
      *
      * @param deviceId - id of the virtual audio device
      * @param effectType the type of sound effect
+     *
      * @hide
      */
     public void playSoundEffect(int deviceId, @AudioManager.SystemSoundEffect int effectType) {
@@ -326,86 +329,25 @@
     }
 
     /**
-     * A virtual device has its own virtual display, audio output, microphone, sensors, etc. The
-     * creator of a virtual device can take the output from the virtual display and stream it over
-     * to another device, and inject input events that are received from the remote device.
+     * A representation of a virtual device.
      *
-     * TODO(b/204081582): Consider using a builder pattern for the input APIs.
+     * <p>A virtual device can have its own virtual displays, audio input/output, sensors, etc.
+     * The creator of a virtual device can take the output from the virtual display and stream it
+     * over to another device, and inject input and sensor events that are received from the remote
+     * device.
+     *
+     * <p>This object is only used by the virtual device creator and allows them to manage the
+     * device's behavior, peripherals, and the user interaction with that device.
+     *
+     * <p class="note">Not to be confused with {@link android.companion.virtual.VirtualDevice},
+     * which is a read-only representation exposing the properties of an existing virtual device.
      *
      * @hide
      */
     @SystemApi
     public static class VirtualDevice implements AutoCloseable {
 
-        private final Context mContext;
-        private final IVirtualDeviceManager mService;
-        private final IVirtualDevice mVirtualDevice;
-        private final Object mActivityListenersLock = new Object();
-        @GuardedBy("mActivityListenersLock")
-        private final ArrayMap<ActivityListener, ActivityListenerDelegate> mActivityListeners =
-                new ArrayMap<>();
-        private final Object mIntentInterceptorListenersLock = new Object();
-        @GuardedBy("mIntentInterceptorListenersLock")
-        private final ArrayMap<IntentInterceptorCallback,
-                     VirtualIntentInterceptorDelegate> mIntentInterceptorListeners =
-                new ArrayMap<>();
-        private final Object mSoundEffectListenersLock = new Object();
-        @GuardedBy("mSoundEffectListenersLock")
-        private final ArrayMap<SoundEffectListener, SoundEffectListenerDelegate>
-                mSoundEffectListeners = new ArrayMap<>();
-        private final IVirtualDeviceActivityListener mActivityListenerBinder =
-                new IVirtualDeviceActivityListener.Stub() {
-
-                    @Override
-                    public void onTopActivityChanged(int displayId, ComponentName topActivity,
-                            @UserIdInt int userId) {
-                        final long token = Binder.clearCallingIdentity();
-                        try {
-                            synchronized (mActivityListenersLock) {
-                                for (int i = 0; i < mActivityListeners.size(); i++) {
-                                    mActivityListeners.valueAt(i)
-                                            .onTopActivityChanged(displayId, topActivity);
-                                    mActivityListeners.valueAt(i)
-                                          .onTopActivityChanged(displayId, topActivity, userId);
-                                }
-                            }
-                        } finally {
-                            Binder.restoreCallingIdentity(token);
-                        }
-                    }
-
-                    @Override
-                    public void onDisplayEmpty(int displayId) {
-                        final long token = Binder.clearCallingIdentity();
-                        try {
-                            synchronized (mActivityListenersLock) {
-                                for (int i = 0; i < mActivityListeners.size(); i++) {
-                                    mActivityListeners.valueAt(i).onDisplayEmpty(displayId);
-                                }
-                            }
-                        } finally {
-                            Binder.restoreCallingIdentity(token);
-                        }
-                    }
-                };
-        private final IVirtualDeviceSoundEffectListener mSoundEffectListener =
-                new IVirtualDeviceSoundEffectListener.Stub() {
-                    @Override
-                    public void onPlaySoundEffect(int soundEffect) {
-                        final long token = Binder.clearCallingIdentity();
-                        try {
-                            synchronized (mSoundEffectListenersLock) {
-                                for (int i = 0; i < mSoundEffectListeners.size(); i++) {
-                                    mSoundEffectListeners.valueAt(i).onPlaySoundEffect(soundEffect);
-                                }
-                            }
-                        } finally {
-                            Binder.restoreCallingIdentity(token);
-                        }
-                    }
-                };
-        @Nullable
-        private VirtualAudioDevice mVirtualAudioDevice;
+        private final VirtualDeviceInternal mVirtualDeviceInternal;
 
         @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
         private VirtualDevice(
@@ -413,38 +355,25 @@
                 Context context,
                 int associationId,
                 VirtualDeviceParams params) throws RemoteException {
-            mService = service;
-            mContext = context.getApplicationContext();
-            mVirtualDevice = service.createVirtualDevice(
-                    new Binder(),
-                    mContext.getPackageName(),
-                    associationId,
-                    params,
-                    mActivityListenerBinder,
-                    mSoundEffectListener);
+            mVirtualDeviceInternal =
+                    new VirtualDeviceInternal(service, context, associationId, params);
         }
 
         /**
          * Returns the unique ID of this virtual device.
          */
         public int getDeviceId() {
-            try {
-                return mVirtualDevice.getDeviceId();
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
+            return mVirtualDeviceInternal.getDeviceId();
         }
 
         /**
-         * @return A new Context bound to this device. This is a convenience method equivalent to
-         * calling {@link Context#createDeviceContext(int)} with the device id of this device.
+         * Returns a new context bound to this device.
+         *
+         * <p>This is a convenience method equivalent to calling
+         * {@link Context#createDeviceContext(int)} with the id of this device.
          */
         public @NonNull Context createContext() {
-            try {
-                return mContext.createDeviceContext(mVirtualDevice.getDeviceId());
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
+            return mVirtualDeviceInternal.createContext();
         }
 
         /**
@@ -456,11 +385,7 @@
          */
         @NonNull
         public List<VirtualSensor> getVirtualSensorList() {
-            try {
-                return mVirtualDevice.getVirtualSensorList();
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
+            return mVirtualDeviceInternal.getVirtualSensorList();
         }
 
         /**
@@ -486,20 +411,11 @@
                 @NonNull PendingIntent pendingIntent,
                 @NonNull Executor executor,
                 @NonNull IntConsumer listener) {
-            try {
-                mVirtualDevice.launchPendingIntent(
-                        displayId,
-                        pendingIntent,
-                        new ResultReceiver(new Handler(Looper.getMainLooper())) {
-                            @Override
-                            protected void onReceiveResult(int resultCode, Bundle resultData) {
-                                super.onReceiveResult(resultCode, resultData);
-                                executor.execute(() -> listener.accept(resultCode));
-                            }
-                        });
-            } catch (RemoteException e) {
-                e.rethrowFromSystemServer();
-            }
+            Objects.requireNonNull(pendingIntent, "pendingIntent must not be null");
+            Objects.requireNonNull(executor, "executor must not be null");
+            Objects.requireNonNull(listener, "listener must not be null");
+            mVirtualDeviceInternal.launchPendingIntent(
+                    displayId, pendingIntent, executor, listener);
         }
 
         /**
@@ -510,20 +426,19 @@
          * @param height The height of the virtual display in pixels, must be greater than 0.
          * @param densityDpi The density of the virtual display in dpi, must be greater than 0.
          * @param surface The surface to which the content of the virtual display should
-         * be rendered, or null if there is none initially. The surface can also be set later using
-         * {@link VirtualDisplay#setSurface(Surface)}.
+         *   be rendered, or null if there is none initially. The surface can also be set later
+         *   using {@link VirtualDisplay#setSurface(Surface)}.
          * @param flags A combination of virtual display flags accepted by
-         * {@link DisplayManager#createVirtualDisplay}. In addition, the following flags are
-         * automatically set for all virtual devices:
-         * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_PUBLIC VIRTUAL_DISPLAY_FLAG_PUBLIC} and
-         * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
-         * VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY}.
+         *   {@link DisplayManager#createVirtualDisplay}. In addition, the following flags are
+         *   automatically set for all virtual devices:
+         *   {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_PUBLIC} and
+         *   {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY}.
          * @param executor The executor on which {@code callback} will be invoked. This is ignored
-         * if {@code callback} is {@code null}. If {@code callback} is specified, this executor must
-         * not be null.
+         *   if {@code callback} is {@code null}. If {@code callback} is specified, this executor
+         *   must not be null.
          * @param callback Callback to call when the state of the {@link VirtualDisplay} changes
          * @return The newly created virtual display, or {@code null} if the application could
-         * not create the virtual display.
+         *   not create the virtual display.
          *
          * @see DisplayManager#createVirtualDisplay
          *
@@ -540,13 +455,18 @@
                 @VirtualDisplayFlag int flags,
                 @Nullable @CallbackExecutor Executor executor,
                 @Nullable VirtualDisplay.Callback callback) {
+            // Currently this just uses the device ID, which means all of the virtual displays
+            // created using the same virtual device will have the same name if they use this
+            // deprecated API. The name should only be used for informational purposes, and not for
+            // identifying the display in code.
+            String virtualDisplayName =  "VirtualDevice_" + getDeviceId();
             VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(
-                    getVirtualDisplayName(), width, height, densityDpi)
+                    virtualDisplayName, width, height, densityDpi)
                     .setFlags(flags);
             if (surface != null) {
                 builder.setSurface(surface);
             }
-            return createVirtualDisplay(builder.build(), executor, callback);
+            return mVirtualDeviceInternal.createVirtualDisplay(builder.build(), executor, callback);
         }
 
         /**
@@ -555,11 +475,11 @@
          *
          * @param config The configuration of the display.
          * @param executor The executor on which {@code callback} will be invoked. This is ignored
-         * if {@code callback} is {@code null}. If {@code callback} is specified, this executor must
-         * not be null.
+         *   if {@code callback} is {@code null}. If {@code callback} is specified, this executor
+         *   must not be null.
          * @param callback Callback to call when the state of the {@link VirtualDisplay} changes
          * @return The newly created virtual display, or {@code null} if the application could
-         * not create the virtual display.
+         *   not create the virtual display.
          *
          * @see DisplayManager#createVirtualDisplay
          */
@@ -568,18 +488,8 @@
                 @NonNull VirtualDisplayConfig config,
                 @Nullable @CallbackExecutor Executor executor,
                 @Nullable VirtualDisplay.Callback callback) {
-            IVirtualDisplayCallback callbackWrapper =
-                    new DisplayManagerGlobal.VirtualDisplayCallback(callback, executor);
-            final int displayId;
-            try {
-                displayId = mService.createVirtualDisplay(config, callbackWrapper, mVirtualDevice,
-                        mContext.getPackageName());
-            } catch (RemoteException ex) {
-                throw ex.rethrowFromSystemServer();
-            }
-            DisplayManagerGlobal displayManager = DisplayManagerGlobal.getInstance();
-            return displayManager.createVirtualDisplayWrapper(config, callbackWrapper,
-                    displayId);
+            Objects.requireNonNull(config, "config must not be null");
+            return mVirtualDeviceInternal.createVirtualDisplay(config, executor, callback);
         }
 
         /**
@@ -588,34 +498,19 @@
          */
         @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
         public void close() {
-            try {
-                // This also takes care of unregistering all virtual sensors.
-                mVirtualDevice.close();
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-            if (mVirtualAudioDevice != null) {
-                mVirtualAudioDevice.close();
-                mVirtualAudioDevice = null;
-            }
+            mVirtualDeviceInternal.close();
         }
 
         /**
          * Creates a virtual dpad.
          *
-         * @param config the configurations of the virtual Dpad.
+         * @param config the configurations of the virtual dpad.
          */
         @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
         @NonNull
         public VirtualDpad createVirtualDpad(@NonNull VirtualDpadConfig config) {
-            try {
-                final IBinder token = new Binder(
-                        "android.hardware.input.VirtualDpad:" + config.getInputDeviceName());
-                mVirtualDevice.createVirtualDpad(config, token);
-                return new VirtualDpad(mVirtualDevice, token);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
+            Objects.requireNonNull(config, "config must not be null");
+            return mVirtualDeviceInternal.createVirtualDpad(config);
         }
 
         /**
@@ -626,24 +521,17 @@
         @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
         @NonNull
         public VirtualKeyboard createVirtualKeyboard(@NonNull VirtualKeyboardConfig config) {
-            try {
-                final IBinder token = new Binder(
-                        "android.hardware.input.VirtualKeyboard:" + config.getInputDeviceName());
-                mVirtualDevice.createVirtualKeyboard(config, token);
-                return new VirtualKeyboard(mVirtualDevice, token);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
+            Objects.requireNonNull(config, "config must not be null");
+            return mVirtualDeviceInternal.createVirtualKeyboard(config);
         }
 
         /**
          * Creates a virtual keyboard.
          *
-         * @param display         the display that the events inputted through this device should
-         *                        target
-         * @param inputDeviceName the name to call this input device
-         * @param vendorId        the PCI vendor id
-         * @param productId       the product id, as defined by the vendor
+         * @param display the display that the events inputted through this device should target.
+         * @param inputDeviceName the name of this keyboard device.
+         * @param vendorId the PCI vendor id.
+         * @param productId the product id, as defined by the vendor.
          * @see #createVirtualKeyboard(VirtualKeyboardConfig config)
          * @deprecated Use {@link #createVirtualKeyboard(VirtualKeyboardConfig config)} instead
          */
@@ -659,7 +547,7 @@
                             .setInputDeviceName(inputDeviceName)
                             .setAssociatedDisplayId(display.getDisplay().getDisplayId())
                             .build();
-            return createVirtualKeyboard(keyboardConfig);
+            return mVirtualDeviceInternal.createVirtualKeyboard(keyboardConfig);
         }
 
         /**
@@ -670,27 +558,19 @@
         @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
         @NonNull
         public VirtualMouse createVirtualMouse(@NonNull VirtualMouseConfig config) {
-            try {
-                final IBinder token = new Binder(
-                        "android.hardware.input.VirtualMouse:" + config.getInputDeviceName());
-                mVirtualDevice.createVirtualMouse(config, token);
-                return new VirtualMouse(mVirtualDevice, token);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
+            Objects.requireNonNull(config, "config must not be null");
+            return mVirtualDeviceInternal.createVirtualMouse(config);
         }
 
         /**
          * Creates a virtual mouse.
          *
-         * @param display         the display that the events inputted through this device should
-         *                        target
-         * @param inputDeviceName the name to call this input device
-         * @param vendorId        the PCI vendor id
-         * @param productId       the product id, as defined by the vendor
+         * @param display the display that the events inputted through this device should target.
+         * @param inputDeviceName the name of this mouse.
+         * @param vendorId the PCI vendor id.
+         * @param productId the product id, as defined by the vendor.
          * @see #createVirtualMouse(VirtualMouseConfig config)
          * @deprecated Use {@link #createVirtualMouse(VirtualMouseConfig config)} instead
-         * *
          */
         @Deprecated
         @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
@@ -704,7 +584,7 @@
                             .setInputDeviceName(inputDeviceName)
                             .setAssociatedDisplayId(display.getDisplay().getDisplayId())
                             .build();
-            return createVirtualMouse(mouseConfig);
+            return mVirtualDeviceInternal.createVirtualMouse(mouseConfig);
         }
 
         /**
@@ -716,48 +596,17 @@
         @NonNull
         public VirtualTouchscreen createVirtualTouchscreen(
                 @NonNull VirtualTouchscreenConfig config) {
-            try {
-                final IBinder token = new Binder(
-                        "android.hardware.input.VirtualTouchscreen:" + config.getInputDeviceName());
-                mVirtualDevice.createVirtualTouchscreen(config, token);
-                return new VirtualTouchscreen(mVirtualDevice, token);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-        }
-
-        /**
-         * Creates a virtual touchpad in navigation mode.
-         *
-         * A touchpad in navigation mode means that its events are interpreted as navigation events
-         * (up, down, etc) instead of using them to update a cursor's absolute position. If the
-         * events are not consumed they are converted to DPAD events.
-         *
-         * @param config the configurations of the virtual navigation touchpad.
-         */
-        @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
-        @NonNull
-        public VirtualNavigationTouchpad createVirtualNavigationTouchpad(
-                 @NonNull VirtualNavigationTouchpadConfig config) {
-            try {
-                final IBinder token = new Binder(
-                        "android.hardware.input.VirtualNavigationTouchpad:"
-                            + config.getInputDeviceName());
-                mVirtualDevice.createVirtualNavigationTouchpad(config, token);
-                return new VirtualNavigationTouchpad(mVirtualDevice, token);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
+            Objects.requireNonNull(config, "config must not be null");
+            return mVirtualDeviceInternal.createVirtualTouchscreen(config);
         }
 
         /**
          * Creates a virtual touchscreen.
          *
-         * @param display         the display that the events inputted through this device should
-         *                        target
-         * @param inputDeviceName the name to call this input device
-         * @param vendorId        the PCI vendor id
-         * @param productId       the product id, as defined by the vendor
+         * @param display the display that the events inputted through this device should target.
+         * @param inputDeviceName the name of this touchscreen device.
+         * @param vendorId the PCI vendor id.
+         * @param productId the product id, as defined by the vendor.
          * @see #createVirtualTouchscreen(VirtualTouchscreenConfig config)
          * @deprecated Use {@link #createVirtualTouchscreen(VirtualTouchscreenConfig config)}
          * instead
@@ -776,7 +625,25 @@
                             .setInputDeviceName(inputDeviceName)
                             .setAssociatedDisplayId(display.getDisplay().getDisplayId())
                             .build();
-            return createVirtualTouchscreen(touchscreenConfig);
+            return mVirtualDeviceInternal.createVirtualTouchscreen(touchscreenConfig);
+        }
+
+        /**
+         * Creates a virtual touchpad in navigation mode.
+         *
+         * <p>A touchpad in navigation mode means that its events are interpreted as navigation
+         * events (up, down, etc) instead of using them to update a cursor's absolute position. If
+         * the events are not consumed they are converted to DPAD events and delivered to the target
+         * again.
+         *
+         * @param config the configurations of the virtual navigation touchpad.
+         * @see android.view.InputDevice#SOURCE_TOUCH_NAVIGATION
+         */
+        @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+        @NonNull
+        public VirtualNavigationTouchpad createVirtualNavigationTouchpad(
+                @NonNull VirtualNavigationTouchpadConfig config) {
+            return mVirtualDeviceInternal.createVirtualNavigationTouchpad(config);
         }
 
         /**
@@ -790,10 +657,10 @@
          *
          * @param display The target virtual display to capture from and inject into.
          * @param executor The {@link Executor} object for the thread on which to execute
-         *                the callback. If <code>null</code>, the {@link Executor} associated with
-         *                the main {@link Looper} will be used.
+         *   the callback. If <code>null</code>, the {@link Executor} associated with the main
+         *   {@link Looper} will be used.
          * @param callback Interface to be notified when playback or recording configuration of
-         *                applications running on virtual display is changed.
+         *   applications running on virtual display is changed.
          * @return A {@link VirtualAudioDevice} instance.
          */
         @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
@@ -802,39 +669,20 @@
                 @NonNull VirtualDisplay display,
                 @Nullable Executor executor,
                 @Nullable AudioConfigurationChangeCallback callback) {
-            if (mVirtualAudioDevice == null) {
-                mVirtualAudioDevice = new VirtualAudioDevice(mContext, mVirtualDevice, display,
-                        executor, callback, () -> mVirtualAudioDevice = null);
-            }
-            return mVirtualAudioDevice;
+            Objects.requireNonNull(display, "display must not be null");
+            return mVirtualDeviceInternal.createVirtualAudioDevice(display, executor, callback);
         }
 
         /**
          * Sets the visibility of the pointer icon for this VirtualDevice's associated displays.
          *
          * @param showPointerIcon True if the pointer should be shown; false otherwise. The default
-         *                        visibility is true.
+         *   visibility is true.
          */
         @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
         @NonNull
         public void setShowPointerIcon(boolean showPointerIcon) {
-            try {
-                mVirtualDevice.setShowPointerIcon(showPointerIcon);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-        }
-
-        private String getVirtualDisplayName() {
-            try {
-                // Currently this just use the device ID, which means all of the virtual displays
-                // created using the same virtual device will have the same name. The name should
-                // only be used for informational purposes, and not for identifying the display in
-                // code.
-                return "VirtualDevice_" + mVirtualDevice.getDeviceId();
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
+            mVirtualDeviceInternal.setShowPointerIcon(showPointerIcon);
         }
 
         /**
@@ -847,24 +695,17 @@
          */
         public void addActivityListener(
                 @CallbackExecutor @NonNull Executor executor, @NonNull ActivityListener listener) {
-            final ActivityListenerDelegate delegate = new ActivityListenerDelegate(
-                    Objects.requireNonNull(listener), Objects.requireNonNull(executor));
-            synchronized (mActivityListenersLock) {
-                mActivityListeners.put(listener, delegate);
-            }
+            mVirtualDeviceInternal.addActivityListener(executor, listener);
         }
 
         /**
-         * Removes an activity listener previously added with
-         * {@link #addActivityListener}.
+         * Removes an activity listener previously added with {@link #addActivityListener}.
          *
          * @param listener The listener to remove.
          * @see #addActivityListener(Executor, ActivityListener)
          */
         public void removeActivityListener(@NonNull ActivityListener listener) {
-            synchronized (mActivityListenersLock) {
-                mActivityListeners.remove(Objects.requireNonNull(listener));
-            }
+            mVirtualDeviceInternal.removeActivityListener(listener);
         }
 
         /**
@@ -876,24 +717,17 @@
          */
         public void addSoundEffectListener(@CallbackExecutor @NonNull Executor executor,
                 @NonNull SoundEffectListener soundEffectListener) {
-            final SoundEffectListenerDelegate delegate =
-                    new SoundEffectListenerDelegate(Objects.requireNonNull(executor),
-                            Objects.requireNonNull(soundEffectListener));
-            synchronized (mSoundEffectListenersLock) {
-                mSoundEffectListeners.put(soundEffectListener, delegate);
-            }
+            mVirtualDeviceInternal.addSoundEffectListener(executor, soundEffectListener);
         }
 
         /**
-         * Removes a sound effect listener previously added with {@link #addActivityListener}.
+         * Removes a sound effect listener previously added with {@link #addSoundEffectListener}.
          *
          * @param soundEffectListener The listener to remove.
-         * @see #addActivityListener(Executor, ActivityListener)
+         * @see #addSoundEffectListener(Executor, SoundEffectListener)
          */
         public void removeSoundEffectListener(@NonNull SoundEffectListener soundEffectListener) {
-            synchronized (mSoundEffectListenersLock) {
-                mSoundEffectListeners.remove(Objects.requireNonNull(soundEffectListener));
-            }
+            mVirtualDeviceInternal.removeSoundEffectListener(soundEffectListener);
         }
 
         /**
@@ -912,40 +746,18 @@
                 @NonNull IntentFilter interceptorFilter,
                 @CallbackExecutor @NonNull Executor executor,
                 @NonNull IntentInterceptorCallback interceptorCallback) {
-            Objects.requireNonNull(executor);
-            Objects.requireNonNull(interceptorFilter);
-            Objects.requireNonNull(interceptorCallback);
-            final VirtualIntentInterceptorDelegate delegate =
-                    new VirtualIntentInterceptorDelegate(executor, interceptorCallback);
-            try {
-                mVirtualDevice.registerIntentInterceptor(delegate, interceptorFilter);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-            synchronized (mIntentInterceptorListenersLock) {
-                mIntentInterceptorListeners.put(interceptorCallback, delegate);
-            }
+            mVirtualDeviceInternal.registerIntentInterceptor(
+                    interceptorFilter, executor, interceptorCallback);
         }
 
         /**
-         * Unregisters the intent interceptorCallback previously registered with
+         * Unregisters the intent interceptor previously registered with
          * {@link #registerIntentInterceptor}.
          */
         @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
         public void unregisterIntentInterceptor(
                     @NonNull IntentInterceptorCallback interceptorCallback) {
-            Objects.requireNonNull(interceptorCallback);
-            final VirtualIntentInterceptorDelegate delegate;
-            synchronized (mIntentInterceptorListenersLock) {
-                delegate = mIntentInterceptorListeners.remove(interceptorCallback);
-            }
-            if (delegate != null) {
-                try {
-                    mVirtualDevice.unregisterIntentInterceptor(delegate);
-                } catch (RemoteException e) {
-                    throw e.rethrowFromSystemServer();
-                }
-            }
+            mVirtualDeviceInternal.unregisterIntentInterceptor(interceptorCallback);
         }
     }
 
@@ -977,9 +789,9 @@
          * {@link #onDisplayEmpty(int)} will be called. If the value topActivity is cached, it
          * should be cleared when {@link #onDisplayEmpty(int)} is called.
          *
-         * @param displayId   The display ID on which the activity change happened.
+         * @param displayId The display ID on which the activity change happened.
          * @param topActivity The component name of the top activity.
-         * @param userId      The user ID associated with the top activity.
+         * @param userId The user ID associated with the top activity.
          */
         default void onTopActivityChanged(int displayId, @NonNull ComponentName topActivity,
                 @UserIdInt int userId) {}
@@ -994,33 +806,6 @@
     }
 
     /**
-     * A wrapper for {@link ActivityListener} that executes callbacks on the given executor.
-     */
-    private static class ActivityListenerDelegate {
-        @NonNull private final ActivityListener mActivityListener;
-        @NonNull private final Executor mExecutor;
-
-        ActivityListenerDelegate(@NonNull ActivityListener listener, @NonNull Executor executor) {
-            mActivityListener = listener;
-            mExecutor = executor;
-        }
-
-        public void onTopActivityChanged(int displayId, ComponentName topActivity) {
-            mExecutor.execute(() -> mActivityListener.onTopActivityChanged(displayId, topActivity));
-        }
-
-        public void onTopActivityChanged(int displayId, ComponentName topActivity,
-                @UserIdInt int userId) {
-            mExecutor.execute(() ->
-                    mActivityListener.onTopActivityChanged(displayId, topActivity, userId));
-        }
-
-        public void onDisplayEmpty(int displayId) {
-            mExecutor.execute(() -> mActivityListener.onDisplayEmpty(displayId));
-        }
-    }
-
-    /**
      * Interceptor interface to be called when an intent matches the IntentFilter passed into {@link
      * VirtualDevice#registerIntentInterceptor}. When the interceptor is called after matching the
      * IntentFilter, the intended activity launch will be aborted and alternatively replaced by
@@ -1042,33 +827,8 @@
     }
 
     /**
-     * A wrapper for {@link IntentInterceptorCallback} that executes callbacks on the
-     * the given executor.
-     */
-    private static class VirtualIntentInterceptorDelegate
-            extends IVirtualDeviceIntentInterceptor.Stub {
-        @NonNull private final IntentInterceptorCallback mIntentInterceptorCallback;
-        @NonNull private final Executor mExecutor;
-
-        private VirtualIntentInterceptorDelegate(Executor executor,
-                IntentInterceptorCallback interceptorCallback) {
-            mExecutor = executor;
-            mIntentInterceptorCallback = interceptorCallback;
-        }
-
-        @Override
-        public void onIntentIntercepted(Intent intent) {
-            final long token = Binder.clearCallingIdentity();
-            try {
-                mExecutor.execute(() -> mIntentInterceptorCallback.onIntentIntercepted(intent));
-            } finally {
-                Binder.restoreCallingIdentity(token);
-            }
-        }
-    }
-
-    /**
      * Listener for system sound effect playback on virtual device.
+     *
      * @hide
      */
     @SystemApi
@@ -1077,27 +837,9 @@
         /**
          * Called when there's a system sound effect to be played on virtual device.
          *
-         * @param effectType - system sound effect type, see
-         *     {@code android.media.AudioManager.SystemSoundEffect}
+         * @param effectType - system sound effect type
+         * @see android.media.AudioManager.SystemSoundEffect
          */
         void onPlaySoundEffect(@AudioManager.SystemSoundEffect int effectType);
     }
-
-    /**
-     * A wrapper for {@link SoundEffectListener} that executes callbacks on the given executor.
-     */
-    private static class SoundEffectListenerDelegate {
-        @NonNull private final SoundEffectListener mSoundEffectListener;
-        @NonNull private final Executor mExecutor;
-
-        private SoundEffectListenerDelegate(Executor executor,
-                SoundEffectListener soundEffectCallback) {
-            mSoundEffectListener = soundEffectCallback;
-            mExecutor = executor;
-        }
-
-        public void onPlaySoundEffect(@AudioManager.SystemSoundEffect int effectType) {
-            mExecutor.execute(() -> mSoundEffectListener.onPlaySoundEffect(effectType));
-        }
-    }
 }
diff --git a/core/java/android/companion/virtual/VirtualDeviceParams.java b/core/java/android/companion/virtual/VirtualDeviceParams.java
index 9a34dbe..45d6dc6 100644
--- a/core/java/android/companion/virtual/VirtualDeviceParams.java
+++ b/core/java/android/companion/virtual/VirtualDeviceParams.java
@@ -34,6 +34,7 @@
 import android.companion.virtual.sensor.VirtualSensorConfig;
 import android.companion.virtual.sensor.VirtualSensorDirectChannelCallback;
 import android.content.ComponentName;
+import android.content.Context;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.SharedMemory;
@@ -680,7 +681,7 @@
          * {@link #NAVIGATION_POLICY_DEFAULT_ALLOWED}, meaning activities are allowed to launch
          * unless they are in {@code blockedCrossTaskNavigations}.
          *
-         * <p> This method must not be called if {@link #setAllowedCrossTaskNavigations(Set)} has
+         * <p>This method must not be called if {@link #setAllowedCrossTaskNavigations(Set)} has
          * been called.
          *
          * @throws IllegalArgumentException if {@link #setAllowedCrossTaskNavigations(Set)} has
@@ -847,11 +848,11 @@
          * <p>Requires {@link #DEVICE_POLICY_CUSTOM} to be set for {@link #POLICY_TYPE_AUDIO},
          * otherwise {@link #build()} method will throw {@link IllegalArgumentException} if
          * the playback session id is set to value other than
-         * {@link android.media.AudioManager.AUDIO_SESSION_ID_GENERATE}.
+         * {@link android.media.AudioManager#AUDIO_SESSION_ID_GENERATE}.
          *
          * @param playbackSessionId requested device-specific audio session id for playback
-         * @see android.media.AudioManager.generateAudioSessionId()
-         * @see android.media.AudioTrack.Builder.setContext(Context)
+         * @see android.media.AudioManager#generateAudioSessionId()
+         * @see android.media.AudioTrack.Builder#setContext(Context)
          */
         @NonNull
         public Builder setAudioPlaybackSessionId(int playbackSessionId) {
@@ -871,11 +872,11 @@
          * <p>Requires {@link #DEVICE_POLICY_CUSTOM} to be set for {@link #POLICY_TYPE_AUDIO},
          * otherwise {@link #build()} method will throw {@link IllegalArgumentException} if
          * the recording session id is set to value other than
-         * {@link android.media.AudioManager.AUDIO_SESSION_ID_GENERATE}.
+         * {@link android.media.AudioManager#AUDIO_SESSION_ID_GENERATE}.
          *
          * @param recordingSessionId requested device-specific audio session id for playback
-         * @see android.media.AudioManager.generateAudioSessionId()
-         * @see android.media.AudioRecord.Builder.setContext(Context)
+         * @see android.media.AudioManager#generateAudioSessionId()
+         * @see android.media.AudioRecord.Builder#setContext(Context)
          */
         @NonNull
         public Builder setAudioRecordingSessionId(int recordingSessionId) {
diff --git a/core/java/android/companion/virtual/audio/AudioCapture.java b/core/java/android/companion/virtual/audio/AudioCapture.java
index d6d0d2b..dd5e660 100644
--- a/core/java/android/companion/virtual/audio/AudioCapture.java
+++ b/core/java/android/companion/virtual/audio/AudioCapture.java
@@ -56,12 +56,12 @@
 
     /**
      * Sets the {@link AudioRecord} to handle audio capturing.
-     * Callers may call this multiple times with different audio records to change
-     * the underlying {@link AudioRecord} without stopping and re-starting recording.
      *
-     * @param audioRecord The underlying {@link AudioRecord} to use for capture,
-     * or null if no audio (i.e. silence) should be captured while still keeping the
-     * record in a recording state.
+     * <p>Callers may call this multiple times with different audio records to change the underlying
+     * {@link AudioRecord} without stopping and re-starting recording.
+     *
+     * @param audioRecord The underlying {@link AudioRecord} to use for capture, or null if no audio
+     *   (i.e. silence) should be captured while still keeping the record in a recording state.
      */
     void setAudioRecord(@Nullable AudioRecord audioRecord) {
         Log.d(TAG, "set AudioRecord with " + audioRecord);
diff --git a/core/java/android/companion/virtual/audio/AudioInjection.java b/core/java/android/companion/virtual/audio/AudioInjection.java
index 9d6a3eb..5de5f7e 100644
--- a/core/java/android/companion/virtual/audio/AudioInjection.java
+++ b/core/java/android/companion/virtual/audio/AudioInjection.java
@@ -65,12 +65,12 @@
 
     /**
      * Sets the {@link AudioTrack} to handle audio injection.
-     * Callers may call this multiple times with different audio tracks to change
-     * the underlying {@link AudioTrack} without stopping and re-starting injection.
      *
-     * @param audioTrack The underlying {@link AudioTrack} to use for injection,
-     * or null if no audio (i.e. silence) should be injected while still keeping the
-     * record in a playing state.
+     * <p>Callers may call this multiple times with different audio tracks to change the underlying
+     * {@link AudioTrack} without stopping and re-starting injection.
+     *
+     * @param audioTrack The underlying {@link AudioTrack} to use for injection, or null if no audio
+     *   (i.e. silence) should be injected while still keeping the record in a playing state.
      */
     void setAudioTrack(@Nullable AudioTrack audioTrack) {
         Log.d(TAG, "set AudioTrack with " + audioTrack);
diff --git a/core/java/android/companion/virtual/sensor/IVirtualSensorCallback.aidl b/core/java/android/companion/virtual/sensor/IVirtualSensorCallback.aidl
index 3cb0572..dcdb6c6 100644
--- a/core/java/android/companion/virtual/sensor/IVirtualSensorCallback.aidl
+++ b/core/java/android/companion/virtual/sensor/IVirtualSensorCallback.aidl
@@ -33,7 +33,7 @@
      * @param enabled Whether the sensor is enabled.
      * @param samplingPeriodMicros The requested sensor's sampling period in microseconds.
      * @param batchReportingLatencyMicros The requested maximum time interval in microseconds
-     * between the delivery of two batches of sensor events.
+     *   between the delivery of two batches of sensor events.
      */
     void onConfigurationChanged(in VirtualSensor sensor, boolean enabled, int samplingPeriodMicros,
             int batchReportLatencyMicros);
@@ -60,7 +60,7 @@
      * @param sensor The sensor, for which the channel was configured.
      * @param rateLevel The rate level used to configure the direct sensor channel.
      * @param reportToken A positive sensor report token, used to differentiate between events from
-     * different sensors within the same channel.
+     *   different sensors within the same channel.
      */
     void onDirectChannelConfigured(int channelHandle, in VirtualSensor sensor, int rateLevel,
             int reportToken);
diff --git a/core/java/android/companion/virtual/sensor/VirtualSensor.java b/core/java/android/companion/virtual/sensor/VirtualSensor.java
index bda44d4..eaa1792 100644
--- a/core/java/android/companion/virtual/sensor/VirtualSensor.java
+++ b/core/java/android/companion/virtual/sensor/VirtualSensor.java
@@ -30,7 +30,7 @@
  * Representation of a sensor on a remote device, capable of sending events, such as an
  * accelerometer or a gyroscope.
  *
- * This registers the sensor device with the sensor framework as a runtime sensor.
+ * <p>A virtual sensor device is registered with the sensor framework as a runtime sensor.
  *
  * @hide
  */
diff --git a/core/java/android/companion/virtual/sensor/VirtualSensorCallback.java b/core/java/android/companion/virtual/sensor/VirtualSensorCallback.java
index e6bd6da..4d586f6 100644
--- a/core/java/android/companion/virtual/sensor/VirtualSensorCallback.java
+++ b/core/java/android/companion/virtual/sensor/VirtualSensorCallback.java
@@ -45,10 +45,10 @@
      *
      * @param sensor The sensor whose requested injection parameters have changed.
      * @param enabled Whether the sensor is enabled. True if any listeners are currently registered,
-     * and false otherwise.
+     *   and false otherwise.
      * @param samplingPeriod The requested sampling period of the sensor.
      * @param batchReportLatency The requested maximum time interval between the delivery of two
-     * batches of sensor events.
+     *   batches of sensor events.
      */
     void onConfigurationChanged(@NonNull VirtualSensor sensor, boolean enabled,
             @NonNull Duration samplingPeriod, @NonNull Duration batchReportLatency);
diff --git a/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java b/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java
index ef55ca9..3bdf9aa 100644
--- a/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java
+++ b/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java
@@ -31,7 +31,9 @@
 
 /**
  * Configuration for creation of a virtual sensor.
+ *
  * @see VirtualSensor
+ *
  * @hide
  */
 @SystemApi
@@ -122,6 +124,7 @@
 
     /**
      * Returns the vendor string of the sensor.
+     *
      * @see Builder#setVendor
      */
     @Nullable
@@ -130,7 +133,8 @@
     }
 
     /**
-     * Returns maximum range of the sensor in the sensor's unit.
+     * Returns the maximum range of the sensor in the sensor's unit.
+     *
      * @see Sensor#getMaximumRange
      */
     public float getMaximumRange() {
@@ -138,7 +142,8 @@
     }
 
     /**
-     * Returns The resolution of the sensor in the sensor's unit.
+     * Returns the resolution of the sensor in the sensor's unit.
+     *
      * @see Sensor#getResolution
      */
     public float getResolution() {
@@ -146,7 +151,8 @@
     }
 
     /**
-     * Returns The power in mA used by this sensor while in use.
+     * Returns the power in mA used by this sensor while in use.
+     *
      * @see Sensor#getPower
      */
     public float getPower() {
@@ -154,8 +160,9 @@
     }
 
     /**
-     * Returns The minimum delay allowed between two events in microseconds, or zero depending on
+     * Returns the minimum delay allowed between two events in microseconds, or zero depending on
      * the sensor type.
+     *
      * @see Sensor#getMinDelay
      */
     public int getMinDelay() {
@@ -163,7 +170,8 @@
     }
 
     /**
-     * Returns The maximum delay between two sensor events in microseconds.
+     * Returns the maximum delay between two sensor events in microseconds.
+     *
      * @see Sensor#getMaxDelay
      */
     public int getMaxDelay() {
@@ -201,6 +209,7 @@
 
     /**
      * Returns the sensor flags.
+     *
      * @hide
      */
     public int getFlags() {
@@ -233,7 +242,7 @@
          *
          * @param type The type of the sensor, matching {@link Sensor#getType}.
          * @param name The name of the sensor. Must be unique among all sensors with the same type
-         *             that belong to the same virtual device.
+         *   that belong to the same virtual device.
          */
         public Builder(@IntRange(from = 1) int type, @NonNull String name) {
             if (type <= 0) {
@@ -275,6 +284,7 @@
 
         /**
          * Sets the maximum range of the sensor in the sensor's unit.
+         *
          * @see Sensor#getMaximumRange
          */
         @NonNull
@@ -285,6 +295,7 @@
 
         /**
          * Sets the resolution of the sensor in the sensor's unit.
+         *
          * @see Sensor#getResolution
          */
         @NonNull
@@ -295,6 +306,7 @@
 
         /**
          * Sets the power in mA used by this sensor while in use.
+         *
          * @see Sensor#getPower
          */
         @NonNull
@@ -305,6 +317,7 @@
 
         /**
          * Sets the minimum delay allowed between two events in microseconds.
+         *
          * @see Sensor#getMinDelay
          */
         @NonNull
@@ -315,6 +328,7 @@
 
         /**
          * Sets the maximum delay between two sensor events in microseconds.
+         *
          * @see Sensor#getMaxDelay
          */
         @NonNull
@@ -339,11 +353,11 @@
          * Sets whether direct sensor channel of the given types is supported.
          *
          * @param memoryTypes A combination of {@link SensorDirectChannel.MemoryType} flags
-         * indicating the types of shared memory supported for creating direct channels. Only
-         * {@link SensorDirectChannel#TYPE_MEMORY_FILE} direct channels may be supported for virtual
-         * sensors.
+         *   indicating the types of shared memory supported for creating direct channels. Only
+         *   {@link SensorDirectChannel#TYPE_MEMORY_FILE} direct channels may be supported for
+         *   virtual sensors.
          * @throws IllegalArgumentException if {@link SensorDirectChannel#TYPE_HARDWARE_BUFFER} is
-         * set to be supported.
+         *   set to be supported.
          */
         @NonNull
         public VirtualSensorConfig.Builder setDirectChannelTypesSupported(
diff --git a/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelCallback.java b/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelCallback.java
index d352f94f..f10e9d0 100644
--- a/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelCallback.java
+++ b/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelCallback.java
@@ -45,6 +45,8 @@
  * <p>The callback is tied to the VirtualDevice's lifetime as the virtual sensors are created when
  * the device is created and destroyed when the device is destroyed.
  *
+ * @see VirtualSensorDirectChannelWriter
+ *
  * @hide
  */
 @SystemApi
@@ -94,7 +96,7 @@
      * @param sensor The sensor, for which the channel was configured.
      * @param rateLevel The rate level used to configure the direct sensor channel.
      * @param reportToken A positive sensor report token, used to differentiate between events from
-     * different sensors within the same channel.
+     *   different sensors within the same channel.
      *
      * @see VirtualSensorConfig.Builder#setHighestDirectReportRateLevel(int)
      * @see VirtualSensorConfig.Builder#setDirectChannelTypesSupported(int)
diff --git a/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelWriter.java b/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelWriter.java
index 6aed96f..bf78dd0 100644
--- a/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelWriter.java
+++ b/core/java/android/companion/virtual/sensor/VirtualSensorDirectChannelWriter.java
@@ -41,6 +41,41 @@
  * write the events from the relevant sensors directly to the shared memory regions of the
  * corresponding {@link SensorDirectChannel} instances.
  *
+ * <p>Example:
+ * <p>During sensor and virtual device creation:
+ * <pre>
+ * VirtualSensorDirectChannelWriter writer = new VirtualSensorDirectChannelWriter();
+ * VirtualSensorDirectChannelCallback callback = new VirtualSensorDirectChannelCallback() {
+ *     @Override
+ *     public void onDirectChannelCreated(int channelHandle, SharedMemory sharedMemory) {
+ *         writer.addChannel(channelHandle, sharedMemory);
+ *     }
+ *     @Override
+ *     public void onDirectChannelDestroyed(int channelHandle);
+ *         writer.removeChannel(channelHandle);
+ *     }
+ *     @Override
+ *     public void onDirectChannelConfigured(int channelHandle, VirtualSensor sensor, int rateLevel,
+ *             int reportToken)
+ *         if (!writer.configureChannel(channelHandle, sensor, rateLevel, reportToken)) {
+ *              // handle error
+ *         }
+ *     }
+ * }
+ * </pre>
+ * <p>During the virtual device lifetime:
+ * <pre>
+ * VirtualSensor sensor = ...
+ * while (shouldInjectEvents(sensor)) {
+ *     if (!writer.writeSensorEvent(sensor, event)) {
+ *         // handle error
+ *     }
+ * }
+ * writer.close();
+ * </pre>
+ * <p>Note that the virtual device owner should take the currently configured rate level into
+ * account when deciding whether and how often to inject events for a particular sensor.
+ *
  * @see android.hardware.SensorDirectChannel#configure
  * @see VirtualSensorDirectChannelCallback
  *
diff --git a/core/java/android/companion/virtual/sensor/VirtualSensorEvent.java b/core/java/android/companion/virtual/sensor/VirtualSensorEvent.java
index 01b4975..a368467e 100644
--- a/core/java/android/companion/virtual/sensor/VirtualSensorEvent.java
+++ b/core/java/android/companion/virtual/sensor/VirtualSensorEvent.java
@@ -121,7 +121,7 @@
          * monotonically increasing using the same time base as
          * {@link android.os.SystemClock#elapsedRealtimeNanos()}.
          *
-         * If not explicitly set, the current timestamp is used for the sensor event.
+         * <p>If not explicitly set, the current timestamp is used for the sensor event.
          *
          * @see android.hardware.SensorEvent#timestamp
          */
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 3b2ea78..2b73afc 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -322,6 +322,7 @@
             BIND_EXTERNAL_SERVICE_LONG,
             // Make sure no flag uses the sign bit (most significant bit) of the long integer,
             // to avoid future confusion.
+            BIND_BYPASS_USER_NETWORK_RESTRICTIONS,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface BindServiceFlagsLongBits {}
@@ -688,6 +689,16 @@
     public static final long BIND_EXTERNAL_SERVICE_LONG = 1L << 62;
 
     /**
+     * Flag for {@link #bindService}: allow the process hosting the target service to gain
+     * {@link ActivityManager#PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK}, which allows it be able
+     * to access network regardless of any user restrictions.
+     *
+     * @hide
+     */
+    public static final long BIND_BYPASS_USER_NETWORK_RESTRICTIONS = 0x1_0000_0000L;
+
+
+    /**
      * These bind flags reduce the strength of the binding such that we shouldn't
      * consider it as pulling the process up to the level of the one that is bound to it.
      * @hide
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index df8da24..154068e 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -4233,6 +4233,13 @@
             "com.android.intent.action.SHOW_BRIGHTNESS_DIALOG";
 
     /**
+     * Activity Action: Shows the contrast setting dialog.
+     * @hide
+     */
+    public static final String ACTION_SHOW_CONTRAST_DIALOG =
+            "com.android.intent.action.SHOW_CONTRAST_DIALOG";
+
+    /**
      * Broadcast Action:  A global button was pressed.  Includes a single
      * extra field, {@link #EXTRA_KEY_EVENT}, containing the key event that
      * caused the broadcast.
@@ -11356,12 +11363,15 @@
     @Override
     public String toString() {
         StringBuilder b = new StringBuilder(128);
+        toString(b);
+        return b.toString();
+    }
 
+    /** @hide */
+    public void toString(@NonNull StringBuilder b) {
         b.append("Intent { ");
         toShortString(b, true, true, true, false);
         b.append(" }");
-
-        return b.toString();
     }
 
     /** @hide */
diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java
index 6ff4271..f946754 100644
--- a/core/java/android/content/IntentFilter.java
+++ b/core/java/android/content/IntentFilter.java
@@ -531,8 +531,9 @@
         mInstantAppVisibility = o.mInstantAppVisibility;
     }
 
-    /** {@inheritDoc} */
-    public String toString() {
+    /** @hide */
+    public String toLongString() {
+        // Not implemented directly as toString() due to potential memory regression
         final StringBuilder sb = new StringBuilder();
         sb.append("IntentFilter {");
         sb.append(" pri=");
diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl
index 96a42e2..563ed7d 100644
--- a/core/java/android/content/pm/ILauncherApps.aidl
+++ b/core/java/android/content/pm/ILauncherApps.aidl
@@ -38,6 +38,7 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.ParcelFileDescriptor;
+import android.window.IDumpCallback;
 
 import com.android.internal.infra.AndroidFuture;
 
@@ -116,4 +117,10 @@
     String getShortcutIconUri(String callingPackage, String packageName, String shortcutId,
             int userId);
     Map<String, LauncherActivityInfoInternal> getActivityOverrides(String callingPackage, int userId);
+
+    /** Register a callback to be called right before the wmtrace data is moved to the bugreport. */
+    void registerDumpCallback(IDumpCallback cb);
+
+    /** Unregister a callback, so that it won't be called when LauncherApps dumps. */
+    void unRegisterDumpCallback(IDumpCallback cb);
 }
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index 8989006..27270d9 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -17,6 +17,7 @@
 package android.content.pm;
 
 import static android.Manifest.permission;
+import static android.Manifest.permission.READ_FRAME_BUFFER;
 
 import android.annotation.CallbackExecutor;
 import android.annotation.IntDef;
@@ -68,6 +69,7 @@
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.Pair;
+import android.window.IDumpCallback;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.infra.AndroidFuture;
@@ -1172,6 +1174,32 @@
     }
 
     /**
+     * Register a callback to be called right before the wmtrace data is moved to the bugreport.
+     * @hide
+     */
+    @RequiresPermission(READ_FRAME_BUFFER)
+    public void registerDumpCallback(IDumpCallback cb) {
+        try {
+            mService.registerDumpCallback(cb);
+        } catch (RemoteException e) {
+            e.rethrowAsRuntimeException();
+        }
+    }
+
+    /**
+     * Unregister a callback, so that it won't be called when LauncherApps dumps.
+     * @hide
+     */
+    @RequiresPermission(READ_FRAME_BUFFER)
+    public void unRegisterDumpCallback(IDumpCallback cb) {
+        try {
+            mService.unRegisterDumpCallback(cb);
+        } catch (RemoteException e) {
+            e.rethrowAsRuntimeException();
+        }
+    }
+
+    /**
      * Returns {@link ShortcutInfo}s that match {@code query}.
      *
      * <p>Callers must be allowed to access the shortcut information, as defined in {@link
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index cb988df..30fd77c 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -2991,6 +2991,10 @@
          * The update ownership enforcement can only be enabled on initial installation. Set
          * this to {@code true} on package update is a no-op.
          *
+         * Apps may opt themselves out of update ownership by setting the
+         * <a href="https://developer.android.com/guide/topics/manifest/manifest-element.html#allowupdateownership">android:alllowUpdateOwnership</a>
+         * attribute in their manifest to <code>false</code>.
+         *
          * Note: To enable the update ownership enforcement, the installer must have the
          * {@link android.Manifest.permission#ENFORCE_UPDATE_OWNERSHIP ENFORCE_UPDATE_OWNERSHIP}
          * permission.
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 21e2a13..eb3d37d 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -3046,6 +3046,17 @@
 
     /**
      * Feature for {@link #getSystemAvailableFeatures} and
+     * {@link #hasSystemFeature}: The device contains support for installing SDKs to a work
+     * profile.
+     *
+     * @hide
+     */
+    @SdkConstant(SdkConstantType.FEATURE)
+    public static final String FEATURE_SDK_SANDBOX_WORK_PROFILE_INSTALL =
+            "android.software.sdksandbox.sdk_install_work_profile";
+
+    /**
+     * Feature for {@link #getSystemAvailableFeatures} and
      * {@link #hasSystemFeature}: The device supports Open Mobile API capable UICC-based secure
      * elements.
      */
diff --git a/core/java/android/content/pm/ServiceInfo.java b/core/java/android/content/pm/ServiceInfo.java
index 1a3c3d9..7e0954a 100644
--- a/core/java/android/content/pm/ServiceInfo.java
+++ b/core/java/android/content/pm/ServiceInfo.java
@@ -332,7 +332,6 @@
      * permissions:
      * {@link android.Manifest.permission#ACTIVITY_RECOGNITION},
      * {@link android.Manifest.permission#BODY_SENSORS},
-     * {@link android.Manifest.permission#BODY_SENSORS_WRIST_TEMPERATURE},
      * {@link android.Manifest.permission#HIGH_SAMPLING_RATE_SENSORS}.
      */
     @RequiresPermission(
@@ -342,7 +341,6 @@
             anyOf = {
                 Manifest.permission.ACTIVITY_RECOGNITION,
                 Manifest.permission.BODY_SENSORS,
-                Manifest.permission.BODY_SENSORS_WRIST_TEMPERATURE,
                 Manifest.permission.HIGH_SAMPLING_RATE_SENSORS,
             }
     )
diff --git a/core/java/android/content/pm/parsing/ApkLite.java b/core/java/android/content/pm/parsing/ApkLite.java
index 269bec2..408f7ed 100644
--- a/core/java/android/content/pm/parsing/ApkLite.java
+++ b/core/java/android/content/pm/parsing/ApkLite.java
@@ -138,6 +138,11 @@
      */
     private final boolean mIsSdkLibrary;
 
+    /**
+     * Indicates if this package allows an installer to declare update ownership of it.
+     */
+    private final boolean mAllowUpdateOwnership;
+
     public ApkLite(String path, String packageName, String splitName, boolean isFeatureSplit,
             String configForSplit, String usesSplitName, boolean isSplitRequired, int versionCode,
             int versionCodeMajor, int revisionCode, int installLocation,
@@ -148,7 +153,7 @@
             String requiredSystemPropertyName, String requiredSystemPropertyValue,
             int minSdkVersion, int targetSdkVersion, int rollbackDataPolicy,
             Set<String> requiredSplitTypes, Set<String> splitTypes,
-            boolean hasDeviceAdminReceiver, boolean isSdkLibrary) {
+            boolean hasDeviceAdminReceiver, boolean isSdkLibrary, boolean allowUpdateOwnership) {
         mPath = path;
         mPackageName = packageName;
         mSplitName = splitName;
@@ -182,6 +187,7 @@
         mRollbackDataPolicy = rollbackDataPolicy;
         mHasDeviceAdminReceiver = hasDeviceAdminReceiver;
         mIsSdkLibrary = isSdkLibrary;
+        mAllowUpdateOwnership = allowUpdateOwnership;
     }
 
     /**
@@ -474,6 +480,9 @@
         return mRollbackDataPolicy;
     }
 
+    /**
+     * Indicates if this app contains a {@link android.app.admin.DeviceAdminReceiver}.
+     */
     @DataClass.Generated.Member
     public boolean isHasDeviceAdminReceiver() {
         return mHasDeviceAdminReceiver;
@@ -487,11 +496,19 @@
         return mIsSdkLibrary;
     }
 
+    /**
+     * Indicates if this package allows an installer to declare update ownership of it.
+     */
+    @DataClass.Generated.Member
+    public boolean isAllowUpdateOwnership() {
+        return mAllowUpdateOwnership;
+    }
+
     @DataClass.Generated(
-            time = 1643063342990L,
+            time = 1680122754650L,
             codegenVersion = "1.0.23",
             sourceFile = "frameworks/base/core/java/android/content/pm/parsing/ApkLite.java",
-            inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.Nullable java.lang.String mUsesSplitName\nprivate final @android.annotation.Nullable java.lang.String mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mSplitTypes\nprivate final  int mVersionCodeMajor\nprivate final  int mVersionCode\nprivate final  int mRevisionCode\nprivate final  int mInstallLocation\nprivate final  int mMinSdkVersion\nprivate final  int mTargetSdkVersion\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final  boolean mFeatureSplit\nprivate final  boolean mIsolatedSplits\nprivate final  boolean mSplitRequired\nprivate final  boolean mCoreApp\nprivate final  boolean mDebuggable\nprivate final  boolean mProfileableByShell\nprivate final  boolean mMultiArch\nprivate final  boolean mUse32bitAbi\nprivate final  boolean mExtractNativeLibs\nprivate final  boolean mUseEmbeddedDex\nprivate final @android.annotation.Nullable java.lang.String mTargetPackageName\nprivate final  boolean mOverlayIsStatic\nprivate final  int mOverlayPriority\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyName\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyValue\nprivate final  int mRollbackDataPolicy\nprivate final  boolean mHasDeviceAdminReceiver\nprivate final  boolean mIsSdkLibrary\npublic  long getLongVersionCode()\nprivate  boolean hasAnyRequiredSplitTypes()\nclass ApkLite extends java.lang.Object implements []\[email protected](genConstructor=false, genConstDefs=false)")
+            inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.Nullable java.lang.String mUsesSplitName\nprivate final @android.annotation.Nullable java.lang.String mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mSplitTypes\nprivate final  int mVersionCodeMajor\nprivate final  int mVersionCode\nprivate final  int mRevisionCode\nprivate final  int mInstallLocation\nprivate final  int mMinSdkVersion\nprivate final  int mTargetSdkVersion\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final  boolean mFeatureSplit\nprivate final  boolean mIsolatedSplits\nprivate final  boolean mSplitRequired\nprivate final  boolean mCoreApp\nprivate final  boolean mDebuggable\nprivate final  boolean mProfileableByShell\nprivate final  boolean mMultiArch\nprivate final  boolean mUse32bitAbi\nprivate final  boolean mExtractNativeLibs\nprivate final  boolean mUseEmbeddedDex\nprivate final @android.annotation.Nullable java.lang.String mTargetPackageName\nprivate final  boolean mOverlayIsStatic\nprivate final  int mOverlayPriority\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyName\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyValue\nprivate final  int mRollbackDataPolicy\nprivate final  boolean mHasDeviceAdminReceiver\nprivate final  boolean mIsSdkLibrary\nprivate final  boolean mAllowUpdateOwnership\npublic  long getLongVersionCode()\nprivate  boolean hasAnyRequiredSplitTypes()\nclass ApkLite extends java.lang.Object implements []\[email protected](genConstructor=false, genConstDefs=false)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
index 64fed63..a4339d4 100644
--- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
+++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
@@ -127,7 +127,8 @@
                             null /* isFeatureSplits */, null /* usesSplitNames */,
                             null /* configForSplit */, null /* splitApkPaths */,
                             null /* splitRevisionCodes */, baseApk.getTargetSdkVersion(),
-                            null /* requiredSplitTypes */, null /* splitTypes */));
+                            null /* requiredSplitTypes */, null, /* splitTypes */
+                            baseApk.isAllowUpdateOwnership()));
         } finally {
             Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
         }
@@ -273,7 +274,8 @@
         return input.success(
                 new PackageLite(codePath, baseCodePath, baseApk, splitNames, isFeatureSplits,
                         usesSplitNames, configForSplits, splitCodePaths, splitRevisionCodes,
-                        baseApk.getTargetSdkVersion(), requiredSplitTypes, splitTypes));
+                        baseApk.getTargetSdkVersion(), requiredSplitTypes, splitTypes,
+                        baseApk.isAllowUpdateOwnership()));
     }
 
     /**
@@ -400,6 +402,8 @@
                 "isFeatureSplit", false);
         boolean isSplitRequired = parser.getAttributeBooleanValue(ANDROID_RES_NAMESPACE,
                 "isSplitRequired", false);
+        boolean allowUpdateOwnership = parser.getAttributeBooleanValue(ANDROID_RES_NAMESPACE,
+                "allowUpdateOwnership", true);
         String configForSplit = parser.getAttributeValue(null, "configForSplit");
 
         int targetSdkVersion = DEFAULT_TARGET_SDK_VERSION;
@@ -583,7 +587,7 @@
                         overlayIsStatic, overlayPriority, requiredSystemPropertyName,
                         requiredSystemPropertyValue, minSdkVersion, targetSdkVersion,
                         rollbackDataPolicy, requiredSplitTypes.first, requiredSplitTypes.second,
-                        hasDeviceAdminReceiver, isSdkLibrary));
+                        hasDeviceAdminReceiver, isSdkLibrary, allowUpdateOwnership));
     }
 
     private static boolean isDeviceAdminReceiver(
diff --git a/core/java/android/content/pm/parsing/PackageLite.java b/core/java/android/content/pm/parsing/PackageLite.java
index e2789c9..e24b932 100644
--- a/core/java/android/content/pm/parsing/PackageLite.java
+++ b/core/java/android/content/pm/parsing/PackageLite.java
@@ -110,10 +110,16 @@
      */
     private final boolean mIsSdkLibrary;
 
+    /**
+     * Indicates if this package allows an installer to declare update ownership of it.
+     */
+    private final boolean mAllowUpdateOwnership;
+
     public PackageLite(String path, String baseApkPath, ApkLite baseApk,
             String[] splitNames, boolean[] isFeatureSplits, String[] usesSplitNames,
             String[] configForSplit, String[] splitApkPaths, int[] splitRevisionCodes,
-            int targetSdk, Set<String>[] requiredSplitTypes, Set<String>[] splitTypes) {
+            int targetSdk, Set<String>[] requiredSplitTypes, Set<String>[] splitTypes,
+            boolean allowUpdateOwnership) {
         // The following paths may be different from the path in ApkLite because we
         // move or rename the APK files. Use parameters to indicate the correct paths.
         mPath = path;
@@ -144,6 +150,7 @@
         mSplitApkPaths = splitApkPaths;
         mSplitRevisionCodes = splitRevisionCodes;
         mTargetSdk = targetSdk;
+        mAllowUpdateOwnership = allowUpdateOwnership;
     }
 
     /**
@@ -414,12 +421,19 @@
         return mIsSdkLibrary;
     }
 
+    /**
+     * Indicates if this package allows an installer to declare update ownership of it.
+     */
+    @DataClass.Generated.Member
+    public boolean isAllowUpdateOwnership() {
+        return mAllowUpdateOwnership;
+    }
+
     @DataClass.Generated(
-            time = 1643132127068L,
+            time = 1680125514341L,
             codegenVersion = "1.0.23",
             sourceFile = "frameworks/base/core/java/android/content/pm/parsing/PackageLite.java",
-            inputSignatures =
-                    "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.NonNull java.lang.String mBaseApkPath\nprivate final @android.annotation.Nullable java.lang.String[] mSplitApkPaths\nprivate final @android.annotation.Nullable java.lang.String[] mSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mUsesSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mBaseRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String>[] mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String>[] mSplitTypes\nprivate final  int mVersionCodeMajor\nprivate final  int mVersionCode\nprivate final  int mTargetSdk\nprivate final  int mBaseRevisionCode\nprivate final @android.annotation.Nullable int[] mSplitRevisionCodes\nprivate final  int mInstallLocation\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.Nullable boolean[] mIsFeatureSplits\nprivate final  boolean mIsolatedSplits\nprivate final  boolean mSplitRequired\nprivate final  boolean mCoreApp\nprivate final  boolean mDebuggable\nprivate final  boolean mMultiArch\nprivate final  boolean mUse32bitAbi\nprivate final  boolean mExtractNativeLibs\nprivate final  boolean mProfileableByShell\nprivate final  boolean mUseEmbeddedDex\nprivate final  boolean mIsSdkLibrary\npublic  java.util.List<java.lang.String> getAllApkPaths()\npublic  long getLongVersionCode()\nprivate  boolean hasAnyRequiredSplitTypes()\nclass PackageLite extends java.lang.Object implements []\[email protected](genConstructor=false, genConstDefs=false)")
+            inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.NonNull java.lang.String mBaseApkPath\nprivate final @android.annotation.Nullable java.lang.String[] mSplitApkPaths\nprivate final @android.annotation.Nullable java.lang.String[] mSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mUsesSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mBaseRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String>[] mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String>[] mSplitTypes\nprivate final  int mVersionCodeMajor\nprivate final  int mVersionCode\nprivate final  int mTargetSdk\nprivate final  int mBaseRevisionCode\nprivate final @android.annotation.Nullable int[] mSplitRevisionCodes\nprivate final  int mInstallLocation\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.Nullable boolean[] mIsFeatureSplits\nprivate final  boolean mIsolatedSplits\nprivate final  boolean mSplitRequired\nprivate final  boolean mCoreApp\nprivate final  boolean mDebuggable\nprivate final  boolean mMultiArch\nprivate final  boolean mUse32bitAbi\nprivate final  boolean mExtractNativeLibs\nprivate final  boolean mProfileableByShell\nprivate final  boolean mUseEmbeddedDex\nprivate final  boolean mIsSdkLibrary\nprivate final  boolean mAllowUpdateOwnership\npublic  java.util.List<java.lang.String> getAllApkPaths()\npublic  long getLongVersionCode()\nprivate  boolean hasAnyRequiredSplitTypes()\nclass PackageLite extends java.lang.Object implements []\[email protected](genConstructor=false, genConstDefs=false)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/core/java/android/credentials/CredentialManager.java b/core/java/android/credentials/CredentialManager.java
index 00ce17a..9140d02 100644
--- a/core/java/android/credentials/CredentialManager.java
+++ b/core/java/android/credentials/CredentialManager.java
@@ -460,9 +460,17 @@
         return false;
     }
 
+    /**
+     * Returns whether the service is enabled.
+     *
+     * @hide
+     */
     private boolean isServiceEnabled() {
-        return DeviceConfig.getBoolean(
-                DeviceConfig.NAMESPACE_CREDENTIAL, DEVICE_CONFIG_ENABLE_CREDENTIAL_MANAGER, true);
+        try {
+            return mService.isServiceEnabled();
+        } catch (RemoteException e) {
+            return false;
+        }
     }
 
     /**
diff --git a/core/java/android/credentials/ICredentialManager.aidl b/core/java/android/credentials/ICredentialManager.aidl
index 5fde96b..b779c56 100644
--- a/core/java/android/credentials/ICredentialManager.aidl
+++ b/core/java/android/credentials/ICredentialManager.aidl
@@ -58,5 +58,7 @@
     List<CredentialProviderInfo> getCredentialProviderServices(in int userId, in int providerFilter);
 
     List<CredentialProviderInfo> getCredentialProviderServicesForTesting(in int providerFilter);
+
+    boolean isServiceEnabled();
 }
 
diff --git a/core/java/android/credentials/ui/CancelUiRequest.java b/core/java/android/credentials/ui/CancelUiRequest.java
index 6bd9de4..d4c249e 100644
--- a/core/java/android/credentials/ui/CancelUiRequest.java
+++ b/core/java/android/credentials/ui/CancelUiRequest.java
@@ -40,24 +40,50 @@
     @NonNull
     private final IBinder mToken;
 
+    private final boolean mShouldShowCancellationUi;
+
+    @NonNull
+    private final String mAppPackageName;
+
     /** Returns the request token matching the user request that should be cancelled. */
     @NonNull
     public IBinder getToken() {
         return mToken;
     }
 
-    public CancelUiRequest(@NonNull IBinder token) {
+    @NonNull
+    public String getAppPackageName() {
+        return mAppPackageName;
+    }
+
+    /**
+     * Returns whether the UI should render a cancellation UI upon the request. If false, the UI
+     * will be silently cancelled.
+     */
+    public boolean shouldShowCancellationUi() {
+        return mShouldShowCancellationUi;
+    }
+
+    public CancelUiRequest(@NonNull IBinder token, boolean shouldShowCancellationUi,
+            @NonNull String appPackageName) {
         mToken = token;
+        mShouldShowCancellationUi = shouldShowCancellationUi;
+        mAppPackageName = appPackageName;
     }
 
     private CancelUiRequest(@NonNull Parcel in) {
         mToken = in.readStrongBinder();
         AnnotationValidations.validate(NonNull.class, null, mToken);
+        mShouldShowCancellationUi = in.readBoolean();
+        mAppPackageName = in.readString8();
+        AnnotationValidations.validate(NonNull.class, null, mAppPackageName);
     }
 
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         dest.writeStrongBinder(mToken);
+        dest.writeBoolean(mShouldShowCancellationUi);
+        dest.writeString8(mAppPackageName);
     }
 
     @Override
diff --git a/core/java/android/credentials/ui/IntentFactory.java b/core/java/android/credentials/ui/IntentFactory.java
index dcfef56..5e8372d 100644
--- a/core/java/android/credentials/ui/IntentFactory.java
+++ b/core/java/android/credentials/ui/IntentFactory.java
@@ -72,7 +72,8 @@
      * @hide
      */
     @NonNull
-    public static Intent createCancelUiIntent(@NonNull IBinder requestToken) {
+    public static Intent createCancelUiIntent(@NonNull IBinder requestToken,
+            boolean shouldShowCancellationUi, @NonNull String appPackageName) {
         Intent intent = new Intent();
         ComponentName componentName =
                 ComponentName.unflattenFromString(
@@ -81,7 +82,8 @@
                                         com.android.internal.R.string
                                                 .config_credentialManagerDialogComponent));
         intent.setComponent(componentName);
-        intent.putExtra(CancelUiRequest.EXTRA_CANCEL_UI_REQUEST, new CancelUiRequest(requestToken));
+        intent.putExtra(CancelUiRequest.EXTRA_CANCEL_UI_REQUEST,
+                new CancelUiRequest(requestToken, shouldShowCancellationUi, appPackageName));
         return intent;
     }
 
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index 81d6ba9..ccc39b6 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -51,6 +51,7 @@
 import android.view.Surface;
 import android.view.SurfaceHolder;
 
+import com.android.internal.R;
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.app.IAppOpsCallback;
 import com.android.internal.app.IAppOpsService;
@@ -486,8 +487,22 @@
 
         boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(
                 ActivityThread.currentApplication().getApplicationContext());
+        boolean forceSlowJpegMode = shouldForceSlowJpegMode();
         return native_setup(new WeakReference<Camera>(this), cameraId,
-                ActivityThread.currentOpPackageName(), overrideToPortrait);
+                ActivityThread.currentOpPackageName(), overrideToPortrait, forceSlowJpegMode);
+    }
+
+    private boolean shouldForceSlowJpegMode() {
+        Context applicationContext = ActivityThread.currentApplication().getApplicationContext();
+        String[] slowJpegPackageNames = applicationContext.getResources().getStringArray(
+                R.array.config_forceSlowJpegModeList);
+        String callingPackageName = applicationContext.getPackageName();
+        for (String packageName : slowJpegPackageNames) {
+            if (TextUtils.equals(packageName, callingPackageName)) {
+                return true;
+            }
+        }
+        return false;
     }
 
     /** used by Camera#open, Camera#open(int) */
@@ -558,7 +573,7 @@
 
     @UnsupportedAppUsage
     private native int native_setup(Object cameraThis, int cameraId, String packageName,
-            boolean overrideToPortrait);
+            boolean overrideToPortrait, boolean forceSlowJpegMode);
 
     private native final void native_release();
 
diff --git a/core/java/android/hardware/biometrics/IBiometricContextListener.aidl b/core/java/android/hardware/biometrics/IBiometricContextListener.aidl
index bf3df90..6ac6581 100644
--- a/core/java/android/hardware/biometrics/IBiometricContextListener.aidl
+++ b/core/java/android/hardware/biometrics/IBiometricContextListener.aidl
@@ -23,11 +23,6 @@
  * @hide
  */
 oneway interface IBiometricContextListener {
-    // Called when aod or awake (screen on) status changes.
-    // These may be called while the device is still transitioning to the new state
-    // (i.e. about to become awake or enter doze)
-    void onDozeChanged(boolean isAod, boolean isAwake);
-
     @VintfStability
     @Backing(type="int")
     enum FoldState {
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 0e4c3c0..e908ced 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -41,9 +41,12 @@
  * <p>The properties describing a
  * {@link CameraDevice CameraDevice}.</p>
  *
- * <p>These properties are fixed for a given CameraDevice, and can be queried
+ * <p>These properties are primarily fixed for a given CameraDevice, and can be queried
  * through the {@link CameraManager CameraManager}
- * interface with {@link CameraManager#getCameraCharacteristics}.</p>
+ * interface with {@link CameraManager#getCameraCharacteristics}. Beginning with API level 32, some
+ * properties such as {@link #SENSOR_ORIENTATION} may change dynamically based on the state of the
+ * device. For information on whether a specific value is fixed, see the documentation for its key.
+ * </p>
  *
  * <p>When obtained by a client that does not hold the CAMERA permission, some metadata values are
  * not included. The list of keys that require the permission is given by
@@ -281,9 +284,6 @@
      * <p>The field definitions can be
      * found in {@link CameraCharacteristics}.</p>
      *
-     * <p>Querying the value for the same key more than once will return a value
-     * which is equal to the previous queried value.</p>
-     *
      * @throws IllegalArgumentException if the key was not valid
      *
      * @param key The characteristics field to read.
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 144b1de..73dd509 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -152,21 +152,8 @@
                     mContext.checkSelfPermission(CAMERA_OPEN_CLOSE_LISTENER_PERMISSION) ==
                     PackageManager.PERMISSION_GRANTED;
         }
-
-        mFoldStateListener = new FoldStateListener(context);
-        try {
-            context.getSystemService(DeviceStateManager.class).registerCallback(
-                    new HandlerExecutor(CameraManagerGlobal.get().getDeviceStateHandler()),
-                    mFoldStateListener);
-        } catch (IllegalStateException e) {
-            Log.v(TAG, "Failed to register device state listener!");
-            Log.v(TAG, "Device state dependent characteristics updates will not be functional!");
-            mFoldStateListener = null;
-        }
     }
 
-    private FoldStateListener mFoldStateListener;
-
     /**
      * @hide
      */
@@ -228,12 +215,7 @@
      * @hide
      */
     public void registerDeviceStateListener(@NonNull CameraCharacteristics chars) {
-        synchronized (mLock) {
-            DeviceStateListener listener = chars.getDeviceStateListener();
-            if (mFoldStateListener != null) {
-                mFoldStateListener.addDeviceStateListener(listener);
-            }
-        }
+        CameraManagerGlobal.get().registerDeviceStateListener(chars, mContext);
     }
 
     /**
@@ -627,6 +609,21 @@
     }
 
     /**
+     * <p>Query the capabilities of a camera device. These capabilities are
+     * immutable for a given camera.</p>
+     *
+     * <p>The value of {@link CameraCharacteristics.SENSOR_ORIENTATION} will change for landscape
+     * cameras depending on whether overrideToPortrait is enabled. If enabled, these cameras will
+     * appear to be portrait orientation instead, provided that the override is supported by the
+     * camera device. Only devices that can be opened by {@link #openCamera} will report a changed
+     * {@link CameraCharacteristics.SENSOR_ORIENTATION}.</p>
+     *
+     * @param cameraId The id of the camera device to query. This could be either a standalone
+     * camera ID which can be directly opened by {@link #openCamera}, or a physical camera ID that
+     * can only used as part of a logical multi-camera.
+     * @param overrideToPortrait Whether to apply the landscape to portrait override.
+     * @return The properties of the given camera
+     *
      * @hide
      */
     @TestApi
@@ -1781,6 +1778,7 @@
 
         private HandlerThread mDeviceStateHandlerThread;
         private Handler mDeviceStateHandler;
+        private FoldStateListener mFoldStateListener;
 
         // Singleton, don't allow construction
         private CameraManagerGlobal() { }
@@ -1795,7 +1793,8 @@
             return gCameraManager;
         }
 
-        public Handler getDeviceStateHandler() {
+        public void registerDeviceStateListener(@NonNull CameraCharacteristics chars,
+                @NonNull Context ctx) {
             synchronized(mLock) {
                 if (mDeviceStateHandlerThread == null) {
                     mDeviceStateHandlerThread = new HandlerThread(TAG);
@@ -1803,7 +1802,20 @@
                     mDeviceStateHandler = new Handler(mDeviceStateHandlerThread.getLooper());
                 }
 
-                return mDeviceStateHandler;
+                if (mFoldStateListener == null) {
+                    mFoldStateListener = new FoldStateListener(ctx);
+                    try {
+                        ctx.getSystemService(DeviceStateManager.class).registerCallback(
+                                new HandlerExecutor(mDeviceStateHandler), mFoldStateListener);
+                    } catch (IllegalStateException e) {
+                        Log.v(TAG, "Failed to register device state listener!");
+                        Log.v(TAG, "Device state dependent characteristics updates will not be" +
+                                "functional!");
+                        return;
+                    }
+                }
+
+                mFoldStateListener.addDeviceStateListener(chars.getDeviceStateListener());
             }
         }
 
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index a7e28e2..4950373 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -41,9 +41,10 @@
  * </p>
  *
  * <p>
- * All instances of CameraMetadata are immutable. The list of keys with {@link #getKeys()}
- * never changes, nor do the values returned by any key with {@code #get} throughout
- * the lifetime of the object.
+ * All instances of CameraMetadata are immutable. Beginning with API level 32, the list of keys
+ * returned by {@link #getKeys()} may change depending on the state of the device, as may the
+ * values returned by any key with {@code #get} throughout the lifetime of the object. For
+ * information on whether a specific value is fixed, see the documentation for its key.
  * </p>
  *
  * @see CameraDevice
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index b5281a5..2aead3c 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -1758,10 +1758,12 @@
         /**
          * Key for the brightness throttling data as a String formatted:
          * <displayId>,<no of throttling levels>,[<severity as string>,<brightness cap>]
-         * Where the latter part is repeated for each throttling level, and the entirety is repeated
-         * for each display, separated by a semicolon.
+         * [,<throttlingId>]?
+         * Where [<severity as string>,<brightness cap>] is repeated for each throttling level.
+         * The entirety is repeated for each display and throttling id, separated by a semicolon.
          * For example:
          * 123,1,critical,0.8;456,2,moderate,0.9,critical,0.7
+         * 123,1,critical,0.8,default;123,1,moderate,0.6,id_2;456,2,moderate,0.9,critical,0.7
          */
         String KEY_BRIGHTNESS_THROTTLING_DATA = "brightness_throttling_data";
     }
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index e7385b6..9cacfff 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -39,6 +39,7 @@
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.os.Vibrator;
+import android.sysprop.InputProperties;
 import android.util.Log;
 import android.view.Display;
 import android.view.InputDevice;
@@ -1123,7 +1124,8 @@
     public boolean isStylusPointerIconEnabled() {
         if (mIsStylusPointerIconEnabled == null) {
             mIsStylusPointerIconEnabled = getContext().getResources()
-                    .getBoolean(com.android.internal.R.bool.config_enableStylusPointerIcon);
+                    .getBoolean(com.android.internal.R.bool.config_enableStylusPointerIcon)
+                    || InputProperties.force_enable_stylus_pointer_icon().orElse(false);
         }
         return mIsStylusPointerIconEnabled;
     }
diff --git a/core/java/android/hardware/soundtrigger/OWNERS b/core/java/android/hardware/soundtrigger/OWNERS
index 01b2cb9..1e41886 100644
--- a/core/java/android/hardware/soundtrigger/OWNERS
+++ b/core/java/android/hardware/soundtrigger/OWNERS
@@ -1,2 +1 @@
[email protected]
[email protected]
+include /media/java/android/media/soundtrigger/OWNERS
diff --git a/core/java/android/inputmethodservice/InkWindow.java b/core/java/android/inputmethodservice/InkWindow.java
index 70bd504..15ed450 100644
--- a/core/java/android/inputmethodservice/InkWindow.java
+++ b/core/java/android/inputmethodservice/InkWindow.java
@@ -26,13 +26,17 @@
 import android.content.Context;
 import android.os.IBinder;
 import android.util.Slog;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewRootImpl;
 import android.view.ViewTreeObserver;
 import android.view.WindowManager;
 
 import com.android.internal.policy.PhoneWindow;
 
+import java.util.Objects;
+
 /**
  * Window of type {@code LayoutParams.TYPE_INPUT_METHOD_DIALOG} for drawing
  * Handwriting Ink on screen.
@@ -185,4 +189,12 @@
         return getDecorView().getVisibility() == View.VISIBLE
                 && mInkView != null && mInkView.isVisibleToUser();
     }
+
+    void dispatchHandwritingEvent(@NonNull MotionEvent event) {
+        final View decor = getDecorView();
+        Objects.requireNonNull(decor);
+        final ViewRootImpl viewRoot = decor.getViewRootImpl();
+        Objects.requireNonNull(viewRoot);
+        viewRoot.enqueueInputEvent(event);
+    }
 }
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index ee9d8a4..a9c4818 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -2563,7 +2563,7 @@
      */
     public void onStylusHandwritingMotionEvent(@NonNull MotionEvent motionEvent) {
         if (mInkWindow != null && mInkWindow.isInkViewVisible()) {
-            mInkWindow.getDecorView().dispatchTouchEvent(motionEvent);
+            mInkWindow.dispatchHandwritingEvent(motionEvent);
         } else {
             if (mPendingEvents == null) {
                 mPendingEvents = new RingBuffer(MotionEvent.class, MAX_EVENTS_BUFFER);
@@ -2576,7 +2576,7 @@
                             if (mInkWindow == null) {
                                 break;
                             }
-                            mInkWindow.getDecorView().dispatchTouchEvent(event);
+                            mInkWindow.dispatchHandwritingEvent(event);
                         }
                         mPendingEvents.clear();
                     }
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index 104a8b2..efed688 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -780,11 +780,11 @@
             case ActivityManager.PROCESS_STATE_PERSISTENT:
             case ActivityManager.PROCESS_STATE_PERSISTENT_UI:
             case ActivityManager.PROCESS_STATE_TOP:
-                return ActivityManager.PROCESS_CAPABILITY_ALL;
             case ActivityManager.PROCESS_STATE_BOUND_TOP:
             case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
             case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
-                return ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK;
+                return ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK
+                        | ActivityManager.PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK;
             default:
                 return ActivityManager.PROCESS_CAPABILITY_NONE;
         }
@@ -826,13 +826,18 @@
         if (uidState == null) {
             return false;
         }
-        return isProcStateAllowedWhileOnRestrictBackground(uidState.procState);
+        return isProcStateAllowedWhileOnRestrictBackground(uidState.procState, uidState.capability);
     }
 
     /** @hide */
-    public static boolean isProcStateAllowedWhileOnRestrictBackground(int procState) {
-        // Data saver and bg policy restrictions will only take procstate into account.
-        return procState <= FOREGROUND_THRESHOLD_STATE;
+    public static boolean isProcStateAllowedWhileOnRestrictBackground(int procState,
+            @ProcessCapability int capabilities) {
+        return procState <= FOREGROUND_THRESHOLD_STATE
+                // This is meant to be a user-initiated job, and therefore gets similar network
+                // access to FGS.
+                || (procState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
+                        && (capabilities
+                              & ActivityManager.PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK) != 0);
     }
 
     /** @hide */
diff --git a/core/java/android/net/vcn/VcnCellUnderlyingNetworkTemplate.java b/core/java/android/net/vcn/VcnCellUnderlyingNetworkTemplate.java
index 38b3174..46cf016 100644
--- a/core/java/android/net/vcn/VcnCellUnderlyingNetworkTemplate.java
+++ b/core/java/android/net/vcn/VcnCellUnderlyingNetworkTemplate.java
@@ -354,6 +354,7 @@
     }
 
     /** @hide */
+    @Override
     public Map<Integer, Integer> getCapabilitiesMatchCriteria() {
         return Collections.unmodifiableMap(new HashMap<>(mCapabilitiesMatchCriteria));
     }
diff --git a/core/java/android/net/vcn/VcnConfig.java b/core/java/android/net/vcn/VcnConfig.java
index 6f9c9dd..a27e923 100644
--- a/core/java/android/net/vcn/VcnConfig.java
+++ b/core/java/android/net/vcn/VcnConfig.java
@@ -16,6 +16,7 @@
 package android.net.vcn;
 
 import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_TEST;
 import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
 
 import static com.android.internal.annotations.VisibleForTesting.Visibility;
@@ -75,6 +76,7 @@
     static {
         ALLOWED_TRANSPORTS.add(TRANSPORT_WIFI);
         ALLOWED_TRANSPORTS.add(TRANSPORT_CELLULAR);
+        ALLOWED_TRANSPORTS.add(TRANSPORT_TEST);
     }
 
     private static final String PACKAGE_NAME_KEY = "mPackageName";
@@ -155,6 +157,11 @@
                                 + transport
                                 + " which might be from a new version of VcnConfig");
             }
+
+            if (transport == TRANSPORT_TEST && !mIsTestModeProfile) {
+                throw new IllegalArgumentException(
+                        "Found TRANSPORT_TEST in a non-test-mode profile");
+            }
         }
     }
 
diff --git a/core/java/android/net/vcn/VcnUnderlyingNetworkTemplate.java b/core/java/android/net/vcn/VcnUnderlyingNetworkTemplate.java
index 9235d09..edf2c09 100644
--- a/core/java/android/net/vcn/VcnUnderlyingNetworkTemplate.java
+++ b/core/java/android/net/vcn/VcnUnderlyingNetworkTemplate.java
@@ -29,6 +29,7 @@
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -307,4 +308,7 @@
     public int getMinExitDownstreamBandwidthKbps() {
         return mMinExitDownstreamBandwidthKbps;
     }
+
+    /** @hide */
+    public abstract Map<Integer, Integer> getCapabilitiesMatchCriteria();
 }
diff --git a/core/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplate.java b/core/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplate.java
index 2544a6d..2e6b09f 100644
--- a/core/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplate.java
+++ b/core/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplate.java
@@ -15,6 +15,9 @@
  */
 package android.net.vcn;
 
+import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_ANY;
+
 import static com.android.internal.annotations.VisibleForTesting.Visibility;
 import static com.android.server.vcn.util.PersistableBundleUtils.STRING_DESERIALIZER;
 import static com.android.server.vcn.util.PersistableBundleUtils.STRING_SERIALIZER;
@@ -23,6 +26,7 @@
 import android.annotation.Nullable;
 import android.annotation.SuppressLint;
 import android.net.NetworkCapabilities;
+import android.net.vcn.VcnUnderlyingNetworkTemplate.MatchCriteria;
 import android.os.PersistableBundle;
 import android.util.ArraySet;
 
@@ -32,6 +36,7 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 
@@ -162,6 +167,12 @@
         return Collections.unmodifiableSet(mSsids);
     }
 
+    /** @hide */
+    @Override
+    public Map<Integer, Integer> getCapabilitiesMatchCriteria() {
+        return Collections.singletonMap(NET_CAPABILITY_INTERNET, MATCH_REQUIRED);
+    }
+
     /** This class is used to incrementally build VcnWifiUnderlyingNetworkTemplate objects. */
     public static final class Builder {
         private int mMeteredMatchCriteria = MATCH_ANY;
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index bfc5afe..4bfff16 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -8434,7 +8434,7 @@
             extras.putString(KEY_ACCOUNT_NAME, accountName);
             extras.putString(KEY_ACCOUNT_TYPE, accountType);
 
-            contentResolver.call(ContactsContract.AUTHORITY_URI,
+            nullSafeCall(contentResolver, ContactsContract.AUTHORITY_URI,
                     ContactsContract.SimContacts.ADD_SIM_ACCOUNT_METHOD,
                     null, extras);
         }
@@ -8457,7 +8457,7 @@
             Bundle extras = new Bundle();
             extras.putInt(KEY_SIM_SLOT_INDEX, simSlotIndex);
 
-            contentResolver.call(ContactsContract.AUTHORITY_URI,
+            nullSafeCall(contentResolver, ContactsContract.AUTHORITY_URI,
                     ContactsContract.SimContacts.REMOVE_SIM_ACCOUNT_METHOD,
                     null, extras);
         }
@@ -8469,7 +8469,7 @@
          */
         public static @NonNull List<SimAccount> getSimAccounts(
                 @NonNull ContentResolver contentResolver) {
-            Bundle response = contentResolver.call(ContactsContract.AUTHORITY_URI,
+            Bundle response = nullSafeCall(contentResolver, ContactsContract.AUTHORITY_URI,
                     ContactsContract.SimContacts.QUERY_SIM_ACCOUNTS_METHOD,
                     null, null);
             List<SimAccount> result = response.getParcelableArrayList(KEY_SIM_ACCOUNTS, android.provider.ContactsContract.SimAccount.class);
@@ -9088,7 +9088,8 @@
          * @param contactId the id of the contact to undemote.
          */
         public static void undemote(ContentResolver contentResolver, long contactId) {
-            contentResolver.call(ContactsContract.AUTHORITY_URI, PinnedPositions.UNDEMOTE_METHOD,
+            nullSafeCall(contentResolver, ContactsContract.AUTHORITY_URI,
+                    PinnedPositions.UNDEMOTE_METHOD,
                     String.valueOf(contactId), null);
         }
 
@@ -10300,4 +10301,13 @@
         public static final String CONTENT_ITEM_TYPE =
                 "vnd.android.cursor.item/contact_metadata_sync_state";
     }
+
+    private static Bundle nullSafeCall(@NonNull ContentResolver resolver, @NonNull Uri uri,
+            @NonNull String method, @Nullable String arg, @Nullable Bundle extras) {
+        try (ContentProviderClient client = resolver.acquireContentProviderClient(uri)) {
+            return client.call(method, arg, extras);
+        } catch (RemoteException e) {
+            throw e.rethrowAsRuntimeException();
+        }
+    }
 }
diff --git a/core/java/android/service/autofill/FillContext.java b/core/java/android/service/autofill/FillContext.java
index cc1b6cd..e36d899 100644
--- a/core/java/android/service/autofill/FillContext.java
+++ b/core/java/android/service/autofill/FillContext.java
@@ -127,7 +127,7 @@
                 final int index = missingNodeIndexes.keyAt(i);
                 final AutofillId id = ids[index];
 
-                if (id.equals(node.getAutofillId())) {
+                if (id != null && id.equals(node.getAutofillId())) {
                     foundNodes[index] = node;
 
                     if (mViewNodeLookupTable == null) {
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index c962bf1..3fb94ee 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -122,10 +122,11 @@
     *
     * @hide
     */
-    public static FillResponse shallowCopy(FillResponse r, List<Dataset> datasets) {
+    public static FillResponse shallowCopy(
+            FillResponse r, List<Dataset> datasets, SaveInfo saveInfo) {
         return new FillResponse(
                 (datasets != null) ? new ParceledListSlice<>(datasets) : null,
-                r.mSaveInfo,
+                saveInfo,
                 r.mClientState,
                 r.mPresentation,
                 r.mInlinePresentation,
diff --git a/core/java/android/service/autofill/SaveInfo.java b/core/java/android/service/autofill/SaveInfo.java
index 828e466..954cc96 100644
--- a/core/java/android/service/autofill/SaveInfo.java
+++ b/core/java/android/service/autofill/SaveInfo.java
@@ -334,6 +334,39 @@
     private final AutofillId[][] mSanitizerValues;
     private final AutofillId mTriggerId;
 
+    /**
+     * Creates a copy of the provided SaveInfo.
+     *
+     * @hide
+     */
+    public static SaveInfo copy(SaveInfo s, AutofillId[] optionalIds) {
+        return new SaveInfo(s.mType, s.mNegativeButtonStyle, s.mPositiveButtonStyle,
+                s.mNegativeActionListener, s.mRequiredIds, assertValid(optionalIds), s.mDescription,
+                s.mFlags, s.mCustomDescription, s.mValidator, s.mSanitizerKeys, s.mSanitizerValues,
+                s.mTriggerId);
+    }
+
+    private SaveInfo(@SaveDataType int type, @NegativeButtonStyle int negativeButtonStyle,
+            @PositiveButtonStyle int positiveButtonStyle, IntentSender negativeActionListener,
+            AutofillId[] requiredIds, AutofillId[] optionalIds, CharSequence description, int flags,
+            CustomDescription customDescription, InternalValidator validator,
+            InternalSanitizer[] sanitizerKeys, AutofillId[][] sanitizerValues,
+            AutofillId triggerId) {
+        mType = type;
+        mNegativeButtonStyle = negativeButtonStyle;
+        mNegativeActionListener = negativeActionListener;
+        mPositiveButtonStyle = positiveButtonStyle;
+        mRequiredIds = requiredIds;
+        mOptionalIds = optionalIds;
+        mDescription = description;
+        mFlags = flags;
+        mCustomDescription = customDescription;
+        mValidator = validator;
+        mSanitizerKeys = sanitizerKeys;
+        mSanitizerValues = sanitizerValues;
+        mTriggerId = triggerId;
+    }
+
     private SaveInfo(Builder builder) {
         mType = builder.mType;
         mNegativeButtonStyle = builder.mNegativeButtonStyle;
diff --git a/core/java/android/service/credentials/CredentialProviderService.java b/core/java/android/service/credentials/CredentialProviderService.java
index b977606..e87333f 100644
--- a/core/java/android/service/credentials/CredentialProviderService.java
+++ b/core/java/android/service/credentials/CredentialProviderService.java
@@ -231,12 +231,18 @@
     }
 
     private final ICredentialProviderService mInterface = new ICredentialProviderService.Stub() {
-        public ICancellationSignal onBeginGetCredential(BeginGetCredentialRequest request,
+        @Override
+        public void onBeginGetCredential(BeginGetCredentialRequest request,
                 IBeginGetCredentialCallback callback) {
             Objects.requireNonNull(request);
             Objects.requireNonNull(callback);
 
             ICancellationSignal transport = CancellationSignal.createTransport();
+            try {
+                callback.onCancellable(transport);
+            } catch (RemoteException e) {
+                e.rethrowFromSystemServer();
+            }
 
             mHandler.sendMessage(obtainMessage(
                     CredentialProviderService::onBeginGetCredential,
@@ -267,7 +273,6 @@
                         }
                     }
             ));
-            return transport;
         }
         private void enforceRemoteEntryPermission() {
             String permission =
@@ -280,12 +285,17 @@
         }
 
         @Override
-        public ICancellationSignal onBeginCreateCredential(BeginCreateCredentialRequest request,
+        public void onBeginCreateCredential(BeginCreateCredentialRequest request,
                 IBeginCreateCredentialCallback callback) {
             Objects.requireNonNull(request);
             Objects.requireNonNull(callback);
 
             ICancellationSignal transport = CancellationSignal.createTransport();
+            try {
+                callback.onCancellable(transport);
+            } catch (RemoteException e) {
+                e.rethrowFromSystemServer();
+            }
 
             mHandler.sendMessage(obtainMessage(
                     CredentialProviderService::onBeginCreateCredential,
@@ -316,16 +326,20 @@
                         }
                     }
             ));
-            return transport;
         }
 
         @Override
-        public ICancellationSignal onClearCredentialState(ClearCredentialStateRequest request,
+        public void onClearCredentialState(ClearCredentialStateRequest request,
                 IClearCredentialStateCallback callback) {
             Objects.requireNonNull(request);
             Objects.requireNonNull(callback);
 
             ICancellationSignal transport = CancellationSignal.createTransport();
+            try {
+                callback.onCancellable(transport);
+            } catch (RemoteException e) {
+                e.rethrowFromSystemServer();
+            }
 
             mHandler.sendMessage(obtainMessage(
                     CredentialProviderService::onClearCredentialState,
@@ -350,7 +364,6 @@
                         }
                     }
             ));
-            return transport;
         }
     };
 
diff --git a/core/java/android/service/credentials/IBeginCreateCredentialCallback.aidl b/core/java/android/service/credentials/IBeginCreateCredentialCallback.aidl
index ab855ef..4b73cbc 100644
--- a/core/java/android/service/credentials/IBeginCreateCredentialCallback.aidl
+++ b/core/java/android/service/credentials/IBeginCreateCredentialCallback.aidl
@@ -1,6 +1,7 @@
 package android.service.credentials;
 
 import android.service.credentials.BeginCreateCredentialResponse;
+import android.os.ICancellationSignal;
 
 /**
  * Interface from the system to a credential provider service.
@@ -10,4 +11,5 @@
 oneway interface IBeginCreateCredentialCallback {
     void onSuccess(in BeginCreateCredentialResponse request);
     void onFailure(String errorType, in CharSequence message);
+    void onCancellable(in ICancellationSignal cancellation);
 }
\ No newline at end of file
diff --git a/core/java/android/service/credentials/IBeginGetCredentialCallback.aidl b/core/java/android/service/credentials/IBeginGetCredentialCallback.aidl
index 73e9870..0710fb3 100644
--- a/core/java/android/service/credentials/IBeginGetCredentialCallback.aidl
+++ b/core/java/android/service/credentials/IBeginGetCredentialCallback.aidl
@@ -1,6 +1,8 @@
 package android.service.credentials;
 
 import android.service.credentials.BeginGetCredentialResponse;
+import android.os.ICancellationSignal;
+
 
 /**
  * Interface from the system to a credential provider service.
@@ -10,4 +12,5 @@
 oneway interface IBeginGetCredentialCallback {
     void onSuccess(in BeginGetCredentialResponse response);
     void onFailure(String errorType, in CharSequence message);
+    void onCancellable(in ICancellationSignal cancellation);
 }
\ No newline at end of file
diff --git a/core/java/android/service/credentials/IClearCredentialStateCallback.aidl b/core/java/android/service/credentials/IClearCredentialStateCallback.aidl
index ec805d0..5751318 100644
--- a/core/java/android/service/credentials/IClearCredentialStateCallback.aidl
+++ b/core/java/android/service/credentials/IClearCredentialStateCallback.aidl
@@ -16,12 +16,16 @@
 
 package android.service.credentials;
 
+import android.os.ICancellationSignal;
+
+
 /**
  * Callback for onClearCredentialState request.
  *
  * @hide
  */
-interface IClearCredentialStateCallback {
-    oneway void onSuccess();
-    oneway void onFailure(String errorType, CharSequence message);
+oneway interface IClearCredentialStateCallback {
+    void onSuccess();
+    void onFailure(String errorType, CharSequence message);
+    void onCancellable(in ICancellationSignal cancellation);
 }
\ No newline at end of file
diff --git a/core/java/android/service/credentials/ICredentialProviderService.aidl b/core/java/android/service/credentials/ICredentialProviderService.aidl
index 626dd78..ebb4a4e 100644
--- a/core/java/android/service/credentials/ICredentialProviderService.aidl
+++ b/core/java/android/service/credentials/ICredentialProviderService.aidl
@@ -30,8 +30,8 @@
  *
  * @hide
  */
-interface ICredentialProviderService {
-    ICancellationSignal onBeginGetCredential(in BeginGetCredentialRequest request, in IBeginGetCredentialCallback callback);
-    ICancellationSignal onBeginCreateCredential(in BeginCreateCredentialRequest request, in IBeginCreateCredentialCallback callback);
-    ICancellationSignal onClearCredentialState(in ClearCredentialStateRequest request, in IClearCredentialStateCallback callback);
+oneway interface ICredentialProviderService {
+    void onBeginGetCredential(in BeginGetCredentialRequest request, in IBeginGetCredentialCallback callback);
+    void onBeginCreateCredential(in BeginCreateCredentialRequest request, in IBeginCreateCredentialCallback callback);
+    void onClearCredentialState(in ClearCredentialStateRequest request, in IClearCredentialStateCallback callback);
 }
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index 5c2b389..402da28 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -1008,9 +1008,8 @@
                 .allowAlarms(allowAlarms)
                 .allowMedia(allowMedia)
                 .allowSystem(allowSystem)
-                .allowConversations(allowConversations
-                        ? ZenModeConfig.getZenPolicySenders(allowConversationsFrom)
-                        : ZenPolicy.PEOPLE_TYPE_NONE);
+                .allowConversations(allowConversations ? allowConversationsFrom
+                        : ZenPolicy.CONVERSATION_SENDERS_NONE);
         if (suppressedVisualEffects == 0) {
             builder.showAllVisualEffects();
         } else {
diff --git a/core/java/android/service/remotelockscreenvalidation/RemoteLockscreenValidationClientImpl.java b/core/java/android/service/remotelockscreenvalidation/RemoteLockscreenValidationClientImpl.java
index 140ef39..a5acf54 100644
--- a/core/java/android/service/remotelockscreenvalidation/RemoteLockscreenValidationClientImpl.java
+++ b/core/java/android/service/remotelockscreenvalidation/RemoteLockscreenValidationClientImpl.java
@@ -179,7 +179,7 @@
                     PackageManager.ComponentInfoFlags.of(PackageManager.GET_META_DATA));
         } catch (PackageManager.NameNotFoundException e) {
             Log.w(TAG, TextUtils.formatSimple("Cannot resolve service %s",
-                    serviceComponent.getClass().getName()));
+                    serviceComponent.getClassName()));
             return null;
         }
     }
diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java
index d48d566..e6dad27 100755
--- a/core/java/android/text/format/DateFormat.java
+++ b/core/java/android/text/format/DateFormat.java
@@ -24,12 +24,12 @@
 import android.content.Context;
 import android.icu.text.DateFormatSymbols;
 import android.icu.text.DateTimePatternGenerator;
+import android.icu.util.ULocale;
 import android.os.Build;
 import android.provider.Settings;
 import android.text.SpannableStringBuilder;
 import android.text.Spanned;
 import android.text.SpannedString;
-import android.text.TextUtils;
 
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -265,11 +265,13 @@
      * @return a string pattern suitable for use with {@link java.text.SimpleDateFormat}.
      */
     public static String getBestDateTimePattern(Locale locale, String skeleton) {
-        DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(locale);
+        ULocale uLocale = ULocale.forLocale(locale);
+        DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(uLocale);
         boolean allowDuplicateFields = !CompatChanges.isChangeEnabled(
                 DISALLOW_DUPLICATE_FIELD_IN_SKELETON);
-        return dtpg.getBestPattern(skeleton, DateTimePatternGenerator.MATCH_NO_OPTIONS,
+        String pattern = dtpg.getBestPattern(skeleton, DateTimePatternGenerator.MATCH_NO_OPTIONS,
                 allowDuplicateFields);
+        return getCompatibleEnglishPattern(uLocale, pattern);
     }
 
     /**
@@ -303,10 +305,11 @@
      */
     @UnsupportedAppUsage
     public static String getTimeFormatString(Context context, int userHandle) {
-        DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(
-                context.getResources().getConfiguration().locale);
-        return is24HourFormat(context, userHandle) ? dtpg.getBestPattern("Hm")
+        ULocale uLocale = ULocale.forLocale(context.getResources().getConfiguration().locale);
+        DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(uLocale);
+        String pattern = is24HourFormat(context, userHandle) ? dtpg.getBestPattern("Hm")
             : dtpg.getBestPattern("hm");
+        return getCompatibleEnglishPattern(uLocale, pattern);
     }
 
     /**
@@ -713,4 +716,21 @@
     public static DateFormatSymbols getIcuDateFormatSymbols(Locale locale) {
         return new DateFormatSymbols(android.icu.util.GregorianCalendar.class, locale);
     }
+
+    /**
+     * See http://b/266731719. It mirrors the implementation in
+     * {@link libcore.icu.SimpleDateFormatData.DateTimeFormatStringGenerator#postProcessPattern}
+     */
+    private static String getCompatibleEnglishPattern(ULocale locale, String pattern) {
+        if (pattern == null || locale == null || !"en".equals(locale.getLanguage())) {
+            return pattern;
+        }
+
+        String region = locale.getCountry();
+        if (region != null && !region.isEmpty() && !"US".equals(region)) {
+            return pattern;
+        }
+
+        return pattern.replace('\u202f', ' ');
+    }
 }
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index bc514b0..c329508 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -234,8 +234,8 @@
         DEFAULT_FLAGS.put(SETTINGS_AUDIO_ROUTING, "true");
         DEFAULT_FLAGS.put(SETTINGS_FLASH_NOTIFICATIONS, "true");
         DEFAULT_FLAGS.put(SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS, "true");
-        DEFAULT_FLAGS.put(SETTINGS_ENABLE_LOCKSCREEN_TRANSFER_API, "false");
-        DEFAULT_FLAGS.put(SETTINGS_REMOTE_DEVICE_CREDENTIAL_VALIDATION, "false");
+        DEFAULT_FLAGS.put(SETTINGS_ENABLE_LOCKSCREEN_TRANSFER_API, "true");
+        DEFAULT_FLAGS.put(SETTINGS_REMOTE_DEVICE_CREDENTIAL_VALIDATION, "true");
     }
 
     private static final Set<String> PERSISTENT_FLAGS;
diff --git a/core/java/android/util/TeeWriter.java b/core/java/android/util/TeeWriter.java
new file mode 100644
index 0000000..439a0c2
--- /dev/null
+++ b/core/java/android/util/TeeWriter.java
@@ -0,0 +1,62 @@
+/*
+ * 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.util;
+
+import android.annotation.NonNull;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Objects;
+
+/**
+ * Writer that offers to "tee" identical output to multiple underlying
+ * {@link Writer} instances.
+ *
+ * @see https://man7.org/linux/man-pages/man1/tee.1.html
+ * @hide
+ */
+public class TeeWriter extends Writer {
+    private final @NonNull Writer[] mWriters;
+
+    public TeeWriter(@NonNull Writer... writers) {
+        for (Writer writer : writers) {
+            Objects.requireNonNull(writer);
+        }
+        mWriters = writers;
+    }
+
+    @Override
+    public void write(char[] cbuf, int off, int len) throws IOException {
+        for (Writer writer : mWriters) {
+            writer.write(cbuf, off, len);
+        }
+    }
+
+    @Override
+    public void flush() throws IOException {
+        for (Writer writer : mWriters) {
+            writer.flush();
+        }
+    }
+
+    @Override
+    public void close() throws IOException {
+        for (Writer writer : mWriters) {
+            writer.close();
+        }
+    }
+}
diff --git a/core/java/android/util/apk/ApkSignatureSchemeV2Verifier.java b/core/java/android/util/apk/ApkSignatureSchemeV2Verifier.java
index eb467e0..992a586 100644
--- a/core/java/android/util/apk/ApkSignatureSchemeV2Verifier.java
+++ b/core/java/android/util/apk/ApkSignatureSchemeV2Verifier.java
@@ -75,6 +75,11 @@
     private static final int APK_SIGNATURE_SCHEME_V2_BLOCK_ID = 0x7109871a;
 
     /**
+     * The maximum number of signers supported by the v2 APK signature scheme.
+     */
+    private static final int MAX_V2_SIGNERS = 10;
+
+    /**
      * Returns {@code true} if the provided APK contains an APK Signature Scheme V2 signature.
      *
      * <p><b>NOTE: This method does not verify the signature.</b>
@@ -183,6 +188,11 @@
         }
         while (signers.hasRemaining()) {
             signerCount++;
+            if (signerCount > MAX_V2_SIGNERS) {
+                throw new SecurityException(
+                        "APK Signature Scheme v2 only supports a maximum of " + MAX_V2_SIGNERS
+                                + " signers");
+            }
             try {
                 ByteBuffer signer = getLengthPrefixedSlice(signers);
                 X509Certificate[] certs = verifySigner(signer, contentDigests, certFactory);
diff --git a/core/java/android/util/jar/StrictJarVerifier.java b/core/java/android/util/jar/StrictJarVerifier.java
index 4525490..a6aca33 100644
--- a/core/java/android/util/jar/StrictJarVerifier.java
+++ b/core/java/android/util/jar/StrictJarVerifier.java
@@ -78,6 +78,11 @@
         "SHA1",
     };
 
+    /**
+     * The maximum number of signers supported by the JAR signature scheme.
+     */
+    private static final int MAX_JAR_SIGNERS = 10;
+
     private final String jarName;
     private final StrictJarManifest manifest;
     private final HashMap<String, byte[]> metaEntries;
@@ -293,10 +298,16 @@
             return false;
         }
 
+        int signerCount = 0;
         Iterator<String> it = metaEntries.keySet().iterator();
         while (it.hasNext()) {
             String key = it.next();
             if (key.endsWith(".DSA") || key.endsWith(".RSA") || key.endsWith(".EC")) {
+                if (++signerCount > MAX_JAR_SIGNERS) {
+                    throw new SecurityException(
+                            "APK Signature Scheme v1 only supports a maximum of " + MAX_JAR_SIGNERS
+                                    + " signers");
+                }
                 verifyCertificate(key);
                 it.remove();
             }
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 5476088..baefd85 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -1218,47 +1218,51 @@
     }
 
     /**
-     * Returns the display's HDR capabilities.
+     * Returns the current display mode's HDR capabilities.
      *
      * @see #isHdr()
      */
     public HdrCapabilities getHdrCapabilities() {
         synchronized (mLock) {
             updateDisplayInfoLocked();
-            if (mDisplayInfo.userDisabledHdrTypes.length == 0) {
-                return mDisplayInfo.hdrCapabilities;
-            }
-
             if (mDisplayInfo.hdrCapabilities == null) {
                 return null;
             }
-
-            ArraySet<Integer> enabledTypesSet = new ArraySet<>();
-            for (int supportedType : mDisplayInfo.hdrCapabilities.getSupportedHdrTypes()) {
-                boolean typeDisabled = false;
-                for (int userDisabledType : mDisplayInfo.userDisabledHdrTypes) {
-                    if (supportedType == userDisabledType) {
-                        typeDisabled = true;
-                        break;
+            int[] supportedHdrTypes;
+            if (mDisplayInfo.userDisabledHdrTypes.length == 0) {
+                int[] modeSupportedHdrTypes = getMode().getSupportedHdrTypes();
+                supportedHdrTypes = Arrays.copyOf(modeSupportedHdrTypes,
+                        modeSupportedHdrTypes.length);
+            } else {
+                ArraySet<Integer> enabledTypesSet = new ArraySet<>();
+                for (int supportedType : getMode().getSupportedHdrTypes()) {
+                    if (!contains(mDisplayInfo.userDisabledHdrTypes, supportedType)) {
+                        enabledTypesSet.add(supportedType);
                     }
                 }
-                if (!typeDisabled) {
-                    enabledTypesSet.add(supportedType);
+
+                supportedHdrTypes = new int[enabledTypesSet.size()];
+                int index = 0;
+                for (int enabledType : enabledTypesSet) {
+                    supportedHdrTypes[index++] = enabledType;
                 }
             }
-
-            int[] enabledTypes = new int[enabledTypesSet.size()];
-            int index = 0;
-            for (int enabledType : enabledTypesSet) {
-                enabledTypes[index++] = enabledType;
-            }
-            return new HdrCapabilities(enabledTypes,
+            return new HdrCapabilities(supportedHdrTypes,
                     mDisplayInfo.hdrCapabilities.mMaxLuminance,
                     mDisplayInfo.hdrCapabilities.mMaxAverageLuminance,
                     mDisplayInfo.hdrCapabilities.mMinLuminance);
         }
     }
 
+    private boolean contains(int[] disabledHdrTypes, int hdrType) {
+        for (Integer disabledHdrFormat : disabledHdrTypes) {
+            if (disabledHdrFormat == hdrType) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * @hide
      * Returns the current mode's supported HDR types.
diff --git a/core/java/android/view/InputWindowHandle.java b/core/java/android/view/InputWindowHandle.java
index 24a0355..d35aff9 100644
--- a/core/java/android/view/InputWindowHandle.java
+++ b/core/java/android/view/InputWindowHandle.java
@@ -158,6 +158,14 @@
      */
     public Matrix transform;
 
+    /**
+     * The input token for the window to which focus should be transferred when this input window
+     * can be successfully focused. If null, this input window will not transfer its focus to
+     * any other window.
+     */
+    @Nullable
+    public IBinder focusTransferTarget;
+
     private native void nativeDispose();
 
     public InputWindowHandle(InputApplicationHandle inputApplicationHandle, int displayId) {
@@ -195,6 +203,7 @@
             transform = new Matrix();
             transform.set(other.transform);
         }
+        focusTransferTarget = other.focusTransferTarget;
     }
 
     @Override
diff --git a/core/java/android/view/PointerIcon.java b/core/java/android/view/PointerIcon.java
index 6a493e6..d88994b 100644
--- a/core/java/android/view/PointerIcon.java
+++ b/core/java/android/view/PointerIcon.java
@@ -57,8 +57,9 @@
     /** Type constant: Null icon.  It has no bitmap. */
     public static final int TYPE_NULL = 0;
 
-    /** Type constant: no icons are specified. If all views uses this, then falls back
-     * to the default type, but this is helpful to distinguish a view explicitly want
+    /**
+     * Type constant: no icons are specified. If all views uses this, then the pointer icon falls
+     * back to the default type, but this is helpful to distinguish a view that explicitly wants
      * to have the default icon.
      * @hide
      */
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 0db52aa..bc6a3b5 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -265,7 +265,7 @@
             int transformHint);
     private static native void nativeRemoveCurrentInputFocus(long nativeObject, int displayId);
     private static native void nativeSetFocusedWindow(long transactionObj, IBinder toToken,
-            String windowName, IBinder focusedToken, String focusedWindowName, int displayId);
+            String windowName, int displayId);
     private static native void nativeSetFrameTimelineVsync(long transactionObj,
             long frameTimelineVsyncId);
     private static native void nativeAddJankDataListener(long nativeListener,
@@ -3604,28 +3604,7 @@
          */
         public Transaction setFocusedWindow(@NonNull IBinder token, String windowName,
                 int displayId) {
-            nativeSetFocusedWindow(mNativeObject, token,  windowName,
-                    null /* focusedToken */, null /* focusedWindowName */, displayId);
-            return this;
-        }
-
-        /**
-         * Set focus on the window identified by the input {@code token} if the window identified by
-         * the input {@code focusedToken} is currently focused. If the {@code focusedToken} does not
-         * have focus, the request is dropped.
-         *
-         * This is used by forward focus transfer requests from clients that host embedded windows,
-         * and want to transfer focus to/from them.
-         *
-         * @hide
-         */
-        public Transaction requestFocusTransfer(@NonNull IBinder token,
-                                                String windowName,
-                                                @NonNull IBinder focusedToken,
-                                                String focusedWindowName,
-                                                int displayId) {
-            nativeSetFocusedWindow(mNativeObject, token, windowName, focusedToken,
-                    focusedWindowName, displayId);
+            nativeSetFocusedWindow(mNativeObject, token, windowName, displayId);
             return this;
         }
 
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 6cd8941..003307d 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -92,6 +92,7 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
 import android.hardware.display.DisplayManagerGlobal;
+import android.hardware.input.InputManager;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
@@ -5413,7 +5414,7 @@
     /**
      * The pointer icon when the mouse hovers on this view. The default is null.
      */
-    private PointerIcon mPointerIcon;
+    private PointerIcon mMousePointerIcon;
 
     /**
      * @hide
@@ -29506,30 +29507,71 @@
     }
 
     /**
-     * Returns the pointer icon for the motion event, or null if it doesn't specify the icon.
-     * The default implementation does not care the location or event types, but some subclasses
-     * may use it (such as WebViews).
-     * @param event The MotionEvent from a mouse
-     * @param pointerIndex The index of the pointer for which to retrieve the {@link PointerIcon}.
-     *                     This will be between 0 and {@link MotionEvent#getPointerCount()}.
+     * Resolve the pointer icon that should be used for specified pointer in the motion event.
+     *
+     * The default implementation will resolve the pointer icon to one set using
+     * {@link #setPointerIcon(PointerIcon)} for mouse devices. Subclasses may override this to
+     * customize the icon for the given pointer.
+     *
+     * For example, the pointer icon for a stylus pointer can be resolved in the following way:
+     * <code><pre>
+     * &#64;Override
+     * public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) {
+     *     final int toolType = event.getToolType(pointerIndex);
+     *     if (!event.isFromSource(InputDevice.SOURCE_MOUSE)
+     *             && event.isFromSource(InputDevice.SOURCE_STYLUS)
+     *             && (toolType == MotionEvent.TOOL_TYPE_STYLUS
+     *                     || toolType == MotionEvent.TOOL_TYPE_ERASER)) {
+     *         // Show this pointer icon only if this pointer is a stylus.
+     *         return PointerIcon.getSystemIcon(mContext, PointerIcon.TYPE_WAIT);
+     *     }
+     *     // Use the default logic for determining the pointer icon for other non-stylus pointers,
+     *     // like for the mouse cursor.
+     *     return super.onResolvePointerIcon(event, pointerIndex);
+     * }
+     * </pre></code>
+     *
+     * @param event The {@link MotionEvent} that requires a pointer icon to be resolved for one of
+     *              pointers.
+     * @param pointerIndex The index of the pointer in {@code event} for which to retrieve the
+     *     {@link PointerIcon}. This will be between 0 and {@link MotionEvent#getPointerCount()}.
+     * @return the pointer icon to use for specified pointer, or {@code null} if a pointer icon
+     *     is not specified and the default icon should be used.
      * @see PointerIcon
+     * @see InputManager#isStylusPointerIconEnabled()
      */
     public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) {
         final float x = event.getX(pointerIndex);
         final float y = event.getY(pointerIndex);
         if (isDraggingScrollBar() || isOnScrollbarThumb(x, y)) {
-            return PointerIcon.getSystemIcon(mContext, PointerIcon.TYPE_ARROW);
+            // Use the default pointer icon.
+            return null;
         }
-        return mPointerIcon;
+
+        // Note: A drawing tablet will have both SOURCE_MOUSE and SOURCE_STYLUS, but it would use
+        // TOOL_TYPE_STYLUS. For now, treat drawing tablets the same way as a mouse or touchpad.
+        if (event.isFromSource(InputDevice.SOURCE_MOUSE)) {
+            return mMousePointerIcon;
+        }
+
+        return null;
     }
 
     /**
-     * Set the pointer icon for the current view.
+     * Set the pointer icon to be used for a mouse pointer in the current view.
+     *
      * Passing {@code null} will restore the pointer icon to its default value.
+     * Note that setting the pointer icon using this method will only set it for events coming from
+     * a mouse device (i.e. with source {@link InputDevice#SOURCE_MOUSE}). To resolve
+     * the pointer icon for other device types like styluses, override
+     * {@link #onResolvePointerIcon(MotionEvent, int)}.
+     *
      * @param pointerIcon A PointerIcon instance which will be shown when the mouse hovers.
+     * @see #onResolvePointerIcon(MotionEvent, int)
+     * @see PointerIcon
      */
     public void setPointerIcon(PointerIcon pointerIcon) {
-        mPointerIcon = pointerIcon;
+        mMousePointerIcon = pointerIcon;
         if (mAttachInfo == null || mAttachInfo.mHandlingPointerEvent) {
             return;
         }
@@ -29540,11 +29582,13 @@
     }
 
     /**
-     * Gets the pointer icon for the current view.
+     * Gets the mouse pointer icon for the current view.
+     *
+     * @see #setPointerIcon(PointerIcon)
      */
     @InspectableProperty
     public PointerIcon getPointerIcon() {
-        return mPointerIcon;
+        return mMousePointerIcon;
     }
 
     /**
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 46ae3ea..f5e4da8 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -66,6 +66,7 @@
 import android.view.animation.LayoutAnimationController;
 import android.view.animation.Transformation;
 import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillManager;
 import android.view.autofill.Helper;
 import android.view.inspector.InspectableProperty;
 import android.view.inspector.InspectableProperty.EnumEntry;
@@ -3709,6 +3710,20 @@
         return children;
     }
 
+    private AutofillManager getAutofillManager() {
+        return mContext.getSystemService(AutofillManager.class);
+    }
+
+    private boolean shouldIncludeAllChildrenViewWithAutofillTypeNotNone(AutofillManager afm) {
+        if (afm == null) return false;
+        return afm.shouldIncludeAllChildrenViewsWithAutofillTypeNotNoneInAssistStructure();
+    }
+
+    private boolean shouldIncludeAllChildrenViews(AutofillManager afm){
+        if (afm == null) return false;
+        return afm.shouldIncludeAllChildrenViewInAssistStructure();
+    }
+
     /** @hide */
     private void populateChildrenForAutofill(ArrayList<View> list, @AutofillFlags int flags) {
         final int childrenCount = mChildrenCount;
@@ -3718,6 +3733,7 @@
         final ArrayList<View> preorderedList = buildOrderedChildList();
         final boolean customOrder = preorderedList == null
                 && isChildrenDrawingOrderEnabled();
+        final AutofillManager afm = getAutofillManager();
         for (int i = 0; i < childrenCount; i++) {
             final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder);
             final View child = (preorderedList == null)
@@ -3725,7 +3741,10 @@
             if ((flags & AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS) != 0
                     || child.isImportantForAutofill()
                     || (child.isMatchingAutofillableHeuristics()
-                        && !child.isActivityDeniedForAutofillForUnimportantView())) {
+                        && !child.isActivityDeniedForAutofillForUnimportantView())
+                    || (shouldIncludeAllChildrenViewWithAutofillTypeNotNone(afm)
+                        && child.getAutofillType() != AUTOFILL_TYPE_NONE)
+                    || shouldIncludeAllChildrenViews(afm)){
                 list.add(child);
             } else if (child instanceof ViewGroup) {
                 ((ViewGroup) child).populateChildrenForAutofill(list, flags);
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 152fa08..2f5cd54 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -265,6 +265,7 @@
     private static final boolean DEBUG_KEEP_SCREEN_ON = false || LOCAL_LOGV;
     private static final boolean DEBUG_CONTENT_CAPTURE = false || LOCAL_LOGV;
     private static final boolean DEBUG_SCROLL_CAPTURE = false || LOCAL_LOGV;
+    private static final boolean DEBUG_TOUCH_NAVIGATION = false || LOCAL_LOGV;
     private static final boolean DEBUG_BLAST = false || LOCAL_LOGV;
     private static final int LOGTAG_INPUT_FOCUS = 62001;
 
@@ -7122,7 +7123,8 @@
                         mJoystick.cancel();
                     } else if ((source & InputDevice.SOURCE_TOUCH_NAVIGATION)
                             == InputDevice.SOURCE_TOUCH_NAVIGATION) {
-                        mTouchNavigation.cancel(event);
+                        // Touch navigation events cannot be cancelled since they are dispatched
+                        // immediately.
                     }
                 }
             }
@@ -7641,392 +7643,109 @@
     }
 
     /**
-     * Creates dpad events from unhandled touch navigation movements.
+     * Creates DPAD events from unhandled touch navigation movements.
      */
     final class SyntheticTouchNavigationHandler extends Handler {
         private static final String LOCAL_TAG = "SyntheticTouchNavigationHandler";
-        private static final boolean LOCAL_DEBUG = false;
 
-        // Assumed nominal width and height in millimeters of a touch navigation pad,
-        // if no resolution information is available from the input system.
-        private static final float DEFAULT_WIDTH_MILLIMETERS = 48;
-        private static final float DEFAULT_HEIGHT_MILLIMETERS = 48;
-
-        /* TODO: These constants should eventually be moved to ViewConfiguration. */
-
-        // The nominal distance traveled to move by one unit.
-        private static final int TICK_DISTANCE_MILLIMETERS = 12;
-
-        // Minimum and maximum fling velocity in ticks per second.
-        // The minimum velocity should be set such that we perform enough ticks per
-        // second that the fling appears to be fluid.  For example, if we set the minimum
-        // to 2 ticks per second, then there may be up to half a second delay between the next
-        // to last and last ticks which is noticeably discrete and jerky.  This value should
-        // probably not be set to anything less than about 4.
-        // If fling accuracy is a problem then consider tuning the tick distance instead.
-        private static final float MIN_FLING_VELOCITY_TICKS_PER_SECOND = 6f;
-        private static final float MAX_FLING_VELOCITY_TICKS_PER_SECOND = 20f;
-
-        // Fling velocity decay factor applied after each new key is emitted.
-        // This parameter controls the deceleration and overall duration of the fling.
-        // The fling stops automatically when its velocity drops below the minimum
-        // fling velocity defined above.
-        private static final float FLING_TICK_DECAY = 0.8f;
-
-        /* The input device that we are tracking. */
-
+        // The id of the input device that is being tracked.
         private int mCurrentDeviceId = -1;
         private int mCurrentSource;
-        private boolean mCurrentDeviceSupported;
 
-        /* Configuration for the current input device. */
-
-        // The scaled tick distance.  A movement of this amount should generally translate
-        // into a single dpad event in a given direction.
-        private float mConfigTickDistance;
-
-        // The minimum and maximum scaled fling velocity.
-        private float mConfigMinFlingVelocity;
-        private float mConfigMaxFlingVelocity;
-
-        /* Tracking state. */
-
-        // The velocity tracker for detecting flings.
-        private VelocityTracker mVelocityTracker;
-
-        // The active pointer id, or -1 if none.
-        private int mActivePointerId = -1;
-
-        // Location where tracking started.
-        private float mStartX;
-        private float mStartY;
-
-        // Most recently observed position.
-        private float mLastX;
-        private float mLastY;
-
-        // Accumulated movement delta since the last direction key was sent.
-        private float mAccumulatedX;
-        private float mAccumulatedY;
-
-        // Set to true if any movement was delivered to the app.
-        // Implies that tap slop was exceeded.
-        private boolean mConsumedMovement;
-
-        // The most recently sent key down event.
-        // The keycode remains set until the direction changes or a fling ends
-        // so that repeated key events may be generated as required.
-        private long mPendingKeyDownTime;
-        private int mPendingKeyCode = KeyEvent.KEYCODE_UNKNOWN;
-        private int mPendingKeyRepeatCount;
         private int mPendingKeyMetaState;
 
-        // The current fling velocity while a fling is in progress.
-        private boolean mFlinging;
-        private float mFlingVelocity;
+        private final GestureDetector mGestureDetector = new GestureDetector(mContext,
+                new GestureDetector.OnGestureListener() {
+                    @Override
+                    public boolean onDown(@NonNull MotionEvent e) {
+                        // This can be ignored since it's not clear what KeyEvent this will
+                        // belong to.
+                        return true;
+                    }
 
-        public SyntheticTouchNavigationHandler() {
+                    @Override
+                    public void onShowPress(@NonNull MotionEvent e) {
+
+                    }
+
+                    @Override
+                    public boolean onSingleTapUp(@NonNull MotionEvent e) {
+                        dispatchTap(e.getEventTime());
+                        return true;
+                    }
+
+                    @Override
+                    public boolean onScroll(@Nullable MotionEvent e1, @NonNull MotionEvent e2,
+                            float distanceX, float distanceY) {
+                        // Scroll doesn't translate to DPAD events so should be ignored.
+                        return true;
+                    }
+
+                    @Override
+                    public void onLongPress(@NonNull MotionEvent e) {
+                        // Long presses don't translate to DPAD events so should be ignored.
+                    }
+
+                    @Override
+                    public boolean onFling(@Nullable MotionEvent e1, @NonNull MotionEvent e2,
+                            float velocityX, float velocityY) {
+                        dispatchFling(velocityX, velocityY, e2.getEventTime());
+                        return true;
+                    }
+                });
+
+        SyntheticTouchNavigationHandler() {
             super(true);
         }
 
         public void process(MotionEvent event) {
+            if (event.getDevice() == null) {
+                // The current device is not supported.
+                if (DEBUG_TOUCH_NAVIGATION) {
+                    Log.d(LOCAL_TAG,
+                            "Current device not supported so motion event is not processed");
+                }
+                return;
+            }
+            mPendingKeyMetaState = event.getMetaState();
             // Update the current device information.
-            final long time = event.getEventTime();
             final int deviceId = event.getDeviceId();
             final int source = event.getSource();
             if (mCurrentDeviceId != deviceId || mCurrentSource != source) {
-                finishKeys(time);
-                finishTracking(time);
                 mCurrentDeviceId = deviceId;
                 mCurrentSource = source;
-                mCurrentDeviceSupported = false;
-                InputDevice device = event.getDevice();
-                if (device != null) {
-                    // In order to support an input device, we must know certain
-                    // characteristics about it, such as its size and resolution.
-                    InputDevice.MotionRange xRange = device.getMotionRange(MotionEvent.AXIS_X);
-                    InputDevice.MotionRange yRange = device.getMotionRange(MotionEvent.AXIS_Y);
-                    if (xRange != null && yRange != null) {
-                        mCurrentDeviceSupported = true;
-
-                        // Infer the resolution if it not actually known.
-                        float xRes = xRange.getResolution();
-                        if (xRes <= 0) {
-                            xRes = xRange.getRange() / DEFAULT_WIDTH_MILLIMETERS;
-                        }
-                        float yRes = yRange.getResolution();
-                        if (yRes <= 0) {
-                            yRes = yRange.getRange() / DEFAULT_HEIGHT_MILLIMETERS;
-                        }
-                        float nominalRes = (xRes + yRes) * 0.5f;
-
-                        // Precompute all of the configuration thresholds we will need.
-                        mConfigTickDistance = TICK_DISTANCE_MILLIMETERS * nominalRes;
-                        mConfigMinFlingVelocity =
-                                MIN_FLING_VELOCITY_TICKS_PER_SECOND * mConfigTickDistance;
-                        mConfigMaxFlingVelocity =
-                                MAX_FLING_VELOCITY_TICKS_PER_SECOND * mConfigTickDistance;
-
-                        if (LOCAL_DEBUG) {
-                            Log.d(LOCAL_TAG, "Configured device " + mCurrentDeviceId
-                                    + " (" + Integer.toHexString(mCurrentSource) + "): "
-                                    + ", mConfigTickDistance=" + mConfigTickDistance
-                                    + ", mConfigMinFlingVelocity=" + mConfigMinFlingVelocity
-                                    + ", mConfigMaxFlingVelocity=" + mConfigMaxFlingVelocity);
-                        }
-                    }
-                }
-            }
-            if (!mCurrentDeviceSupported) {
-                return;
             }
 
-            // Handle the event.
-            final int action = event.getActionMasked();
-            switch (action) {
-                case MotionEvent.ACTION_DOWN: {
-                    boolean caughtFling = mFlinging;
-                    finishKeys(time);
-                    finishTracking(time);
-                    mActivePointerId = event.getPointerId(0);
-                    mVelocityTracker = VelocityTracker.obtain();
-                    mVelocityTracker.addMovement(event);
-                    mStartX = event.getX();
-                    mStartY = event.getY();
-                    mLastX = mStartX;
-                    mLastY = mStartY;
-                    mAccumulatedX = 0;
-                    mAccumulatedY = 0;
-
-                    // If we caught a fling, then pretend that the tap slop has already
-                    // been exceeded to suppress taps whose only purpose is to stop the fling.
-                    mConsumedMovement = caughtFling;
-                    break;
-                }
-
-                case MotionEvent.ACTION_MOVE:
-                case MotionEvent.ACTION_UP: {
-                    if (mActivePointerId < 0) {
-                        break;
-                    }
-                    final int index = event.findPointerIndex(mActivePointerId);
-                    if (index < 0) {
-                        finishKeys(time);
-                        finishTracking(time);
-                        break;
-                    }
-
-                    mVelocityTracker.addMovement(event);
-                    final float x = event.getX(index);
-                    final float y = event.getY(index);
-                    mAccumulatedX += x - mLastX;
-                    mAccumulatedY += y - mLastY;
-                    mLastX = x;
-                    mLastY = y;
-
-                    // Consume any accumulated movement so far.
-                    final int metaState = event.getMetaState();
-                    consumeAccumulatedMovement(time, metaState);
-
-                    // Detect taps and flings.
-                    if (action == MotionEvent.ACTION_UP) {
-                        if (mConsumedMovement && mPendingKeyCode != KeyEvent.KEYCODE_UNKNOWN) {
-                            // It might be a fling.
-                            mVelocityTracker.computeCurrentVelocity(1000, mConfigMaxFlingVelocity);
-                            final float vx = mVelocityTracker.getXVelocity(mActivePointerId);
-                            final float vy = mVelocityTracker.getYVelocity(mActivePointerId);
-                            if (!startFling(time, vx, vy)) {
-                                finishKeys(time);
-                            }
-                        }
-                        finishTracking(time);
-                    }
-                    break;
-                }
-
-                case MotionEvent.ACTION_CANCEL: {
-                    finishKeys(time);
-                    finishTracking(time);
-                    break;
-                }
-            }
+            // Interpret the event.
+            mGestureDetector.onTouchEvent(event);
         }
 
-        public void cancel(MotionEvent event) {
-            if (mCurrentDeviceId == event.getDeviceId()
-                    && mCurrentSource == event.getSource()) {
-                final long time = event.getEventTime();
-                finishKeys(time);
-                finishTracking(time);
-            }
+        private void dispatchTap(long time) {
+            dispatchEvent(time, KeyEvent.KEYCODE_DPAD_CENTER);
         }
 
-        private void finishKeys(long time) {
-            cancelFling();
-            sendKeyUp(time);
-        }
-
-        private void finishTracking(long time) {
-            if (mActivePointerId >= 0) {
-                mActivePointerId = -1;
-                mVelocityTracker.recycle();
-                mVelocityTracker = null;
-            }
-        }
-
-        private void consumeAccumulatedMovement(long time, int metaState) {
-            final float absX = Math.abs(mAccumulatedX);
-            final float absY = Math.abs(mAccumulatedY);
-            if (absX >= absY) {
-                if (absX >= mConfigTickDistance) {
-                    mAccumulatedX = consumeAccumulatedMovement(time, metaState, mAccumulatedX,
-                            KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_RIGHT);
-                    mAccumulatedY = 0;
-                    mConsumedMovement = true;
-                }
+        private void dispatchFling(float x, float y, long time) {
+            if (Math.abs(x) > Math.abs(y)) {
+                dispatchEvent(time,
+                        x > 0 ? KeyEvent.KEYCODE_DPAD_RIGHT : KeyEvent.KEYCODE_DPAD_LEFT);
             } else {
-                if (absY >= mConfigTickDistance) {
-                    mAccumulatedY = consumeAccumulatedMovement(time, metaState, mAccumulatedY,
-                            KeyEvent.KEYCODE_DPAD_UP, KeyEvent.KEYCODE_DPAD_DOWN);
-                    mAccumulatedX = 0;
-                    mConsumedMovement = true;
-                }
+                dispatchEvent(time, y > 0 ? KeyEvent.KEYCODE_DPAD_DOWN : KeyEvent.KEYCODE_DPAD_UP);
             }
         }
 
-        private float consumeAccumulatedMovement(long time, int metaState,
-                float accumulator, int negativeKeyCode, int positiveKeyCode) {
-            while (accumulator <= -mConfigTickDistance) {
-                sendKeyDownOrRepeat(time, negativeKeyCode, metaState);
-                accumulator += mConfigTickDistance;
+        private void dispatchEvent(long time, int keyCode) {
+            if (DEBUG_TOUCH_NAVIGATION) {
+                Log.d(LOCAL_TAG, "Dispatching DPAD events DOWN and UP with keycode " + keyCode);
             }
-            while (accumulator >= mConfigTickDistance) {
-                sendKeyDownOrRepeat(time, positiveKeyCode, metaState);
-                accumulator -= mConfigTickDistance;
-            }
-            return accumulator;
+            enqueueInputEvent(new KeyEvent(time, time,
+                    KeyEvent.ACTION_DOWN, keyCode, /* repeat= */ 0, mPendingKeyMetaState,
+                    mCurrentDeviceId, /* scancode= */ 0, KeyEvent.FLAG_FALLBACK,
+                    mCurrentSource));
+            enqueueInputEvent(new KeyEvent(time, time,
+                    KeyEvent.ACTION_UP, keyCode, /* repeat= */ 0, mPendingKeyMetaState,
+                    mCurrentDeviceId, /* scancode= */ 0, KeyEvent.FLAG_FALLBACK,
+                    mCurrentSource));
         }
-
-        private void sendKeyDownOrRepeat(long time, int keyCode, int metaState) {
-            if (mPendingKeyCode != keyCode) {
-                sendKeyUp(time);
-                mPendingKeyDownTime = time;
-                mPendingKeyCode = keyCode;
-                mPendingKeyRepeatCount = 0;
-            } else {
-                mPendingKeyRepeatCount += 1;
-            }
-            mPendingKeyMetaState = metaState;
-
-            // Note: Normally we would pass FLAG_LONG_PRESS when the repeat count is 1
-            // but it doesn't quite make sense when simulating the events in this way.
-            if (LOCAL_DEBUG) {
-                Log.d(LOCAL_TAG, "Sending key down: keyCode=" + mPendingKeyCode
-                        + ", repeatCount=" + mPendingKeyRepeatCount
-                        + ", metaState=" + Integer.toHexString(mPendingKeyMetaState));
-            }
-            enqueueInputEvent(new KeyEvent(mPendingKeyDownTime, time,
-                    KeyEvent.ACTION_DOWN, mPendingKeyCode, mPendingKeyRepeatCount,
-                    mPendingKeyMetaState, mCurrentDeviceId,
-                    KeyEvent.FLAG_FALLBACK, mCurrentSource));
-        }
-
-        private void sendKeyUp(long time) {
-            if (mPendingKeyCode != KeyEvent.KEYCODE_UNKNOWN) {
-                if (LOCAL_DEBUG) {
-                    Log.d(LOCAL_TAG, "Sending key up: keyCode=" + mPendingKeyCode
-                            + ", metaState=" + Integer.toHexString(mPendingKeyMetaState));
-                }
-                enqueueInputEvent(new KeyEvent(mPendingKeyDownTime, time,
-                        KeyEvent.ACTION_UP, mPendingKeyCode, 0, mPendingKeyMetaState,
-                        mCurrentDeviceId, 0, KeyEvent.FLAG_FALLBACK,
-                        mCurrentSource));
-                mPendingKeyCode = KeyEvent.KEYCODE_UNKNOWN;
-            }
-        }
-
-        private boolean startFling(long time, float vx, float vy) {
-            if (LOCAL_DEBUG) {
-                Log.d(LOCAL_TAG, "Considering fling: vx=" + vx + ", vy=" + vy
-                        + ", min=" + mConfigMinFlingVelocity);
-            }
-
-            // Flings must be oriented in the same direction as the preceding movements.
-            switch (mPendingKeyCode) {
-                case KeyEvent.KEYCODE_DPAD_LEFT:
-                    if (-vx >= mConfigMinFlingVelocity
-                            && Math.abs(vy) < mConfigMinFlingVelocity) {
-                        mFlingVelocity = -vx;
-                        break;
-                    }
-                    return false;
-
-                case KeyEvent.KEYCODE_DPAD_RIGHT:
-                    if (vx >= mConfigMinFlingVelocity
-                            && Math.abs(vy) < mConfigMinFlingVelocity) {
-                        mFlingVelocity = vx;
-                        break;
-                    }
-                    return false;
-
-                case KeyEvent.KEYCODE_DPAD_UP:
-                    if (-vy >= mConfigMinFlingVelocity
-                            && Math.abs(vx) < mConfigMinFlingVelocity) {
-                        mFlingVelocity = -vy;
-                        break;
-                    }
-                    return false;
-
-                case KeyEvent.KEYCODE_DPAD_DOWN:
-                    if (vy >= mConfigMinFlingVelocity
-                            && Math.abs(vx) < mConfigMinFlingVelocity) {
-                        mFlingVelocity = vy;
-                        break;
-                    }
-                    return false;
-            }
-
-            // Post the first fling event.
-            mFlinging = postFling(time);
-            return mFlinging;
-        }
-
-        private boolean postFling(long time) {
-            // The idea here is to estimate the time when the pointer would have
-            // traveled one tick distance unit given the current fling velocity.
-            // This effect creates continuity of motion.
-            if (mFlingVelocity >= mConfigMinFlingVelocity) {
-                long delay = (long)(mConfigTickDistance / mFlingVelocity * 1000);
-                postAtTime(mFlingRunnable, time + delay);
-                if (LOCAL_DEBUG) {
-                    Log.d(LOCAL_TAG, "Posted fling: velocity="
-                            + mFlingVelocity + ", delay=" + delay
-                            + ", keyCode=" + mPendingKeyCode);
-                }
-                return true;
-            }
-            return false;
-        }
-
-        private void cancelFling() {
-            if (mFlinging) {
-                removeCallbacks(mFlingRunnable);
-                mFlinging = false;
-            }
-        }
-
-        private final Runnable mFlingRunnable = new Runnable() {
-            @Override
-            public void run() {
-                final long time = SystemClock.uptimeMillis();
-                sendKeyDownOrRepeat(time, mPendingKeyCode, mPendingKeyMetaState);
-                mFlingVelocity *= FLING_TICK_DECAY;
-                if (!postFling(time)) {
-                    mFlinging = false;
-                    finishKeys(time);
-                }
-            }
-        };
     }
 
     final class SyntheticKeyboardHandler {
@@ -9272,7 +8991,7 @@
     }
 
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    void enqueueInputEvent(InputEvent event) {
+    public void enqueueInputEvent(InputEvent event) {
         enqueueInputEvent(event, null, 0, false);
     }
 
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index cda1f3a..02b3478 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -495,64 +495,64 @@
      * Transition flag: Keyguard is going away, but keeping the notification shade open
      * @hide
      */
-    int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE = 0x1;
+    int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE = (1 << 0); // 0x1
 
     /**
      * Transition flag: Keyguard is going away, but doesn't want an animation for it
      * @hide
      */
-    int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION = 0x2;
+    int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION = (1 << 1); // 0x2
 
     /**
      * Transition flag: Keyguard is going away while it was showing the system wallpaper.
      * @hide
      */
-    int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER = 0x4;
+    int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER = (1 << 2); // 0x4
 
     /**
      * Transition flag: Keyguard is going away with subtle animation.
      * @hide
      */
-    int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION = 0x8;
-
-    /**
-     * Transition flag: Keyguard is going away to the launcher, and it needs us to clear the task
-     * snapshot of the launcher because it has changed something in the Launcher window.
-     * @hide
-     */
-    int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT = 0x16;
+    int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION = (1 << 3); // 0x8
 
     /**
      * Transition flag: App is crashed.
      * @hide
      */
-    int TRANSIT_FLAG_APP_CRASHED = 0x10;
+    int TRANSIT_FLAG_APP_CRASHED = (1 << 4); // 0x10
 
     /**
      * Transition flag: A window in a new task is being opened behind an existing one in another
      * activity's task.
      * @hide
      */
-    int TRANSIT_FLAG_OPEN_BEHIND = 0x20;
+    int TRANSIT_FLAG_OPEN_BEHIND = (1 << 5); // 0x20
 
     /**
      * Transition flag: The keyguard is locked throughout the whole transition.
      * @hide
      */
-    int TRANSIT_FLAG_KEYGUARD_LOCKED = 0x40;
+    int TRANSIT_FLAG_KEYGUARD_LOCKED = (1 << 6); // 0x40
 
     /**
      * Transition flag: Indicates that this transition is for recents animation.
      * TODO(b/188669821): Remove once special-case logic moves to shell.
      * @hide
      */
-    int TRANSIT_FLAG_IS_RECENTS = 0x80;
+    int TRANSIT_FLAG_IS_RECENTS = (1 << 7); // 0x80
 
     /**
      * Transition flag: Indicates that keyguard should go away with this transition.
      * @hide
      */
-    int TRANSIT_FLAG_KEYGUARD_GOING_AWAY = 0x100;
+    int TRANSIT_FLAG_KEYGUARD_GOING_AWAY = (1 << 8); // 0x100
+
+    /**
+     * Transition flag: Keyguard is going away to the launcher, and it needs us to clear the task
+     * snapshot of the launcher because it has changed something in the Launcher window.
+     * @hide
+     */
+    int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT = (1 << 9); // 0x200
 
     /**
      * @hide
@@ -562,12 +562,12 @@
             TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION,
             TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER,
             TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION,
-            TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT,
             TRANSIT_FLAG_APP_CRASHED,
             TRANSIT_FLAG_OPEN_BEHIND,
             TRANSIT_FLAG_KEYGUARD_LOCKED,
             TRANSIT_FLAG_IS_RECENTS,
-            TRANSIT_FLAG_KEYGUARD_GOING_AWAY
+            TRANSIT_FLAG_KEYGUARD_GOING_AWAY,
+            TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT
     })
     @Retention(RetentionPolicy.SOURCE)
     @interface TransitionFlags {}
@@ -869,6 +869,42 @@
             "android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION";
 
     /**
+     * Application level {@link android.content.pm.PackageManager.Property PackageManager.Property}
+     * for an app to inform the system that the app can be opted-out from the compatibility
+     * treatment that avoids {@link android.app.Activity#setRequestedOrientation} loops. The loop
+     * can be trigerred by ignoreRequestedOrientation display setting enabled on the device or
+     * by the landscape natural orientation of the device.
+     *
+     * <p>The system could ignore {@link android.app.Activity#setRequestedOrientation}
+     * call from an app if both of the following conditions are true:
+     * <ul>
+     *     <li>Activity has requested orientation more than 2 times within 1-second timer
+     *     <li>Activity is not letterboxed for fixed orientation
+     * </ul>
+     *
+     * <p>Setting this property to {@code false} informs the system that the app must be
+     * opted-out from the compatibility treatment even if the device manufacturer has opted the app
+     * into the treatment.
+     *
+     * <p>Not setting this property at all, or setting this property to {@code true} has no effect.
+     *
+     * <p><b>Syntax:</b>
+     * <pre>
+     * &lt;application&gt;
+     *   &lt;property
+     *     android:name=
+     *       "android.window.PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
+     *     android:value="false"/&gt;
+     * &lt;/application&gt;
+     * </pre>
+     *
+     * @hide
+     */
+    // TODO(b/274924641): Make this public API.
+    String PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED =
+            "android.window.PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED";
+
+    /**
      * Application level {@link android.content.pm.PackageManager.Property PackageManager
      * .Property} for an app to inform the system that it needs to be opted-out from the
      * compatibility treatment that sandboxes {@link android.view.View} API.
diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java
index 0560caf..9868144 100644
--- a/core/java/android/view/WindowlessWindowManager.java
+++ b/core/java/android/view/WindowlessWindowManager.java
@@ -57,18 +57,16 @@
         SurfaceControl mLeash;
         Rect mFrame;
         Rect mAttachedFrame;
+        IBinder mFocusGrantToken;
 
-        State(SurfaceControl sc, WindowManager.LayoutParams p,
-                int displayId, IBinder inputChannelToken, IWindow client, SurfaceControl leash,
-                Rect frame, Rect attachedFrame) {
+        State(SurfaceControl sc, WindowManager.LayoutParams p, int displayId, IWindow client,
+                SurfaceControl leash, Rect frame) {
             mSurfaceControl = sc;
             mParams.copyFrom(p);
             mDisplayId = displayId;
-            mInputChannelToken = inputChannelToken;
             mClient = client;
             mLeash = leash;
             mFrame = frame;
-            mAttachedFrame = attachedFrame;
         }
     };
 
@@ -182,45 +180,53 @@
                 .setParent(leash)
                 .build();
 
+        final State state = new State(sc, attrs, displayId, window, leash, /* frame= */ new Rect());
+        synchronized (this) {
+            State parentState = mStateForWindow.get(attrs.token);
+            if (parentState != null) {
+                state.mAttachedFrame = parentState.mFrame;
+            }
+
+            // Give the first window the mFocusGrantToken since that's the token the host can use
+            // to give focus to the embedded.
+            if (mStateForWindow.isEmpty()) {
+                state.mFocusGrantToken = mFocusGrantToken;
+            } else {
+                state.mFocusGrantToken = new Binder();
+            }
+
+            mStateForWindow.put(window.asBinder(), state);
+        }
+
+        if (state.mAttachedFrame == null) {
+            outAttachedFrame.set(0, 0, -1, -1);
+        } else {
+            outAttachedFrame.set(state.mAttachedFrame);
+        }
+        outSizeCompatScale[0] = 1f;
+
         if (((attrs.inputFeatures &
                 WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0)) {
             try {
                 if (mRealWm instanceof IWindowSession.Stub) {
                     mRealWm.grantInputChannel(displayId,
                             new SurfaceControl(sc, "WindowlessWindowManager.addToDisplay"),
-                            window, mHostInputToken,
-                            attrs.flags, attrs.privateFlags, attrs.inputFeatures, attrs.type,
-                            attrs.token, mFocusGrantToken, attrs.getTitle().toString(),
+                            window, mHostInputToken, attrs.flags, attrs.privateFlags,
+                            attrs.inputFeatures, attrs.type,
+                            attrs.token, state.mFocusGrantToken, attrs.getTitle().toString(),
                             outInputChannel);
                 } else {
                     mRealWm.grantInputChannel(displayId, sc, window, mHostInputToken, attrs.flags,
                             attrs.privateFlags, attrs.inputFeatures, attrs.type, attrs.token,
-                            mFocusGrantToken, attrs.getTitle().toString(), outInputChannel);
+                            state.mFocusGrantToken, attrs.getTitle().toString(), outInputChannel);
                 }
+                state.mInputChannelToken =
+                        outInputChannel != null ? outInputChannel.getToken() : null;
             } catch (RemoteException e) {
                 Log.e(TAG, "Failed to grant input to surface: ", e);
             }
         }
 
-        final State state = new State(sc, attrs, displayId,
-                outInputChannel != null ? outInputChannel.getToken() : null, window,
-                leash, /* frame= */ new Rect(), /* attachedFrame= */ null);
-        Rect parentFrame = null;
-        synchronized (this) {
-            State parentState = mStateForWindow.get(attrs.token);
-            if (parentState != null) {
-                parentFrame = parentState.mFrame;
-            }
-            mStateForWindow.put(window.asBinder(), state);
-        }
-        state.mAttachedFrame = parentFrame;
-        if (parentFrame == null) {
-            outAttachedFrame.set(0, 0, -1, -1);
-        } else {
-            outAttachedFrame.set(parentFrame);
-        }
-        outSizeCompatScale[0] = 1f;
-
         final int res = WindowManagerGlobal.ADD_OKAY | WindowManagerGlobal.ADD_FLAG_APP_VISIBLE |
                         WindowManagerGlobal.ADD_FLAG_USE_BLAST;
 
diff --git a/core/java/android/view/accessibility/AccessibilityRecord.java b/core/java/android/view/accessibility/AccessibilityRecord.java
index 38b564a..d69c781 100644
--- a/core/java/android/view/accessibility/AccessibilityRecord.java
+++ b/core/java/android/view/accessibility/AccessibilityRecord.java
@@ -976,6 +976,7 @@
         append(builder, "AddedCount", mAddedCount);
         append(builder, "RemovedCount", mRemovedCount);
         append(builder, "ParcelableData", mParcelableData);
+        append(builder, "DisplayId", mSourceDisplayId);
         builder.append(" ]");
         return builder;
     }
diff --git a/core/java/android/view/autofill/AutofillClientController.java b/core/java/android/view/autofill/AutofillClientController.java
index 93d98ac..3a8e802 100644
--- a/core/java/android/view/autofill/AutofillClientController.java
+++ b/core/java/android/view/autofill/AutofillClientController.java
@@ -350,6 +350,10 @@
         final boolean[] visible = new boolean[autofillIdCount];
         for (int i = 0; i < autofillIdCount; i++) {
             final AutofillId autofillId = autofillIds[i];
+            if (autofillId == null) {
+                visible[i] = false;
+                continue;
+            }
             final View view = autofillClientFindViewByAutofillIdTraversal(autofillId);
             if (view != null) {
                 if (!autofillId.isVirtualInt()) {
@@ -383,6 +387,7 @@
 
     @Override
     public View autofillClientFindViewByAutofillIdTraversal(AutofillId autofillId) {
+        if (autofillId == null) return null;
         final ArrayList<ViewRootImpl> roots =
                 WindowManagerGlobal.getInstance().getRootViews(mActivity.getActivityToken());
         for (int rootNum = 0; rootNum < roots.size(); rootNum++) {
@@ -410,7 +415,7 @@
             if (rootView != null) {
                 final int viewCount = autofillIds.length;
                 for (int viewNum = 0; viewNum < viewCount; viewNum++) {
-                    if (views[viewNum] == null) {
+                    if (autofillIds[viewNum] != null && views[viewNum] == null) {
                         views[viewNum] = rootView.findViewByAutofillIdTraversal(
                                 autofillIds[viewNum].getViewId());
                     }
diff --git a/core/java/android/view/autofill/AutofillFeatureFlags.java b/core/java/android/view/autofill/AutofillFeatureFlags.java
index e51eff4..951eecc 100644
--- a/core/java/android/view/autofill/AutofillFeatureFlags.java
+++ b/core/java/android/view/autofill/AutofillFeatureFlags.java
@@ -193,6 +193,32 @@
     public static final String DEVICE_CONFIG_SHOULD_ENABLE_AUTOFILL_ON_ALL_VIEW_TYPES =
             "should_enable_autofill_on_all_view_types";
 
+    /**
+     * Whether to enable multi-line filter when checking if view is autofillable
+     *
+     * @hide
+     */
+    public static final String DEVICE_CONFIG_MULTILINE_FILTER_ENABLED =
+            "multiline_filter_enabled";
+
+    /**
+     * Whether include all autofill type not none views in assist structure
+     *
+     * @hide
+     */
+    public static final String
+        DEVICE_CONFIG_INCLUDE_ALL_AUTOFILL_TYPE_NOT_NONE_VIEWS_IN_ASSIST_STRUCTURE =
+            "include_all_autofill_type_not_none_views_in_assist_structure";
+
+    /**
+     * Whether include all views in assist structure
+     *
+     * @hide
+     */
+    public static final String
+        DEVICE_CONFIG_INCLUDE_ALL_VIEWS_IN_ASSIST_STRUCTURE =
+            "include_all_views_in_assist_structure";
+
     // END AUTOFILL FOR ALL APPS FLAGS //
 
 
@@ -398,6 +424,39 @@
             DeviceConfig.NAMESPACE_AUTOFILL,
             DEVICE_CONFIG_PACKAGE_AND_ACTIVITY_ALLOWLIST_FOR_TRIGGERING_FILL_REQUEST, "");
     }
+    /**
+     * Whether include all views that have autofill type not none in assist structure.
+     *
+     * @hide
+     */
+    public static boolean shouldIncludeAllViewsAutofillTypeNotNoneInAssistStructrue() {
+        return DeviceConfig.getBoolean(
+            DeviceConfig.NAMESPACE_AUTOFILL,
+            DEVICE_CONFIG_INCLUDE_ALL_AUTOFILL_TYPE_NOT_NONE_VIEWS_IN_ASSIST_STRUCTURE, false);
+    }
+
+    /**
+     * Whether include all views in assist structure.
+     *
+     * @hide
+     */
+    public static boolean shouldIncludeAllChildrenViewInAssistStructure() {
+        return DeviceConfig.getBoolean(
+            DeviceConfig.NAMESPACE_AUTOFILL,
+            DEVICE_CONFIG_INCLUDE_ALL_VIEWS_IN_ASSIST_STRUCTURE, false);
+    }
+
+
+    /**
+     * Whether should enable multi-line filter
+     *
+     * @hide
+     */
+    public static boolean shouldEnableMultilineFilter() {
+        return DeviceConfig.getBoolean(
+            DeviceConfig.NAMESPACE_AUTOFILL,
+            DEVICE_CONFIG_MULTILINE_FILTER_ENABLED, false);
+    }
 
     // START AUTOFILL PCC CLASSIFICATION FUNCTIONS
 
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index cc8ab10..f7b7d33 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -707,6 +707,15 @@
     // An allowed activity set read from device config
     private Set<String> mAllowedActivitySet = new ArraySet<>();
 
+    // Whether to enable multi-line check when checking whether view is autofillable
+    private boolean mShouldEnableMultilineFilter;
+
+    // Indicate whether should include all view with autofill type not none in assist structure
+    private boolean mShouldIncludeAllViewsWithAutofillTypeNotNoneInAssistStructure;
+
+    // Indicate whether should include all view in assist structure
+    private boolean mShouldIncludeAllChildrenViewInAssistStructure;
+
     // Indicates whether called the showAutofillDialog() method.
     private boolean mShowAutofillDialogCalled = false;
 
@@ -883,6 +892,9 @@
         mNonAutofillableImeActionIdSet =
             AutofillFeatureFlags.getNonAutofillableImeActionIdSetFromFlag();
 
+        mShouldEnableMultilineFilter =
+            AutofillFeatureFlags.shouldEnableMultilineFilter();
+
         final String denyListString = AutofillFeatureFlags.getDenylistStringFromFlag();
         final String allowlistString = AutofillFeatureFlags.getAllowlistStringFromFlag();
 
@@ -913,6 +925,12 @@
             mAllowedActivitySet = getDeniedOrAllowedActivitySetFromString(
                     allowlistString, packageName);
         }
+
+        mShouldIncludeAllViewsWithAutofillTypeNotNoneInAssistStructure
+            = AutofillFeatureFlags.shouldIncludeAllViewsAutofillTypeNotNoneInAssistStructrue();
+
+        mShouldIncludeAllChildrenViewInAssistStructure
+            = AutofillFeatureFlags.shouldIncludeAllChildrenViewInAssistStructure();
     }
 
     /**
@@ -936,9 +954,8 @@
     /**
      * Whether view passes the imeAction check
      *
-     * @hide
      */
-    public boolean isPassingImeActionCheck(EditText editText) {
+    private boolean isPassingImeActionCheck(EditText editText) {
         final int actionId = editText.getImeOptions();
         if (mNonAutofillableImeActionIdSet.contains(String.valueOf(actionId))) {
             Log.d(TAG, "view not autofillable - not passing ime action check");
@@ -947,6 +964,21 @@
         return true;
     }
 
+    /**
+     * Checks whether the view passed in is not multiline text
+     *
+     * @param editText the view that passed to this check
+     * @return true if the view input is not multiline, false otherwise
+     */
+    private boolean isPassingMultilineCheck(EditText editText) {
+        // check if min line is set to be greater than 1
+        if (editText.getMinLines() > 1) {
+            Log.d(TAG, "view not autofillable - has multiline input type");
+            return false;
+        }
+        return true;
+    }
+
     private boolean isPackageFullyAllowedOrDeniedForAutofill(
             @NonNull String listString, @NonNull String packageName) {
         // If "PackageName:;" is in the string, then it the package is fully denied or allowed for
@@ -963,6 +995,20 @@
     }
 
     /**
+     * @hide
+     */
+    public boolean shouldIncludeAllChildrenViewsWithAutofillTypeNotNoneInAssistStructure()  {
+        return mShouldIncludeAllViewsWithAutofillTypeNotNoneInAssistStructure;
+    }
+
+    /**
+     * @hide
+     */
+    public boolean shouldIncludeAllChildrenViewInAssistStructure() {
+        return mShouldIncludeAllChildrenViewInAssistStructure;
+    }
+
+    /**
      * Get the denied or allowed activitiy names under specified package from the list string and
      * set it in fields accordingly
      *
@@ -1077,6 +1123,9 @@
         }
 
         if (view instanceof EditText) {
+            if (mShouldEnableMultilineFilter && !isPassingMultilineCheck((EditText) view)) {
+                return false;
+            }
             return isPassingImeActionCheck((EditText) view);
         }
 
@@ -2296,7 +2345,10 @@
      *
      * @param executor specifies the thread upon which the callbacks will be invoked.
      * @param callback which handles autofill request to provide client's suggestions.
+     *
+     * @hide
      */
+    @TestApi
     @RequiresPermission(PROVIDE_OWN_AUTOFILL_SUGGESTIONS)
     public void setAutofillRequestCallback(@NonNull @CallbackExecutor Executor executor,
             @NonNull AutofillRequestCallback callback) {
@@ -2313,7 +2365,10 @@
 
     /**
      * clears the client's suggestions callback for autofill.
+     *
+     * @hide
      */
+    @TestApi
     public void clearAutofillRequestCallback() {
         synchronized (mLock) {
             mRequestCallbackExecutor = null;
diff --git a/core/java/android/view/autofill/AutofillRequestCallback.java b/core/java/android/view/autofill/AutofillRequestCallback.java
index e632a58..10a088b 100644
--- a/core/java/android/view/autofill/AutofillRequestCallback.java
+++ b/core/java/android/view/autofill/AutofillRequestCallback.java
@@ -18,6 +18,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.TestApi;
 import android.os.CancellationSignal;
 import android.service.autofill.FillCallback;
 import android.view.inputmethod.InlineSuggestionsRequest;
@@ -55,7 +56,10 @@
  *
  * <P>IMPORTANT: This should not be used for displaying anything other than input suggestions, or
  * the keyboard may choose to block your app from the inline strip.
+ *
+ * @hide
  */
+@TestApi
 public interface AutofillRequestCallback {
     /**
      * Called by the Android system to decide if a screen can be autofilled by the callback.
diff --git a/core/java/android/view/inputmethod/InlineSuggestionsRequest.java b/core/java/android/view/inputmethod/InlineSuggestionsRequest.java
index 70279cc..77a2b5b 100644
--- a/core/java/android/view/inputmethod/InlineSuggestionsRequest.java
+++ b/core/java/android/view/inputmethod/InlineSuggestionsRequest.java
@@ -18,6 +18,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.TestApi;
 import android.app.ActivityThread;
 import android.app.compat.CompatChanges;
 import android.compat.annotation.ChangeId;
@@ -700,7 +701,10 @@
          * provides the input view.
          *
          * Note: The default value is {@code true}.
+         *
+         * @hide
          */
+        @TestApi
         @DataClass.Generated.Member
         public @NonNull Builder setServiceSupported(boolean value) {
             checkNotUsed();
@@ -714,7 +718,10 @@
          * input view.
          *
          * Note: The default value is {@code true}.
+         *
+         * @hide
          */
+        @TestApi
         @DataClass.Generated.Member
         public @NonNull Builder setClientSupported(boolean value) {
             checkNotUsed();
diff --git a/core/java/android/view/inputmethod/InputConnection.java b/core/java/android/view/inputmethod/InputConnection.java
index 6872536..1840bcb 100644
--- a/core/java/android/view/inputmethod/InputConnection.java
+++ b/core/java/android/view/inputmethod/InputConnection.java
@@ -1217,9 +1217,11 @@
      * notify cursor/anchor locations.
      *
      * @param cursorUpdateMode any combination of update modes and filters:
-     * {@link #CURSOR_UPDATE_IMMEDIATE}, {@link #CURSOR_UPDATE_MONITOR}, and date filters:
+     * {@link #CURSOR_UPDATE_IMMEDIATE}, {@link #CURSOR_UPDATE_MONITOR}, and data filters:
      * {@link #CURSOR_UPDATE_FILTER_CHARACTER_BOUNDS}, {@link #CURSOR_UPDATE_FILTER_EDITOR_BOUNDS},
-     * {@link #CURSOR_UPDATE_FILTER_INSERTION_MARKER}.
+     * {@link #CURSOR_UPDATE_FILTER_INSERTION_MARKER},
+     * {@link #CURSOR_UPDATE_FILTER_VISIBLE_LINE_BOUNDS},
+     * {@link #CURSOR_UPDATE_FILTER_TEXT_APPEARANCE}.
      * Pass {@code 0} to disable them. However, if an unknown flag is provided, request will be
      * rejected and method will return {@code false}.
      * @return {@code true} if the request is scheduled. {@code false} to indicate that when the
@@ -1240,7 +1242,9 @@
      * {@link #CURSOR_UPDATE_IMMEDIATE}, {@link #CURSOR_UPDATE_MONITOR}
      * @param cursorUpdateFilter any combination of data filters:
      * {@link #CURSOR_UPDATE_FILTER_CHARACTER_BOUNDS}, {@link #CURSOR_UPDATE_FILTER_EDITOR_BOUNDS},
-     * {@link #CURSOR_UPDATE_FILTER_INSERTION_MARKER}.
+     * {@link #CURSOR_UPDATE_FILTER_INSERTION_MARKER},
+     * {@link #CURSOR_UPDATE_FILTER_VISIBLE_LINE_BOUNDS},
+     * {@link #CURSOR_UPDATE_FILTER_TEXT_APPEARANCE}.
      *
      * <p>Pass {@code 0} to disable them. However, if an unknown flag is provided, request will be
      * rejected and method will return {@code false}.</p>
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 515b95c..82cf073 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -1648,6 +1648,7 @@
      *
      * @param userId user ID to query
      * @return {@link List} of {@link InputMethodInfo}.
+     * @see #getEnabledInputMethodSubtypeListAsUser(String, boolean, int)
      * @hide
      */
     @RequiresPermission(value = Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true)
@@ -1676,6 +1677,27 @@
     }
 
     /**
+     * Returns a list of enabled input method subtypes for the specified input method info for the
+     * specified user.
+     *
+     * @param imeId IME ID to be queried about.
+     * @param allowsImplicitlyEnabledSubtypes {@code true} to include implicitly enabled subtypes.
+     * @param userId user ID to be queried about.
+     *               {@link Manifest.permission#INTERACT_ACROSS_USERS_FULL} is required if this is
+     *               different from the calling process user ID.
+     * @return {@link List} of {@link InputMethodSubtype}.
+     * @see #getEnabledInputMethodListAsUser(int)
+     * @hide
+     */
+    @NonNull
+    @RequiresPermission(value = Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true)
+    public List<InputMethodSubtype> getEnabledInputMethodSubtypeListAsUser(
+            @NonNull String imeId, boolean allowsImplicitlyEnabledSubtypes, @UserIdInt int userId) {
+        return IInputMethodManagerGlobalInvoker.getEnabledInputMethodSubtypeList(
+                Objects.requireNonNull(imeId), allowsImplicitlyEnabledSubtypes, userId);
+    }
+
+    /**
      * @deprecated Use {@link InputMethodService#showStatusIcon(int)} instead. This method was
      * intended for IME developers who should be accessing APIs through the service. APIs in this
      * class are intended for app developers interacting with the IME.
diff --git a/core/java/android/view/inputmethod/RemoteInputConnectionImpl.java b/core/java/android/view/inputmethod/RemoteInputConnectionImpl.java
index eb91d08..aa9225b 100644
--- a/core/java/android/view/inputmethod/RemoteInputConnectionImpl.java
+++ b/core/java/android/view/inputmethod/RemoteInputConnectionImpl.java
@@ -405,31 +405,28 @@
                     }
                     if (handler.getLooper().isCurrentThread()) {
                         servedView.onInputConnectionClosedInternal();
-                        final ViewRootImpl viewRoot = servedView.getViewRootImpl();
-                        if (viewRoot != null) {
-                            viewRoot.getHandwritingInitiator().onInputConnectionClosed(servedView);
-                        }
                     } else {
                         handler.post(servedView::onInputConnectionClosedInternal);
-                        handler.post(() -> {
-                            final ViewRootImpl viewRoot = servedView.getViewRootImpl();
-                            if (viewRoot != null) {
-                                viewRoot.getHandwritingInitiator()
-                                        .onInputConnectionClosed(servedView);
-                            }
-                        });
                     }
                 }
+
+                final ViewRootImpl viewRoot = servedView.getViewRootImpl();
+                if (viewRoot != null) {
+                    viewRoot.getHandwritingInitiator().onInputConnectionClosed(servedView);
+                }
             }
         });
     }
 
+    @Dispatching(cancellable = false)
     @Override
     public void cancelCancellationSignal(IBinder token) {
         if (mBeamer == null) {
             return;
         }
-        mBeamer.cancel(token);
+        dispatch(() -> {
+            mBeamer.cancel(token);
+        });
     }
 
     @Override
diff --git a/core/java/android/widget/AnalogClock.java b/core/java/android/widget/AnalogClock.java
index 3df09c2..1f0e95e 100644
--- a/core/java/android/widget/AnalogClock.java
+++ b/core/java/android/widget/AnalogClock.java
@@ -49,15 +49,18 @@
 import java.util.Locale;
 
 /**
- * This widget display an analogic clock with two hands for hours and
- * minutes.
+ * This widget displays an analogic clock with two hands for hours and minutes.
  *
  * @attr ref android.R.styleable#AnalogClock_dial
  * @attr ref android.R.styleable#AnalogClock_hand_hour
  * @attr ref android.R.styleable#AnalogClock_hand_minute
  * @attr ref android.R.styleable#AnalogClock_hand_second
  * @attr ref android.R.styleable#AnalogClock_timeZone
- * @deprecated This widget is no longer supported.
+ * @deprecated This widget is no longer supported; except for
+ * {@link android.widget.RemoteViews} use cases like
+ * <a href="https://developer.android.com/develop/ui/views/appwidgets/overview">
+ * app widgets</a>.
+ *
  */
 @RemoteView
 @Deprecated
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index d56a06f..67c9f8c 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -6232,7 +6232,10 @@
      * @attr ref android.R.styleable#TextView_lineHeight
      */
     @android.view.RemotableViewMethod
-    public void setLineHeight(int unit, @FloatRange(from = 0) float lineHeight) {
+    public void setLineHeight(
+            @TypedValue.ComplexDimensionUnit int unit,
+            @FloatRange(from = 0) float lineHeight
+    ) {
         setLineHeightPx(
                 TypedValue.applyDimension(unit, lineHeight, getDisplayMetricsOrSystem()));
     }
diff --git a/core/java/android/window/IDumpCallback.aidl b/core/java/android/window/IDumpCallback.aidl
new file mode 100644
index 0000000..4c825d4
--- /dev/null
+++ b/core/java/android/window/IDumpCallback.aidl
@@ -0,0 +1,24 @@
+/*
+ * 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.window;
+
+/**
+ * Callback for processes which need to feed data to another process when it dumps.
+ * @hide
+ */
+ interface IDumpCallback {
+    oneway void onDump(in ParcelFileDescriptor outFd);
+ }
\ No newline at end of file
diff --git a/core/java/android/window/RemoteTransition.java b/core/java/android/window/RemoteTransition.java
index 4bd15f2..4cc7ec5 100644
--- a/core/java/android/window/RemoteTransition.java
+++ b/core/java/android/window/RemoteTransition.java
@@ -38,9 +38,18 @@
     /** The application thread that will be running the remote transition. */
     private @Nullable IApplicationThread mAppThread;
 
+    /** A name for this that can be used for debugging. */
+    private @Nullable String mDebugName;
+
     /** Constructs with no app thread (animation runs in shell). */
     public RemoteTransition(@NonNull IRemoteTransition remoteTransition) {
-        this(remoteTransition, null /* appThread */);
+        this(remoteTransition, null /* appThread */, null /* debugName */);
+    }
+
+    /** Constructs with no app thread (animation runs in shell). */
+    public RemoteTransition(@NonNull IRemoteTransition remoteTransition,
+            @Nullable String debugName) {
+        this(remoteTransition, null /* appThread */, debugName);
     }
 
     /** Get the IBinder associated with the underlying IRemoteTransition. */
@@ -70,15 +79,19 @@
      *   The actual remote-transition interface used to run the transition animation.
      * @param appThread
      *   The application thread that will be running the remote transition.
+     * @param debugName
+     *   A name for this that can be used for debugging.
      */
     @DataClass.Generated.Member
     public RemoteTransition(
             @NonNull IRemoteTransition remoteTransition,
-            @Nullable IApplicationThread appThread) {
+            @Nullable IApplicationThread appThread,
+            @Nullable String debugName) {
         this.mRemoteTransition = remoteTransition;
         com.android.internal.util.AnnotationValidations.validate(
                 NonNull.class, null, mRemoteTransition);
         this.mAppThread = appThread;
+        this.mDebugName = debugName;
 
         // onConstructed(); // You can define this method to get a callback
     }
@@ -100,6 +113,14 @@
     }
 
     /**
+     * A name for this that can be used for debugging.
+     */
+    @DataClass.Generated.Member
+    public @Nullable String getDebugName() {
+        return mDebugName;
+    }
+
+    /**
      * The actual remote-transition interface used to run the transition animation.
      */
     @DataClass.Generated.Member
@@ -119,6 +140,15 @@
         return this;
     }
 
+    /**
+     * A name for this that can be used for debugging.
+     */
+    @DataClass.Generated.Member
+    public @NonNull RemoteTransition setDebugName(@NonNull String value) {
+        mDebugName = value;
+        return this;
+    }
+
     @Override
     @DataClass.Generated.Member
     public String toString() {
@@ -127,7 +157,8 @@
 
         return "RemoteTransition { " +
                 "remoteTransition = " + mRemoteTransition + ", " +
-                "appThread = " + mAppThread +
+                "appThread = " + mAppThread + ", " +
+                "debugName = " + mDebugName +
         " }";
     }
 
@@ -139,9 +170,11 @@
 
         byte flg = 0;
         if (mAppThread != null) flg |= 0x2;
+        if (mDebugName != null) flg |= 0x4;
         dest.writeByte(flg);
         dest.writeStrongInterface(mRemoteTransition);
         if (mAppThread != null) dest.writeStrongInterface(mAppThread);
+        if (mDebugName != null) dest.writeString(mDebugName);
     }
 
     @Override
@@ -158,11 +191,13 @@
         byte flg = in.readByte();
         IRemoteTransition remoteTransition = IRemoteTransition.Stub.asInterface(in.readStrongBinder());
         IApplicationThread appThread = (flg & 0x2) == 0 ? null : IApplicationThread.Stub.asInterface(in.readStrongBinder());
+        String debugName = (flg & 0x4) == 0 ? null : in.readString();
 
         this.mRemoteTransition = remoteTransition;
         com.android.internal.util.AnnotationValidations.validate(
                 NonNull.class, null, mRemoteTransition);
         this.mAppThread = appThread;
+        this.mDebugName = debugName;
 
         // onConstructed(); // You can define this method to get a callback
     }
@@ -182,10 +217,10 @@
     };
 
     @DataClass.Generated(
-            time = 1630690027011L,
+            time = 1678926409863L,
             codegenVersion = "1.0.23",
             sourceFile = "frameworks/base/core/java/android/window/RemoteTransition.java",
-            inputSignatures = "private @android.annotation.NonNull android.window.IRemoteTransition mRemoteTransition\nprivate @android.annotation.Nullable android.app.IApplicationThread mAppThread\npublic @android.annotation.Nullable android.os.IBinder asBinder()\nclass RemoteTransition extends java.lang.Object implements [android.os.Parcelable]\[email protected](genToString=true, genSetters=true, genAidl=true)")
+            inputSignatures = "private @android.annotation.NonNull android.window.IRemoteTransition mRemoteTransition\nprivate @android.annotation.Nullable android.app.IApplicationThread mAppThread\nprivate @android.annotation.Nullable java.lang.String mDebugName\npublic @android.annotation.Nullable android.os.IBinder asBinder()\nclass RemoteTransition extends java.lang.Object implements [android.os.Parcelable]\[email protected](genToString=true, genSetters=true, genAidl=true)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/core/java/android/window/ScreenCapture.java b/core/java/android/window/ScreenCapture.java
index 8a7efb9..95451a9 100644
--- a/core/java/android/window/ScreenCapture.java
+++ b/core/java/android/window/ScreenCapture.java
@@ -272,6 +272,8 @@
         public final long mUid;
         public final boolean mGrayscale;
 
+        final SurfaceControl[] mExcludeLayers;
+
         private CaptureArgs(CaptureArgs.Builder<? extends CaptureArgs.Builder<?>> builder) {
             mPixelFormat = builder.mPixelFormat;
             mSourceCrop.set(builder.mSourceCrop);
@@ -281,6 +283,7 @@
             mAllowProtected = builder.mAllowProtected;
             mUid = builder.mUid;
             mGrayscale = builder.mGrayscale;
+            mExcludeLayers = builder.mExcludeLayers;
         }
 
         private CaptureArgs(Parcel in) {
@@ -292,6 +295,46 @@
             mAllowProtected = in.readBoolean();
             mUid = in.readLong();
             mGrayscale = in.readBoolean();
+
+            int excludeLayersLength = in.readInt();
+            if (excludeLayersLength > 0) {
+                mExcludeLayers = new SurfaceControl[excludeLayersLength];
+                for (int index = 0; index < excludeLayersLength; index++) {
+                    mExcludeLayers[index] = SurfaceControl.CREATOR.createFromParcel(in);
+                }
+            } else {
+                mExcludeLayers = null;
+            }
+        }
+
+        /** Release any layers if set using {@link Builder#setExcludeLayers(SurfaceControl[])}. */
+        public void release() {
+            if (mExcludeLayers == null || mExcludeLayers.length == 0) {
+                return;
+            }
+
+            for (SurfaceControl surfaceControl : mExcludeLayers) {
+                if (surfaceControl != null) {
+                    surfaceControl.release();
+                }
+            }
+        }
+
+        /**
+         * Returns an array of {@link SurfaceControl#mNativeObject} corresponding to
+         * {@link #mExcludeLayers}. Used only in native code.
+         */
+        private long[] getNativeExcludeLayers() {
+            if (mExcludeLayers == null || mExcludeLayers.length == 0) {
+                return new long[0];
+            }
+
+            long[] nativeExcludeLayers = new long[mExcludeLayers.length];
+            for (int index = 0; index < mExcludeLayers.length; index++) {
+                nativeExcludeLayers[index] = mExcludeLayers[index].mNativeObject;
+            }
+
+            return nativeExcludeLayers;
         }
 
         /**
@@ -308,6 +351,7 @@
             private boolean mAllowProtected;
             private long mUid = -1;
             private boolean mGrayscale;
+            private SurfaceControl[] mExcludeLayers;
 
             /**
              * Construct a new {@link CaptureArgs} with the set parameters. The builder remains
@@ -397,6 +441,14 @@
             }
 
             /**
+             * An array of {@link SurfaceControl} layer handles to exclude.
+             */
+            public T setExcludeLayers(@Nullable SurfaceControl[] excludeLayers) {
+                mExcludeLayers = excludeLayers;
+                return getThis();
+            }
+
+            /**
              * Each sub class should return itself to allow the builder to chain properly
              */
             T getThis() {
@@ -419,6 +471,15 @@
             dest.writeBoolean(mAllowProtected);
             dest.writeLong(mUid);
             dest.writeBoolean(mGrayscale);
+
+            if (mExcludeLayers != null) {
+                dest.writeInt(mExcludeLayers.length);
+                for (SurfaceControl excludeLayer : mExcludeLayers) {
+                    excludeLayer.writeToParcel(dest, flags);
+                }
+            } else {
+                dest.writeInt(0);
+            }
         }
 
         public static final Parcelable.Creator<CaptureArgs> CREATOR =
@@ -529,21 +590,12 @@
      */
     public static class LayerCaptureArgs extends CaptureArgs {
         private final long mNativeLayer;
-        private final long[] mNativeExcludeLayers;
         private final boolean mChildrenOnly;
 
         private LayerCaptureArgs(Builder builder) {
             super(builder);
             mChildrenOnly = builder.mChildrenOnly;
             mNativeLayer = builder.mLayer.mNativeObject;
-            if (builder.mExcludeLayers != null) {
-                mNativeExcludeLayers = new long[builder.mExcludeLayers.length];
-                for (int i = 0; i < builder.mExcludeLayers.length; i++) {
-                    mNativeExcludeLayers[i] = builder.mExcludeLayers[i].mNativeObject;
-                }
-            } else {
-                mNativeExcludeLayers = null;
-            }
         }
 
         /**
@@ -551,7 +603,6 @@
          */
         public static class Builder extends CaptureArgs.Builder<Builder> {
             private SurfaceControl mLayer;
-            private SurfaceControl[] mExcludeLayers;
             private boolean mChildrenOnly = true;
 
             /**
@@ -575,6 +626,7 @@
                 setAllowProtected(args.mAllowProtected);
                 setUid(args.mUid);
                 setGrayscale(args.mGrayscale);
+                setExcludeLayers(args.mExcludeLayers);
             }
 
             public Builder(SurfaceControl layer) {
@@ -590,14 +642,6 @@
             }
 
             /**
-             * An array of layer handles to exclude.
-             */
-            public Builder setExcludeLayers(@Nullable SurfaceControl[] excludeLayers) {
-                mExcludeLayers = excludeLayers;
-                return this;
-            }
-
-            /**
              * Whether to include the layer itself in the screenshot or just the children and their
              * descendants.
              */
diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java
index 4c48246..0f3eef7 100644
--- a/core/java/android/window/TransitionInfo.java
+++ b/core/java/android/window/TransitionInfo.java
@@ -149,8 +149,11 @@
     /** The task is launching behind home. */
     public static final int FLAG_TASK_LAUNCHING_BEHIND = 1 << 19;
 
+    /** The task became the top-most task even if it didn't change visibility. */
+    public static final int FLAG_MOVED_TO_TOP = 1 << 20;
+
     /** The first unused bit. This can be used by remotes to attach custom flags to this change. */
-    public static final int FLAG_FIRST_CUSTOM = 1 << 20;
+    public static final int FLAG_FIRST_CUSTOM = 1 << 21;
 
     /** The change belongs to a window that won't contain activities. */
     public static final int FLAGS_IS_NON_APP_WINDOW =
@@ -179,6 +182,7 @@
             FLAG_BACK_GESTURE_ANIMATED,
             FLAG_NO_ANIMATION,
             FLAG_TASK_LAUNCHING_BEHIND,
+            FLAG_MOVED_TO_TOP,
             FLAG_FIRST_CUSTOM
     })
     public @interface ChangeFlags {}
@@ -190,6 +194,9 @@
 
     private AnimationOptions mOptions;
 
+    /** This is only a BEST-EFFORT id used for log correlation. DO NOT USE for any real work! */
+    private int mDebugId = -1;
+
     /** @hide */
     public TransitionInfo(@TransitionType int type, @TransitionFlags int flags) {
         mType = type;
@@ -202,6 +209,7 @@
         in.readTypedList(mChanges, Change.CREATOR);
         in.readTypedList(mRoots, Root.CREATOR);
         mOptions = in.readTypedObject(AnimationOptions.CREATOR);
+        mDebugId = in.readInt();
     }
 
     @Override
@@ -212,6 +220,7 @@
         dest.writeTypedList(mChanges);
         dest.writeTypedList(mRoots, flags);
         dest.writeTypedObject(mOptions, flags);
+        dest.writeInt(mDebugId);
     }
 
     @NonNull
@@ -347,11 +356,24 @@
         return (mFlags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0;
     }
 
+    /**
+     * Set an arbitrary "debug" id for this info. This id will not be used for any "real work",
+     * it is just for debugging and logging.
+     */
+    public void setDebugId(int id) {
+        mDebugId = id;
+    }
+
+    /** Get the "debug" id of this info. Do NOT use this for real work, only use for debugging. */
+    public int getDebugId() {
+        return mDebugId;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
-        sb.append("{t=").append(transitTypeToString(mType)).append(" f=0x")
-                .append(Integer.toHexString(mFlags)).append(" r=[");
+        sb.append("{id=").append(mDebugId).append(" t=").append(transitTypeToString(mType))
+                .append(" f=0x").append(Integer.toHexString(mFlags)).append(" r=[");
         for (int i = 0; i < mRoots.size(); ++i) {
             if (i > 0) {
                 sb.append(',');
@@ -510,6 +532,7 @@
      */
     public TransitionInfo localRemoteCopy() {
         final TransitionInfo out = new TransitionInfo(mType, mFlags);
+        out.mDebugId = mDebugId;
         for (int i = 0; i < mChanges.size(); ++i) {
             out.mChanges.add(mChanges.get(i).localRemoteCopy());
         }
diff --git a/core/java/android/window/WindowContainerTransaction.java b/core/java/android/window/WindowContainerTransaction.java
index ad20432..9f804b1 100644
--- a/core/java/android/window/WindowContainerTransaction.java
+++ b/core/java/android/window/WindowContainerTransaction.java
@@ -1586,61 +1586,109 @@
             return mShortcutInfo;
         }
 
+        /** Gets a string representation of a hierarchy-op type. */
+        public static String hopToString(int type) {
+            switch (type) {
+                case HIERARCHY_OP_TYPE_REPARENT: return "reparent";
+                case HIERARCHY_OP_TYPE_REORDER: return "reorder";
+                case HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT: return "ChildrenTasksReparent";
+                case HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT: return "SetLaunchRoot";
+                case HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS: return "SetAdjacentRoot";
+                case HIERARCHY_OP_TYPE_LAUNCH_TASK: return "LaunchTask";
+                case HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT: return "SetAdjacentFlagRoot";
+                case HIERARCHY_OP_TYPE_PENDING_INTENT: return "PendingIntent";
+                case HIERARCHY_OP_TYPE_START_SHORTCUT: return "StartShortcut";
+                case HIERARCHY_OP_TYPE_ADD_INSETS_FRAME_PROVIDER: return "addInsetsFrameProvider";
+                case HIERARCHY_OP_TYPE_REMOVE_INSETS_FRAME_PROVIDER:
+                    return "removeInsetsFrameProvider";
+                case HIERARCHY_OP_TYPE_SET_ALWAYS_ON_TOP: return "setAlwaysOnTop";
+                case HIERARCHY_OP_TYPE_REMOVE_TASK: return "RemoveTask";
+                case HIERARCHY_OP_TYPE_FINISH_ACTIVITY: return "finishActivity";
+                case HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS: return "ClearAdjacentRoot";
+                case HIERARCHY_OP_TYPE_SET_REPARENT_LEAF_TASK_IF_RELAUNCH:
+                    return "setReparentLeafTaskIfRelaunch";
+                case HIERARCHY_OP_TYPE_ADD_TASK_FRAGMENT_OPERATION:
+                    return "addTaskFragmentOperation";
+                default: return "HOP(" + type + ")";
+            }
+        }
+
         @Override
         public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("{").append(hopToString(mType)).append(": ");
             switch (mType) {
                 case HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT:
-                    return "{ChildrenTasksReparent: from=" + mContainer + " to=" + mReparent
-                            + " mToTop=" + mToTop + " mReparentTopOnly=" + mReparentTopOnly
-                            + " mWindowingMode=" + Arrays.toString(mWindowingModes)
-                            + " mActivityType=" + Arrays.toString(mActivityTypes) + "}";
+                    sb.append("from=").append(mContainer).append(" to=").append(mReparent)
+                            .append(" mToTop=").append(mToTop)
+                            .append(" mReparentTopOnly=").append(mReparentTopOnly)
+                            .append(" mWindowingMode=").append(Arrays.toString(mWindowingModes))
+                            .append(" mActivityType=").append(Arrays.toString(mActivityTypes));
+                    break;
                 case HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT:
-                    return "{SetLaunchRoot: container=" + mContainer
-                            + " mWindowingMode=" + Arrays.toString(mWindowingModes)
-                            + " mActivityType=" + Arrays.toString(mActivityTypes) + "}";
+                    sb.append("container=").append(mContainer)
+                            .append(" mWindowingMode=").append(Arrays.toString(mWindowingModes))
+                            .append(" mActivityType=").append(Arrays.toString(mActivityTypes));
+                    break;
                 case HIERARCHY_OP_TYPE_REPARENT:
-                    return "{reparent: " + mContainer + " to " + (mToTop ? "top of " : "bottom of ")
-                            + mReparent + "}";
+                    sb.append(mContainer).append(" to ").append(mToTop ? "top of " : "bottom of ")
+                            .append(mReparent);
+                    break;
                 case HIERARCHY_OP_TYPE_REORDER:
-                    return "{reorder: " + mContainer + " to " + (mToTop ? "top" : "bottom") + "}";
+                    sb.append(mContainer).append(" to ").append(mToTop ? "top" : "bottom");
+                    break;
                 case HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS:
-                    return "{SetAdjacentRoot: container=" + mContainer
-                            + " adjacentRoot=" + mReparent + "}";
+                    sb.append("container=").append(mContainer)
+                            .append(" adjacentRoot=").append(mReparent);
+                    break;
                 case HIERARCHY_OP_TYPE_LAUNCH_TASK:
-                    return "{LaunchTask: " + mLaunchOptions + "}";
+                    sb.append(mLaunchOptions);
+                    break;
                 case HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT:
-                    return "{SetAdjacentFlagRoot: container=" + mContainer + " clearRoot=" + mToTop
-                            + "}";
+                    sb.append("container=").append(mContainer).append(" clearRoot=").append(mToTop);
+                    break;
                 case HIERARCHY_OP_TYPE_START_SHORTCUT:
-                    return "{StartShortcut: options=" + mLaunchOptions + " info=" + mShortcutInfo
-                            + "}";
+                    sb.append("options=").append(mLaunchOptions)
+                            .append(" info=").append(mShortcutInfo);
+                    break;
+                case HIERARCHY_OP_TYPE_PENDING_INTENT:
+                    sb.append("options=").append(mLaunchOptions);
+                    break;
                 case HIERARCHY_OP_TYPE_ADD_INSETS_FRAME_PROVIDER:
-                    return "{addRectInsetsProvider: container=" + mContainer
-                            + " provider=" + mInsetsFrameProvider + "}";
                 case HIERARCHY_OP_TYPE_REMOVE_INSETS_FRAME_PROVIDER:
-                    return "{removeLocalInsetsProvider: container=" + mContainer
-                            + " provider=" + mInsetsFrameProvider + "}";
+                    sb.append("container=").append(mContainer)
+                            .append(" provider=").append(mInsetsFrameProvider);
+                    break;
                 case HIERARCHY_OP_TYPE_SET_ALWAYS_ON_TOP:
-                    return "{setAlwaysOnTop: container=" + mContainer
-                            + " alwaysOnTop=" + mAlwaysOnTop + "}";
+                    sb.append("container=").append(mContainer)
+                            .append(" alwaysOnTop=").append(mAlwaysOnTop);
+                    break;
                 case HIERARCHY_OP_TYPE_REMOVE_TASK:
-                    return "{RemoveTask: task=" + mContainer + "}";
+                    sb.append("task=").append(mContainer);
+                    break;
                 case HIERARCHY_OP_TYPE_FINISH_ACTIVITY:
-                    return "{finishActivity: activity=" + mContainer + "}";
+                    sb.append("activity=").append(mContainer);
+                    break;
                 case HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS:
-                    return "{ClearAdjacentRoot: container=" + mContainer + "}";
+                    sb.append("container=").append(mContainer);
+                    break;
                 case HIERARCHY_OP_TYPE_SET_REPARENT_LEAF_TASK_IF_RELAUNCH:
-                    return "{setReparentLeafTaskIfRelaunch: container= " + mContainer
-                            + " reparentLeafTaskIfRelaunch= " + mReparentLeafTaskIfRelaunch + "}";
+                    sb.append("container= ").append(mContainer)
+                            .append(" reparentLeafTaskIfRelaunch= ")
+                            .append(mReparentLeafTaskIfRelaunch);
+                    break;
                 case HIERARCHY_OP_TYPE_ADD_TASK_FRAGMENT_OPERATION:
-                    return "{addTaskFragmentOperation: fragmentToken= " + mContainer
-                            + " operation= " + mTaskFragmentOperation + "}";
+                    sb.append("fragmentToken= ").append(mContainer)
+                            .append(" operation= ").append(mTaskFragmentOperation);
+                    break;
                 default:
-                    return "{mType=" + mType + " container=" + mContainer + " reparent=" + mReparent
-                            + " mToTop=" + mToTop
-                            + " mWindowingMode=" + Arrays.toString(mWindowingModes)
-                            + " mActivityType=" + Arrays.toString(mActivityTypes) + "}";
+                    sb.append("container=").append(mContainer)
+                            .append(" reparent=").append(mReparent)
+                            .append(" mToTop=").append(mToTop)
+                            .append(" mWindowingMode=").append(Arrays.toString(mWindowingModes))
+                            .append(" mActivityType=").append(Arrays.toString(mActivityTypes));
             }
+            return sb.append("}").toString();
         }
 
         @Override
diff --git a/core/java/com/android/internal/app/IntentForwarderActivity.java b/core/java/com/android/internal/app/IntentForwarderActivity.java
index 75e797b..44d517a 100644
--- a/core/java/com/android/internal/app/IntentForwarderActivity.java
+++ b/core/java/com/android/internal/app/IntentForwarderActivity.java
@@ -19,6 +19,7 @@
 import static android.Manifest.permission.INTERACT_ACROSS_USERS;
 import static android.app.admin.DevicePolicyResources.Strings.Core.FORWARD_INTENT_TO_PERSONAL;
 import static android.app.admin.DevicePolicyResources.Strings.Core.FORWARD_INTENT_TO_WORK;
+import static android.app.admin.DevicePolicyResources.Strings.Core.MINIRESOLVER_OPEN_IN_WORK;
 import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 
@@ -212,9 +213,7 @@
         buttonContainer.setPadding(0, 0, 0, buttonContainer.getPaddingBottom());
 
         ((TextView) findViewById(R.id.open_cross_profile)).setText(
-                getResources().getString(
-                        R.string.miniresolver_open_in_work,
-                        target.loadLabel(packageManagerForTargetUser)));
+                getOpenInWorkMessage(target.loadLabel(packageManagerForTargetUser)));
 
         // The mini-resolver's negative button is reused in this flow to cancel the intent
         ((Button) findViewById(R.id.use_same_profile_browser)).setText(R.string.cancel);
@@ -226,6 +225,13 @@
         });
     }
 
+    private String getOpenInWorkMessage(CharSequence targetLabel) {
+        return getSystemService(DevicePolicyManager.class).getResources().getString(
+                MINIRESOLVER_OPEN_IN_WORK,
+                () -> getString(R.string.miniresolver_open_in_work, targetLabel),
+                targetLabel);
+    }
+
     private String getForwardToPersonalMessage() {
         return getSystemService(DevicePolicyManager.class).getResources().getString(
                 FORWARD_INTENT_TO_PERSONAL,
diff --git a/core/java/com/android/internal/app/LocaleStore.java b/core/java/com/android/internal/app/LocaleStore.java
index bcbfdc9..d07058d 100644
--- a/core/java/com/android/internal/app/LocaleStore.java
+++ b/core/java/com/android/internal/app/LocaleStore.java
@@ -657,6 +657,7 @@
                 // of supported locales.
                 result.mIsPseudo = localeInfo.mIsPseudo;
                 result.mIsTranslated = localeInfo.mIsTranslated;
+                result.mHasNumberingSystems = localeInfo.mHasNumberingSystems;
                 result.mSuggestionFlags = localeInfo.mSuggestionFlags;
                 return result;
             }
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index 73c5207..499d38c 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -19,6 +19,10 @@
 import static android.Manifest.permission.INTERACT_ACROSS_PROFILES;
 import static android.app.admin.DevicePolicyResources.Strings.Core.FORWARD_INTENT_TO_PERSONAL;
 import static android.app.admin.DevicePolicyResources.Strings.Core.FORWARD_INTENT_TO_WORK;
+import static android.app.admin.DevicePolicyResources.Strings.Core.MINIRESOLVER_OPEN_IN_PERSONAL;
+import static android.app.admin.DevicePolicyResources.Strings.Core.MINIRESOLVER_OPEN_IN_WORK;
+import static android.app.admin.DevicePolicyResources.Strings.Core.MINIRESOLVER_USE_PERSONAL_BROWSER;
+import static android.app.admin.DevicePolicyResources.Strings.Core.MINIRESOLVER_USE_WORK_BROWSER;
 import static android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_CANT_ACCESS_PERSONAL;
 import static android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_CANT_ACCESS_WORK;
 import static android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_CROSS_PROFILE_BLOCKED_TITLE;
@@ -46,6 +50,7 @@
 import android.app.VoiceInteractor.Prompt;
 import android.app.admin.DevicePolicyEventLogger;
 import android.app.admin.DevicePolicyManager;
+import android.app.admin.DevicePolicyResourcesManager;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -1713,14 +1718,29 @@
             }
         }.execute();
 
-        ((TextView) findViewById(R.id.open_cross_profile)).setText(
-                getResources().getString(
-                        inWorkProfile ? R.string.miniresolver_open_in_personal
-                                : R.string.miniresolver_open_in_work,
-                        otherProfileResolveInfo.getDisplayLabel()));
-        ((Button) findViewById(R.id.use_same_profile_browser)).setText(
-                inWorkProfile ? R.string.miniresolver_use_work_browser
-                        : R.string.miniresolver_use_personal_browser);
+        CharSequence targetDisplayLabel = otherProfileResolveInfo.getDisplayLabel();
+
+        DevicePolicyResourcesManager devicePolicyResourcesManager = getSystemService(
+                DevicePolicyManager.class).getResources();
+
+        if (inWorkProfile) {
+            ((TextView) findViewById(R.id.open_cross_profile)).setText(
+                    devicePolicyResourcesManager.getString(MINIRESOLVER_OPEN_IN_WORK,
+                            () -> getString(R.string.miniresolver_open_in_work, targetDisplayLabel),
+                            targetDisplayLabel));
+            ((Button) findViewById(R.id.use_same_profile_browser)).setText(
+                    devicePolicyResourcesManager.getString(MINIRESOLVER_USE_WORK_BROWSER,
+                            () -> getString(R.string.miniresolver_use_work_browser)));
+        } else {
+            ((TextView) findViewById(R.id.open_cross_profile)).setText(
+                    devicePolicyResourcesManager.getString(MINIRESOLVER_OPEN_IN_PERSONAL,
+                            () -> getString(R.string.miniresolver_open_in_personal,
+                                    targetDisplayLabel),
+                            targetDisplayLabel));
+            ((Button) findViewById(R.id.use_same_profile_browser)).setText(
+                    devicePolicyResourcesManager.getString(MINIRESOLVER_USE_PERSONAL_BROWSER,
+                            () -> getString(R.string.miniresolver_use_personal_browser)));
+        }
 
         findViewById(R.id.use_same_profile_browser).setOnClickListener(
                 v -> {
diff --git a/core/java/com/android/internal/app/UnlaunchableAppActivity.java b/core/java/com/android/internal/app/UnlaunchableAppActivity.java
index e47c335..73914a2 100644
--- a/core/java/com/android/internal/app/UnlaunchableAppActivity.java
+++ b/core/java/com/android/internal/app/UnlaunchableAppActivity.java
@@ -16,7 +16,6 @@
 
 package com.android.internal.app;
 
-import static android.app.admin.DevicePolicyResources.Strings.Core.UNLAUNCHABLE_APP_WORK_PAUSED_MESSAGE;
 import static android.app.admin.DevicePolicyResources.Strings.Core.UNLAUNCHABLE_APP_WORK_PAUSED_TITLE;
 import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
@@ -87,17 +86,13 @@
                         mTelecomManager.getDefaultDialerPackage(UserHandle.of(mUserId))));
 
         final AlertDialog.Builder builder;
-        final String dialogMessage;
         if (showEmergencyCallButton) {
             builder = new AlertDialog.Builder(this, R.style.AlertDialogWithEmergencyButton);
-            dialogMessage = getDialogMessage(R.string.work_mode_dialer_off_message);
             builder.setNeutralButton(R.string.work_mode_emergency_call_button, this);
         } else {
             builder = new AlertDialog.Builder(this);
-            dialogMessage = getDialogMessage(R.string.work_mode_off_message);
         }
         builder.setTitle(getDialogTitle())
-                .setMessage(dialogMessage)
                 .setOnDismissListener(this)
                 .setPositiveButton(R.string.work_mode_turn_on, this)
                 .setNegativeButton(R.string.cancel, null);
@@ -120,12 +115,6 @@
                 UNLAUNCHABLE_APP_WORK_PAUSED_TITLE, () -> getString(R.string.work_mode_off_title));
     }
 
-    private String getDialogMessage(int dialogMessageString) {
-        return getSystemService(DevicePolicyManager.class).getResources().getString(
-                UNLAUNCHABLE_APP_WORK_PAUSED_MESSAGE,
-                () -> getString(dialogMessageString));
-    }
-
     @Override
     public void onDismiss(DialogInterface dialog) {
         finish();
diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
index 0cb87fe..7ad2a68 100644
--- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
+++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
@@ -524,11 +524,6 @@
     public static final String DEFAULT_QR_CODE_SCANNER = "default_qr_code_scanner";
 
     /**
-     * (boolean) Whether the task manager entrypoint is enabled.
-     */
-    public static final String TASK_MANAGER_ENABLED = "task_manager_enabled";
-
-    /**
      * (boolean) Whether the task manager should show an attention grabbing dot when tasks changed.
      */
     public static final String TASK_MANAGER_SHOW_FOOTER_DOT = "task_manager_show_footer_dot";
diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java
index 63445684..4b9e77e 100644
--- a/core/java/com/android/internal/jank/InteractionJankMonitor.java
+++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java
@@ -36,6 +36,7 @@
 import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_CLOSE_ALL_APPS_SWIPE;
 import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_CLOSE_ALL_APPS_TO_HOME;
 import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_OPEN_ALL_APPS;
+import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_OPEN_SEARCH_RESULT;
 import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_QUICK_SWITCH;
 import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_UNLOCK_ENTRANCE_ANIMATION;
 import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LOCKSCREEN_CLOCK_MOVE_ANIMATION;
@@ -244,6 +245,7 @@
     public static final int CUJ_LAUNCHER_CLOSE_ALL_APPS_TO_HOME = 68;
     public static final int CUJ_IME_INSETS_ANIMATION = 69;
     public static final int CUJ_LOCKSCREEN_CLOCK_MOVE_ANIMATION = 70;
+    public static final int CUJ_LAUNCHER_OPEN_SEARCH_RESULT = 71;
 
     private static final int NO_STATSD_LOGGING = -1;
 
@@ -323,6 +325,7 @@
             UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_CLOSE_ALL_APPS_TO_HOME,
             UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__IME_INSETS_ANIMATION,
             UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LOCKSCREEN_CLOCK_MOVE_ANIMATION,
+            UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_OPEN_SEARCH_RESULT,
     };
 
     private static class InstanceHolder {
@@ -418,6 +421,7 @@
             CUJ_LAUNCHER_CLOSE_ALL_APPS_TO_HOME,
             CUJ_IME_INSETS_ANIMATION,
             CUJ_LOCKSCREEN_CLOCK_MOVE_ANIMATION,
+            CUJ_LAUNCHER_OPEN_SEARCH_RESULT,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface CujType {
@@ -968,6 +972,8 @@
                 return "IME_INSETS_ANIMATION";
             case CUJ_LOCKSCREEN_CLOCK_MOVE_ANIMATION:
                 return "LOCKSCREEN_CLOCK_MOVE_ANIMATION";
+            case CUJ_LAUNCHER_OPEN_SEARCH_RESULT:
+                return "LAUNCHER_OPEN_SEARCH_RESULT";
         }
         return "UNKNOWN";
     }
diff --git a/core/java/com/android/internal/os/TimeoutRecord.java b/core/java/com/android/internal/os/TimeoutRecord.java
index 2f6091b..a0e2934 100644
--- a/core/java/com/android/internal/os/TimeoutRecord.java
+++ b/core/java/com/android/internal/os/TimeoutRecord.java
@@ -18,6 +18,8 @@
 
 import android.annotation.IntDef;
 import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ComponentName;
 import android.content.Intent;
 import android.os.SystemClock;
 
@@ -98,18 +100,41 @@
 
     /** Record for a broadcast receiver timeout. */
     @NonNull
+    public static TimeoutRecord forBroadcastReceiver(@NonNull Intent intent,
+            @Nullable String packageName, @Nullable String className) {
+        final Intent logIntent;
+        if (packageName != null) {
+            if (className != null) {
+                logIntent = new Intent(intent);
+                logIntent.setComponent(new ComponentName(packageName, className));
+            } else {
+                logIntent = new Intent(intent);
+                logIntent.setPackage(packageName);
+            }
+        } else {
+            logIntent = intent;
+        }
+        return forBroadcastReceiver(logIntent);
+    }
+
+    /** Record for a broadcast receiver timeout. */
+    @NonNull
     public static TimeoutRecord forBroadcastReceiver(@NonNull Intent intent) {
-        String reason = "Broadcast of " + intent.toString();
-        return TimeoutRecord.endingNow(TimeoutKind.BROADCAST_RECEIVER, reason);
+        final StringBuilder reason = new StringBuilder("Broadcast of ");
+        intent.toString(reason);
+        return TimeoutRecord.endingNow(TimeoutKind.BROADCAST_RECEIVER, reason.toString());
     }
 
     /** Record for a broadcast receiver timeout. */
     @NonNull
     public static TimeoutRecord forBroadcastReceiver(@NonNull Intent intent,
             long timeoutDurationMs) {
-        String reason = "Broadcast of " + intent.toString() + ", waited " + timeoutDurationMs
-                + "ms";
-        return TimeoutRecord.endingNow(TimeoutKind.BROADCAST_RECEIVER, reason);
+        final StringBuilder reason = new StringBuilder("Broadcast of ");
+        intent.toString(reason);
+        reason.append(", waited ");
+        reason.append(timeoutDurationMs);
+        reason.append("ms");
+        return TimeoutRecord.endingNow(TimeoutKind.BROADCAST_RECEIVER, reason.toString());
     }
 
     /** Record for an input dispatch no focused window timeout */
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 85cb15b..a95ce64 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -51,6 +51,7 @@
 import android.util.Log;
 import android.util.Slog;
 import android.util.TimingsTraceLog;
+import android.view.WindowManager;
 import android.webkit.WebViewFactory;
 import android.widget.TextView;
 
@@ -72,6 +73,8 @@
 import java.io.InputStreamReader;
 import java.security.Provider;
 import java.security.Security;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Startup class for the zygote process.
@@ -384,33 +387,49 @@
      * classpath.
      */
     private static void cacheNonBootClasspathClassLoaders() {
+        // Ordered dependencies first
+        final List<SharedLibraryInfo> libs = new ArrayList<>();
         // These libraries used to be part of the bootclasspath, but had to be removed.
         // Old system applications still get them for backwards compatibility reasons,
         // so they are cached here in order to preserve performance characteristics.
-        SharedLibraryInfo hidlBase = new SharedLibraryInfo(
+        libs.add(new SharedLibraryInfo(
                 "/system/framework/android.hidl.base-V1.0-java.jar", null /*packageName*/,
                 null /*codePaths*/, null /*name*/, 0 /*version*/, SharedLibraryInfo.TYPE_BUILTIN,
                 null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/,
-                false /*isNative*/);
-        SharedLibraryInfo hidlManager = new SharedLibraryInfo(
+                false /*isNative*/));
+        libs.add(new SharedLibraryInfo(
                 "/system/framework/android.hidl.manager-V1.0-java.jar", null /*packageName*/,
                 null /*codePaths*/, null /*name*/, 0 /*version*/, SharedLibraryInfo.TYPE_BUILTIN,
                 null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/,
-                false /*isNative*/);
+                false /*isNative*/));
 
-        SharedLibraryInfo androidTestBase = new SharedLibraryInfo(
+        libs.add(new SharedLibraryInfo(
                 "/system/framework/android.test.base.jar", null /*packageName*/,
                 null /*codePaths*/, null /*name*/, 0 /*version*/, SharedLibraryInfo.TYPE_BUILTIN,
                 null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/,
-                false /*isNative*/);
+                false /*isNative*/));
 
-        ApplicationLoaders.getDefault().createAndCacheNonBootclasspathSystemClassLoaders(
-                new SharedLibraryInfo[]{
-                    // ordered dependencies first
-                    hidlBase,
-                    hidlManager,
-                    androidTestBase,
-                });
+        // 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.
+        if (WindowManager.hasWindowExtensionsEnabled()) {
+            final String systemExtFrameworkPath =
+                    new File(Environment.getSystemExtDirectory(), "framework").getPath();
+            libs.add(new SharedLibraryInfo(
+                    systemExtFrameworkPath + "/androidx.window.extensions.jar",
+                    "androidx.window.extensions", null /*codePaths*/,
+                    "androidx.window.extensions", SharedLibraryInfo.VERSION_UNDEFINED,
+                    SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/,
+                    null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/));
+            libs.add(new SharedLibraryInfo(
+                    systemExtFrameworkPath + "/androidx.window.sidecar.jar",
+                    "androidx.window.sidecar", null /*codePaths*/,
+                    "androidx.window.sidecar", SharedLibraryInfo.VERSION_UNDEFINED,
+                    SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/,
+                    null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/));
+        }
+
+        ApplicationLoaders.getDefault().createAndCacheNonBootclasspathSystemClassLoaders(libs);
     }
 
     /**
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index f7c03cd..ae58626 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -28,6 +28,7 @@
 import android.media.MediaRoute2Info;
 import android.os.Bundle;
 import android.os.ParcelFileDescriptor;
+import android.view.KeyEvent;
 import android.service.notification.StatusBarNotification;
 
 import com.android.internal.statusbar.IAddTileResultCallback;
@@ -141,7 +142,7 @@
     void addQsTile(in ComponentName tile);
     void remQsTile(in ComponentName tile);
     void clickQsTile(in ComponentName tile);
-    void handleSystemKey(in int key);
+    void handleSystemKey(in KeyEvent key);
 
     /**
      * Methods to show toast messages for screen pinning
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index c1dbc87..3708859 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -29,6 +29,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.UserHandle;
+import android.view.KeyEvent;
 import android.service.notification.StatusBarNotification;
 
 import com.android.internal.logging.InstanceId;
@@ -110,7 +111,7 @@
     void remTile(in ComponentName tile);
     void clickTile(in ComponentName tile);
     @UnsupportedAppUsage
-    void handleSystemKey(in int key);
+    void handleSystemKey(in KeyEvent key);
     int getLastSystemKey();
 
     /**
diff --git a/core/java/com/android/internal/widget/MessagingImageMessage.java b/core/java/com/android/internal/widget/MessagingImageMessage.java
index 8e7fe18..098bce1 100644
--- a/core/java/com/android/internal/widget/MessagingImageMessage.java
+++ b/core/java/com/android/internal/widget/MessagingImageMessage.java
@@ -198,6 +198,11 @@
 
     @Override
     public int getMeasuredType() {
+        if (mDrawable == null) {
+            Log.e(TAG, "getMeasuredType() after recycle()!");
+            return MEASURED_NORMAL;
+        }
+
         int measuredHeight = getMeasuredHeight();
         int minImageHeight;
         if (mIsIsolated) {
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index a8abe50..2a670e8 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -556,7 +556,8 @@
 // connect to camera service
 static jint android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz, jobject weak_this,
                                                  jint cameraId, jstring clientPackageName,
-                                                 jboolean overrideToPortrait) {
+                                                 jboolean overrideToPortrait,
+                                                 jboolean forceSlowJpegMode) {
     // Convert jstring to String16
     const char16_t *rawClientName = reinterpret_cast<const char16_t*>(
         env->GetStringChars(clientPackageName, NULL));
@@ -568,7 +569,7 @@
     int targetSdkVersion = android_get_application_target_sdk_version();
     sp<Camera> camera =
             Camera::connect(cameraId, clientName, Camera::USE_CALLING_UID, Camera::USE_CALLING_PID,
-                            targetSdkVersion, overrideToPortrait);
+                            targetSdkVersion, overrideToPortrait, forceSlowJpegMode);
     if (camera == NULL) {
         return -EACCES;
     }
@@ -1054,7 +1055,7 @@
         {"getNumberOfCameras", "()I", (void *)android_hardware_Camera_getNumberOfCameras},
         {"_getCameraInfo", "(IZLandroid/hardware/Camera$CameraInfo;)V",
          (void *)android_hardware_Camera_getCameraInfo},
-        {"native_setup", "(Ljava/lang/Object;ILjava/lang/String;Z)I",
+        {"native_setup", "(Ljava/lang/Object;ILjava/lang/String;ZZ)I",
          (void *)android_hardware_Camera_native_setup},
         {"native_release", "()V", (void *)android_hardware_Camera_release},
         {"setPreviewSurface", "(Landroid/view/Surface;)V",
diff --git a/core/jni/android_hardware_input_InputWindowHandle.cpp b/core/jni/android_hardware_input_InputWindowHandle.cpp
index 241320f..416d991 100644
--- a/core/jni/android_hardware_input_InputWindowHandle.cpp
+++ b/core/jni/android_hardware_input_InputWindowHandle.cpp
@@ -74,6 +74,7 @@
     WeakRefHandleField touchableRegionSurfaceControl;
     jfieldID transform;
     jfieldID windowToken;
+    jfieldID focusTransferTarget;
 } gInputWindowHandleClassInfo;
 
 static struct {
@@ -216,6 +217,17 @@
         mInfo.windowToken.clear();
     }
 
+    ScopedLocalRef<jobject>
+            focusTransferTargetObj(env,
+                                   env->GetObjectField(obj,
+                                                       gInputWindowHandleClassInfo
+                                                               .focusTransferTarget));
+    if (focusTransferTargetObj.get()) {
+        mInfo.focusTransferTarget = ibinderForJavaObject(env, focusTransferTargetObj.get());
+    } else {
+        mInfo.focusTransferTarget.clear();
+    }
+
     env->DeleteLocalRef(obj);
     return true;
 }
@@ -433,6 +445,9 @@
     GET_FIELD_ID(gInputWindowHandleClassInfo.windowToken, clazz, "windowToken",
                  "Landroid/os/IBinder;");
 
+    GET_FIELD_ID(gInputWindowHandleClassInfo.focusTransferTarget, clazz, "focusTransferTarget",
+                 "Landroid/os/IBinder;");
+
     jclass weakRefClazz;
     FIND_CLASS(weakRefClazz, "java/lang/ref/Reference");
 
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index a7c7d0b..b24dc8a 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -413,9 +413,13 @@
 
         if (env->ExceptionCheck()) {
             ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
-            binder_report_exception(env, excep.get(),
-                                    "*** Uncaught remote exception!  "
-                                    "(Exceptions are not yet supported across processes.)");
+
+            auto state = IPCThreadState::self();
+            String8 msg;
+            msg.appendFormat("*** Uncaught remote exception! Exceptions are not yet supported "
+                             "across processes. Client PID %d UID %d.",
+                             state->getCallingPid(), state->getCallingUid());
+            binder_report_exception(env, excep.get(), msg.c_str());
             res = JNI_FALSE;
         }
 
@@ -431,6 +435,7 @@
             ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
             binder_report_exception(env, excep.get(),
                                     "*** Uncaught exception in onBinderStrictModePolicyChange");
+            // TODO: should turn this to fatal?
         }
 
         // Need to always call through the native implementation of
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 03d6eec..e42c6f1 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -1820,17 +1820,11 @@
 }
 
 static void nativeSetFocusedWindow(JNIEnv* env, jclass clazz, jlong transactionObj,
-                                   jobject toTokenObj, jstring windowNameJstr,
-                                   jobject focusedTokenObj, jstring focusedWindowNameJstr,
-                                   jint displayId) {
+                                   jobject toTokenObj, jstring windowNameJstr, jint displayId) {
     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
     if (toTokenObj == NULL) return;
 
     sp<IBinder> toToken(ibinderForJavaObject(env, toTokenObj));
-    sp<IBinder> focusedToken;
-    if (focusedTokenObj != NULL) {
-        focusedToken = ibinderForJavaObject(env, focusedTokenObj);
-    }
 
     FocusRequest request;
     request.token = toToken;
@@ -1839,11 +1833,6 @@
         request.windowName = windowName.c_str();
     }
 
-    request.focusedToken = focusedToken;
-    if (focusedWindowNameJstr != NULL) {
-        ScopedUtfChars focusedWindowName(env, focusedWindowNameJstr);
-        request.focusedWindowName = focusedWindowName.c_str();
-    }
     request.timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
     request.displayId = displayId;
     transaction->setFocusedWindow(request);
@@ -2236,7 +2225,7 @@
             (void*)nativeGetHandle },
     {"nativeSetFixedTransformHint", "(JJI)V",
             (void*)nativeSetFixedTransformHint},
-    {"nativeSetFocusedWindow", "(JLandroid/os/IBinder;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I)V",
+    {"nativeSetFocusedWindow", "(JLandroid/os/IBinder;Ljava/lang/String;I)V",
             (void*)nativeSetFocusedWindow},
     {"nativeRemoveCurrentInputFocus", "(JI)V",
             (void*)nativeRemoveCurrentInputFocus},
diff --git a/core/jni/android_window_ScreenCapture.cpp b/core/jni/android_window_ScreenCapture.cpp
index c1929c6..1b67a0d 100644
--- a/core/jni/android_window_ScreenCapture.cpp
+++ b/core/jni/android_window_ScreenCapture.cpp
@@ -45,6 +45,7 @@
     jfieldID allowProtected;
     jfieldID uid;
     jfieldID grayscale;
+    jmethodID getNativeExcludeLayers;
 } gCaptureArgsClassInfo;
 
 static struct {
@@ -56,7 +57,6 @@
 
 static struct {
     jfieldID layer;
-    jfieldID excludeLayers;
     jfieldID childrenOnly;
 } gLayerCaptureArgsClassInfo;
 
@@ -168,6 +168,23 @@
     captureArgs.uid = env->GetLongField(captureArgsObject, gCaptureArgsClassInfo.uid);
     captureArgs.grayscale =
             env->GetBooleanField(captureArgsObject, gCaptureArgsClassInfo.grayscale);
+
+    jlongArray excludeObjectArray = reinterpret_cast<jlongArray>(
+            env->CallObjectMethod(captureArgsObject, gCaptureArgsClassInfo.getNativeExcludeLayers));
+    if (excludeObjectArray != nullptr) {
+        ScopedLongArrayRO excludeArray(env, excludeObjectArray);
+        const jsize len = excludeArray.size();
+        captureArgs.excludeHandles.reserve(len);
+
+        for (jsize i = 0; i < len; i++) {
+            auto excludeObject = reinterpret_cast<SurfaceControl*>(excludeArray[i]);
+            if (excludeObject == nullptr) {
+                jniThrowNullPointerException(env, "Exclude layer is null");
+                return;
+            }
+            captureArgs.excludeHandles.emplace(excludeObject->getHandle());
+        }
+    }
 }
 
 static DisplayCaptureArgs displayCaptureArgsFromObject(JNIEnv* env,
@@ -207,6 +224,7 @@
                                 jlong screenCaptureListenerObject) {
     LayerCaptureArgs captureArgs;
     getCaptureArgs(env, layerCaptureArgsObject, captureArgs);
+
     SurfaceControl* layer = reinterpret_cast<SurfaceControl*>(
             env->GetLongField(layerCaptureArgsObject, gLayerCaptureArgsClassInfo.layer));
     if (layer == nullptr) {
@@ -217,23 +235,6 @@
     captureArgs.childrenOnly =
             env->GetBooleanField(layerCaptureArgsObject, gLayerCaptureArgsClassInfo.childrenOnly);
 
-    jlongArray excludeObjectArray = reinterpret_cast<jlongArray>(
-            env->GetObjectField(layerCaptureArgsObject, gLayerCaptureArgsClassInfo.excludeLayers));
-    if (excludeObjectArray != nullptr) {
-        ScopedLongArrayRO excludeArray(env, excludeObjectArray);
-        const jsize len = excludeArray.size();
-        captureArgs.excludeHandles.reserve(len);
-
-        for (jsize i = 0; i < len; i++) {
-            auto excludeObject = reinterpret_cast<SurfaceControl*>(excludeArray[i]);
-            if (excludeObject == nullptr) {
-                jniThrowNullPointerException(env, "Exclude layer is null");
-                return BAD_VALUE;
-            }
-            captureArgs.excludeHandles.emplace(excludeObject->getHandle());
-        }
-    }
-
     sp<gui::IScreenCaptureListener> captureListener =
             reinterpret_cast<gui::IScreenCaptureListener*>(screenCaptureListenerObject);
     return ScreenshotClient::captureLayers(captureArgs, captureListener);
@@ -318,6 +319,9 @@
     gCaptureArgsClassInfo.uid = GetFieldIDOrDie(env, captureArgsClazz, "mUid", "J");
     gCaptureArgsClassInfo.grayscale = GetFieldIDOrDie(env, captureArgsClazz, "mGrayscale", "Z");
 
+    gCaptureArgsClassInfo.getNativeExcludeLayers =
+            GetMethodIDOrDie(env, captureArgsClazz, "getNativeExcludeLayers", "()[J");
+
     jclass displayCaptureArgsClazz =
             FindClassOrDie(env, "android/window/ScreenCapture$DisplayCaptureArgs");
     gDisplayCaptureArgsClassInfo.displayToken =
@@ -333,8 +337,6 @@
             FindClassOrDie(env, "android/window/ScreenCapture$LayerCaptureArgs");
     gLayerCaptureArgsClassInfo.layer =
             GetFieldIDOrDie(env, layerCaptureArgsClazz, "mNativeLayer", "J");
-    gLayerCaptureArgsClassInfo.excludeLayers =
-            GetFieldIDOrDie(env, layerCaptureArgsClazz, "mNativeExcludeLayers", "[J");
     gLayerCaptureArgsClassInfo.childrenOnly =
             GetFieldIDOrDie(env, layerCaptureArgsClazz, "mChildrenOnly", "Z");
 
diff --git a/core/proto/android/app/notification_channel.proto b/core/proto/android/app/notification_channel.proto
index c835b90..d79de5c 100644
--- a/core/proto/android/app/notification_channel.proto
+++ b/core/proto/android/app/notification_channel.proto
@@ -56,7 +56,9 @@
     optional android.media.AudioAttributesProto audio_attributes = 16;
     // If this is a blockable system notification channel.
     optional bool is_blockable_system = 17;
-    optional bool fg_service_shown = 18;
+    // On U+, this field will be true if either a foreground service or a user initiated job is
+    // shown whereas on T-, this field will only be true if a foreground service is shown.
+    optional bool user_visible_task_shown = 18;
     // Default is true.
     // Allows the notifications to appear outside of the shade in floating windows
     optional bool allow_app_overlay = 19;
diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto
index e62af74..bab4b6e 100644
--- a/core/proto/android/providers/settings.proto
+++ b/core/proto/android/providers/settings.proto
@@ -21,6 +21,7 @@
 option java_outer_classname = "SettingsServiceProto";
 
 import "frameworks/base/core/proto/android/providers/settings/config.proto";
+import "frameworks/base/core/proto/android/providers/settings/generation.proto";
 import "frameworks/base/core/proto/android/providers/settings/global.proto";
 import "frameworks/base/core/proto/android/providers/settings/secure.proto";
 import "frameworks/base/core/proto/android/providers/settings/system.proto";
@@ -37,6 +38,9 @@
 
     // Config settings
     optional ConfigSettingsProto config_settings = 3;
+
+    // Generation registry stats
+    optional GenerationRegistryProto generation_registry = 4;
 }
 
 message UserSettingsProto {
diff --git a/core/proto/android/providers/settings/generation.proto b/core/proto/android/providers/settings/generation.proto
new file mode 100644
index 0000000..9dcbad2
--- /dev/null
+++ b/core/proto/android/providers/settings/generation.proto
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ */
+
+syntax = "proto2";
+package android.providers.settings;
+
+option java_multiple_files = true;
+
+import "frameworks/base/core/proto/android/privacy.proto";
+
+message GenerationRegistryProto {
+  option (android.msg_privacy).dest = DEST_EXPLICIT;
+  optional int32 num_backing_stores = 1;
+  optional int32 num_max_backing_stores = 2;
+  repeated BackingStoreProto backing_stores = 3;
+}
+
+message BackingStoreProto {
+  optional int32 key = 1;
+  optional int32 backing_store_size = 2;
+  optional int32 num_cached_entries = 3;
+  repeated CacheEntryProto cache_entries = 4;
+}
+
+message CacheEntryProto {
+  optional string name = 1;
+  optional int32 generation = 2;
+}
\ No newline at end of file
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto
index d1f7b63..bb3089b 100644
--- a/core/proto/android/server/windowmanagerservice.proto
+++ b/core/proto/android/server/windowmanagerservice.proto
@@ -390,6 +390,10 @@
     optional bool enable_recents_screenshot = 35;
     optional int32 last_drop_input_mode = 36;
     optional int32 override_orientation = 37 [(.android.typedef) = "android.content.pm.ActivityInfo.ScreenOrientation"];
+    optional bool should_send_compat_fake_focus = 38;
+    optional bool should_force_rotate_for_camera_compat = 39;
+    optional bool should_refresh_activity_for_camera_compat = 40;
+    optional bool should_refresh_activity_via_pause_for_camera_compat = 41;
 }
 
 /* represents WindowToken */
diff --git a/core/proto/android/server/windowmanagertransitiontrace.proto b/core/proto/android/server/windowmanagertransitiontrace.proto
index 9e53a91..25985eb 100644
--- a/core/proto/android/server/windowmanagertransitiontrace.proto
+++ b/core/proto/android/server/windowmanagertransitiontrace.proto
@@ -23,7 +23,7 @@
 option java_multiple_files = true;
 
 /* Represents a file full of transition entries.
-   Encoded, it should start with 0x9 0x57 0x49 0x4e 0x54 0x52 0x41 0x43 0x45 (.TRNTRACE), such
+   Encoded, it should start with 0x09 0x54 0x52 0x4E 0x54 0x52 0x41 0x43 0x45 (TRNTRACE), such
    that it can be easily identified. */
 message TransitionTraceProto {
 
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 81b1f21..78d3923 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1746,9 +1746,11 @@
         android:protectionLevel="dangerous"
         android:permissionFlags="hardRestricted" />
 
-    <!-- Allows an application to access wrist temperature data from the watch sensors.
+    <!-- @TestApi Allows an application to access wrist temperature data from the watch sensors.
         <p class="note"><strong>Note: </strong> This permission is for Wear OS only.
-        <p>Protection level: dangerous -->
+        <p>Protection level: dangerous
+        @hide
+        -->
     <permission android:name="android.permission.BODY_SENSORS_WRIST_TEMPERATURE"
                 android:permissionGroup="android.permission-group.UNDEFINED"
                 android:label="@string/permlab_bodySensorsWristTemperature"
@@ -1756,7 +1758,7 @@
                 android:backgroundPermission="android.permission.BODY_SENSORS_WRIST_TEMPERATURE_BACKGROUND"
                 android:protectionLevel="dangerous" />
 
-    <!-- Allows an application to access wrist temperature data from the watch sensors.
+    <!-- @TestApi Allows an application to access wrist temperature data from the watch sensors.
          If you're requesting this permission, you must also request
          {@link #BODY_SENSORS_WRIST_TEMPERATURE}. Requesting this permission by itself doesn't
          give you wrist temperature body sensors access.
@@ -1766,6 +1768,7 @@
          <p> This is a hard restricted permission which cannot be held by an app until
          the installer on record allowlists the permission. For more details see
          {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
+         @hide
     -->
     <permission android:name="android.permission.BODY_SENSORS_WRIST_TEMPERATURE_BACKGROUND"
                 android:permissionGroup="android.permission-group.UNDEFINED"
diff --git a/core/res/res/drawable-hdpi/pointer_alias.png b/core/res/res/drawable-hdpi/pointer_alias.png
new file mode 100644
index 0000000..d33fe3c
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_alias.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_all_scroll.png b/core/res/res/drawable-hdpi/pointer_all_scroll.png
new file mode 100644
index 0000000..095aadc
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_all_scroll.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_arrow.png b/core/res/res/drawable-hdpi/pointer_arrow.png
index 85d066e..a949a1a 100644
--- a/core/res/res/drawable-hdpi/pointer_arrow.png
+++ b/core/res/res/drawable-hdpi/pointer_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_cell.png b/core/res/res/drawable-hdpi/pointer_cell.png
new file mode 100644
index 0000000..76910e6
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_cell.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_context_menu.png b/core/res/res/drawable-hdpi/pointer_context_menu.png
new file mode 100644
index 0000000..c45d29b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_context_menu.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_copy.png b/core/res/res/drawable-hdpi/pointer_copy.png
new file mode 100644
index 0000000..5d06a8e
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_copy.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_crosshair.png b/core/res/res/drawable-hdpi/pointer_crosshair.png
new file mode 100644
index 0000000..be767b2
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_crosshair.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_grab.png b/core/res/res/drawable-hdpi/pointer_grab.png
new file mode 100644
index 0000000..b76ec16
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_grab.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_grabbing.png b/core/res/res/drawable-hdpi/pointer_grabbing.png
new file mode 100644
index 0000000..10013e9
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_grabbing.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_hand.png b/core/res/res/drawable-hdpi/pointer_hand.png
new file mode 100644
index 0000000..8a72774
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_hand.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_help.png b/core/res/res/drawable-hdpi/pointer_help.png
new file mode 100644
index 0000000..a3afdb6
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_help.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_horizontal_double_arrow.png b/core/res/res/drawable-hdpi/pointer_horizontal_double_arrow.png
new file mode 100644
index 0000000..9388f16
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_horizontal_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_nodrop.png b/core/res/res/drawable-hdpi/pointer_nodrop.png
new file mode 100644
index 0000000..9df140c
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_nodrop.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_spot_anchor.png b/core/res/res/drawable-hdpi/pointer_spot_anchor.png
index 784f613..4b74e2d 100644
--- a/core/res/res/drawable-hdpi/pointer_spot_anchor.png
+++ b/core/res/res/drawable-hdpi/pointer_spot_anchor.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_spot_hover.png b/core/res/res/drawable-hdpi/pointer_spot_hover.png
index 0e8353c5..68d6e4a 100644
--- a/core/res/res/drawable-hdpi/pointer_spot_hover.png
+++ b/core/res/res/drawable-hdpi/pointer_spot_hover.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_spot_touch.png b/core/res/res/drawable-hdpi/pointer_spot_touch.png
index 3ad9b10..fda831f 100644
--- a/core/res/res/drawable-hdpi/pointer_spot_touch.png
+++ b/core/res/res/drawable-hdpi/pointer_spot_touch.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_text.png b/core/res/res/drawable-hdpi/pointer_text.png
new file mode 100644
index 0000000..ab0c80a
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_text.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_top_left_diagonal_double_arrow.png b/core/res/res/drawable-hdpi/pointer_top_left_diagonal_double_arrow.png
new file mode 100644
index 0000000..ab52bff
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_top_left_diagonal_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_top_right_diagonal_double_arrow.png b/core/res/res/drawable-hdpi/pointer_top_right_diagonal_double_arrow.png
new file mode 100644
index 0000000..1250d35
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_top_right_diagonal_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_vertical_double_arrow.png b/core/res/res/drawable-hdpi/pointer_vertical_double_arrow.png
new file mode 100644
index 0000000..6730c7b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_vertical_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_vertical_text.png b/core/res/res/drawable-hdpi/pointer_vertical_text.png
new file mode 100644
index 0000000..f079bc1
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_vertical_text.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_zoom_in.png b/core/res/res/drawable-hdpi/pointer_zoom_in.png
new file mode 100644
index 0000000..a3dc84b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_zoom_in.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pointer_zoom_out.png b/core/res/res/drawable-hdpi/pointer_zoom_out.png
new file mode 100644
index 0000000..3ee31bd
--- /dev/null
+++ b/core/res/res/drawable-hdpi/pointer_zoom_out.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_alias.png b/core/res/res/drawable-mdpi/pointer_alias.png
index 8f61a39..619567a 100644
--- a/core/res/res/drawable-mdpi/pointer_alias.png
+++ b/core/res/res/drawable-mdpi/pointer_alias.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_alias_large.png b/core/res/res/drawable-mdpi/pointer_alias_large.png
index 606774d..b3f382e 100644
--- a/core/res/res/drawable-mdpi/pointer_alias_large.png
+++ b/core/res/res/drawable-mdpi/pointer_alias_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_all_scroll.png b/core/res/res/drawable-mdpi/pointer_all_scroll.png
index a897ef4..3db456e 100644
--- a/core/res/res/drawable-mdpi/pointer_all_scroll.png
+++ b/core/res/res/drawable-mdpi/pointer_all_scroll.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_all_scroll_large.png b/core/res/res/drawable-mdpi/pointer_all_scroll_large.png
index c29db87..120e1d7 100644
--- a/core/res/res/drawable-mdpi/pointer_all_scroll_large.png
+++ b/core/res/res/drawable-mdpi/pointer_all_scroll_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_arrow.png b/core/res/res/drawable-mdpi/pointer_arrow.png
index 7a74ec1..77e4354 100644
--- a/core/res/res/drawable-mdpi/pointer_arrow.png
+++ b/core/res/res/drawable-mdpi/pointer_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_arrow_large.png b/core/res/res/drawable-mdpi/pointer_arrow_large.png
index 9f59c4c..e28a7a5 100644
--- a/core/res/res/drawable-mdpi/pointer_arrow_large.png
+++ b/core/res/res/drawable-mdpi/pointer_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_cell.png b/core/res/res/drawable-mdpi/pointer_cell.png
index b521389..e5ce946 100644
--- a/core/res/res/drawable-mdpi/pointer_cell.png
+++ b/core/res/res/drawable-mdpi/pointer_cell.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_cell_large.png b/core/res/res/drawable-mdpi/pointer_cell_large.png
index 3dec5e5..fcb9fc8 100644
--- a/core/res/res/drawable-mdpi/pointer_cell_large.png
+++ b/core/res/res/drawable-mdpi/pointer_cell_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_context_menu.png b/core/res/res/drawable-mdpi/pointer_context_menu.png
index 4e1ba4e..e0e849d 100644
--- a/core/res/res/drawable-mdpi/pointer_context_menu.png
+++ b/core/res/res/drawable-mdpi/pointer_context_menu.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_context_menu_large.png b/core/res/res/drawable-mdpi/pointer_context_menu_large.png
index 7c9e250..e8c9be4 100644
--- a/core/res/res/drawable-mdpi/pointer_context_menu_large.png
+++ b/core/res/res/drawable-mdpi/pointer_context_menu_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_copy.png b/core/res/res/drawable-mdpi/pointer_copy.png
index 254485c..7189dad 100644
--- a/core/res/res/drawable-mdpi/pointer_copy.png
+++ b/core/res/res/drawable-mdpi/pointer_copy.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_copy_large.png b/core/res/res/drawable-mdpi/pointer_copy_large.png
index 2f0e082..a3d487d 100644
--- a/core/res/res/drawable-mdpi/pointer_copy_large.png
+++ b/core/res/res/drawable-mdpi/pointer_copy_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_crosshair.png b/core/res/res/drawable-mdpi/pointer_crosshair.png
index 8a06c77..be6bd34 100644
--- a/core/res/res/drawable-mdpi/pointer_crosshair.png
+++ b/core/res/res/drawable-mdpi/pointer_crosshair.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_crosshair_large.png b/core/res/res/drawable-mdpi/pointer_crosshair_large.png
index 51faf96..657df8d 100644
--- a/core/res/res/drawable-mdpi/pointer_crosshair_large.png
+++ b/core/res/res/drawable-mdpi/pointer_crosshair_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_grab.png b/core/res/res/drawable-mdpi/pointer_grab.png
index 0e0ea2e..977b36c 100644
--- a/core/res/res/drawable-mdpi/pointer_grab.png
+++ b/core/res/res/drawable-mdpi/pointer_grab.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_grab_large.png b/core/res/res/drawable-mdpi/pointer_grab_large.png
index 44a171c..80587ce 100644
--- a/core/res/res/drawable-mdpi/pointer_grab_large.png
+++ b/core/res/res/drawable-mdpi/pointer_grab_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_grabbing.png b/core/res/res/drawable-mdpi/pointer_grabbing.png
index 9deb64c..2bdcbdc 100644
--- a/core/res/res/drawable-mdpi/pointer_grabbing.png
+++ b/core/res/res/drawable-mdpi/pointer_grabbing.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_grabbing_large.png b/core/res/res/drawable-mdpi/pointer_grabbing_large.png
index b602d2f..a8a599c 100644
--- a/core/res/res/drawable-mdpi/pointer_grabbing_large.png
+++ b/core/res/res/drawable-mdpi/pointer_grabbing_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_hand.png b/core/res/res/drawable-mdpi/pointer_hand.png
index c614d9e..e94b927 100644
--- a/core/res/res/drawable-mdpi/pointer_hand.png
+++ b/core/res/res/drawable-mdpi/pointer_hand.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_hand_large.png b/core/res/res/drawable-mdpi/pointer_hand_large.png
index 464ec28e..7d89067 100644
--- a/core/res/res/drawable-mdpi/pointer_hand_large.png
+++ b/core/res/res/drawable-mdpi/pointer_hand_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_help.png b/core/res/res/drawable-mdpi/pointer_help.png
index d54b2b1..286242c 100644
--- a/core/res/res/drawable-mdpi/pointer_help.png
+++ b/core/res/res/drawable-mdpi/pointer_help.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_help_large.png b/core/res/res/drawable-mdpi/pointer_help_large.png
index 69d1e41..27f4a84 100644
--- a/core/res/res/drawable-mdpi/pointer_help_large.png
+++ b/core/res/res/drawable-mdpi/pointer_help_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_horizontal_double_arrow.png b/core/res/res/drawable-mdpi/pointer_horizontal_double_arrow.png
index a2951a9..20f319a 100644
--- a/core/res/res/drawable-mdpi/pointer_horizontal_double_arrow.png
+++ b/core/res/res/drawable-mdpi/pointer_horizontal_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_horizontal_double_arrow_large.png b/core/res/res/drawable-mdpi/pointer_horizontal_double_arrow_large.png
index 7086106..33ef5c9 100644
--- a/core/res/res/drawable-mdpi/pointer_horizontal_double_arrow_large.png
+++ b/core/res/res/drawable-mdpi/pointer_horizontal_double_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_nodrop.png b/core/res/res/drawable-mdpi/pointer_nodrop.png
index aa92895..15764fa 100644
--- a/core/res/res/drawable-mdpi/pointer_nodrop.png
+++ b/core/res/res/drawable-mdpi/pointer_nodrop.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_nodrop_large.png b/core/res/res/drawable-mdpi/pointer_nodrop_large.png
index e150d04..46ff5f7 100644
--- a/core/res/res/drawable-mdpi/pointer_nodrop_large.png
+++ b/core/res/res/drawable-mdpi/pointer_nodrop_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_spot_anchor.png b/core/res/res/drawable-mdpi/pointer_spot_anchor.png
index 48d638b..a8bc03b 100644
--- a/core/res/res/drawable-mdpi/pointer_spot_anchor.png
+++ b/core/res/res/drawable-mdpi/pointer_spot_anchor.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_spot_hover.png b/core/res/res/drawable-mdpi/pointer_spot_hover.png
index b304815..c3672b2 100644
--- a/core/res/res/drawable-mdpi/pointer_spot_hover.png
+++ b/core/res/res/drawable-mdpi/pointer_spot_hover.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_spot_touch.png b/core/res/res/drawable-mdpi/pointer_spot_touch.png
index 659f809..1f146d2 100644
--- a/core/res/res/drawable-mdpi/pointer_spot_touch.png
+++ b/core/res/res/drawable-mdpi/pointer_spot_touch.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_text.png b/core/res/res/drawable-mdpi/pointer_text.png
index 34d1698..68a5535 100644
--- a/core/res/res/drawable-mdpi/pointer_text.png
+++ b/core/res/res/drawable-mdpi/pointer_text.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_text_large.png b/core/res/res/drawable-mdpi/pointer_text_large.png
index 2fba190..599dc69 100644
--- a/core/res/res/drawable-mdpi/pointer_text_large.png
+++ b/core/res/res/drawable-mdpi/pointer_text_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_top_left_diagonal_double_arrow.png b/core/res/res/drawable-mdpi/pointer_top_left_diagonal_double_arrow.png
index b0cd92c..fe7d496 100644
--- a/core/res/res/drawable-mdpi/pointer_top_left_diagonal_double_arrow.png
+++ b/core/res/res/drawable-mdpi/pointer_top_left_diagonal_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_top_left_diagonal_double_arrow_large.png b/core/res/res/drawable-mdpi/pointer_top_left_diagonal_double_arrow_large.png
index eecaa89..7b2e20c 100644
--- a/core/res/res/drawable-mdpi/pointer_top_left_diagonal_double_arrow_large.png
+++ b/core/res/res/drawable-mdpi/pointer_top_left_diagonal_double_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_top_right_diagonal_double_arrow.png b/core/res/res/drawable-mdpi/pointer_top_right_diagonal_double_arrow.png
index f8d3527..95a6620 100644
--- a/core/res/res/drawable-mdpi/pointer_top_right_diagonal_double_arrow.png
+++ b/core/res/res/drawable-mdpi/pointer_top_right_diagonal_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_top_right_diagonal_double_arrow_large.png b/core/res/res/drawable-mdpi/pointer_top_right_diagonal_double_arrow_large.png
index 9d47ecf..2e2904b 100644
--- a/core/res/res/drawable-mdpi/pointer_top_right_diagonal_double_arrow_large.png
+++ b/core/res/res/drawable-mdpi/pointer_top_right_diagonal_double_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_vertical_double_arrow.png b/core/res/res/drawable-mdpi/pointer_vertical_double_arrow.png
index 48c9379..ae6bfed 100644
--- a/core/res/res/drawable-mdpi/pointer_vertical_double_arrow.png
+++ b/core/res/res/drawable-mdpi/pointer_vertical_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_vertical_double_arrow_large.png b/core/res/res/drawable-mdpi/pointer_vertical_double_arrow_large.png
index fd777b1..3beb1d1 100644
--- a/core/res/res/drawable-mdpi/pointer_vertical_double_arrow_large.png
+++ b/core/res/res/drawable-mdpi/pointer_vertical_double_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_vertical_text.png b/core/res/res/drawable-mdpi/pointer_vertical_text.png
index 9fcbcba..06a536b 100644
--- a/core/res/res/drawable-mdpi/pointer_vertical_text.png
+++ b/core/res/res/drawable-mdpi/pointer_vertical_text.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_vertical_text_large.png b/core/res/res/drawable-mdpi/pointer_vertical_text_large.png
index 1cbe49a..f03179b 100644
--- a/core/res/res/drawable-mdpi/pointer_vertical_text_large.png
+++ b/core/res/res/drawable-mdpi/pointer_vertical_text_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_0.png b/core/res/res/drawable-mdpi/pointer_wait_0.png
index ae32a44..aefdb46 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_0.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_0.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_1.png b/core/res/res/drawable-mdpi/pointer_wait_1.png
index afadc31..1939660 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_1.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_1.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_10.png b/core/res/res/drawable-mdpi/pointer_wait_10.png
index 4e5f3b0..cd3a8f5 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_10.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_10.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_11.png b/core/res/res/drawable-mdpi/pointer_wait_11.png
index f895e53..e8894ed 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_11.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_11.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_12.png b/core/res/res/drawable-mdpi/pointer_wait_12.png
index 7a155f5..f5af8b0 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_12.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_12.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_13.png b/core/res/res/drawable-mdpi/pointer_wait_13.png
index a9ae639..06e4462 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_13.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_13.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_14.png b/core/res/res/drawable-mdpi/pointer_wait_14.png
index 6761dda..7f0ac45 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_14.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_14.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_15.png b/core/res/res/drawable-mdpi/pointer_wait_15.png
index 98821ed..577fb78 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_15.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_15.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_16.png b/core/res/res/drawable-mdpi/pointer_wait_16.png
index 72f3853..d111d0b 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_16.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_16.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_17.png b/core/res/res/drawable-mdpi/pointer_wait_17.png
index a7452ed..55bd35a 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_17.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_17.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_18.png b/core/res/res/drawable-mdpi/pointer_wait_18.png
index ecb4f72..a1870ca 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_18.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_18.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_19.png b/core/res/res/drawable-mdpi/pointer_wait_19.png
index 1ce5d70..ffc4435 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_19.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_19.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_2.png b/core/res/res/drawable-mdpi/pointer_wait_2.png
index d42278a..04314b7 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_2.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_2.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_20.png b/core/res/res/drawable-mdpi/pointer_wait_20.png
index 2736fea..c98abab 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_20.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_20.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_21.png b/core/res/res/drawable-mdpi/pointer_wait_21.png
index e2fafd1..778e829 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_21.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_21.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_22.png b/core/res/res/drawable-mdpi/pointer_wait_22.png
index 24bd01a..9d61756 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_22.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_22.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_23.png b/core/res/res/drawable-mdpi/pointer_wait_23.png
index 26c6129..68c1def 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_23.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_23.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_24.png b/core/res/res/drawable-mdpi/pointer_wait_24.png
index 2597963..cb4e59f 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_24.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_24.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_25.png b/core/res/res/drawable-mdpi/pointer_wait_25.png
index c925d82..64662b2 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_25.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_25.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_26.png b/core/res/res/drawable-mdpi/pointer_wait_26.png
index 7c3735d..8a4a730 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_26.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_26.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_27.png b/core/res/res/drawable-mdpi/pointer_wait_27.png
index d4f2f65..6578225 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_27.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_27.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_28.png b/core/res/res/drawable-mdpi/pointer_wait_28.png
index 582c276..233efc3 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_28.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_28.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_29.png b/core/res/res/drawable-mdpi/pointer_wait_29.png
index f79f715..2513064 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_29.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_29.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_3.png b/core/res/res/drawable-mdpi/pointer_wait_3.png
index efc766e..a4b3de5 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_3.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_3.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_30.png b/core/res/res/drawable-mdpi/pointer_wait_30.png
index 636d793..f3dcdbb 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_30.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_30.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_31.png b/core/res/res/drawable-mdpi/pointer_wait_31.png
index 8f41a53..c0709aa 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_31.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_31.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_32.png b/core/res/res/drawable-mdpi/pointer_wait_32.png
index deef9b7..2456313 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_32.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_32.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_33.png b/core/res/res/drawable-mdpi/pointer_wait_33.png
index 6cad76b..d5506a8 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_33.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_33.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_34.png b/core/res/res/drawable-mdpi/pointer_wait_34.png
index 4b25825..365213d 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_34.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_34.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_35.png b/core/res/res/drawable-mdpi/pointer_wait_35.png
index ccfaf74..577c7b6 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_35.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_35.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_36.png b/core/res/res/drawable-mdpi/pointer_wait_36.png
new file mode 100644
index 0000000..9f7202b
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_36.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_37.png b/core/res/res/drawable-mdpi/pointer_wait_37.png
new file mode 100644
index 0000000..7a041af
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_37.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_38.png b/core/res/res/drawable-mdpi/pointer_wait_38.png
new file mode 100644
index 0000000..d615452
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_38.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_39.png b/core/res/res/drawable-mdpi/pointer_wait_39.png
new file mode 100644
index 0000000..b6ecf0f
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_39.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_4.png b/core/res/res/drawable-mdpi/pointer_wait_4.png
index d39d13a..f2a7759 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_4.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_4.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_40.png b/core/res/res/drawable-mdpi/pointer_wait_40.png
new file mode 100644
index 0000000..408ac15
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_40.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_41.png b/core/res/res/drawable-mdpi/pointer_wait_41.png
new file mode 100644
index 0000000..54f38cf
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_41.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_42.png b/core/res/res/drawable-mdpi/pointer_wait_42.png
new file mode 100644
index 0000000..7894cf5
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_42.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_43.png b/core/res/res/drawable-mdpi/pointer_wait_43.png
new file mode 100644
index 0000000..8bd34af
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_43.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_44.png b/core/res/res/drawable-mdpi/pointer_wait_44.png
new file mode 100644
index 0000000..b79e17b
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_44.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_45.png b/core/res/res/drawable-mdpi/pointer_wait_45.png
new file mode 100644
index 0000000..7105121
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_45.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_46.png b/core/res/res/drawable-mdpi/pointer_wait_46.png
new file mode 100644
index 0000000..09b2f61
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_46.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_47.png b/core/res/res/drawable-mdpi/pointer_wait_47.png
new file mode 100644
index 0000000..2415548a
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_47.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_48.png b/core/res/res/drawable-mdpi/pointer_wait_48.png
new file mode 100644
index 0000000..7b51615
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_48.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_49.png b/core/res/res/drawable-mdpi/pointer_wait_49.png
new file mode 100644
index 0000000..985c7bc
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_49.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_5.png b/core/res/res/drawable-mdpi/pointer_wait_5.png
index 1c5a7de..a6f9941 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_5.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_5.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_50.png b/core/res/res/drawable-mdpi/pointer_wait_50.png
new file mode 100644
index 0000000..c8b031f
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_50.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_51.png b/core/res/res/drawable-mdpi/pointer_wait_51.png
new file mode 100644
index 0000000..74e74c9
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_51.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_52.png b/core/res/res/drawable-mdpi/pointer_wait_52.png
new file mode 100644
index 0000000..e42252d
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_52.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_53.png b/core/res/res/drawable-mdpi/pointer_wait_53.png
new file mode 100644
index 0000000..860de2a
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_53.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_54.png b/core/res/res/drawable-mdpi/pointer_wait_54.png
new file mode 100644
index 0000000..eb47cc1
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_54.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_55.png b/core/res/res/drawable-mdpi/pointer_wait_55.png
new file mode 100644
index 0000000..ce853acc
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_55.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_56.png b/core/res/res/drawable-mdpi/pointer_wait_56.png
new file mode 100644
index 0000000..e17ec11
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_56.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_57.png b/core/res/res/drawable-mdpi/pointer_wait_57.png
new file mode 100644
index 0000000..f450f04
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_57.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_58.png b/core/res/res/drawable-mdpi/pointer_wait_58.png
new file mode 100644
index 0000000..f3d26dd
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_58.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_59.png b/core/res/res/drawable-mdpi/pointer_wait_59.png
new file mode 100644
index 0000000..5220f3c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_59.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_6.png b/core/res/res/drawable-mdpi/pointer_wait_6.png
index 5113b27..5f2b1f9 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_6.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_6.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_60.png b/core/res/res/drawable-mdpi/pointer_wait_60.png
new file mode 100644
index 0000000..b01a0cd
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_60.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_61.png b/core/res/res/drawable-mdpi/pointer_wait_61.png
new file mode 100644
index 0000000..07a132d
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_61.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_62.png b/core/res/res/drawable-mdpi/pointer_wait_62.png
new file mode 100644
index 0000000..52e9768
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_62.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_63.png b/core/res/res/drawable-mdpi/pointer_wait_63.png
new file mode 100644
index 0000000..85b36f7
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_63.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_64.png b/core/res/res/drawable-mdpi/pointer_wait_64.png
new file mode 100644
index 0000000..d684752
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_64.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_65.png b/core/res/res/drawable-mdpi/pointer_wait_65.png
new file mode 100644
index 0000000..7c0ee30
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_65.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_66.png b/core/res/res/drawable-mdpi/pointer_wait_66.png
new file mode 100644
index 0000000..54a7204
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_66.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_67.png b/core/res/res/drawable-mdpi/pointer_wait_67.png
new file mode 100644
index 0000000..8416304
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_67.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_68.png b/core/res/res/drawable-mdpi/pointer_wait_68.png
new file mode 100644
index 0000000..af2e5e2
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_68.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_69.png b/core/res/res/drawable-mdpi/pointer_wait_69.png
new file mode 100644
index 0000000..dd440d7
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_69.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_7.png b/core/res/res/drawable-mdpi/pointer_wait_7.png
index 766a716..d950c53 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_7.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_7.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_70.png b/core/res/res/drawable-mdpi/pointer_wait_70.png
new file mode 100644
index 0000000..3b3843b
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_70.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_71.png b/core/res/res/drawable-mdpi/pointer_wait_71.png
new file mode 100644
index 0000000..e8aba4c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_71.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_72.png b/core/res/res/drawable-mdpi/pointer_wait_72.png
new file mode 100644
index 0000000..17c30d50
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_72.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_73.png b/core/res/res/drawable-mdpi/pointer_wait_73.png
new file mode 100644
index 0000000..9336a80
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_73.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_74.png b/core/res/res/drawable-mdpi/pointer_wait_74.png
new file mode 100644
index 0000000..1f18ea5
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_74.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_75.png b/core/res/res/drawable-mdpi/pointer_wait_75.png
new file mode 100644
index 0000000..24d2b774
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_75.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_76.png b/core/res/res/drawable-mdpi/pointer_wait_76.png
new file mode 100644
index 0000000..21cd4b1
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_76.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_77.png b/core/res/res/drawable-mdpi/pointer_wait_77.png
new file mode 100644
index 0000000..53d6532
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_77.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_78.png b/core/res/res/drawable-mdpi/pointer_wait_78.png
new file mode 100644
index 0000000..769f1c8
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_78.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_79.png b/core/res/res/drawable-mdpi/pointer_wait_79.png
new file mode 100644
index 0000000..3f89a84
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_79.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_8.png b/core/res/res/drawable-mdpi/pointer_wait_8.png
index 80fb2d9..c3026ea 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_8.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_8.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_80.png b/core/res/res/drawable-mdpi/pointer_wait_80.png
new file mode 100644
index 0000000..4cf0e15
--- /dev/null
+++ b/core/res/res/drawable-mdpi/pointer_wait_80.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_wait_9.png b/core/res/res/drawable-mdpi/pointer_wait_9.png
index db07e87..f1fb134 100644
--- a/core/res/res/drawable-mdpi/pointer_wait_9.png
+++ b/core/res/res/drawable-mdpi/pointer_wait_9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_zoom_in.png b/core/res/res/drawable-mdpi/pointer_zoom_in.png
index 17c4e66..ef4e4a5 100644
--- a/core/res/res/drawable-mdpi/pointer_zoom_in.png
+++ b/core/res/res/drawable-mdpi/pointer_zoom_in.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_zoom_in_large.png b/core/res/res/drawable-mdpi/pointer_zoom_in_large.png
index 9b0fa7f..c484ce8 100644
--- a/core/res/res/drawable-mdpi/pointer_zoom_in_large.png
+++ b/core/res/res/drawable-mdpi/pointer_zoom_in_large.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_zoom_out.png b/core/res/res/drawable-mdpi/pointer_zoom_out.png
index 742f705..af725a4 100644
--- a/core/res/res/drawable-mdpi/pointer_zoom_out.png
+++ b/core/res/res/drawable-mdpi/pointer_zoom_out.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pointer_zoom_out_large.png b/core/res/res/drawable-mdpi/pointer_zoom_out_large.png
index 1a9ec86..448ea45 100644
--- a/core/res/res/drawable-mdpi/pointer_zoom_out_large.png
+++ b/core/res/res/drawable-mdpi/pointer_zoom_out_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_alias.png b/core/res/res/drawable-xhdpi/pointer_alias.png
index fe0fd25..d71ba71 100644
--- a/core/res/res/drawable-xhdpi/pointer_alias.png
+++ b/core/res/res/drawable-xhdpi/pointer_alias.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_alias_large.png b/core/res/res/drawable-xhdpi/pointer_alias_large.png
index ad595ed..b178901 100644
--- a/core/res/res/drawable-xhdpi/pointer_alias_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_alias_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_all_scroll.png b/core/res/res/drawable-xhdpi/pointer_all_scroll.png
index e2374ec..e9d05d5 100644
--- a/core/res/res/drawable-xhdpi/pointer_all_scroll.png
+++ b/core/res/res/drawable-xhdpi/pointer_all_scroll.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_all_scroll_large.png b/core/res/res/drawable-xhdpi/pointer_all_scroll_large.png
index 6029f52..1fd54fb 100644
--- a/core/res/res/drawable-xhdpi/pointer_all_scroll_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_all_scroll_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_arrow.png b/core/res/res/drawable-xhdpi/pointer_arrow.png
index 1cfd033..b2608c5 100644
--- a/core/res/res/drawable-xhdpi/pointer_arrow.png
+++ b/core/res/res/drawable-xhdpi/pointer_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_arrow_large.png b/core/res/res/drawable-xhdpi/pointer_arrow_large.png
index dc9007a..6019c5a 100644
--- a/core/res/res/drawable-xhdpi/pointer_arrow_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_cell.png b/core/res/res/drawable-xhdpi/pointer_cell.png
index 4ca09e3..e96b8bd 100644
--- a/core/res/res/drawable-xhdpi/pointer_cell.png
+++ b/core/res/res/drawable-xhdpi/pointer_cell.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_cell_large.png b/core/res/res/drawable-xhdpi/pointer_cell_large.png
index 50119b7..01d0270 100644
--- a/core/res/res/drawable-xhdpi/pointer_cell_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_cell_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_context_menu.png b/core/res/res/drawable-xhdpi/pointer_context_menu.png
index 05a59f8..d4b2bde 100644
--- a/core/res/res/drawable-xhdpi/pointer_context_menu.png
+++ b/core/res/res/drawable-xhdpi/pointer_context_menu.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_context_menu_large.png b/core/res/res/drawable-xhdpi/pointer_context_menu_large.png
index 148cf87..977df10 100644
--- a/core/res/res/drawable-xhdpi/pointer_context_menu_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_context_menu_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_copy.png b/core/res/res/drawable-xhdpi/pointer_copy.png
index 0cdbf21..8d889e1 100644
--- a/core/res/res/drawable-xhdpi/pointer_copy.png
+++ b/core/res/res/drawable-xhdpi/pointer_copy.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_copy_large.png b/core/res/res/drawable-xhdpi/pointer_copy_large.png
index 0e1350c..860c854 100644
--- a/core/res/res/drawable-xhdpi/pointer_copy_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_copy_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_crosshair.png b/core/res/res/drawable-xhdpi/pointer_crosshair.png
index 86c649c..d384c94 100644
--- a/core/res/res/drawable-xhdpi/pointer_crosshair.png
+++ b/core/res/res/drawable-xhdpi/pointer_crosshair.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_crosshair_large.png b/core/res/res/drawable-xhdpi/pointer_crosshair_large.png
index fc59291..165daf3 100644
--- a/core/res/res/drawable-xhdpi/pointer_crosshair_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_crosshair_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_grab.png b/core/res/res/drawable-xhdpi/pointer_grab.png
index b5c28ba..dd3c6de 100644
--- a/core/res/res/drawable-xhdpi/pointer_grab.png
+++ b/core/res/res/drawable-xhdpi/pointer_grab.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_grab_large.png b/core/res/res/drawable-xhdpi/pointer_grab_large.png
index df98d89..bcae2c9 100644
--- a/core/res/res/drawable-xhdpi/pointer_grab_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_grab_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_grabbing.png b/core/res/res/drawable-xhdpi/pointer_grabbing.png
index 6aba589..500fa73 100644
--- a/core/res/res/drawable-xhdpi/pointer_grabbing.png
+++ b/core/res/res/drawable-xhdpi/pointer_grabbing.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_grabbing_large.png b/core/res/res/drawable-xhdpi/pointer_grabbing_large.png
index f2d043c..c9c6f18 100644
--- a/core/res/res/drawable-xhdpi/pointer_grabbing_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_grabbing_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_hand.png b/core/res/res/drawable-xhdpi/pointer_hand.png
index 486cb24..e931afe 100644
--- a/core/res/res/drawable-xhdpi/pointer_hand.png
+++ b/core/res/res/drawable-xhdpi/pointer_hand.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_hand_large.png b/core/res/res/drawable-xhdpi/pointer_hand_large.png
index 3113589..39ae1b7 100644
--- a/core/res/res/drawable-xhdpi/pointer_hand_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_hand_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_help.png b/core/res/res/drawable-xhdpi/pointer_help.png
index abcf923..5a6805c 100644
--- a/core/res/res/drawable-xhdpi/pointer_help.png
+++ b/core/res/res/drawable-xhdpi/pointer_help.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_help_large.png b/core/res/res/drawable-xhdpi/pointer_help_large.png
index b745e1e..4bdc3d1 100644
--- a/core/res/res/drawable-xhdpi/pointer_help_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_help_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_horizontal_double_arrow.png b/core/res/res/drawable-xhdpi/pointer_horizontal_double_arrow.png
index 299ae11..caf2a97 100644
--- a/core/res/res/drawable-xhdpi/pointer_horizontal_double_arrow.png
+++ b/core/res/res/drawable-xhdpi/pointer_horizontal_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_horizontal_double_arrow_large.png b/core/res/res/drawable-xhdpi/pointer_horizontal_double_arrow_large.png
index 9c8fa5c..2f22640 100644
--- a/core/res/res/drawable-xhdpi/pointer_horizontal_double_arrow_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_horizontal_double_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_nodrop.png b/core/res/res/drawable-xhdpi/pointer_nodrop.png
index 8e93f33..4c9fe63 100644
--- a/core/res/res/drawable-xhdpi/pointer_nodrop.png
+++ b/core/res/res/drawable-xhdpi/pointer_nodrop.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_nodrop_large.png b/core/res/res/drawable-xhdpi/pointer_nodrop_large.png
index a392da7..ae60e77 100644
--- a/core/res/res/drawable-xhdpi/pointer_nodrop_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_nodrop_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_spot_anchor.png b/core/res/res/drawable-xhdpi/pointer_spot_anchor.png
index a1dcc14..c740755 100644
--- a/core/res/res/drawable-xhdpi/pointer_spot_anchor.png
+++ b/core/res/res/drawable-xhdpi/pointer_spot_anchor.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_spot_hover.png b/core/res/res/drawable-xhdpi/pointer_spot_hover.png
index 668f841..e734427 100644
--- a/core/res/res/drawable-xhdpi/pointer_spot_hover.png
+++ b/core/res/res/drawable-xhdpi/pointer_spot_hover.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_spot_touch.png b/core/res/res/drawable-xhdpi/pointer_spot_touch.png
index 2e922db..4394050 100644
--- a/core/res/res/drawable-xhdpi/pointer_spot_touch.png
+++ b/core/res/res/drawable-xhdpi/pointer_spot_touch.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_text.png b/core/res/res/drawable-xhdpi/pointer_text.png
index 0cebeae..2c0184d 100644
--- a/core/res/res/drawable-xhdpi/pointer_text.png
+++ b/core/res/res/drawable-xhdpi/pointer_text.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_text_large.png b/core/res/res/drawable-xhdpi/pointer_text_large.png
index d9ce209..97db3ec 100644
--- a/core/res/res/drawable-xhdpi/pointer_text_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_text_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_top_left_diagonal_double_arrow.png b/core/res/res/drawable-xhdpi/pointer_top_left_diagonal_double_arrow.png
index 5454a8b..a36deb3 100644
--- a/core/res/res/drawable-xhdpi/pointer_top_left_diagonal_double_arrow.png
+++ b/core/res/res/drawable-xhdpi/pointer_top_left_diagonal_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_top_left_diagonal_double_arrow_large.png b/core/res/res/drawable-xhdpi/pointer_top_left_diagonal_double_arrow_large.png
index fcfa405..6870e23 100644
--- a/core/res/res/drawable-xhdpi/pointer_top_left_diagonal_double_arrow_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_top_left_diagonal_double_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_top_right_diagonal_double_arrow.png b/core/res/res/drawable-xhdpi/pointer_top_right_diagonal_double_arrow.png
index a4268e4..c8d6d1f 100644
--- a/core/res/res/drawable-xhdpi/pointer_top_right_diagonal_double_arrow.png
+++ b/core/res/res/drawable-xhdpi/pointer_top_right_diagonal_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_top_right_diagonal_double_arrow_large.png b/core/res/res/drawable-xhdpi/pointer_top_right_diagonal_double_arrow_large.png
index 39c5f1a..5bfb771 100644
--- a/core/res/res/drawable-xhdpi/pointer_top_right_diagonal_double_arrow_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_top_right_diagonal_double_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_vertical_double_arrow.png b/core/res/res/drawable-xhdpi/pointer_vertical_double_arrow.png
index 95ca954..720df91 100644
--- a/core/res/res/drawable-xhdpi/pointer_vertical_double_arrow.png
+++ b/core/res/res/drawable-xhdpi/pointer_vertical_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_vertical_double_arrow_large.png b/core/res/res/drawable-xhdpi/pointer_vertical_double_arrow_large.png
index 191f103..82b30d1 100644
--- a/core/res/res/drawable-xhdpi/pointer_vertical_double_arrow_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_vertical_double_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_vertical_text.png b/core/res/res/drawable-xhdpi/pointer_vertical_text.png
index a07d091..4ec8eea 100644
--- a/core/res/res/drawable-xhdpi/pointer_vertical_text.png
+++ b/core/res/res/drawable-xhdpi/pointer_vertical_text.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_vertical_text_large.png b/core/res/res/drawable-xhdpi/pointer_vertical_text_large.png
index d3f729a..fab7412 100644
--- a/core/res/res/drawable-xhdpi/pointer_vertical_text_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_vertical_text_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_0.png b/core/res/res/drawable-xhdpi/pointer_wait_0.png
index 013aaf6..4c558b2 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_0.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_0.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_1.png b/core/res/res/drawable-xhdpi/pointer_wait_1.png
index 7fb0300..e86769d 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_1.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_1.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_10.png b/core/res/res/drawable-xhdpi/pointer_wait_10.png
index 90efa0a..b0f9d87 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_10.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_10.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_11.png b/core/res/res/drawable-xhdpi/pointer_wait_11.png
index 7c303a2..4b853ab 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_11.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_11.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_12.png b/core/res/res/drawable-xhdpi/pointer_wait_12.png
index 20a1fa8..59bf8a8 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_12.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_12.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_13.png b/core/res/res/drawable-xhdpi/pointer_wait_13.png
index 4585a39..5c618d7 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_13.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_13.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_14.png b/core/res/res/drawable-xhdpi/pointer_wait_14.png
index bdf0e5c..c4fb4ac 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_14.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_14.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_15.png b/core/res/res/drawable-xhdpi/pointer_wait_15.png
index e39c28c..24bdc15 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_15.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_15.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_16.png b/core/res/res/drawable-xhdpi/pointer_wait_16.png
index 7288141..a55f280 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_16.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_16.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_17.png b/core/res/res/drawable-xhdpi/pointer_wait_17.png
index b35da18..fc61645 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_17.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_17.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_18.png b/core/res/res/drawable-xhdpi/pointer_wait_18.png
index 0a61dd6..6f72345 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_18.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_18.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_19.png b/core/res/res/drawable-xhdpi/pointer_wait_19.png
index 1920c77..05d2dbb 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_19.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_19.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_2.png b/core/res/res/drawable-xhdpi/pointer_wait_2.png
index c6b3861..5b018a3 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_2.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_2.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_20.png b/core/res/res/drawable-xhdpi/pointer_wait_20.png
index b27358b..af141d8 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_20.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_20.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_21.png b/core/res/res/drawable-xhdpi/pointer_wait_21.png
index c1f9076..90cd89c 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_21.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_21.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_22.png b/core/res/res/drawable-xhdpi/pointer_wait_22.png
index 6cc0c13..41165cb 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_22.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_22.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_23.png b/core/res/res/drawable-xhdpi/pointer_wait_23.png
index 7df525c..46305db 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_23.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_23.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_24.png b/core/res/res/drawable-xhdpi/pointer_wait_24.png
index 008e273..53ecd9b 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_24.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_24.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_25.png b/core/res/res/drawable-xhdpi/pointer_wait_25.png
index 59f02d9..e413997 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_25.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_25.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_26.png b/core/res/res/drawable-xhdpi/pointer_wait_26.png
index 852b0bf..081ef84 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_26.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_26.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_27.png b/core/res/res/drawable-xhdpi/pointer_wait_27.png
index aba6292..19f29ac 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_27.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_27.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_28.png b/core/res/res/drawable-xhdpi/pointer_wait_28.png
index e59af43..9f9f906 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_28.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_28.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_29.png b/core/res/res/drawable-xhdpi/pointer_wait_29.png
index a195c29..07ff05e 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_29.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_29.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_3.png b/core/res/res/drawable-xhdpi/pointer_wait_3.png
index fb40e6f..e77332e 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_3.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_3.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_30.png b/core/res/res/drawable-xhdpi/pointer_wait_30.png
index 0d19d28..7d31416 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_30.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_30.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_31.png b/core/res/res/drawable-xhdpi/pointer_wait_31.png
index 49066b6..651a33d 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_31.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_31.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_32.png b/core/res/res/drawable-xhdpi/pointer_wait_32.png
index 43f7543..b09b961 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_32.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_32.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_33.png b/core/res/res/drawable-xhdpi/pointer_wait_33.png
index 3664ea8..5b260c4a 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_33.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_33.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_34.png b/core/res/res/drawable-xhdpi/pointer_wait_34.png
index e4c3919..fdcfc64 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_34.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_34.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_35.png b/core/res/res/drawable-xhdpi/pointer_wait_35.png
index e58777a..e3da4b8 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_35.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_35.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_36.png b/core/res/res/drawable-xhdpi/pointer_wait_36.png
new file mode 100644
index 0000000..1a1d7b7
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_36.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_37.png b/core/res/res/drawable-xhdpi/pointer_wait_37.png
new file mode 100644
index 0000000..c53c43c
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_37.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_38.png b/core/res/res/drawable-xhdpi/pointer_wait_38.png
new file mode 100644
index 0000000..16cf47f
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_38.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_39.png b/core/res/res/drawable-xhdpi/pointer_wait_39.png
new file mode 100644
index 0000000..2adb861
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_39.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_4.png b/core/res/res/drawable-xhdpi/pointer_wait_4.png
index 552b735..18bd826 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_4.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_4.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_40.png b/core/res/res/drawable-xhdpi/pointer_wait_40.png
new file mode 100644
index 0000000..da7861f
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_40.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_41.png b/core/res/res/drawable-xhdpi/pointer_wait_41.png
new file mode 100644
index 0000000..d0ba242
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_41.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_42.png b/core/res/res/drawable-xhdpi/pointer_wait_42.png
new file mode 100644
index 0000000..a90a138
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_42.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_43.png b/core/res/res/drawable-xhdpi/pointer_wait_43.png
new file mode 100644
index 0000000..4256b25
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_43.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_44.png b/core/res/res/drawable-xhdpi/pointer_wait_44.png
new file mode 100644
index 0000000..9e5fe21
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_44.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_45.png b/core/res/res/drawable-xhdpi/pointer_wait_45.png
new file mode 100644
index 0000000..19dd43f
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_45.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_46.png b/core/res/res/drawable-xhdpi/pointer_wait_46.png
new file mode 100644
index 0000000..c91001f
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_46.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_47.png b/core/res/res/drawable-xhdpi/pointer_wait_47.png
new file mode 100644
index 0000000..d481e42
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_47.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_48.png b/core/res/res/drawable-xhdpi/pointer_wait_48.png
new file mode 100644
index 0000000..299585b
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_48.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_49.png b/core/res/res/drawable-xhdpi/pointer_wait_49.png
new file mode 100644
index 0000000..cd03213
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_49.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_5.png b/core/res/res/drawable-xhdpi/pointer_wait_5.png
index cd2bfa1..3abd5db 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_5.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_5.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_50.png b/core/res/res/drawable-xhdpi/pointer_wait_50.png
new file mode 100644
index 0000000..72122a0
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_50.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_51.png b/core/res/res/drawable-xhdpi/pointer_wait_51.png
new file mode 100644
index 0000000..94398fd
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_51.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_52.png b/core/res/res/drawable-xhdpi/pointer_wait_52.png
new file mode 100644
index 0000000..a4561bd
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_52.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_53.png b/core/res/res/drawable-xhdpi/pointer_wait_53.png
new file mode 100644
index 0000000..a8f417a
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_53.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_54.png b/core/res/res/drawable-xhdpi/pointer_wait_54.png
new file mode 100644
index 0000000..cedab09
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_54.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_55.png b/core/res/res/drawable-xhdpi/pointer_wait_55.png
new file mode 100644
index 0000000..76e1bb6
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_55.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_56.png b/core/res/res/drawable-xhdpi/pointer_wait_56.png
new file mode 100644
index 0000000..c4f1d12
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_56.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_57.png b/core/res/res/drawable-xhdpi/pointer_wait_57.png
new file mode 100644
index 0000000..46ab8e2
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_57.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_58.png b/core/res/res/drawable-xhdpi/pointer_wait_58.png
new file mode 100644
index 0000000..9d36957
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_58.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_59.png b/core/res/res/drawable-xhdpi/pointer_wait_59.png
new file mode 100644
index 0000000..c0f342b
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_59.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_6.png b/core/res/res/drawable-xhdpi/pointer_wait_6.png
index f7c71b9..ad5ecb4 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_6.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_6.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_60.png b/core/res/res/drawable-xhdpi/pointer_wait_60.png
new file mode 100644
index 0000000..202c512
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_60.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_61.png b/core/res/res/drawable-xhdpi/pointer_wait_61.png
new file mode 100644
index 0000000..c48c3f2
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_61.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_62.png b/core/res/res/drawable-xhdpi/pointer_wait_62.png
new file mode 100644
index 0000000..80dee22
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_62.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_63.png b/core/res/res/drawable-xhdpi/pointer_wait_63.png
new file mode 100644
index 0000000..d5b0ee5
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_63.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_64.png b/core/res/res/drawable-xhdpi/pointer_wait_64.png
new file mode 100644
index 0000000..b327a57
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_64.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_65.png b/core/res/res/drawable-xhdpi/pointer_wait_65.png
new file mode 100644
index 0000000..92d832b
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_65.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_66.png b/core/res/res/drawable-xhdpi/pointer_wait_66.png
new file mode 100644
index 0000000..253b8a0
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_66.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_67.png b/core/res/res/drawable-xhdpi/pointer_wait_67.png
new file mode 100644
index 0000000..a8b3e4e
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_67.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_68.png b/core/res/res/drawable-xhdpi/pointer_wait_68.png
new file mode 100644
index 0000000..cfd0343
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_68.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_69.png b/core/res/res/drawable-xhdpi/pointer_wait_69.png
new file mode 100644
index 0000000..cb01ee5
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_69.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_7.png b/core/res/res/drawable-xhdpi/pointer_wait_7.png
index 3fa202e..bca504e 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_7.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_7.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_70.png b/core/res/res/drawable-xhdpi/pointer_wait_70.png
new file mode 100644
index 0000000..f38082f
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_70.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_71.png b/core/res/res/drawable-xhdpi/pointer_wait_71.png
new file mode 100644
index 0000000..e8b56db
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_71.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_72.png b/core/res/res/drawable-xhdpi/pointer_wait_72.png
new file mode 100644
index 0000000..9dff9e0
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_72.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_73.png b/core/res/res/drawable-xhdpi/pointer_wait_73.png
new file mode 100644
index 0000000..e989fcc
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_73.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_74.png b/core/res/res/drawable-xhdpi/pointer_wait_74.png
new file mode 100644
index 0000000..953bbd3
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_74.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_75.png b/core/res/res/drawable-xhdpi/pointer_wait_75.png
new file mode 100644
index 0000000..7df2d9e
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_75.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_76.png b/core/res/res/drawable-xhdpi/pointer_wait_76.png
new file mode 100644
index 0000000..b241ef6
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_76.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_77.png b/core/res/res/drawable-xhdpi/pointer_wait_77.png
new file mode 100644
index 0000000..f5018b8
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_77.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_78.png b/core/res/res/drawable-xhdpi/pointer_wait_78.png
new file mode 100644
index 0000000..06209a0
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_78.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_79.png b/core/res/res/drawable-xhdpi/pointer_wait_79.png
new file mode 100644
index 0000000..37887b8
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_79.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_8.png b/core/res/res/drawable-xhdpi/pointer_wait_8.png
index e0e50ae..0844944 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_8.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_8.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_80.png b/core/res/res/drawable-xhdpi/pointer_wait_80.png
new file mode 100644
index 0000000..115ef9d
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_wait_80.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_wait_9.png b/core/res/res/drawable-xhdpi/pointer_wait_9.png
index e3de26f..bf6d022 100644
--- a/core/res/res/drawable-xhdpi/pointer_wait_9.png
+++ b/core/res/res/drawable-xhdpi/pointer_wait_9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_zoom_in.png b/core/res/res/drawable-xhdpi/pointer_zoom_in.png
index 9c29fcb..d436387 100644
--- a/core/res/res/drawable-xhdpi/pointer_zoom_in.png
+++ b/core/res/res/drawable-xhdpi/pointer_zoom_in.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_zoom_in_large.png b/core/res/res/drawable-xhdpi/pointer_zoom_in_large.png
index beabbd2..e451a33 100644
--- a/core/res/res/drawable-xhdpi/pointer_zoom_in_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_zoom_in_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_zoom_out.png b/core/res/res/drawable-xhdpi/pointer_zoom_out.png
index 710552b6..afaaedc 100644
--- a/core/res/res/drawable-xhdpi/pointer_zoom_out.png
+++ b/core/res/res/drawable-xhdpi/pointer_zoom_out.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_zoom_out_large.png b/core/res/res/drawable-xhdpi/pointer_zoom_out_large.png
index b748f07..0ed8327 100644
--- a/core/res/res/drawable-xhdpi/pointer_zoom_out_large.png
+++ b/core/res/res/drawable-xhdpi/pointer_zoom_out_large.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_alias.png b/core/res/res/drawable-xxhdpi/pointer_alias.png
new file mode 100644
index 0000000..c329002
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_alias.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_all_scroll.png b/core/res/res/drawable-xxhdpi/pointer_all_scroll.png
new file mode 100644
index 0000000..808143a
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_all_scroll.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_arrow.png b/core/res/res/drawable-xxhdpi/pointer_arrow.png
index 4031f16..56dfedc 100644
--- a/core/res/res/drawable-xxhdpi/pointer_arrow.png
+++ b/core/res/res/drawable-xxhdpi/pointer_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_cell.png b/core/res/res/drawable-xxhdpi/pointer_cell.png
new file mode 100644
index 0000000..4180882
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_cell.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_context_menu.png b/core/res/res/drawable-xxhdpi/pointer_context_menu.png
new file mode 100644
index 0000000..6ebfaab
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_context_menu.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_copy.png b/core/res/res/drawable-xxhdpi/pointer_copy.png
new file mode 100644
index 0000000..24661a6
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_copy.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_crosshair.png b/core/res/res/drawable-xxhdpi/pointer_crosshair.png
new file mode 100644
index 0000000..6cb8b83
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_crosshair.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_grab.png b/core/res/res/drawable-xxhdpi/pointer_grab.png
new file mode 100644
index 0000000..1917722
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_grab.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_grabbing.png b/core/res/res/drawable-xxhdpi/pointer_grabbing.png
new file mode 100644
index 0000000..a4cd9e5
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_grabbing.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_hand.png b/core/res/res/drawable-xxhdpi/pointer_hand.png
new file mode 100644
index 0000000..917529b
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_hand.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_help.png b/core/res/res/drawable-xxhdpi/pointer_help.png
new file mode 100644
index 0000000..96b2a71
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_help.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_horizontal_double_arrow.png b/core/res/res/drawable-xxhdpi/pointer_horizontal_double_arrow.png
new file mode 100644
index 0000000..677ccad
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_horizontal_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_nodrop.png b/core/res/res/drawable-xxhdpi/pointer_nodrop.png
new file mode 100644
index 0000000..35b4d13
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_nodrop.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_spot_anchor.png b/core/res/res/drawable-xxhdpi/pointer_spot_anchor.png
new file mode 100644
index 0000000..5b46ce5
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_spot_anchor.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_spot_hover.png b/core/res/res/drawable-xxhdpi/pointer_spot_hover.png
new file mode 100644
index 0000000..6c1ab15
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_spot_hover.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_spot_touch.png b/core/res/res/drawable-xxhdpi/pointer_spot_touch.png
new file mode 100644
index 0000000..ab69fd8
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_spot_touch.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_text.png b/core/res/res/drawable-xxhdpi/pointer_text.png
new file mode 100644
index 0000000..0145886
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_text.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_top_left_diagonal_double_arrow.png b/core/res/res/drawable-xxhdpi/pointer_top_left_diagonal_double_arrow.png
new file mode 100644
index 0000000..e01aa64
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_top_left_diagonal_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_top_right_diagonal_double_arrow.png b/core/res/res/drawable-xxhdpi/pointer_top_right_diagonal_double_arrow.png
new file mode 100644
index 0000000..e947e0e
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_top_right_diagonal_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_vertical_double_arrow.png b/core/res/res/drawable-xxhdpi/pointer_vertical_double_arrow.png
new file mode 100644
index 0000000..c867247
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_vertical_double_arrow.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_vertical_text.png b/core/res/res/drawable-xxhdpi/pointer_vertical_text.png
new file mode 100644
index 0000000..77ff389
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_vertical_text.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_zoom_in.png b/core/res/res/drawable-xxhdpi/pointer_zoom_in.png
new file mode 100644
index 0000000..7852abe
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_zoom_in.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/pointer_zoom_out.png b/core/res/res/drawable-xxhdpi/pointer_zoom_out.png
new file mode 100644
index 0000000..83c621e
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/pointer_zoom_out.png
Binary files differ
diff --git a/core/res/res/drawable/pointer_alias_icon.xml b/core/res/res/drawable/pointer_alias_icon.xml
index 8ba9301..4c701c0 100644
--- a/core/res/res/drawable/pointer_alias_icon.xml
+++ b/core/res/res/drawable/pointer_alias_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_alias"
-    android:hotSpotX="8dp"
-    android:hotSpotY="6dp" />
+    android:hotSpotX="11.5dp"
+    android:hotSpotY="11.5dp" />
diff --git a/core/res/res/drawable/pointer_alias_large_icon.xml b/core/res/res/drawable/pointer_alias_large_icon.xml
index 149f58c..8dca8a5 100644
--- a/core/res/res/drawable/pointer_alias_large_icon.xml
+++ b/core/res/res/drawable/pointer_alias_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_alias_large"
-    android:hotSpotX="19dp"
-    android:hotSpotY="11dp" />
+    android:hotSpotX="28.75dp"
+    android:hotSpotY="28.75dp" />
diff --git a/core/res/res/drawable/pointer_all_scroll_icon.xml b/core/res/res/drawable/pointer_all_scroll_icon.xml
index e946948..a0cf318 100644
--- a/core/res/res/drawable/pointer_all_scroll_icon.xml
+++ b/core/res/res/drawable/pointer_all_scroll_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_all_scroll"
-    android:hotSpotX="11dp"
-    android:hotSpotY="11dp" />
+    android:hotSpotX="12dp"
+    android:hotSpotY="12dp" />
diff --git a/core/res/res/drawable/pointer_all_scroll_large_icon.xml b/core/res/res/drawable/pointer_all_scroll_large_icon.xml
index c580f76..1fe7dad 100644
--- a/core/res/res/drawable/pointer_all_scroll_large_icon.xml
+++ b/core/res/res/drawable/pointer_all_scroll_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_all_scroll_large"
-    android:hotSpotX="32dp"
-    android:hotSpotY="31dp" />
+    android:hotSpotX="30dp"
+    android:hotSpotY="30dp" />
diff --git a/core/res/res/drawable/pointer_arrow_icon.xml b/core/res/res/drawable/pointer_arrow_icon.xml
index 72af0c1..61eb1cd 100644
--- a/core/res/res/drawable/pointer_arrow_icon.xml
+++ b/core/res/res/drawable/pointer_arrow_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_arrow"
-    android:hotSpotX="5dp"
-    android:hotSpotY="5dp" />
+    android:hotSpotX="4.5dp"
+    android:hotSpotY="3.5dp" />
diff --git a/core/res/res/drawable/pointer_arrow_large_icon.xml b/core/res/res/drawable/pointer_arrow_large_icon.xml
index 22c7bfe..0f2997b 100644
--- a/core/res/res/drawable/pointer_arrow_large_icon.xml
+++ b/core/res/res/drawable/pointer_arrow_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_arrow_large"
-    android:hotSpotX="10dp"
-    android:hotSpotY="10dp" />
+    android:hotSpotX="13.5dp"
+    android:hotSpotY="10.5dp" />
diff --git a/core/res/res/drawable/pointer_cell_icon.xml b/core/res/res/drawable/pointer_cell_icon.xml
index da1e320..35a61c2 100644
--- a/core/res/res/drawable/pointer_cell_icon.xml
+++ b/core/res/res/drawable/pointer_cell_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_cell"
-    android:hotSpotX="11dp"
-    android:hotSpotY="11dp" />
+    android:hotSpotX="12dp"
+    android:hotSpotY="12dp" />
diff --git a/core/res/res/drawable/pointer_context_menu_icon.xml b/core/res/res/drawable/pointer_context_menu_icon.xml
index 330b627..badc736 100644
--- a/core/res/res/drawable/pointer_context_menu_icon.xml
+++ b/core/res/res/drawable/pointer_context_menu_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_context_menu"
-    android:hotSpotX="4dp"
-    android:hotSpotY="4dp" />
+    android:hotSpotX="4.5dp"
+    android:hotSpotY="3.5dp" />
diff --git a/core/res/res/drawable/pointer_context_menu_large_icon.xml b/core/res/res/drawable/pointer_context_menu_large_icon.xml
index c57e615..e07e5b6 100644
--- a/core/res/res/drawable/pointer_context_menu_large_icon.xml
+++ b/core/res/res/drawable/pointer_context_menu_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_context_menu_large"
-    android:hotSpotX="11dp"
-    android:hotSpotY="11dp" />
+    android:hotSpotX="13.5dp"
+    android:hotSpotY="10.5dp" />
diff --git a/core/res/res/drawable/pointer_copy_icon.xml b/core/res/res/drawable/pointer_copy_icon.xml
index e299db5..7e7c0ca 100644
--- a/core/res/res/drawable/pointer_copy_icon.xml
+++ b/core/res/res/drawable/pointer_copy_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_copy"
-    android:hotSpotX="9dp"
-    android:hotSpotY="9dp" />
+    android:hotSpotX="8.5dp"
+    android:hotSpotY="7.5dp" />
diff --git a/core/res/res/drawable/pointer_copy_large_icon.xml b/core/res/res/drawable/pointer_copy_large_icon.xml
index 4ee3f18..54e9523 100644
--- a/core/res/res/drawable/pointer_copy_large_icon.xml
+++ b/core/res/res/drawable/pointer_copy_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_copy_large"
-    android:hotSpotX="10dp"
-    android:hotSpotY="10dp" />
+    android:hotSpotX="21.25dp"
+    android:hotSpotY="18.75dp" />
diff --git a/core/res/res/drawable/pointer_crosshair_large_icon.xml b/core/res/res/drawable/pointer_crosshair_large_icon.xml
index 6a71b7b..1073fff 100644
--- a/core/res/res/drawable/pointer_crosshair_large_icon.xml
+++ b/core/res/res/drawable/pointer_crosshair_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_crosshair_large"
-    android:hotSpotX="31dp"
+    android:hotSpotX="30dp"
     android:hotSpotY="30dp" />
diff --git a/core/res/res/drawable/pointer_grab_icon.xml b/core/res/res/drawable/pointer_grab_icon.xml
index d437b3a..dd1216a 100644
--- a/core/res/res/drawable/pointer_grab_icon.xml
+++ b/core/res/res/drawable/pointer_grab_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_grab"
-    android:hotSpotX="8dp"
-    android:hotSpotY="5dp" />
+    android:hotSpotX="9.5dp"
+    android:hotSpotY="4.5dp" />
diff --git a/core/res/res/drawable/pointer_grab_large_icon.xml b/core/res/res/drawable/pointer_grab_large_icon.xml
index f2df1cb..b5dbd11 100644
--- a/core/res/res/drawable/pointer_grab_large_icon.xml
+++ b/core/res/res/drawable/pointer_grab_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_grab_large"
-    android:hotSpotX="21dp"
-    android:hotSpotY="11dp" />
+    android:hotSpotX="23.75dp"
+    android:hotSpotY="11.25dp" />
diff --git a/core/res/res/drawable/pointer_grabbing_icon.xml b/core/res/res/drawable/pointer_grabbing_icon.xml
index 38f4c3a..93818d7 100644
--- a/core/res/res/drawable/pointer_grabbing_icon.xml
+++ b/core/res/res/drawable/pointer_grabbing_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_grabbing"
-    android:hotSpotX="9dp"
-    android:hotSpotY="9dp" />
+    android:hotSpotX="8.5dp"
+    android:hotSpotY="7.5dp" />
diff --git a/core/res/res/drawable/pointer_grabbing_large_icon.xml b/core/res/res/drawable/pointer_grabbing_large_icon.xml
index e4042bf..b041c83 100644
--- a/core/res/res/drawable/pointer_grabbing_large_icon.xml
+++ b/core/res/res/drawable/pointer_grabbing_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_grabbing_large"
-    android:hotSpotX="20dp"
-    android:hotSpotY="12dp" />
+    android:hotSpotX="21.25dp"
+    android:hotSpotY="18.75dp" />
diff --git a/core/res/res/drawable/pointer_hand_icon.xml b/core/res/res/drawable/pointer_hand_icon.xml
index 3d90b88..0feccd2 100644
--- a/core/res/res/drawable/pointer_hand_icon.xml
+++ b/core/res/res/drawable/pointer_hand_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_hand"
-    android:hotSpotX="9dp"
-    android:hotSpotY="4dp" />
+    android:hotSpotX="9.5dp"
+    android:hotSpotY="2.5dp" />
diff --git a/core/res/res/drawable/pointer_hand_large_icon.xml b/core/res/res/drawable/pointer_hand_large_icon.xml
index e34422a..6257b0b 100644
--- a/core/res/res/drawable/pointer_hand_large_icon.xml
+++ b/core/res/res/drawable/pointer_hand_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_hand_large"
-    android:hotSpotX="25dp"
-    android:hotSpotY="7dp" />
+    android:hotSpotX="23.75dp"
+    android:hotSpotY="6.25dp" />
diff --git a/core/res/res/drawable/pointer_help_icon.xml b/core/res/res/drawable/pointer_help_icon.xml
index 49ae554..0a4bdb0 100644
--- a/core/res/res/drawable/pointer_help_icon.xml
+++ b/core/res/res/drawable/pointer_help_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_help"
-    android:hotSpotX="4dp"
-    android:hotSpotY="4dp" />
+    android:hotSpotX="4.5dp"
+    android:hotSpotY="3.5dp" />
diff --git a/core/res/res/drawable/pointer_help_large_icon.xml b/core/res/res/drawable/pointer_help_large_icon.xml
index 4c60a55..43a1261 100644
--- a/core/res/res/drawable/pointer_help_large_icon.xml
+++ b/core/res/res/drawable/pointer_help_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_help_large"
-    android:hotSpotX="10dp"
-    android:hotSpotY="11dp" />
+    android:hotSpotX="13.5dp"
+    android:hotSpotY="10.5dp" />
diff --git a/core/res/res/drawable/pointer_horizontal_double_arrow_icon.xml b/core/res/res/drawable/pointer_horizontal_double_arrow_icon.xml
index 93b3fe5..6ddcc42 100644
--- a/core/res/res/drawable/pointer_horizontal_double_arrow_icon.xml
+++ b/core/res/res/drawable/pointer_horizontal_double_arrow_icon.xml
@@ -2,4 +2,4 @@
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_horizontal_double_arrow"
     android:hotSpotX="12dp"
-    android:hotSpotY="11dp" />
+    android:hotSpotY="12dp" />
diff --git a/core/res/res/drawable/pointer_horizontal_double_arrow_large_icon.xml b/core/res/res/drawable/pointer_horizontal_double_arrow_large_icon.xml
index a2039e6..854be26 100644
--- a/core/res/res/drawable/pointer_horizontal_double_arrow_large_icon.xml
+++ b/core/res/res/drawable/pointer_horizontal_double_arrow_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_horizontal_double_arrow_large"
-    android:hotSpotX="35dp"
-    android:hotSpotY="29dp" />
+    android:hotSpotX="30dp"
+    android:hotSpotY="30dp" />
diff --git a/core/res/res/drawable/pointer_nodrop_icon.xml b/core/res/res/drawable/pointer_nodrop_icon.xml
index 955b40f..fb78d74 100644
--- a/core/res/res/drawable/pointer_nodrop_icon.xml
+++ b/core/res/res/drawable/pointer_nodrop_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_nodrop"
-    android:hotSpotX="9dp"
-    android:hotSpotY="9dp" />
+    android:hotSpotX="8.5dp"
+    android:hotSpotY="7.5dp" />
diff --git a/core/res/res/drawable/pointer_nodrop_large_icon.xml b/core/res/res/drawable/pointer_nodrop_large_icon.xml
index cde2e41..2385e11 100644
--- a/core/res/res/drawable/pointer_nodrop_large_icon.xml
+++ b/core/res/res/drawable/pointer_nodrop_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_nodrop_large"
-    android:hotSpotX="10dp"
-    android:hotSpotY="10dp" />
+    android:hotSpotX="21.25dp"
+    android:hotSpotY="18.75dp" />
diff --git a/core/res/res/drawable/pointer_spot_anchor_icon.xml b/core/res/res/drawable/pointer_spot_anchor_icon.xml
index 73c0c11..b7d000f 100644
--- a/core/res/res/drawable/pointer_spot_anchor_icon.xml
+++ b/core/res/res/drawable/pointer_spot_anchor_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_spot_anchor"
-    android:hotSpotX="22dp"
-    android:hotSpotY="22dp" />
+    android:hotSpotX="12dp"
+    android:hotSpotY="12dp" />
diff --git a/core/res/res/drawable/pointer_spot_hover_icon.xml b/core/res/res/drawable/pointer_spot_hover_icon.xml
index 1d7440b..0d641b2 100644
--- a/core/res/res/drawable/pointer_spot_hover_icon.xml
+++ b/core/res/res/drawable/pointer_spot_hover_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_spot_hover"
-    android:hotSpotX="22dp"
-    android:hotSpotY="22dp" />
+    android:hotSpotX="12dp"
+    android:hotSpotY="12dp" />
diff --git a/core/res/res/drawable/pointer_spot_touch_icon.xml b/core/res/res/drawable/pointer_spot_touch_icon.xml
index f4f0639..b1c8c0b 100644
--- a/core/res/res/drawable/pointer_spot_touch_icon.xml
+++ b/core/res/res/drawable/pointer_spot_touch_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_spot_touch"
-    android:hotSpotX="16dp"
-    android:hotSpotY="16dp" />
+    android:hotSpotX="12dp"
+    android:hotSpotY="12dp" />
diff --git a/core/res/res/drawable/pointer_text_icon.xml b/core/res/res/drawable/pointer_text_icon.xml
index d948c89..1daba65 100644
--- a/core/res/res/drawable/pointer_text_icon.xml
+++ b/core/res/res/drawable/pointer_text_icon.xml
@@ -2,4 +2,4 @@
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_text"
     android:hotSpotX="12dp"
-    android:hotSpotY="12dp" />
+    android:hotSpotY="11dp" />
diff --git a/core/res/res/drawable/pointer_text_large_icon.xml b/core/res/res/drawable/pointer_text_large_icon.xml
index 24d35b0..5b32ea34 100644
--- a/core/res/res/drawable/pointer_text_large_icon.xml
+++ b/core/res/res/drawable/pointer_text_large_icon.xml
@@ -2,4 +2,4 @@
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_text_large"
     android:hotSpotX="30dp"
-    android:hotSpotY="32dp" />
+    android:hotSpotY="27.5dp" />
diff --git a/core/res/res/drawable/pointer_top_left_diagonal_double_arrow_icon.xml b/core/res/res/drawable/pointer_top_left_diagonal_double_arrow_icon.xml
index de5efe2..1598766e 100644
--- a/core/res/res/drawable/pointer_top_left_diagonal_double_arrow_icon.xml
+++ b/core/res/res/drawable/pointer_top_left_diagonal_double_arrow_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_top_left_diagonal_double_arrow"
-    android:hotSpotX="11dp"
-    android:hotSpotY="11dp" />
+    android:hotSpotX="12dp"
+    android:hotSpotY="12dp" />
diff --git a/core/res/res/drawable/pointer_top_left_diagonal_double_arrow_large_icon.xml b/core/res/res/drawable/pointer_top_left_diagonal_double_arrow_large_icon.xml
index 270ccc9..5e0d37b 100644
--- a/core/res/res/drawable/pointer_top_left_diagonal_double_arrow_large_icon.xml
+++ b/core/res/res/drawable/pointer_top_left_diagonal_double_arrow_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_top_left_diagonal_double_arrow_large"
-    android:hotSpotX="32dp"
+    android:hotSpotX="30dp"
     android:hotSpotY="30dp" />
diff --git a/core/res/res/drawable/pointer_top_right_diagonal_double_arrow_icon.xml b/core/res/res/drawable/pointer_top_right_diagonal_double_arrow_icon.xml
index e87b526..83324ef9 100644
--- a/core/res/res/drawable/pointer_top_right_diagonal_double_arrow_icon.xml
+++ b/core/res/res/drawable/pointer_top_right_diagonal_double_arrow_icon.xml
@@ -2,4 +2,4 @@
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_top_right_diagonal_double_arrow"
     android:hotSpotX="12dp"
-    android:hotSpotY="11dp" />
+    android:hotSpotY="12dp" />
diff --git a/core/res/res/drawable/pointer_top_right_diagonal_double_arrow_large_icon.xml b/core/res/res/drawable/pointer_top_right_diagonal_double_arrow_large_icon.xml
index e350a438..6ed5a0b 100644
--- a/core/res/res/drawable/pointer_top_right_diagonal_double_arrow_large_icon.xml
+++ b/core/res/res/drawable/pointer_top_right_diagonal_double_arrow_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_top_right_diagonal_double_arrow_large"
-    android:hotSpotX="32dp"
-    android:hotSpotY="31dp" />
+    android:hotSpotX="30dp"
+    android:hotSpotY="30dp" />
diff --git a/core/res/res/drawable/pointer_vertical_double_arrow_icon.xml b/core/res/res/drawable/pointer_vertical_double_arrow_icon.xml
index 5759079..c746fd8 100644
--- a/core/res/res/drawable/pointer_vertical_double_arrow_icon.xml
+++ b/core/res/res/drawable/pointer_vertical_double_arrow_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_vertical_double_arrow"
-    android:hotSpotX="11dp"
+    android:hotSpotX="12dp"
     android:hotSpotY="12dp" />
diff --git a/core/res/res/drawable/pointer_vertical_double_arrow_large_icon.xml b/core/res/res/drawable/pointer_vertical_double_arrow_large_icon.xml
index 65728ad..190d181 100644
--- a/core/res/res/drawable/pointer_vertical_double_arrow_large_icon.xml
+++ b/core/res/res/drawable/pointer_vertical_double_arrow_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_vertical_double_arrow_large"
-    android:hotSpotX="29dp"
-    android:hotSpotY="32dp" />
+    android:hotSpotX="30dp"
+    android:hotSpotY="30dp" />
diff --git a/core/res/res/drawable/pointer_vertical_text_icon.xml b/core/res/res/drawable/pointer_vertical_text_icon.xml
index 3b48dc8..275b9797 100644
--- a/core/res/res/drawable/pointer_vertical_text_icon.xml
+++ b/core/res/res/drawable/pointer_vertical_text_icon.xml
@@ -2,4 +2,4 @@
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_vertical_text"
     android:hotSpotX="12dp"
-    android:hotSpotY="11dp" />
+    android:hotSpotY="12dp" />
diff --git a/core/res/res/drawable/pointer_vertical_text_large_icon.xml b/core/res/res/drawable/pointer_vertical_text_large_icon.xml
index 48211cb..a1b5dc2 100644
--- a/core/res/res/drawable/pointer_vertical_text_large_icon.xml
+++ b/core/res/res/drawable/pointer_vertical_text_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_vertical_text_large"
-    android:hotSpotX="32dp"
+    android:hotSpotX="30dp"
     android:hotSpotY="30dp" />
diff --git a/core/res/res/drawable/pointer_wait.xml b/core/res/res/drawable/pointer_wait.xml
index 8955ce8..c769be5 100644
--- a/core/res/res/drawable/pointer_wait.xml
+++ b/core/res/res/drawable/pointer_wait.xml
@@ -1,38 +1,84 @@
 <?xml version="1.0" encoding="utf-8"?>
 <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
-  <item android:drawable="@drawable/pointer_wait_1" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_2" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_3" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_4" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_5" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_6" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_7" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_8" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_9" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_10" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_11" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_12" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_13" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_14" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_15" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_16" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_17" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_18" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_19" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_20" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_21" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_22" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_23" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_24" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_25" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_26" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_27" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_28" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_29" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_30" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_31" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_32" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_33" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_34" android:duration="25"/>
-  <item android:drawable="@drawable/pointer_wait_35" android:duration="25"/>
+  <item android:drawable="@drawable/pointer_wait_0" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_1" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_2" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_3" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_4" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_5" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_6" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_7" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_8" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_9" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_10" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_11" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_12" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_13" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_14" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_15" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_16" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_17" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_18" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_19" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_20" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_21" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_22" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_23" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_24" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_25" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_26" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_27" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_28" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_29" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_30" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_31" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_32" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_33" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_34" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_35" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_36" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_37" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_38" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_39" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_40" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_41" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_42" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_43" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_44" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_45" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_46" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_47" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_48" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_49" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_50" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_51" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_52" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_53" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_54" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_55" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_56" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_57" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_58" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_59" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_60" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_61" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_62" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_63" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_64" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_65" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_66" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_67" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_68" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_69" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_70" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_71" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_72" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_73" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_74" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_75" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_76" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_77" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_78" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_79" android:duration="16"/>
+  <item android:drawable="@drawable/pointer_wait_80" android:duration="16"/>
 </animation-list>
diff --git a/core/res/res/drawable/pointer_wait_icon.xml b/core/res/res/drawable/pointer_wait_icon.xml
index d9b03b0..e52c4e0 100644
--- a/core/res/res/drawable/pointer_wait_icon.xml
+++ b/core/res/res/drawable/pointer_wait_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_wait"
-    android:hotSpotX="7dp"
-    android:hotSpotY="7dp" />
+    android:hotSpotX="8dp"
+    android:hotSpotY="8dp" />
diff --git a/core/res/res/drawable/pointer_zoom_in_icon.xml b/core/res/res/drawable/pointer_zoom_in_icon.xml
index e2dcb49..322fab8 100644
--- a/core/res/res/drawable/pointer_zoom_in_icon.xml
+++ b/core/res/res/drawable/pointer_zoom_in_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_zoom_in"
-    android:hotSpotX="10dp"
-    android:hotSpotY="10dp" />
+    android:hotSpotX="10.5dp"
+    android:hotSpotY="9.5dp" />
diff --git a/core/res/res/drawable/pointer_zoom_in_large_icon.xml b/core/res/res/drawable/pointer_zoom_in_large_icon.xml
index 3eb89f56..4505892 100644
--- a/core/res/res/drawable/pointer_zoom_in_large_icon.xml
+++ b/core/res/res/drawable/pointer_zoom_in_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_zoom_in_large"
-    android:hotSpotX="25dp"
-    android:hotSpotY="26dp" />
+    android:hotSpotX="26.25dp"
+    android:hotSpotY="23.75dp" />
diff --git a/core/res/res/drawable/pointer_zoom_out_icon.xml b/core/res/res/drawable/pointer_zoom_out_icon.xml
index b805df3..bfb5aa6 100644
--- a/core/res/res/drawable/pointer_zoom_out_icon.xml
+++ b/core/res/res/drawable/pointer_zoom_out_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_zoom_out"
-    android:hotSpotX="10dp"
-    android:hotSpotY="10dp" />
+    android:hotSpotX="10.5dp"
+    android:hotSpotY="9.5dp" />
diff --git a/core/res/res/drawable/pointer_zoom_out_large_icon.xml b/core/res/res/drawable/pointer_zoom_out_large_icon.xml
index df6412e..90057e6 100644
--- a/core/res/res/drawable/pointer_zoom_out_large_icon.xml
+++ b/core/res/res/drawable/pointer_zoom_out_large_icon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
     android:bitmap="@drawable/pointer_zoom_out_large"
-    android:hotSpotX="26dp"
-    android:hotSpotY="26dp" />
+    android:hotSpotX="26.25dp"
+    android:hotSpotY="23.75dp" />
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 42e5188..9a065ab 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Laat die houer toe om die kenmerke-inligting vir \'n program te begin bekyk."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"kry toegang tot sensordata teen \'n hoë monsternemingkoers"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Laat die program toe om monsters van sensordata teen \'n hoër koers as 200 Hz te neem"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"dateer app sonder gebruikerhandeling op"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Laat die houer toe om die app wat dit voorheen sonder gebruikhandeling geïnstalleer het, op te dateer"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Stel wagwoordreëls"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Beheer die lengte en die karakters wat in skermslotwagwoorde en -PIN\'e toegelaat word."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitor pogings om skerm te ontsluit"</string>
@@ -1698,11 +1700,11 @@
     <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"AAN"</string>
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"AF"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Gee <xliff:g id="SERVICE">%1$s</xliff:g> volle beheer oor jou toestel?"</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Volle beheer is gepas vir programme wat jou help met toeganklikheidsbehoeftes, maar nie vir die meeste programme nie."</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Volle beheer is gepas vir apps wat jou help met toeganklikheidsbehoeftes, maar nie vir die meeste apps nie."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Bekyk en beheer skerm"</string>
-    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Dit kan alle inhoud op die skerm lees en inhoud bo-oor ander programme vertoon."</string>
+    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Dit kan alle inhoud op die skerm lees en inhoud bo-oor ander apps vertoon."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Bekyk en voer handelinge uit"</string>
-    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Dit kan jou interaksies met \'n program of \'n hardewaresensor naspoor en namens jou met programme interaksie hê."</string>
+    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Dit kan jou interaksies met \'n app of \'n hardewaresensor naspoor en namens jou met apps interaksie hê."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Laat toe"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Weier"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Tik op \'n kenmerk om dit te begin gebruik:"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 26f99bf..6a32577 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -140,8 +140,7 @@
     <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string>
     <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"የWi-Fi ጥሪ"</string>
     <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string>
-    <!-- no translation found for wfcSpnFormat_wifi_call (434016592539090004) -->
-    <skip />
+    <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"የWi-Fi ጥሪ"</string>
     <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ጠፍቷል"</string>
     <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"በ Wi-Fi በኩል ደውል"</string>
     <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ከተንቀሳቃሽ ስልክ አውታረ መረብ በኩል ደውል"</string>
@@ -801,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ያዢው የአንድ መተግበሪያ የባህሪያት መረጃን ማየት እንዲጀምር ያስችለዋል።"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"የዳሳሽ ውሂቡን በከፍተኛ የናሙና ብዛት ላይ ይድረሱበት"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"መተግበሪያው የዳሳሽ ውሂቡን ከ200 ኸ በሚበልጥ ፍጥነት ናሙና እንዲያደርግ ይፈቅድለታል"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"የይለፍ ቃል ደንቦች አዘጋጅ"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"በማያ ገጽ መቆለፊያ የይለፍ ቃሎች እና ፒኖች ውስጥ የሚፈቀዱ ቁምፊዎችን እና ርዝመታቸውን ተቆጣጠር።"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"የማሳያ-ክፈት ሙከራዎችን ክትትል ያድርጉባቸው"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 7335043..b79dcf2 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -804,6 +804,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"للسماح للمالك ببدء عرض معلومات عن ميزات التطبيق."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"الوصول إلى بيانات جهاز الاستشعار بمعدّل مرتفع للبيانات في الملف الصوتي"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"يسمح هذا الأذن للتطبيق بزيادة بيانات جهاز الاستشعار بمعدّل بيانات في الملف الصوتي أكبر من 200 هرتز."</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"تعيين قواعد كلمة المرور"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"للتحكم في الطول والأحرف المسموح بها في كلمات المرور وأرقام التعريف الشخصي في قفل الشاشة."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"مراقبة محاولات فتح قفل الشاشة"</string>
@@ -1701,8 +1705,8 @@
     <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_off" msgid="5531598275559472393">"غير مفعّل"</string>
-    <string name="accessibility_enable_service_title" msgid="3931558336268541484">"هل تريد السماح لخدمة <xliff:g id="SERVICE">%1$s</xliff:g> بالتحكّم الكامل في جهازك؟"</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"إنّ التحكّم الكامل ليس ملائمًا لمعظم التطبيقات، باستثناء التطبيقات المعنية بسهولة الاستخدام."</string>
+    <string name="accessibility_enable_service_title" msgid="3931558336268541484">"هل تريد السماح لـ \"<xliff:g id="SERVICE">%1$s</xliff:g>\" بالتحكّم الكامل في جهازك؟"</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"إنّ التحكّم الكامل ليس ملائمًا لمعظم التطبيقات، باستثناء التطبيقات المعنية بتسهيل الاستخدام."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"قراءة محتوى الشاشة والتحكم به"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"يمكنها قراءة كل المحتوى على الشاشة وعرض المحتوى فوق تطبيقات أخرى."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"عرض الإجراءات وتنفيذها"</string>
@@ -2328,12 +2332,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"يستخدم \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" كلتا الشاشتين لعرض المحتوى."</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"الجهاز ساخن للغاية"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ميزة \"استخدام الشاشتين\" غير متاحة لأن هاتفك ساخن للغاية."</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <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_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-as/strings.xml b/core/res/res/values-as/strings.xml
index 9be6860..055078a 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -249,13 +249,13 @@
     <string name="global_action_emergency" msgid="1387617624177105088">"জৰুৰীকালীন কল"</string>
     <string name="global_action_bug_report" msgid="5127867163044170003">"বাগ সম্পর্কীয় অভিযোগ"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"ছেশ্বন সমাপ্ত কৰক"</string>
-    <string name="global_action_screenshot" msgid="2610053466156478564">"স্ক্ৰীণশ্বট"</string>
+    <string name="global_action_screenshot" msgid="2610053466156478564">"স্ক্ৰীনশ্বট"</string>
     <string name="bugreport_title" msgid="8549990811777373050">"বাগ সম্পর্কীয় অভিযোগ"</string>
     <string name="bugreport_message" msgid="5212529146119624326">"এই কার্যই ইমেইল বাৰ্তা হিচাপে পঠিয়াবলৈ আপোনাৰ ডিভাইচৰ বৰ্তমান অৱস্থাৰ বিষয়ে তথ্য সংগ্ৰহ কৰিব৷ ইয়াক বাগ সম্পর্কীয় অভিযোগ পঠিওৱা কাৰ্য আৰম্ভ কৰোঁতে অলপ সময় লাগিব; অনুগ্ৰহ কৰি ধৈৰ্য ধৰক।"</string>
     <string name="bugreport_option_interactive_title" msgid="7968287837902871289">"ইণ্টাৰেক্টিভ অভিযোগ"</string>
-    <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"বেছিভাগ পৰিস্থিতিত এয়া ব্যৱহাৰ কৰক। ই আপোনাক অভিযোগৰ অগ্ৰগতি ট্ৰেক কৰিবলৈ, সমস্যাটোৰ সম্পর্কে অধিক বিৱৰণ দিবলৈ আৰু স্ক্ৰীণশ্বট ল\'বলৈ অনুমতি দিয়ে। ই কম ব্যৱহাৰ হোৱা সেই শাখাসমূহক অন্তৰ্ভুক্ত নকৰিব পাৰে যিবোৰক অভিযোগ কৰিবলৈ দীৰ্ঘ সময়ৰ প্ৰয়োজন হয়।"</string>
+    <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"বেছিভাগ পৰিস্থিতিত এয়া ব্যৱহাৰ কৰক। ই আপোনাক অভিযোগৰ অগ্ৰগতি ট্ৰেক কৰিবলৈ, সমস্যাটোৰ সম্পর্কে অধিক বিৱৰণ দিবলৈ আৰু স্ক্ৰীনশ্বট ল\'বলৈ অনুমতি দিয়ে। ই কম ব্যৱহাৰ হোৱা সেই শাখাসমূহক অন্তৰ্ভুক্ত নকৰিব পাৰে যিবোৰক অভিযোগ কৰিবলৈ দীৰ্ঘ সময়ৰ প্ৰয়োজন হয়।"</string>
     <string name="bugreport_option_full_title" msgid="7681035745950045690">"সম্পূৰ্ণ অভিযোগ"</string>
-    <string name="bugreport_option_full_summary" msgid="1975130009258435885">"যেতিয়া আপোনাৰ ডিভাইচটোৱে সঁহাৰি নিদিয়া হয় বা ই অতি লেহেমীয়া হৈ পৰে বা যেতিয়া আপোনাক আটাইবোৰ অভিযোগৰ শাখাৰ প্ৰয়োজন হয় তেতিয়া ছিষ্টেমত কম হস্তক্ষেপৰ বাবে এই বিকল্প ব্যৱহাৰ কৰক। আপোনাক অধিক বিৱৰণ দিবলৈ বা অতিৰিক্ত স্ক্ৰীণশ্বট ল’বলৈ নিদিয়ে।"</string>
+    <string name="bugreport_option_full_summary" msgid="1975130009258435885">"যেতিয়া আপোনাৰ ডিভাইচটোৱে সঁহাৰি নিদিয়া হয় বা ই অতি লেহেমীয়া হৈ পৰে বা যেতিয়া আপোনাক আটাইবোৰ অভিযোগৰ শাখাৰ প্ৰয়োজন হয় তেতিয়া ছিষ্টেমত কম হস্তক্ষেপৰ বাবে এই বিকল্প ব্যৱহাৰ কৰক। আপোনাক অধিক বিৱৰণ দিবলৈ বা অতিৰিক্ত স্ক্ৰীনশ্বট ল’বলৈ নিদিয়ে।"</string>
     <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{ত্ৰুটি সম্পর্কীয় অভিযোগৰ বাবে # ছেকেণ্ডৰ ভিতৰত স্ক্ৰীনশ্বট লোৱা হ\'ব।}one{ত্ৰুটি সম্পর্কীয় অভিযোগৰ বাবে # ছেকেণ্ডৰ ভিতৰত স্ক্ৰীনশ্বট লোৱা হ\'ব।}other{ত্ৰুটি সম্পর্কীয় অভিযোগৰ বাবে # ছেকেণ্ডৰ ভিতৰত স্ক্ৰীনশ্বট লোৱা হ\'ব।}}"</string>
     <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"বাগ ৰিপ’ৰ্টৰ সৈতে স্ক্ৰীনশ্বট লোৱা হ’ল"</string>
     <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"বাগ ৰিপ’ৰ্টৰ সৈতে স্ক্ৰীনশ্বট ল’ব পৰা নগ’ল"</string>
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ধাৰকক কোনো এপৰ সুবিধাসমূহৰ সম্পর্কীয় তথ্য চোৱাটো আৰম্ভ কৰিবলৈ দিয়ে।"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"এটা উচ্চ ছেম্পলিঙৰ হাৰত ছেন্সৰৰ ডেটা এক্সেছ কৰে"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"এপ্‌টোক ২০০ হাৰ্টজতকৈ অধিক হাৰত ছেন্সৰৰ ডেটাৰ নমুনা ল’বলৈ অনুমতি দিয়ে"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"ব্যৱহাৰকাৰীৰ কাৰ্য অবিহনে এপ্‌টো আপডে’ট কৰক"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"ব্যৱহাৰকাৰীৰ কাৰ্য অবিহনে ধাৰকক তেওঁ পূৰ্বে ইনষ্টল কৰা এপ্‌টো আপডে’ট কৰাৰ অনুমতি দিয়ে"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"পাছৱর্ডৰ নিয়ম ছেট কৰক"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"স্ক্ৰীন লক পাছৱৰ্ড আৰু পিনত অনুমোদিত দৈৰ্ঘ্য আৰু বৰ্ণবোৰ নিয়ন্ত্ৰণ কৰক।।"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"স্ক্ৰীন আনলক কৰা প্ৰয়াসবোৰ নিৰীক্ষণ কৰক"</string>
@@ -2135,7 +2137,7 @@
     <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>
-    <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"স্ক্ৰীণশ্বট"</string>
+    <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"স্ক্ৰীনশ্বট"</string>
     <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"হেডছেটৰ হুক"</string>
     <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"স্ক্ৰীনত সাধ্য সুবিধাৰ শ্বৰ্টকাট"</string>
     <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"স্ক্ৰীনত সাধ্য সুবিধাসমূহৰ শ্বৰ্টকাট বাছনি কৰাৰ সুবিধা"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 94ceba5..a26fe9c 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"İstifadəçinin tətbiqin funksiyaları barədə məlumatları görməyə başlamasına icazə verir."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"sensor datasına yüksək ölçmə sürəti ilə giriş etmək"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Tətbiqə sensor datasını 200 Hz-dən yüksək sürətlə ölçməyə imkan verir"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Parol qaydalarını təyin edin"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Ekran kilidinin parolu və PINlərində icazə verilən uzunluq və simvollara nəzarət edin."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Ekranı kiliddən çıxarmaq üçün edilən cəhdlərə nəzarət edin"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index fa6991f..54f9e06 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -801,6 +801,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Dozvoljava nosiocu dozvole da započne pregledanje informacija o funkcijama aplikacije."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"pristup podacima senzora pri velikoj brzini uzorkovanja"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Dozvoljava aplikaciji da uzima uzorak podataka senzora pri brzini većoj od 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"ažuriranje aplikacije bez radnji korisnika"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Dozvoljava vlasniku da ažurira aplikaciju koju je prethodno instalirala bez radnji korisnika"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Podešavanje pravila za lozinku"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontroliše dužinu i znakove dozvoljene u lozinkama i PIN-ovima za zaključavanje ekrana."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Nadgledajte pokušaje otključavanja ekrana"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 3037acb..8938da7 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -802,6 +802,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Дазваляе трымальніку запусціць прагляд інфармацыі пра функцыі для праграмы."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"атрымліваць даныя датчыка з высокай частатой дыскрэтызацыі"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Праграма зможа распазнаваць даныя датчыка з частатой звыш 200 Гц"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Устанавіць правілы паролю"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Кіраваць даўжынёй і сімваламі, дазволенымі пры ўводзе пароляў і PIN-кодаў блакіроўкі экрана."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Сачыць за спробамі разблакіроўкі экрана"</string>
@@ -2326,12 +2330,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" выкарыстоўвае абодва экраны для паказу змесціва"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Прылада моцна нагрэлася"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Функцыя \"Двайны экран\" недаступная, бо тэлефон моцна награваецца"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <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_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-bg/strings.xml b/core/res/res/values-bg/strings.xml
index a70d59f..f2fddee 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Разрешава на притежателя да стартира прегледа на информацията за функциите на дадено приложение."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"осъществяване на достъп до данните от сензорите при висока скорост на семплиране"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Разрешава на приложението да семплира данните от сензорите със скорост, по-висока от 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Задаване на правила за паролата"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролира дължината и разрешените знаци за паролите и ПИН кодовете за заключване на екрана."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Наблюдаване на опитите за отключване на екрана"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 16cbc77..78f7945 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"কোনও অ্যাপের ফিচার সম্পর্কিত তথ্য দেখা শুরু করতে অনুমতি দেয়।"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"হাই স্যাম্পলিং রেটে সেন্সর ডেটা অ্যাক্সেস করুন"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"200 Hz-এর বেশি রেটে অ্যাপকে স্যাম্পল সেন্সর ডেটার জন্য অনুমতি দিন"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"পাসওয়ার্ড নিয়মগুলি সেট করে"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"স্ক্রিন লক করার পাসওয়ার্ডগুলিতে অনুমতিপ্রাপ্ত অক্ষর এবং দৈর্ঘ্য নিয়ন্ত্রণ করে৷"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"স্ক্রিন আনলক করার প্রচেষ্টাগুলির উপরে নজর রাখুন"</string>
@@ -1699,7 +1703,7 @@
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"বন্ধ"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> অ্যাপটিকে আপনার ডিভাইসে সম্পূর্ণ নিয়ন্ত্রণের অনুমতি দিতে চান?"</string>
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"যে অ্যাপগুলি আপনাকে অ্যাক্সেসিবিলিটির প্রয়োজন মেটাতে সাহায্য করে সেই অ্যাপগুলির জন্য সম্পূর্ণ নিয়ন্ত্রণের বিষয়টি উপযুক্ত, কিন্তু তা বলে সমস্ত অ্যাপের জন্য নয়।"</string>
-    <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"স্ক্রিন দেখে নিয়ন্ত্রণ করা"</string>
+    <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"স্ক্রিন দেখা ও নিয়ন্ত্রণ করা"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"এটি স্ক্রিনের সমস্ত কন্টেন্ট পড়তে এবং অন্য অ্যাপেও কন্টেন্ট ডিসপ্লে করতে পারে।"</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"দেখুন এবং কাজটি করুন"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"এটি কোনও একটি অ্যাপের সাথে অথবা হার্ডওয়্যার সেন্সরের সাথে আপনার ইন্টার‍্যাকশন ট্র্যাক করতে এবং আপনার হয়ে বিভিন্ন অ্যাপের সাথে ইন্টার‍্যাক্ট করতে পারে।"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 0b78d26..2787e03 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -801,6 +801,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Dozvoljava vlasniku da pokrene pregled informacija o funkcijama za aplikaciju."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"pristup podacima senzora velikom brzinom uzorkovanja"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Dozvoljava aplikaciji da uzorkuje podatke senzora brzinom većom od 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"ažuriranje aplikacije bez radnje korisnika"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Nositelju omogućuje ažuriranje aplikacije koju je prethodno instalirao bez radnje korisnika"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Postavljanje pravila za lozinke"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolira dužinu i znakove koji su dozvoljeni u lozinkama za zaključavanje ekrana i PIN-ovima."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Prati pokušaje otključavanja ekrana"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index f08cb3a..fe85c5c 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -801,6 +801,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permet que el propietari vegi la informació de les funcions d\'una aplicació."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"accedir a les dades del sensor a una freqüència de mostratge alta"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permet que l\'aplicació dugui a terme un mostratge de les dades del sensor a una freqüència superior a 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Definir les normes de contrasenya"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Permet controlar la longitud i el nombre de caràcters permesos a les contrasenyes i als PIN del bloqueig de pantalla."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Supervisar els intents de desbloqueig de la pantalla"</string>
@@ -1701,8 +1705,8 @@
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Vols permetre que <xliff:g id="SERVICE">%1$s</xliff:g> controli el teu dispositiu per complet?"</string>
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"El control total és adequat per a les aplicacions que t\'ajuden amb l\'accessibilitat, però no per a la majoria de les aplicacions."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Veure i controlar la pantalla"</string>
-    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Pot llegir tot el contingut de la pantalla i mostrar contingut sobre altres aplicacions."</string>
-    <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Mostrar i dur a terme accions"</string>
+    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Pot llegir tot el contingut de la pantalla i mostrar contingut per sobre d\'altres aplicacions."</string>
+    <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Veure i dur a terme accions"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Pot fer un seguiment de les teves interaccions amb una aplicació o un sensor de maquinari, i interaccionar amb aplicacions en nom teu."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Permet"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Denega"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index d624345..a3ea1bb 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -802,6 +802,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Umožňuje držiteli zobrazit informace o funkcích aplikace."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"přístup k datům ze senzorů s vyšší vzorkovací frekvencí"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Umožňuje aplikaci vzorkovat data ze senzorů s frekvencí vyšší než 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Nastavit pravidla pro heslo"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Ovládání délky a znaků povolených v heslech a kódech PIN zámku obrazovky."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Sledovat pokusy o odemknutí obrazovky"</string>
@@ -2326,12 +2330,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> používá k zobrazení obsahu oba displeje"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Zařízení je příliš horké"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dvojitá obrazovka není k dispozici, protože se telefon příliš zahřívá"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Funkce Dual Screen není k dispozici"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Funkce Dual Screen není k dispozici, protože je zapnutý spořič baterie. Tuto možnost můžete vypnout v nastavení."</string>
+    <string name="device_state_notification_settings_button" msgid="691937505741872749">"Přejít do Nastavení"</string>
     <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Vypnout"</string>
     <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Zařízení <xliff:g id="DEVICE_NAME">%s</xliff:g> je nakonfigurováno"</string>
     <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Rozložení klávesnice je nastaveno na <xliff:g id="LAYOUT_1">%s</xliff:g>. Klepnutím jej změníte."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 46269af..1cf8097 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Giver den app, som har tilladelsen, mulighed for at se oplysninger om en apps funktioner."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"få adgang til sensordata ved høj samplingfrekvens"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Tillader, at appen kan sample sensordata ved en højere frekvens end 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Angiv regler for adgangskoder"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Tjek længden samt tilladte tegn i adgangskoder og pinkoder til skærmlåsen."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Overvåg forsøg på oplåsning af skærm"</string>
@@ -1912,7 +1916,7 @@
     <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Phishingadvarsel"</string>
     <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Arbejdsprofil"</string>
     <string name="notification_alerted_content_description" msgid="6139691253611265992">"Underrettet"</string>
-    <string name="notification_verified_content_description" msgid="6401483602782359391">"Bekræftet"</string>
+    <string name="notification_verified_content_description" msgid="6401483602782359391">"Verificeret"</string>
     <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Udvid"</string>
     <string name="expand_button_content_description_expanded" msgid="7484217944948667489">"Skjul"</string>
     <string name="expand_action_accessibility" msgid="1947657036871746627">"Slå udvidelse til eller fra"</string>
@@ -2324,12 +2328,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> bruger begge skærme til at vise indhold"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Enheden er for varm"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dobbeltskærm er ikke tilgængelig, fordi din telefon er for varm"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen er ikke tilgængelig"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen er ikke tilgængelig, fordi Batterisparefunktion er aktiveret. Du kan deaktivere dette i Indstillinger."</string>
+    <string name="device_state_notification_settings_button" msgid="691937505741872749">"Gå til Indstillinger"</string>
     <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Deaktiver"</string>
     <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> er konfigureret"</string>
     <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Tastaturlayoutet er angivet som <xliff:g id="LAYOUT_1">%s</xliff:g>. Tryk for at ændre dette."</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index afb2c73..629fc2a 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Ermöglicht der App, die Informationen über die Funktionen einer anderen App anzusehen."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"Sensordaten mit hoher Frequenz auslesen"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Erlaubt der App, Sensordaten mit einer Frequenz von mehr als 200 Hz auszulesen"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Passwortregeln festlegen"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Zulässige Länge und Zeichen für Passwörter für die Displaysperre festlegen"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Versuche zum Entsperren des Displays überwachen"</string>
@@ -1698,9 +1702,9 @@
     <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"AN"</string>
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"AUS"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"„<xliff:g id="SERVICE">%1$s</xliff:g>“ die vollständige Kontrolle über dein Gerät geben?"</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Die vollständige Kontrolle sollte nur für Apps aktiviert werden, die dir Zugang zu App-Funktionen erleichtern. Das ist in der Regel nur ein kleiner Teil der Apps."</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Die vollständige Kontrolle sollte nur für Apps aktiviert werden, die dir bei der Barrierefreiheit helfen. Das ist in der Regel nur ein kleiner Teil der Apps."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Bildschirm aufrufen und steuern"</string>
-    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Die Funktion kann alle Inhalte auf dem Bildschirm lesen und diese Inhalte über andere Apps anzeigen."</string>
+    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Die Funktion kann alle Inhalte auf dem Bildschirm lesen und diese Inhalte über anderen Apps anzeigen."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Aktionen aufrufen und durchführen"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Die Funktion kann deine Interaktionen mit einer App oder einem Hardwaresensor verfolgen und in deinem Namen mit Apps interagieren."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Zulassen"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index fd20378..1e4629b 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Επιτρέπει στον κάτοχο να ξεκινήσει την προβολή των πληροφοριών για τις λειτουργίες μιας εφαρμογής."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"πρόσβαση σε δεδομένα αισθητήρα με υψηλό ρυθμό δειγματοληψίας"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Επιτρέπει στην εφαρμογή τη δειγματοληψία των δεδομένων αισθητήρα με ρυθμό μεγαλύτερο από 200 Hz."</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Ορισμός κανόνων κωδικού πρόσβασης"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Ελέγξτε την έκταση και τους επιτρεπόμενους χαρακτήρες σε κωδικούς πρόσβασης κλειδώματος οθόνης και PIN."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Παρακολούθηση προσπαθειών ξεκλειδώματος οθόνης"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 3cee375..2d5f15a 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Allows the holder to start viewing the features info for an app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Allows the app to sample sensor data at a rate greater than 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Set password rules"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Control the length and the characters allowed in screen lock passwords and PINs."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitor screen unlock attempts"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 311c8a3..7d416c6 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Allows the holder to start viewing the features info for an app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Allows the app to sample sensor data at a rate greater than 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"update app without user action"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Allows the holder to update the app it previously installed without user action"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Set password rules"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Control the length and the characters allowed in screen lock passwords and PINs."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitor screen unlock attempts"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 9c97a49..3730bd2 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Allows the holder to start viewing the features info for an app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Allows the app to sample sensor data at a rate greater than 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Set password rules"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Control the length and the characters allowed in screen lock passwords and PINs."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitor screen unlock attempts"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 86be1a9..67d124a 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Allows the holder to start viewing the features info for an app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Allows the app to sample sensor data at a rate greater than 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Set password rules"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Control the length and the characters allowed in screen lock passwords and PINs."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitor screen unlock attempts"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 44426d7..310f821 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‏‏‏‎‎‎‎‏‏‎‏‎‎‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‏‏‎Allows the holder to start viewing the features info for an app.‎‏‎‎‏‎"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‎‎‏‎‏‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‎‎‎‎‏‏‏‎‎access sensor data at a high sampling rate‎‏‎‎‏‎"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‎‏‏‎‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‎‏‏‎Allows the app to sample sensor data at a rate greater than 200 Hz‎‏‎‎‏‎"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‎‏‏‏‏‎‏‎‏‏‎‏‏‏‎update app without user action‎‏‎‎‏‎"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‎‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‏‎‎Allows the holder to update the app it previously installed without user action‎‏‎‎‏‎"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‎‎‏‏‎‎‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‎‎‎‏‎‎‏‎‏‏‎‏‏‏‎Set password rules‎‏‎‎‏‎"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‎‏‎‏‎‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‎‎‎‎‎‎‏‎Control the length and the characters allowed in screen lock passwords and PINs.‎‏‎‎‏‎"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‎‎‎‏‏‎‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎Monitor screen unlock attempts‎‏‎‎‏‎"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index d2c12e4..9f6fa74 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -801,6 +801,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite que el propietario vea la información de las funciones de una app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"Acceder a los datos de sensores a una tasa de muestreo alta"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permite que la app tome una muestra de los datos de sensores a una tasa superior a 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Establecer reglas de contraseña"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controlar la longitud y los caracteres permitidos en las contraseñas y los PIN para el bloqueo de pantalla."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Supervisa los intentos para desbloquear la pantalla"</string>
@@ -1701,7 +1705,7 @@
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"¿Deseas permitir que <xliff:g id="SERVICE">%1$s</xliff:g> tenga el control total del dispositivo?"</string>
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"El control total es apropiado para las apps que te ayudan con las necesidades de accesibilidad, pero no para la mayoría de las apps."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Ver y controlar la pantalla"</string>
-    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Puede leer todo el contenido en la pantalla y mostrarlo sobre otras apps."</string>
+    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Puede leer todo el contenido en la pantalla y mostrar contenido sobre otras apps."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Ver y realizar acciones"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Puede realizar el seguimiento de tus interacciones con una app o un sensor de hardware, así como interactuar con las apps por ti."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Permitir"</string>
@@ -2325,12 +2329,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> está usando ambas pantallas para mostrar contenido"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"El dispositivo está muy caliente"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"La Pantalla dual no está disponible porque el teléfono se está calentando demasiado"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen no está disponible"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen no está disponible porque el Ahorro de batería está activado. Puedes desactivar esta opción en la Configuración."</string>
+    <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ir a Configuración"</string>
     <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Desactivar"</string>
     <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Se configuró <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string>
     <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Diseño de teclado establecido en <xliff:g id="LAYOUT_1">%s</xliff:g>. Presiona para cambiar esta opción."</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 9d06e15..3d16439 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -801,6 +801,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite que el titular vea la información de las funciones de una aplicación."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"acceder a datos de sensores a una frecuencia de muestreo alta"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permite que la aplicación consulte datos de sensores a una frecuencia superior a 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Establecimiento de reglas de contraseña"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controla la longitud y los caracteres permitidos en los PIN y en las contraseñas de bloqueo de pantalla."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Supervisar los intentos de desbloqueo de pantalla"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 78f5749..1dc96c3 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Võimaldab omanikul alustada rakenduse funktsioonide teabe vaatamist."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"juurdepääs anduri andmetele kõrgel diskreetimissagedusel"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Võimaldab rakendusel anduri andmeid diskreetida sagedusel, mis on suurem kui 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"rakenduse värskendamine ilma kasutaja toiminguta"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Võimaldab hoidjal värskendada varem installitud rakendust ilma kasutaja toiminguta"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Parooli reeglite määramine"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Juhitakse ekraaniluku paroolide ja PIN-koodide pikkusi ning lubatud tähemärkide seadeid."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Ekraani avamiskatsete jälgimine"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 53644927..2331536 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Aplikazio baten eginbideei buruzko informazioa ikusten hasteko baimena ematen die titularrei."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"atzitu sentsoreen datuen laginak abiadura handian"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Aplikazioak 200 Hz-tik gorako abiaduran hartu ahal izango ditu sentsoreen datuen laginak"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Ezarri pasahitzen arauak"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolatu pantaila blokeoaren pasahitzen eta PINen luzera eta onartutako karaktereak."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Gainbegiratu pantaila desblokeatzeko saiakerak"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 88dd3a6..5348e84 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"به دارنده اجازه می‌دهد اطلاعات مربوط به ویژگی‌های برنامه را مشاهده کند."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"دسترسی به داده‌های حسگر با نرخ نمونه‌برداری بالا"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"به برنامه اجازه می‌دهد داده‌های حسگر را با نرخ بیش‌از ۲۰۰ هرتز نمونه‌برداری کند"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"تنظیم قوانین گذرواژه"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"کنترل طول و نوع نویسه‌هایی که در گذرواژه و پین قفل صفحه مجاز است."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"پایش تلاش‌های باز کردن قفل صفحه"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index f007d74..2bc040e 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Antaa luvanhaltijan aloittaa sovelluksen ominaisuustietojen katselun."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"saada pääsyn anturidataan suuremmalla näytteenottotaajuudella"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Sallii sovelluksen ottaa anturidatasta näytteitä yli 200 Hz:n taajuudella"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Asentaa salasanasäännöt"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Hallinnoida ruudun lukituksen salasanoissa ja PIN-koodeissa sallittuja merkkejä ja niiden pituutta."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Tarkkailla näytön avaamisyrityksiä"</string>
@@ -2324,12 +2328,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> käyttää molempia näyttöjä sisällön näyttämiseen"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Laite on liian lämmin"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Kaksoisnäyttö ei ole käytettävissä, koska puhelin on liian lämmin"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Kaksoisnäyttö ei ole saatavilla"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Kaksoisnäyttö ei ole käytettävissä, koska Virransäästö on päällä. Voit estää tämän asetuksista."</string>
+    <string name="device_state_notification_settings_button" msgid="691937505741872749">"Siirry asetuksiin"</string>
     <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Laita pois päältä"</string>
     <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> määritetty"</string>
     <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Näppäimistöasetteluksi valittu <xliff:g id="LAYOUT_1">%s</xliff:g>. Muuta asetuksia napauttamalla."</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 409f5a2..f65d3e5 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -801,6 +801,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permet au détenteur de commencer à afficher les renseignements sur les fonctionnalités d\'une application."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"accéder aux données des capteurs à un taux d’échantillonnage élevé"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permet à l’application d’échantillonner les données des capteurs à une fréquence supérieure à 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"Mettre à jour l\'application sans intervention de l\'utilisateur"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Permet à une application précédemment installée de se mettre à jour sans intervention de l\'utilisateur"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Définir les règles du mot de passe"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Gérer le nombre et le type de caractères autorisés dans les mots de passe et les NIP de verrouillage de l\'écran."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Gérer les tentatives de déverrouillage de l\'écran"</string>
@@ -1279,18 +1281,18 @@
     <string name="dump_heap_ready_text" msgid="5849618132123045516">"Une empreinte de mémoire du processus lié à l\'application <xliff:g id="PROC">%1$s</xliff:g> peut être partagée. Attention : Cette empreinte peut contenir des renseignements personnels auxquels le processus a accès, y compris du texte que vous avez entré."</string>
     <string name="sendText" msgid="493003724401350724">"Sélectionner une action pour le texte"</string>
     <string name="volume_ringtone" msgid="134784084629229029">"Volume de la sonnerie"</string>
-    <string name="volume_music" msgid="7727274216734955095">"Volume"</string>
+    <string name="volume_music" msgid="7727274216734955095">"Volume du contenu multimédia"</string>
     <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Lecture via Bluetooth"</string>
     <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Sonnerie silencieuse sélectionnée"</string>
     <string name="volume_call" msgid="7625321655265747433">"Volume des appels entrants"</string>
     <string name="volume_bluetooth_call" msgid="2930204618610115061">"Volume d\'appels entrants sur Bluetooth"</string>
-    <string name="volume_alarm" msgid="4486241060751798448">"Volume de l\'alarme"</string>
+    <string name="volume_alarm" msgid="4486241060751798448">"Volume des alarmes"</string>
     <string name="volume_notification" msgid="6864412249031660057">"Volume des notifications"</string>
     <string name="volume_unknown" msgid="4041914008166576293">"Volume"</string>
     <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Volume Bluetooth"</string>
     <string name="volume_icon_description_ringer" msgid="2187800636867423459">"Volume de la sonnerie"</string>
-    <string name="volume_icon_description_incall" msgid="4491255105381227919">"Volume d\'appel"</string>
-    <string name="volume_icon_description_media" msgid="4997633254078171233">"Volume"</string>
+    <string name="volume_icon_description_incall" msgid="4491255105381227919">"Volume des appels"</string>
+    <string name="volume_icon_description_media" msgid="4997633254078171233">"Volume du contenu multimédia"</string>
     <string name="volume_icon_description_notification" msgid="579091344110747279">"Volume des notifications"</string>
     <string name="ringtone_default" msgid="9118299121288174597">"Sonnerie par défaut"</string>
     <string name="ringtone_default_with_actual" msgid="2709686194556159773">"Défaut (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
@@ -1728,7 +1730,7 @@
     <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Pour basculer entre les fonctionnalités, maintenez le doigt sur le bouton d\'accessibilité."</string>
     <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Pour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec deux doigts et maintenez-les-y."</string>
     <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Pour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec trois doigts et maintenez-les-y."</string>
-    <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Zoom"</string>
+    <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Agrandissement"</string>
     <string name="user_switched" msgid="7249833311585228097">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="user_switching_message" msgid="1912993630661332336">"Passage au profil : <xliff:g id="NAME">%1$s</xliff:g>…"</string>
     <string name="user_logging_out_message" msgid="7216437629179710359">"Déconnexion de <xliff:g id="NAME">%1$s</xliff:g> en cours..."</string>
@@ -2325,12 +2327,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> utilise les deux écrans pour afficher le contenu"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"L\'appareil est trop chaud"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Le double écran n\'est pas accessible, car votre téléphone est trop chaud"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"La fonctionnalité Dual Screen n\'est pas accessible"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"La fonctionnalité Dual Screen n\'est pas accessible, car l\'économiseur de pile est activé. Vous pouvez désactiver cette option dans les paramètres."</string>
+    <string name="device_state_notification_settings_button" msgid="691937505741872749">"Accéder aux paramètres"</string>
     <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Désactiver"</string>
     <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> est configuré"</string>
     <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Disposition du clavier définie à <xliff:g id="LAYOUT_1">%s</xliff:g>. Touchez pour modifier."</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 7de81a5..6092ded 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -801,6 +801,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permet à l\'appli autorisée de commencer à voir les infos sur les fonctionnalités d\'une appli."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"accéder aux données des capteurs à un taux d\'échantillonnage élevé"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Autorise l\'appli à échantillonner les données des capteurs à un taux supérieur à 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Définir les règles du mot de passe"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Gérer le nombre et le type de caractères autorisés dans les mots de passe et les codes d\'accès de verrouillage de l\'écran"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Gérer les tentatives de déverrouillage de l\'écran"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index d748991..405829d 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite que o propietario comece a ver a información das funcións dunha aplicación."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"acceder aos datos dos sensores usando unha taxa de mostraxe alta"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permite que a aplicación recompile mostras dos datos dos sensores cunha taxa superior a 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Establecer as normas de contrasinal"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controla a lonxitude e os caracteres permitidos nos contrasinais e nos PIN de bloqueo da pantalla."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Controlar os intentos de desbloqueo da pantalla"</string>
@@ -2324,12 +2328,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"A aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> está usando ambas as pantallas para mostrar contido"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"O dispositivo está demasiado quente"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"A pantalla dual non está dispoñible porque o teléfono está quentando demasiado"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen non está dispoñible"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen non está dispoñible porque a opción Aforro de batería está activado. Podes desactivar esta función en Configuración."</string>
+    <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ir a Configuración"</string>
     <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Desactivar"</string>
     <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Configurouse o teclado (<xliff:g id="DEVICE_NAME">%s</xliff:g>)"</string>
     <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"O deseño do teclado estableceuse en <xliff:g id="LAYOUT_1">%s</xliff:g>. Toca para cambialo."</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 53d7fd8..ff19bb4 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ધારકને ઍપ માટેની સુવિધાઓની માહિતી જોવાનું શરૂ કરવાની મંજૂરી આપે છે."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ઉચ્ચ સેમ્પ્લિંગ રેટ પર સેન્સરનો ડેટા ઍક્સેસ કરો"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"ઍપને 200 Hzથી વધુના દરે સેન્સરના ડેટાના નમૂનાની મંજૂરી આપે છે"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"વપરાશકર્તા દ્વારા કરવામાં આવતી ક્રિયા વિના ઍપને અપડેટ કરો"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"હોલ્ડરને વપરાશકર્તા દ્વારા કરવામાં આવતી ક્રિયા વિના, અગાઉ ઇન્સ્ટૉલ કરેલી ઍપને અપડેટ કરવાની મંજૂરી આપે છે"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"પાસવર્ડ નિયમો સેટ કરો"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"સ્ક્રીન લૉક પાસવર્ડ અને પિનમાં મંજૂર લંબાઈ અને અક્ષરોને નિયંત્રિત કરો."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"સ્ક્રીનને અનલૉક કરવાના પ્રયત્નોનું નિયમન કરો"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 84f0490..2134598 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -22,7 +22,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="byteShort" msgid="202579285008794431">"B"</string>
     <string name="fileSizeSuffix" msgid="4233671691980131257">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
-    <string name="untitled" msgid="3381766946944136678">"&lt;शीर्षक-रहित&gt;"</string>
+    <string name="untitled" msgid="3381766946944136678">"&lt;टाइटल-रहित&gt;"</string>
     <string name="emptyPhoneNumber" msgid="5812172618020360048">"(कोई फ़ोन नंबर नहीं)"</string>
     <string name="unknownName" msgid="7078697621109055330">"अज्ञात"</string>
     <string name="defaultVoiceMailAlphaTag" msgid="2190754495304236490">"वॉइसमेल"</string>
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ऐप्लिकेशन को, किसी ऐप्लिकेशन की सुविधाओं की जानकारी देखने की अनुमति देता है."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"सेंसर डेटा को, नमूने लेने की तेज़ दर पर ऐक्सेस करें"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"यह अनुमति मिलने पर ऐप्लिकेशन, 200 हर्ट्ज़ से ज़्यादा की दर पर सेंसर डेटा का नमूना ले पाएगा"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"ऐप्लिकेशन अपने-आप अपडेट होने की अनुमति दें"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"इससे होल्डर उस ऐप्लिकेशन को अपने-आप अपडेट कर पाएगा जो उसने पहले इंस्टॉल किया था"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियम सेट करना"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्‍क्रीन लॉक पासवर्ड और पिन की लंबाई और उनमें स्वीकृत वर्णों को नियंत्रित करना."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"स्‍क्रीन अनलॉक करने के की कोशिशों पर नज़र रखना"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index eff5524..5959388 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -801,6 +801,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Dopušta nositelju pokretanje prikaza informacija o značajkama aplikacije."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"pristup podacima senzora pri višoj brzini uzorkovanja"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Aplikaciji omogućuje uzorkovanje podataka senzora pri brzini većoj od 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"ažuriranje aplikacije bez radnje korisnika"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Nositelju omogućuje ažuriranje aplikacije koju je prethodno instalirao bez radnje korisnika"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Postavi pravila zaporke"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Upravlja duljinom i znakovima koji su dopušteni u zaporkama i PIN-ovima zaključavanja zaslona."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Nadziri pokušaje otključavanja zaslona"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index e61aba4..757598e 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Engedélyezi az alkalmazás számára, hogy megkezdje az alkalmazások funkcióira vonatkozó adatok megtekintését."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"hozzáférés a szenzoradatokhoz nagy mintavételezési gyakorisággal"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Lehetővé teszi az alkalmazás számára, hogy 200 Hz-nél magasabb gyakorisággal vegyen mintát a szenzoradatokból"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Jelszavakkal kapcsolatos szabályok beállítása"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"A képernyőzár jelszavaiban és PIN kódjaiban engedélyezett karakterek és hosszúság vezérlése."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Képernyőzár-feloldási kísérletek figyelése"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index b1e226e..ae2134e 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Թույլ է տալիս դիտել հավելվածի գործառույթների մասին տեղեկությունները։"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"օգտագործել սենսորների տվյալները բարձր հաճախականության վրա"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Թույլ է տալիս հավելվածին փորձել սենսորների տվյալները 200 Հց-ից բարձր հաճախականության վրա"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Սահմանել գաղտնաբառի կանոնները"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Կառավարել էկրանի ապակողպման գաղտնաբառերի և PIN կոդերի թույլատրելի երկարությունն ու գրանշանները:"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Վերահսկել էկրանի ապակողպման փորձերը"</string>
@@ -2130,7 +2134,7 @@
     <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Հավելվածը ձայնագրելու թույլտվություն չունի, սակայն կկարողանա գրանցել ձայնն այս USB սարքի միջոցով։"</string>
     <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_recents_label" msgid="4782875610281649728">"Վերջին հավելվածներ"</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>
@@ -2324,12 +2328,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը երկու էկրաններն էլ օգտագործում է բովանդակություն ցուցադրելու համար"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Սարքը գերտաքացել է"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Կրկնակի էկրանն անհասանելի է, քանի որ ձեր հեռախոսը գերտաքանում է"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <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_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-in/strings.xml b/core/res/res/values-in/strings.xml
index ca97e22..8f9199f 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Memungkinkan pemegang mulai melihat info fitur untuk aplikasi."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"mengakses data sensor pada frekuensi sampling yang tinggi"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Mengizinkan aplikasi mengambil sampel data sensor pada frekuensi yang lebih besar dari 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Setel aturan sandi"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Mengontrol panjang dan karakter yang diizinkan dalam sandi dan PIN kunci layar."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Pantau upaya pembukaan kunci layar"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 77ade61..330c0d9 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Leyfir handhafa að skoða upplýsingar um eiginleika tiltekins forrits."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"aðgangur að skynjaragögnum með hárri upptökutíðni"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Leyfir forritinu að nota upptökutíðni yfir 200 Hz fyrir skynjaragögn"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Setja reglur um aðgangsorð"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Stjórna lengd og fjölda stafa í aðgangsorðum og PIN-númerum skjáláss."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Fylgjast með tilraunum til að taka skjáinn úr lás"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 8d57810..e2bd8db 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -801,6 +801,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Consente all\'app che ha questa autorizzazione di iniziare a visualizzare le informazioni relative alle funzionalità di un\'app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"Accesso ai dati dei sensori a una frequenza di campionamento elevata"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Consente all\'app di campionare i dati dei sensori a una frequenza maggiore di 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"Aggiornamento dell\'app senza l\'intervento dell\'utente"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Consente al titolare di questa autorizzazione di aggiornare l\'app installata in precedenza senza l\'intervento dell\'utente"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Impostare regole per le password"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controlla la lunghezza e i caratteri ammessi nelle password e nei PIN del blocco schermo."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitorare tentativi di sblocco dello schermo"</string>
@@ -1634,7 +1636,7 @@
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Impostazioni"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Disconnetti"</string>
     <string name="media_route_status_scanning" msgid="8045156315309594482">"Ricerca in corso..."</string>
-    <string name="media_route_status_connecting" msgid="5845597961412010540">"Connessione..."</string>
+    <string name="media_route_status_connecting" msgid="5845597961412010540">"Connessione in corso..."</string>
     <string name="media_route_status_available" msgid="1477537663492007608">"Disponibile"</string>
     <string name="media_route_status_not_available" msgid="480912417977515261">"Non disponibili"</string>
     <string name="media_route_status_in_use" msgid="6684112905244944724">"In uso"</string>
@@ -2325,12 +2327,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> sta usando entrambi i display per mostrare contenuti"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Il dispositivo è troppo caldo"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Il doppio schermo non è disponibile perché il telefono si sta surriscaldando"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen non disponibile"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Il doppio schermo non è disponibile perché il Risparmio energetico è attivato. Puoi disattivare questa opzione in Impostazioni."</string>
+    <string name="device_state_notification_settings_button" msgid="691937505741872749">"Vai a Impostazioni"</string>
     <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Disattiva"</string>
     <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Dispositivo <xliff:g id="DEVICE_NAME">%s</xliff:g> configurato"</string>
     <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Layout tastiera impostato su <xliff:g id="LAYOUT_1">%s</xliff:g>. Tocca per cambiare l\'impostazione."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 9e283fa..bdc4821 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -801,6 +801,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"בעלי ההרשאה יוכלו להתחיל לצפות בפרטי התכונות של אפליקציות."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"גישה לנתוני חיישנים בתדירות דגימה גבוהה"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"האפליקציה תוכל לדגום נתוני חיישנים בתדירות של מעל 200 הרץ"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"הגדרת כללי סיסמה"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי האימות של מסך הנעילה."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"מעקב אחר ניסיונות לביטול של נעילת המסך"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 7d2b2a5..93ef258 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"アプリの機能情報の表示の開始を所有者に許可します。"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"高サンプリング レートでセンサーデータにアクセスする"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"200 Hz を超えるレートでセンサーデータをサンプリングすることをアプリに許可します"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"ユーザーの操作なしでアプリを更新する"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"ユーザーの操作なしで以前にインストールされたアプリの更新をホルダーに許可します"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"パスワードルールの設定"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"画面ロックのパスワードとPINの長さと使用できる文字を制御します。"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"画面ロック解除試行の監視"</string>
@@ -2324,12 +2326,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g>は 2 画面でコンテンツを表示しています"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"デバイスが熱くなりすぎています"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"スマートフォンが熱くなりすぎているため、デュアル スクリーンを使用できません"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"デュアル スクリーンを使用できません"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"バッテリー セーバーが ON のため、デュアル スクリーンを使用できません。この動作は設定で OFF にできます。"</string>
+    <string name="device_state_notification_settings_button" msgid="691937505741872749">"設定に移動"</string>
     <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-ka/strings.xml b/core/res/res/values-ka/strings.xml
index af735ea..85050b8 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"მფლობელს საშუალებას აძლევს, დაიწყოს აპის ფუნქციების ინფორმაციის ნახვა."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"სენსორის მონაცემებზე წვდომა სემპლინგის მაღალი სიხშირით"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"საშუალებას აძლევს აპს, მიიღოს სენსორის მონაცემების ნიმუშები 200 ჰც-ზე მეტი სიხშირით"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"პაროლის წესების დაყენება"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"აკონტროლეთ ეკრანის ბლოკირების პაროლებისა და PIN-ების სიმბოლოების სიგრძე."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"ეკრანის განბლოკვის მცდელობების მონიტორინგი"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 5fbe915..f2b9318 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Қолданбаға функциялар туралы ақпаратты көре бастауды кідіртуге мүмкіндік береді."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"жоғары дискретизация жиілігіндегі датчик деректерін пайдалану"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Қолданбаға жиілігі 200 Гц-тен жоғары датчик деректерінің үлгісін таңдауға рұқсат береді."</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Құпия сөз ережелерін тағайындау"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Экран бекітпесінің құпия сөздерінің және PIN кодтарының ұзындығын және оларда рұқсат етілген таңбаларды басқару."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Экран құлпын ашу әркеттерін бақылау"</string>
@@ -2130,7 +2134,7 @@
     <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Қолданбаға жазу рұқсаты берілмеді, бірақ ол осы USB құрылғысы арқылы дыбыс жаза алады."</string>
     <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_recents_label" msgid="4782875610281649728">"Соңғы қолданбалар"</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>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index f69ff8a..313df92 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"អនុញ្ញាតឱ្យកម្មវិធី​ចាប់ផ្ដើម​មើលព័ត៌មានមុខងារ​សម្រាប់កម្មវិធី។"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ចូលប្រើទិន្នន័យ​ឧបករណ៍ចាប់សញ្ញា​នៅអត្រាសំណាកខ្ពស់"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"អនុញ្ញាតឱ្យកម្មវិធី​ធ្វើសំណាកទិន្នន័យ​ឧបករណ៍ចាប់សញ្ញា​នៅអត្រាលើសពី 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"ដំឡើងកំណែកម្មវិធីដោយមិនចាំបាច់មានសកម្មភាពរបស់អ្នកប្រើប្រាស់"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"អនុញ្ញាតឱ្យម្ចាស់សិទ្ធិដំឡើងកំណែកម្មវិធីដែលខ្លួនបានដំឡើងពីមុនដោយមិនចាំបាច់មានសកម្មភាពរបស់អ្នកប្រើប្រាស់"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"កំណត់​ក្បួន​ពាក្យ​សម្ងាត់"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"គ្រប់គ្រងប្រវែង និងតួអក្សរដែលអនុញ្ញាតឲ្យប្រើក្នុងពាក្យសម្ងាត់ និងលេខសម្ងាត់ចាក់សោអេក្រង់។"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"តាមដាន​ការ​ព្យាយាម​ដោះ​សោ​អេក្រង់"</string>
@@ -1702,7 +1704,7 @@
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"មើល និង​គ្រប់គ្រងអេក្រង់"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"វា​អាចអានខ្លឹមសារទាំងអស់​នៅលើអេក្រង់ និងបង្ហាញខ្លឹមសារ​លើកម្មវិធីផ្សេងទៀត។"</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"មើល និង​ធ្វើសកម្មភាព"</string>
-    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"វា​អាចតាមដានអន្តរកម្មរបស់អ្នកជាមួយនឹងកម្មវិធី ឬឧបករណ៍ចាប់​សញ្ញាហាតវែរ និងធ្វើអន្តរកម្ម​ជាមួយកម្មវិធីនានា​ជំនួសឱ្យអ្នក។"</string>
+    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"វា​អាចតាមដានអន្តរកម្មរបស់អ្នកជាមួយនឹងកម្មវិធី ឬសេនស័រហាតវែរ និងធ្វើអន្តរកម្ម​ជាមួយកម្មវិធីនានា​ជំនួសឱ្យអ្នក។"</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"អនុញ្ញាត"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"បដិសេធ"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ចុចមុខងារណាមួយ ដើម្បចាប់ផ្ដើមប្រើ៖"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index b503d6b..9800ae1 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ಆ್ಯಪ್‌ನ ವೈಶಿಷ್ಟ್ಯಗಳ ಮಾಹಿತಿಯನ್ನು ವೀಕ್ಷಿಸಲು ಬಳಕೆದಾರರನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ಹೆಚ್ಚಿನ ನಮೂನೆ ದರದಲ್ಲಿ ಸೆನ್ಸಾರ್ ಡೇಟಾ ಪ್ರವೇಶಿಸಿ"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"200 Hz ಗಿಂತಲೂ ಹೆಚ್ಚಿನ ವೇಗದಲ್ಲಿ ಸೆನ್ಸಾರ್ ಡೇಟಾದ ಮಾದರಿ ಪರೀಕ್ಷಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"ಪಾಸ್‌ವರ್ಡ್ ನಿಮಯಗಳನ್ನು ಹೊಂದಿಸಿ"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"ಪರದೆ ಲಾಕ್‌ನಲ್ಲಿನ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಪಿನ್‌ಗಳ ಅನುಮತಿಸಲಾದ ಅಕ್ಷರಗಳ ಪ್ರಮಾಣವನ್ನು ನಿಯಂತ್ರಿಸಿ."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"ಪರದೆಯ ಅನ್‌ಲಾಕ್ ಪ್ರಯತ್ನಗಳನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಿ"</string>
@@ -1489,7 +1493,7 @@
     <string name="forward_intent_to_work" msgid="3620262405636021151">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"ಇನ್‌ಪುಟ್ ವಿಧಾನ"</string>
     <string name="sync_binding_label" msgid="469249309424662147">"ಸಿಂಕ್ ಮಾಡು"</string>
-    <string name="accessibility_binding_label" msgid="1974602776545801715">"ಪ್ರವೇಶಿಸುವಿಕೆ"</string>
+    <string name="accessibility_binding_label" msgid="1974602776545801715">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ"</string>
     <string name="wallpaper_binding_label" msgid="1197440498000786738">"ವಾಲ್‌ಪೇಪರ್"</string>
     <string name="chooser_wallpaper" msgid="3082405680079923708">"ವಾಲ್‌ಪೇಪರ್ ಬದಲಿಸಿ"</string>
     <string name="notification_listener_binding_label" msgid="2702165274471499713">"ಅಧಿಸೂಚನೆ ಕೇಳುಗ"</string>
@@ -1686,19 +1690,19 @@
     <string name="csd_dose_repeat_warning" product="default" msgid="6765471037071089401">"ಎಚ್ಚರಿಕೆ,\nಒಬ್ಬ ವ್ಯಕ್ತಿ ಒಂದು ವಾರದಲ್ಲಿ ಹೆಡ್‌ಫೋನ್‌ಗಳ ಮೂಲಕ ಸುರಕ್ಷಿತವಾಗಿ ಆಲಿಸಬಹುದಾದ ಗಟ್ಟಿಯಾದ ವಾಲ್ಯೂಮ್‌ನ 5 ಪಟ್ಟು ಮಿತಿಯನ್ನು ನೀವು ಮೀರಿದ್ದೀರಿ.\n\nನಿಮ್ಮ ಆಲಿಸುವ ಸಾಮರ್ಥ್ಯವನ್ನು ರಕ್ಷಿಸುವುದಕ್ಕಾಗಿ ವಾಲ್ಯೂಮ್ ಅನ್ನು ಕಡಿಮೆಗೊಳಿಸಲಾಗಿದೆ."</string>
     <string name="csd_entering_RS2_warning" product="default" msgid="3699509945325496807">"ನೀವು ಪ್ರಸ್ತುತ ಆಲಿಸುತ್ತಿರುವ ವಾಲ್ಯೂಮ್‌ನಲ್ಲಿ ಮಾಧ್ಯಮವನ್ನು ಆಲಿಸುವುದನ್ನು ನೀವು ದೀರ್ಘಕಾಲ ಮುಂದುವರಿಸಿದರೆ, ನಿಮ್ಮ ಆಲಿಸುವ ಸಾಮರ್ಥ್ಯಕ್ಕೆ ಹಾನಿಯುಂಟಾಗಬಹುದು.\n\nಇದೇ ವಾಲ್ಯೂಮ್‌ನಲ್ಲಿ ದೀರ್ಘಕಾಲದವರೆಗೆ ಮಾಧ್ಯಮವನ್ನು ಪ್ಲೇ ಮಾಡುವುದನ್ನು ಮುಂದುವರಿಸಿದರೆ ನಿಮ್ಮ ಆಲಿಸುವ ಸಾಮರ್ಥ್ಯಕ್ಕೆ ಹಾನಿಯುಂಟಾಗಬಹುದು."</string>
     <string name="csd_momentary_exposure_warning" product="default" msgid="7861896191081176454">"ಎಚ್ಚರಿಕೆ,\nನೀವು ಪ್ರಸ್ತುತ ಅಸುರಕ್ಷಿತ ವಾಲ್ಯೂಮ್‌ನಲ್ಲಿ ಪ್ಲೇ ಆಗುತ್ತಿರುವ ಮಾಧ್ಯಮವನ್ನು ಆಲಿಸುತ್ತಿದ್ದೀರಿ.\n\nಇಷ್ಟು ಗಟ್ಟಿಯಾದ ವಾಲ್ಯೂಮ್‌ನಲ್ಲಿ ಆಲಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿದರೆ, ನಿಮ್ಮ ಆಲಿಸುವ ಸಾಮರ್ಥ್ಯಕ್ಕೆ ಶಾಶ್ವತ ಹಾನಿಯುಂಟಾಗುತ್ತದೆ."</string>
-    <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್ ಬಳಸುವುದೇ?"</string>
-    <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ಶಾರ್ಟ್‌ಕಟ್ ಆನ್ ಆಗಿರುವಾಗ, ಎರಡೂ ವಾಲ್ಯೂಮ್ ಬಟನ್‌ಗಳನ್ನು 3 ಸೆಕೆಂಡುಗಳ ಕಾಲ ಒತ್ತಿದರೆ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವೊಂದು ಪ್ರಾರಂಭವಾಗುತ್ತದೆ."</string>
-    <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯಗಳಿಗಾಗಿ ಶಾರ್ಟ್‌ಕಟ್ ಆನ್ ಮಾಡಬೇಕೇ?"</string>
-    <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಕೆಲವು ಸೆಕೆಂಡುಗಳ ಕಾಲ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವುದರಿಂದ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯಗಳು ಆನ್ ಆಗುತ್ತವೆ. ಇದು ನಿಮ್ಮ ಸಾಧನವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಬದಲಾಯಿಸಬಹುದು.\n\n ಪ್ರಸ್ತುತ ವೈಶಿಷ್ಟ್ಯಗಳು:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿಯಲ್ಲಿ ಆಯ್ದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ನೀವು ಬದಲಾಯಿಸಬಹುದು."</string>
+    <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಶಾರ್ಟ್‌ಕಟ್ ಬಳಸುವುದೇ?"</string>
+    <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ಶಾರ್ಟ್‌ಕಟ್ ಆನ್ ಆಗಿರುವಾಗ, ಎರಡೂ ವಾಲ್ಯೂಮ್ ಬಟನ್‌ಗಳನ್ನು 3 ಸೆಕೆಂಡುಗಳ ಕಾಲ ಒತ್ತಿದರೆ ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ವೈಶಿಷ್ಟ್ಯವೊಂದು ಪ್ರಾರಂಭವಾಗುತ್ತದೆ."</string>
+    <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ವೈಶಿಷ್ಟ್ಯಗಳಿಗಾಗಿ ಶಾರ್ಟ್‌ಕಟ್ ಆನ್ ಮಾಡಬೇಕೇ?"</string>
+    <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಕೆಲವು ಸೆಕೆಂಡುಗಳ ಕಾಲ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವುದರಿಂದ ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ವೈಶಿಷ್ಟ್ಯಗಳು ಆನ್ ಆಗುತ್ತವೆ. ಇದು ನಿಮ್ಮ ಸಾಧನವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಬದಲಾಯಿಸಬಹುದು.\n\n ಪ್ರಸ್ತುತ ವೈಶಿಷ್ಟ್ಯಗಳು:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿಯಲ್ಲಿ ಆಯ್ದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ನೀವು ಬದಲಾಯಿಸಬಹುದು."</string>
     <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string>
     <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"ಶಾರ್ಟ್‌ಕಟ್ <xliff:g id="SERVICE">%1$s</xliff:g>ಆನ್‌ ಮಾಡಬೇಕೇ?"</string>
-    <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಕೆಲವು ಸೆಕೆಂಡುಗಳ ಕಾಲ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವುದರಿಂದ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವಾದ <xliff:g id="SERVICE">%1$s</xliff:g> ಆನ್ ಆಗುತ್ತದೆ. ಇದು ನಿಮ್ಮ ಸಾಧನವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಬದಲಾಯಿಸಬಹುದು.\n\nನೀವು ಈ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಅಕ್ಸೆಸಿಬಿಲಿಟಿಯಲ್ಲಿನ ಮತ್ತೊಂದು ವೈಶಿಷ್ಟ್ಯಕ್ಕೆ ಬದಲಾಯಿಸಬಹುದು."</string>
+    <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಕೆಲವು ಸೆಕೆಂಡುಗಳ ಕಾಲ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವುದರಿಂದ ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ವೈಶಿಷ್ಟ್ಯವಾದ <xliff:g id="SERVICE">%1$s</xliff:g> ಆನ್ ಆಗುತ್ತದೆ. ಇದು ನಿಮ್ಮ ಸಾಧನವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಬದಲಾಯಿಸಬಹುದು.\n\nನೀವು ಈ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಅಕ್ಸೆಸಿಬಿಲಿಟಿಯಲ್ಲಿನ ಮತ್ತೊಂದು ವೈಶಿಷ್ಟ್ಯಕ್ಕೆ ಬದಲಾಯಿಸಬಹುದು."</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_off" msgid="5531598275559472393">"ಆಫ್ ಆಗಿದೆ"</string>
-    <string name="accessibility_enable_service_title" msgid="3931558336268541484">"ನಿಮ್ಮ ಸಾಧನದ ಪೂರ್ಣ ನಿಯಂತ್ರಣ ಹೊಂದಲು <xliff:g id="SERVICE">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೆ?"</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"ಪ್ರವೇಶಿಸುವಿಕೆಯ ಅವಶ್ಯಕತೆಗಳಿಗೆ ಸಹಾಯ ಮಾಡುವ ಆ್ಯಪ್‌ಗಳಿಗೆ ಪೂರ್ಣ ನಿಯಂತ್ರಣ ನೀಡುವುದು ಸೂಕ್ತವಾಗಿರುತ್ತದೆ, ಆದರೆ ಬಹುತೇಕ ಆ್ಯಪ್‌ಗಳಿಗೆ ಇದು ಸೂಕ್ತವಲ್ಲ."</string>
+    <string name="accessibility_enable_service_title" msgid="3931558336268541484">"ನಿಮ್ಮ ಸಾಧನದ ಸಂಪೂರ್ಣ ನಿಯಂತ್ರಣವನ್ನು ಹೊಂದಲು <xliff:g id="SERVICE">%1$s</xliff:g>ಗೆ ಅನುಮತಿಸಬೇಕೆ?"</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಅವಶ್ಯಕತೆಗಳ ಕುರಿತು ನಿಮಗೆ ಸಹಾಯ ಮಾಡುವ ಆ್ಯಪ್‌ಗಳಿಗೆ ಸಂಪೂರ್ಣ ನಿಯಂತ್ರಣ ನೀಡುವುದು ಸೂಕ್ತವಾಗಿರುತ್ತದೆ, ಆದರೆ ಬಹುತೇಕ ಆ್ಯಪ್‌ಗಳಿಗೆ ಇದು ಸೂಕ್ತವಲ್ಲ."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"ಸ್ಕ್ರೀನ್ ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"ಇದು ಪರದೆಯ ಮೇಲಿನ ಎಲ್ಲಾ ವಿಷಯವನ್ನು ಓದಬಹುದು ಮತ್ತು ಇತರ ಆ್ಯಪ್‌ಗಳ ಮೇಲೆ ವಿಷಯವನ್ನು ಪ್ರದರ್ಶಿಸಬಹುದು."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"ಕ್ರಿಯೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿರ್ವಹಿಸಿ"</string>
@@ -1706,7 +1710,7 @@
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"ಅನುಮತಿಸಿ"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"ನಿರಾಕರಿಸಿ"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ವೈಶಿಷ್ಟ್ದ ಬಳಸುವುದನ್ನು ಪ್ರಾರಂಭಿಸಲು ಅದನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ:"</string>
-    <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಜೊತೆಗೆ ಬಳಸಲು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಬಟನ್ ಜೊತೆಗೆ ಬಳಸಲು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"ವಾಲ್ಯೂಮ್ ಕೀ ಶಾರ್ಟ್‌ಕಟ್ ಜೊತೆಗೆ ಬಳಸಲು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ಅನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ"</string>
     <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"ಶಾರ್ಟ್‌ಕಟ್‌‍ಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
@@ -1721,10 +1725,10 @@
     <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>
     <string name="accessibility_shortcut_spoken_feedback" msgid="3760999147597564314">"ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಬಿಡುಗಡೆ ಮಾಡಿ. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಆನ್ ಮಾಡಲು, ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಮತ್ತೊಮ್ಮೆ 3 ಸೆಕೆಂಡ್‌ಗಳ ಕಾಲ ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
-    <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"ನೀವು ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಟ್ಯಾಪ್ ಮಾಡಿದಾಗ ಬಳಸುವುದಕ್ಕಾಗಿ ವೈಶಿಷ್ಟ್ಯವೊಂದನ್ನು ಆರಿಸಿ:"</string>
-    <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"ಪ್ರವೇಶಿಸುವಿಕೆ ಗೆಸ್ಚರ್‌ನೊಂದಿಗೆ ಬಳಸಲು ವೈಶಿಷ್ಟ್ಯವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ (ಎರಡು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಪರದೆಯ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ):"</string>
-    <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"ಪ್ರವೇಶಿಸುವಿಕೆ ಗೆಸ್ಚರ್‌ನೊಂದಿಗೆ ಬಳಸಲು ವೈಶಿಷ್ಟ್ಯವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ (ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಪರದೆಯ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ):"</string>
-    <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"ವೈಶಿಷ್ಟ್ಯಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್‌ ಮಾಡಿ."</string>
+    <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"ನೀವು ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಬಟನ್ ಟ್ಯಾಪ್ ಮಾಡಿದಾಗ ಬಳಸುವುದಕ್ಕಾಗಿ ವೈಶಿಷ್ಟ್ಯವೊಂದನ್ನು ಆರಿಸಿ:"</string>
+    <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಗೆಸ್ಚರ್‌ನೊಂದಿಗೆ ಬಳಸಲು ವೈಶಿಷ್ಟ್ಯವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ (ಎರಡು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಪರದೆಯ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ):"</string>
+    <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಗೆಸ್ಚರ್‌ನೊಂದಿಗೆ ಬಳಸಲು ವೈಶಿಷ್ಟ್ಯವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ (ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಪರದೆಯ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ):"</string>
+    <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"ವೈಶಿಷ್ಟ್ಯಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಬಟನ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್‌ ಮಾಡಿ."</string>
     <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"ವೈಶಿಷ್ಟ್ಯಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಎರಡು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string>
     <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"ವೈಶಿಷ್ಟ್ಯಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string>
     <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ಹಿಗ್ಗಿಸುವಿಕೆ"</string>
@@ -2005,7 +2009,7 @@
     <string name="app_category_news" msgid="1172762719574964544">"ಸುದ್ದಿ ಮತ್ತು ನಿಯತಕಾಲಿಕೆಗಳು"</string>
     <string name="app_category_maps" msgid="6395725487922533156">"Maps ಮತ್ತು ನ್ಯಾವಿಗೇಶನ್"</string>
     <string name="app_category_productivity" msgid="1844422703029557883">"ಉತ್ಪಾದಕತೆ"</string>
-    <string name="app_category_accessibility" msgid="6643521607848547683">"ಪ್ರವೇಶಿಸುವಿಕೆ"</string>
+    <string name="app_category_accessibility" msgid="6643521607848547683">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ"</string>
     <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"ಸಾಧನ ಸಂಗ್ರಹಣೆ"</string>
     <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆ"</string>
     <string name="time_picker_hour_label" msgid="4208590187662336864">"ಗಂಟೆ"</string>
@@ -2137,9 +2141,9 @@
     <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ಲಾಕ್ ಸ್ಕ್ರೀನ್"</string>
     <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್"</string>
     <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"ಹೆಡ್‌ಸೆಟ್ ಹುಕ್"</string>
-    <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿನ ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್"</string>
-    <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿನ ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್ ಆಯ್ಕೆ"</string>
-    <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್"</string>
+    <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿನ ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಶಾರ್ಟ್‌ಕಟ್"</string>
+    <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿನ ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಶಾರ್ಟ್‌ಕಟ್ ಆಯ್ಕೆ"</string>
+    <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಶಾರ್ಟ್‌ಕಟ್"</string>
     <string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"ಅಧಿಸೂಚನೆಯ ಪರದೆಯನ್ನು ವಜಾಗೊಳಿಸಿ"</string>
     <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad ನ ಮೇಲಿನ ಬಟನ್"</string>
     <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad ನ ಕೆಳಗಿನ ಬಟನ್"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 78dd9ec..37c8bc7 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"권한을 보유한 앱에서 앱의 기능 정보를 보도록 허용합니다."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"더 높은 샘플링 레이트로 센서 데이터 액세스"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"앱에서 200Hz보다 빠른 속도로 센서 데이터를 샘플링하도록 허용합니다."</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"비밀번호 규칙 설정"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"화면 잠금 비밀번호와 PIN에 허용되는 길이와 문자 수를 제어합니다."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"화면 잠금 해제 시도 모니터링"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 5e3e3d9..8d5bbe4 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Колдонуучуга функциялары тууралуу маалыматты көрүп баштоо мүмкүнчүлүгүн берет."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"үлгүнү жаздыруу ылдамдыгы жогору болгон сенсор дайындарынын үлгүсүнө мүмкүнчүлүк алуу"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Колдонмолорго сенсор дайындарынын үлгүсү 200 Герцтен жогору болгон үлгүлөрдү алууга уруксат берет"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"колдонмону автоматтык түрдө жаңыртуу"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Буга чейин орнотулган колдонмону автоматтык түрдө жаңыртууга мүмкүндүк берет"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Сырсөз эрежелерин коюу"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Экран кулпусунун сырсөздөрү менен PIN\'дерине уруксат берилген узундук менен белгилерди көзөмөлдөө."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Экран кулпусун ачуу аракеттерин көзөмөлдөө"</string>
@@ -2132,7 +2134,7 @@
     <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_quick_settings_label" msgid="4583900123506773783">"Ыкчам жөндөөлөр"</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>
     <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 700940d..ca879a3 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ອະນຸຍາດໃຫ້ຜູ້ຖືເລີ່ມການເບິ່ງຂໍ້ມູນຄຸນສົມບັດສຳລັບແອັບໃດໜຶ່ງ."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ເຂົ້າເຖິງຂໍ້ມູນເຊັນເຊີໃນອັດຕາຕົວຢ່າງສູງ"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"ອະນຸຍາດໃຫ້ແອັບສຸ່ມຕົວຢ່າງຂໍ້ມູນເຊັນເຊີໃນອັດຕາທີ່ຫຼາຍກວ່າ 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"ອັບເດດແອັບໂດຍບໍ່ຕ້ອງມີຄຳສັ່ງຜູ້ໃຊ້"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"ອະນຸຍາດໃຫ້ຜູ້ຖືອັບເດດແອັບທີ່ໄດ້ຕິດຕັ້ງໄວ້ກ່ອນໜ້າໂດຍບໍ່ຕ້ອງມີຄຳສັ່ງຜູ້ໃຊ້"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"ຕັ້ງຄ່າກົດຂອງລະຫັດຜ່ານ"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"ຄວບຄຸມຄວາມຍາວ ແລະຕົວອັກສອນທີ່ອະ​ນຸ​ຍາດ​ໃຫ້​ຢູ່​ໃນລະ​ຫັດລັອກໜ້າຈໍ ແລະ PIN."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"ຕິດຕາມການພະຍາຍາມປົດລັອກໜ້າຈໍ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 86b8903..20e1f87 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -802,6 +802,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Savininkui leidžiama pradėti programos funkcijų informacijos peržiūrą."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"pasiekti jutiklių duomenis dideliu skaitmeninimo dažniu"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Programai leidžiama skaitmeninti jutiklių duomenis didesniu nei 200 Hz dažniu"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Nustatyti slaptažodžio taisykles"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Valdykite, kokio ilgio ekrano užrakto slaptažodžius ir PIN kodus galima naudoti."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Stebėti bandymus atrakinti ekraną"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 123e43a..14df78f 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -801,6 +801,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Lietotne ar šo atļauju var skatīt informāciju par citas lietotnes funkcijām."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"piekļuve sensoru datiem, izmantojot augstu iztveršanas frekvenci"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Ļauj lietotnei iztvert sensoru datus, izmantojot frekvenci, kas ir augstāka par 200 Hz."</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Paroles kārtulu iestatīšana"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolēt ekrāna bloķēšanas paroļu un PIN garumu un tajos atļautās rakstzīmes."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Ekrāna atbloķēšanas mēģinājumu pārraudzīšana"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 746f06f..b13ce62 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"му дозволува на сопственикот да почне со прегледување на податоците за функциите за некоја апликација"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"пристапува до податоците со висока фреквенција на семпл"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Дозволува апликацијата да пристапува до податоците од сензорите со фреквенција на семпл поголема од 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Постави правила за лозинката"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролирај ги должината и знаците што се дозволени за лозинки и PIN-броеви за отклучување екран."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Следи ги обидите за отклучување на екранот"</string>
@@ -1701,7 +1705,7 @@
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"Целосната контрола е соодветна за апликации што ви помагаат со потребите за пристапност, но не и за повеќето апликации."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Приказ и контрола на екранот"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Може да ги чита сите содржини на екранот и да прикажува содржини врз другите апликации."</string>
-    <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Преглед и вршење на дејствата"</string>
+    <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Преглед и вршење дејства"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Може да ја следи вашата интеракција со апликациите или хардверскиот сензор и да врши интеракција со апликациите во ваше име."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Дозволи"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Одбиј"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 69c96f3..e8f0b52 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ആപ്പിനുള്ള ഫീച്ചറുകളുടെ വിവരങ്ങൾ കാണാൻ ആരംഭിക്കാൻ ഹോൾഡറിനെ അനുവദിക്കുന്നു."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ഉയർന്ന സാം‍പ്ലിംഗ് റേറ്റിൽ സെൻസർ ഡാറ്റ ആക്സസ് ചെയ്യുക"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"200 Hz-നേക്കാൾ ഉയർന്ന റേറ്റിൽ സെൻസർ ഡാറ്റ സാമ്പിൾ ചെയ്യാൻ ആപ്പിനെ അനുവദിക്കുന്നു"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"ഉപയോക്താവിന്റെ പ്രവർത്തനമില്ലാതെ തന്നെ ആപ്പ് അപ്ഡേറ്റ് ചെയ്യുക"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"മുമ്പ് ഹോൾഡർ ഇൻസ്റ്റാൾ ചെയ്ത ആപ്പ്, ഉപയോക്താവിന്റെ പ്രവർത്തനമില്ലാതെ തന്നെ അപ്ഡേറ്റ് ചെയ്യാൻ ആ ഹോൾഡറെ അനുവദിക്കുന്നു"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"പാസ്‌വേഡ് നിയമങ്ങൾ സജ്ജീകരിക്കുക"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"സ്‌ക്രീൻ ലോക്ക് പാസ്‌വേഡുകളിലും PIN-കളിലും അനുവദിച്ചിരിക്കുന്ന ദൈർഘ്യവും പ്രതീകങ്ങളും നിയന്ത്രിക്കുക."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"സ്‌ക്രീൻ അൺലോക്ക് ശ്രമങ്ങൾ നിരീക്ഷിക്കുക"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 18aa7bc..6621f94 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Аппын онцлогуудын мэдээллийг үзэж эхлэхийг эзэмшигчид зөвшөөрдөг."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"түүврийн өндөр хувиар мэдрэгчийн өгөгдөлд хандах"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Аппад 200 Гц-ээс их хувиар мэдрэгчийн өгөгдлийг түүвэрлэх боломжийг олгодог"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"хэрэглэгчийн үйлдэлгүйгээр аппыг шинэчлэх"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Эзэмшигчид өмнө нь суулгасан аппыг хэрэглэгчийн үйлдэлгүйгээр шинэчлэхийг зөвшөөрнө"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Нууц үгний дүрмийг тохируулах"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Дэлгэц түгжих нууц үг болон ПИН кодны урт болон нийт тэмдэгтийн уртыг хянах."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Дэлгэцийн түгжээг тайлах оролдлогыг хянах"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index e1b45f92..83e33c5 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -644,7 +644,7 @@
     <string name="fingerprint_udfps_error_not_match" msgid="8236930793223158856">"फिंगरप्रिंट ओळखले नाही"</string>
     <string name="fingerprint_authenticated" msgid="2024862866860283100">"फिंगरप्रिंट ऑथेंटिकेट केली आहे"</string>
     <string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"चेहरा ऑथेंटिकेशन केलेला आहे"</string>
-    <string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"चेहरा ऑथेंटिकेशन केलेला आहे, कृपया कंफर्म दाबा"</string>
+    <string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"चेहरा ऑथेंटिकेशन केलेला आहे, कृपया कंफर्म प्रेस करा"</string>
     <string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"फिंगरप्रिंट हार्डवेअर उपलब्‍ध नाही."</string>
     <string name="fingerprint_error_no_space" msgid="7285481581905967580">"फिंगरप्रिंट सेट करता आली नाही"</string>
     <string name="fingerprint_error_timeout" msgid="7361192266621252164">"फिंगरप्रिट सेट करण्याची वेळ संपली आहे. पुन्हा प्रयत्न करा."</string>
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"होल्डरला ॲपसाठी वैशिष्ट्यांची माहिती पाहण्यास सुरू करण्याची अनुमती देते."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"उच्च नमुना दराने सेन्सर डेटा अ‍ॅक्सेस करते"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"ॲपला २०० Hz पेक्षा जास्त दराने सेन्सर डेटाचा नमुना तयार करण्याची अनुमती देते"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"वापरकर्त्याच्या कृतीशिवाय अ‍ॅप अपडेट करा"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"होल्डरला वापरकर्त्याच्या कृतीशिवाय पूर्वी इंस्टॉल केलेले अ‍ॅप अपडेट करण्याची अनुमती देते"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियम सेट करा"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रीन लॉक पासवर्ड आणि पिन मध्ये अनुमती दिलेले लांबी आणि वर्ण नियंत्रित करा."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"स्क्रीन अनलॉक प्रयत्नांचे परीक्षण करा"</string>
@@ -958,12 +960,12 @@
     <string name="keyguard_password_enter_password_code" msgid="2751130557661643482">"अनलॉक करण्यासाठी पासवर्ड टाइप करा"</string>
     <string name="keyguard_password_enter_pin_password_code" msgid="7792964196473964340">"अनलॉक करण्यासाठी पिन टाइप करा"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="8583732939138432793">"अयोग्य पिन कोड."</string>
-    <string name="keyguard_label_text" msgid="3841953694564168384">"अनलॉक करण्यासाठी, मेनू दाबा नंतर 0."</string>
+    <string name="keyguard_label_text" msgid="3841953694564168384">"अनलॉक करण्यासाठी, आधी मेनू व नंतर 0 प्रेस करा."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="2978165477085612673">"आणीबाणीचा नंबर"</string>
     <string name="lockscreen_carrier_default" msgid="6192313772955399160">"सेवा नाही"</string>
     <string name="lockscreen_screen_locked" msgid="7364905540516041817">"स्क्रीन लॉक केली."</string>
-    <string name="lockscreen_instructions_when_pattern_enabled" msgid="7982445492532123308">"अनलॉक करण्‍यासाठी मेनू दाबा किंवा आणीबाणीचा कॉल करा."</string>
-    <string name="lockscreen_instructions_when_pattern_disabled" msgid="7434061749374801753">"अनलॉक करण्यासाठी मेनू दाबा."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled" msgid="7982445492532123308">"अनलॉक करण्‍यासाठी मेनू प्रेस करा किंवा आणीबाणीचा कॉल करा."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled" msgid="7434061749374801753">"अनलॉक करण्यासाठी मेनू प्रेस करा."</string>
     <string name="lockscreen_pattern_instructions" msgid="3169991838169244941">"अनलॉक करण्यासाठी पॅटर्न काढा"</string>
     <string name="lockscreen_emergency_call" msgid="7500692654885445299">"आणीबाणी"</string>
     <string name="lockscreen_return_to_call" msgid="3156883574692006382">"कॉलवर परत या"</string>
@@ -1687,7 +1689,7 @@
     <string name="csd_entering_RS2_warning" product="default" msgid="3699509945325496807">"तुम्ही ज्या पातळीवर मीडिया ऐकत आहात, असे जास्त कालावधीसाठी सुरू राहिल्याचा परिणाम म्हणून तुमच्या श्रवणशक्तीचे कायमचे नुकसान होऊ शकते.\n\nया पातळीवर जास्त कालावधीसाठी प्ले करणे पुढे सुरू ठेवल्यामुळे तुमच्या श्रवणशक्तीचे नुकसान होऊ शकते."</string>
     <string name="csd_momentary_exposure_warning" product="default" msgid="7861896191081176454">"चेतावणी,\nतुम्ही सध्या असुरक्षित पातळीवर प्ले होणारा मोठ्या आवाजातील आशय ऐकत आहात.\n\nएवढ्या मोठ्याने ऐकणे पुढे सुरू ठेवणे तुमच्या श्रवणशक्तीचे कायमचे नुकसान करेल."</string>
     <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"प्रवेशयोग्यता शॉर्टकट वापरायचा?"</string>
-    <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"शॉर्टकट सुरू असताना, दोन्ही व्‍हॉल्‍यूम बटणे तीन सेकंदांसाठी दाबून ठेवल्याने अ‍ॅक्सेसिबिलिटी वैशिष्ट्य सुरू होईल."</string>
+    <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"शॉर्टकट सुरू असताना, दोन्ही व्‍हॉल्‍यूम बटणे तीन सेकंदांसाठी प्रेस करून ठेवल्याने अ‍ॅक्सेसिबिलिटी वैशिष्ट्य सुरू होईल."</string>
     <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"अ‍ॅक्सेसिबिलिटी वैशिष्ट्यांसाठी शॉर्टकट सुरू करायचा आहे का?"</string>
     <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"दोन्ही व्हॉल्यूम की काही सेकंद धरून ठेवल्याने अ‍ॅक्सेसिबिलिटी वैशिष्ट्ये सुरू होतात. यामुळे तुमचे डिव्हाइस कसे काम करते हे पूर्णपणे बदलते.\n\nसध्याची वैशिष्ट्ये:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nतुम्ही हा शॉर्टकट सेटिंग्ज &gt; अ‍ॅक्सेसिबिलिटी मध्ये बदलू शकता."</string>
     <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string>
@@ -1702,7 +1704,7 @@
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"स्क्रीन पहा आणि नियंत्रित करा"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"ते स्क्रीनवरील सर्व आशय वाचू शकते आणि इतर ॲप्सवर आशय प्रदर्शित करू शकते."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"पहा आणि क्रिया करा"</string>
-    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"हे तुम्ही ॲप किंवा हार्डवेअर सेन्सर कसे वापरता ते ट्रॅक करू शकते आणि इतर ॲप्ससोबत तुमच्या वतीने संवाद साधू शकते."</string>
+    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"हे तुमचा ॲप किंवा हार्डवेअर सेन्सरसोबतचा परस्‍परसंवाद ट्रॅक करू शकते आणि इतर ॲप्ससोबत तुमच्या वतीने संवाद साधू शकते."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"अनुमती द्या"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"नकार द्या"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"वैशिष्ट्य वापरणे सुरू करण्यासाठी त्यावर टॅप करा:"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index faf3b0c..28a8c26 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Membenarkan pemegang mula melihat maklumat ciri untuk apl."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"akses data penderia pada data pensampelan yang tinggi"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Membenarkan apl mengambil sampel data penderia pada kadar yang lebih besar daripada 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"kemas kinikan apl tanpa tindakan pengguna"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Benarkan pemegang untuk mengemaskinikan apl yang telah dipasang sebelumnya tanpa tindakan pengguna"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Tetapkan peraturan kata laluan"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Mengawal panjang dan aksara yang dibenarkan dalam kata laluan  dan PIN kunci skrin."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Pantau percubaan buka kunci skrin"</string>
@@ -1702,7 +1704,7 @@
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Melihat dan mengawal skrin"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Ciri ini boleh membaca semua kandungan pada skrin dan memaparkan kandungan di atas apl lain."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Lihat dan laksanakan tindakan"</string>
-    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Ciri ini boleh menjejak interaksi anda dengan apl atau penderia perkakasan dan berinteraksi dengan apl bagi pihak anda."</string>
+    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Ciri ini boleh menjejaki interaksi anda dengan apl atau penderia perkakasan dan berinteraksi dengan apl bagi pihak anda."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Benarkan"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Tolak"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Ketik ciri untuk mula menggunakan ciri itu:"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index da4ff15..70cb8c1 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ဝန်ဆောင်မှုအချက်အလက်ကိုများကို ခွင့်ပြုချက်ရထားသည့် အက်ပ်အား စတင်ကြည့်နိုင်ရန် ခွင့်ပြုသည်။"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"နမူနာနှုန်းမြင့်သော အာရုံခံစနစ်ဒေတာကို သုံးပါ"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"၂၀၀ Hz နှုန်းထက်ပိုများသော အာရုံခံစနစ်ဒေတာကို နမူနာယူရန် အက်ပ်အား ခွင့်ပြုပါ"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"စကားဝှက်စည်းမျဥ်းကိုသတ်မှတ်ရန်"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"မျက်နှာပြင်သော့ခတ်သည့် စကားဝှက်များနှင့် PINများရှိ ခွင့်ပြုထားသည့် စာလုံးအရေအတွက်နှင့် အက္ခရာများအား ထိန်းချုပ်ရန်။"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"မျက်နှာပြင်လော့ခ်ဖွင့်ရန် ကြိုးပမ်းမှုများကို စောင့်ကြည့်ပါ"</string>
@@ -1489,7 +1493,7 @@
     <string name="forward_intent_to_work" msgid="3620262405636021151">"သင်သည် ဒီအက်ပ်ကို သင်၏ အလုပ် ပရိုဖိုင် ထဲမှာ အသုံးပြုနေသည်"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"ထည့်သွင်းရန်နည်းလမ်း"</string>
     <string name="sync_binding_label" msgid="469249309424662147">"ထပ်တူ ကိုက်ညီခြင်း"</string>
-    <string name="accessibility_binding_label" msgid="1974602776545801715">"အသုံးပြုခွင့်"</string>
+    <string name="accessibility_binding_label" msgid="1974602776545801715">"အများသုံးနိုင်မှု"</string>
     <string name="wallpaper_binding_label" msgid="1197440498000786738">"နောက်ခံ"</string>
     <string name="chooser_wallpaper" msgid="3082405680079923708">"နောက်ခံပြောင်းခြင်း"</string>
     <string name="notification_listener_binding_label" msgid="2702165274471499713">"အကြောင်းကြားချက် နားတောင်သူ"</string>
@@ -1686,10 +1690,10 @@
     <string name="csd_dose_repeat_warning" product="default" msgid="6765471037071089401">"သတိပေးချက်-\nတစ်ပတ်တာအတွင်း နားကြပ်ဖြင့် ဘေးကင်းကင်း အသံကျယ်လောင်စွာ နားထောင်နိုင်သည့် ပမာဏထက် ၅ ဆ ကျော်လွန်သွားပါပြီ။\n\nသင့်အကြားအာရုံကို မထိခိုက်စေရန် အသံတိုးလိုက်သည်။"</string>
     <string name="csd_entering_RS2_warning" product="default" msgid="3699509945325496807">"မီဒီယာကို ယခုနားထောင်သည့်အဆင့်ဖြင့် အချိန်ကြာမြင့်စွာ နားထောင်ပါက အကြားအာရုံကို ထိခိုက်နိုင်သည်။\n\nဤအဆင့်ဖြင့် အချိန်ကြာမြင့်စွာ ဆက်ဖွင့်ခြင်းက သင့်အကြားအာရုံကို ထိခိုက်စေနိုင်သည်။"</string>
     <string name="csd_momentary_exposure_warning" product="default" msgid="7861896191081176454">"သတိပေးချက်-\nသင်သည် ကျယ်လောင်သော အကြောင်းအရာကို အန္တရာယ်ရှိသောအဆင့်ဖြင့် လက်ရှိဖွင့်ထားသည်။\n\nဤသို့ကျယ်လောင်စွာ ဆက်လက်နားထောင်ခြင်းက သင့်အကြားအာရုံကို ထာဝရထိခိုက်စေမည်။"</string>
-    <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်ကို အသုံးပြုလိုပါသလား။"</string>
+    <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"အများသုံးနိုင်မှု ဖြတ်လမ်းလင့်ခ်ကို အသုံးပြုလိုပါသလား။"</string>
     <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ဖြတ်လမ်းလင့်ခ်ကို ဖွင့်ထားစဉ် အသံထိန်းခလုတ် နှစ်ခုစလုံးကို ၃ စက္ကန့်ခန့် ဖိထားခြင်းဖြင့် အများသုံးနိုင်သည့် ဝန်ဆောင်မှုကို ဖွင့်နိုင်သည်။"</string>
     <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုများအတွက် ဖြတ်လမ်းကို ဖွင့်မလား။"</string>
-    <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားခြင်းက အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုများ ဖွင့်ပေးသည်။ ဤလုပ်ဆောင်ချက်က သင့်စက်အလုပ်လုပ်ပုံကို ပြောင်းလဲနိုင်သည်။\n\nလက်ရှိ ဝန်ဆောင်မှုများ-\n<xliff:g id="SERVICE">%1$s</xliff:g>\n\'ဆက်တင်များ &gt; အများသုံးစွဲနိုင်မှု\' တွင် ရွေးထားသည့် ဝန်ဆောင်မှုများကို ပြောင်းနိုင်သည်။"</string>
+    <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားခြင်းက အများသုံးနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုများ ဖွင့်ပေးသည်။ ဤလုပ်ဆောင်ချက်က သင့်စက်အလုပ်လုပ်ပုံကို ပြောင်းလဲနိုင်သည်။\n\nလက်ရှိ ဝန်ဆောင်မှုများ-\n<xliff:g id="SERVICE">%1$s</xliff:g>\n\'ဆက်တင်များ &gt; အများသုံးနိုင်မှု\' တွင် ရွေးထားသည့် ဝန်ဆောင်မှုများကို ပြောင်းနိုင်သည်။"</string>
     <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string>
     <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> ဖြတ်လမ်းကို ဖွင့်မလား။"</string>
     <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားခြင်းက အများသုံးနိုင်သည့် ဝန်ဆောင်မှုဖြစ်သော <xliff:g id="SERVICE">%1$s</xliff:g> ကို ဖွင့်ပေးသည်။ ဤလုပ်ဆောင်ချက်က သင့်စက်အလုပ်လုပ်ပုံကို ပြောင်းလဲနိုင်သည်။\n\nဤဖြတ်လမ်းလင့်ခ်ကို ဆက်တင်များ &gt; အများသုံးနိုင်မှုတွင် နောက်ဝန်ဆောင်မှုတစ်ခုသို့ ပြောင်းနိုင်သည်။"</string>
@@ -1698,7 +1702,7 @@
     <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"ဖွင့်"</string>
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"ပိတ်"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> ကို သင့်စက်အား အပြည့်အဝထိန်းချုပ်ခွင့် ပေးလိုပါသလား။"</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"အများသုံးစွဲနိုင်မှု လိုအပ်ချက်များအတွက် အထောက်အကူပြုသည့် အက်ပ်များအား အပြည့်အဝ ထိန်းချုပ်ခွင့်ပေးခြင်းသည် သင့်လျော်သော်လည်း အက်ပ်အများစုအတွက် မသင့်လျော်ပါ။"</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"အများသုံးနိုင်မှု လိုအပ်ချက်များအတွက် အထောက်အကူပြုသည့် အက်ပ်များအား အပြည့်အဝ ထိန်းချုပ်ခွင့်ပေးခြင်းသည် သင့်လျော်သော်လည်း အက်ပ်အများစုအတွက် မသင့်လျော်ပါ။"</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"ဖန်သားပြင်ကို ကြည့်ရှုထိန်းချုပ်ခြင်း"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"၎င်းသည် မျက်နှာပြင်ပေါ်ရှိ အကြောင်းအရာအားလုံးကို ဖတ်နိုင်ပြီး အခြားအက်ပ်များအပေါ်တွင် အကြောင်းအရာကို ဖော်ပြနိုင်သည်။"</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"လုပ်ဆောင်ချက်များကို ကြည့်ရှုဆောင်ရွက်ခြင်း"</string>
@@ -1706,7 +1710,7 @@
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"ခွင့်ပြုရန်"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"ပယ်ရန်"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ဝန်ဆောင်မှုကို စတင်အသုံးပြုရန် တို့ပါ−"</string>
-    <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"အများသုံးစွဲနိုင်မှု ခလုတ်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုများကို ရွေးပါ"</string>
+    <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"အများသုံးနိုင်မှု ခလုတ်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုများကို ရွေးပါ"</string>
     <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"အသံခလုတ် ဖြတ်လမ်းလင့်ခ်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုများကို ရွေးပါ"</string>
     <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ကို ပိတ်ထားသည်"</string>
     <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"ဖြတ်လမ်းများကို တည်းဖြတ်ရန်"</string>
@@ -2005,7 +2009,7 @@
     <string name="app_category_news" msgid="1172762719574964544">"သတင်းနှင့် မဂ္ဂဇင်းများ"</string>
     <string name="app_category_maps" msgid="6395725487922533156">"မြေပုံနှင့် ခရီးလမ်းညွှန်ချက်"</string>
     <string name="app_category_productivity" msgid="1844422703029557883">"ထုတ်လုပ်နိုင်မှု"</string>
-    <string name="app_category_accessibility" msgid="6643521607848547683">"အများသုံးစွဲနိုင်မှု"</string>
+    <string name="app_category_accessibility" msgid="6643521607848547683">"အများသုံးနိုင်မှု"</string>
     <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"စက်ပစ္စည်း သိုလှောင်ခန်း"</string>
     <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB အမှားရှာပြင်ခြင်း"</string>
     <string name="time_picker_hour_label" msgid="4208590187662336864">"နာရီ"</string>
@@ -2139,7 +2143,7 @@
     <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"မိုက်ခွက်ပါနားကြပ်ချိတ်"</string>
     <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ဖန်သားပြင်အတွက် အများသုံးစွဲနိုင်မှုဖြတ်လမ်းလင့်ခ်"</string>
     <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ဖန်သားပြင်အတွက် အများသုံးစွဲနိုင်မှုဖြတ်လမ်းလင့်ခ် ရွေးချယ်စနစ်"</string>
-    <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်"</string>
+    <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"အများသုံးနိုင်မှု ဖြတ်လမ်းလင့်ခ်"</string>
     <string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"အကြောင်းကြားစာအကွက်ကို ပယ်ရန်"</string>
     <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad အပေါ်"</string>
     <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad အောက်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 2f59013..826c1c1 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Lar innehaveren se informasjon om funksjonene for en app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"tilgang til sensordata ved høy samplingfrekvens"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Lar appen samle inn sensordata ved en hastighet som er høyere enn 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Angi passordregler"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrollerer tillatt lengde og tillatte tegn i passord og PIN-koder for opplåsing av skjermen."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Overvåk forsøk på å låse opp skjermen"</string>
@@ -2324,12 +2328,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> bruker begge skjermene til å vise innhold"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Enheten er for varm"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dobbel skjerm er ikke tilgjengelig fordi telefonen begynner å bli for varm"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen er ikke tilgjengelig"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen er ikke tilgjengelig fordi Batterisparing er slått på. Du kan slå av denne funksjonen i innstillingene."</string>
+    <string name="device_state_notification_settings_button" msgid="691937505741872749">"Gå til innstillingene"</string>
     <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Slå av"</string>
     <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> er konfigurert"</string>
     <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Tastaturoppsettet er satt til <xliff:g id="LAYOUT_1">%s</xliff:g>. Trykk for å endre det."</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 52775d0..f6de5f5 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"होल्डरलाई एपका सुविधासम्बन्धी जानकारी हेर्न दिन्छ।"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"नमुना लिने उच्च दरमा सेन्सरसम्बन्धी डेटा प्रयोग गर्ने"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"यो अनुमति दिइएमा एपले २०० हर्जभन्दा बढी दरमा सेन्सरसम्बन्धी डेटाको नमुना लिन सक्छ"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियमहरू मिलाउनुहोस्"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रिन लक पासवर्ड र PIN हरूमा अनुमति दिइएको लम्बाइ र वर्णहरूको नियन्त्रण गर्नुहोस्।"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"मनिटरको स्क्रिन अनलक गर्ने प्रयासहरू"</string>
@@ -1704,7 +1708,7 @@
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"कारबाहीहरू हेर्नुहोस् र तिनमा कार्य गर्नुहोस्"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"यसले कुनै एप वा हार्डवेयर सेन्सरसँग तपाईंले गर्ने अन्तर्क्रियाको ट्र्याक गर्न सक्छ र तपाईंका तर्फबाट एपहरूसँग अन्तर्क्रिया गर्न सक्छ।"</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"अनुमति दिनुहोस्"</string>
-    <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"इन्कार गर्नु⋯"</string>
+    <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"नदिनुहोस्"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"कुनै सुविधा प्रयोग गर्न थाल्न उक्त सुविधामा ट्याप गर्नुहोस्:"</string>
     <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"पहुँचको बटनमार्फत प्रयोग गर्न चाहेका सुविधाहरू छनौट गर्नुहोस्"</string>
     <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"भोल्युम कुञ्जीको सर्टकटमार्फत प्रयोग गर्न चाहेका सुविधाहरू छनौट गर्नुहोस्"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 64ae814..041fde1 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Hiermee kan de houder informatie over functies bekijken voor een app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"toegang krijgen tot sensorgegevens met een hoge samplingsnelheid"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Hiermee kan de app sensorgegevens samplen met een snelheid die hoger is dan 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Wachtwoordregels instellen"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"De lengte en het aantal tekens beheren die zijn toegestaan in wachtwoorden en pincodes voor schermvergrendeling."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Pogingen voor schermontgrendeling bijhouden"</string>
@@ -1698,7 +1702,7 @@
     <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"AAN"</string>
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"UIT"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Toestaan dat <xliff:g id="SERVICE">%1$s</xliff:g> volledige controle over je apparaat heeft?"</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Volledige controle is gepast voor apps die je helpen met toegankelijkheid, maar niet voor de meeste apps."</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Volledige controle is gepast voor apps die je helpen met toegankelijkheid, maar niet voor de meeste andere apps."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Scherm bekijken en bedienen"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Deze functie kan alle content op het scherm lezen en content bovenop andere apps weergeven."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Acties bekijken en uitvoeren"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 09ae262..d6c0af0 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -249,7 +249,7 @@
     <string name="global_action_emergency" msgid="1387617624177105088">"ଜରୁରୀକାଳୀନ"</string>
     <string name="global_action_bug_report" msgid="5127867163044170003">"ବଗ୍‌ ରିପୋର୍ଟ"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"ସେସନ୍‍ ଶେଷ କରନ୍ତୁ"</string>
-    <string name="global_action_screenshot" msgid="2610053466156478564">"ସ୍କ୍ରିନସଟ୍‌"</string>
+    <string name="global_action_screenshot" msgid="2610053466156478564">"ସ୍କ୍ରିନସଟ"</string>
     <string name="bugreport_title" msgid="8549990811777373050">"ବଗ୍‌ ରିପୋର୍ଟ"</string>
     <string name="bugreport_message" msgid="5212529146119624326">"ଇ-ମେଲ୍ ମେସେଜ୍‍ ଭାବରେ ପଠାଇବାକୁ, ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ଡିଭାଇସ୍‌ ବିଷୟରେ ଏହା ସୂଚନା ସଂଗ୍ରହ କରିବ। ବଗ୍ ରିପୋର୍ଟ ଆରମ୍ଭ ହେବାପରଠାରୁ ଏହାକୁ ପଠାଇବା ପାଇଁ କିଛି ସମୟ ଲାଗିବ, ଦୟାକରି ଧୈର୍ଯ୍ୟ ରଖନ୍ତୁ।"</string>
     <string name="bugreport_option_interactive_title" msgid="7968287837902871289">"ଇଣ୍ଟରାକ୍ଟିଭ୍‍ ରିପୋର୍ଟ"</string>
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"କୌଣସି ଆପ ପାଇଁ ଫିଚରଗୁଡ଼ିକ ବିଷୟରେ ସୂଚନା ଦେଖିବା ଆରମ୍ଭ କରିବାକୁ ହୋଲଡରଙ୍କୁ ଅନୁମତି ଦିଏ।"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ଏକ ଉଚ୍ଚ ନମୁନାକରଣ ରେଟରେ ସେନ୍ସର୍ ଡାଟାକୁ ଆକ୍ସେସ୍ କରନ୍ତୁ"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"200 Hz ଠାରୁ ଅଧିକ ଏକ ରେଟରେ ସେନ୍ସର୍ ଡାଟାର ନମୁନା ନେବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦିଏ"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"ପାସ୍‌ୱର୍ଡ ନିୟମାବଳୀ ସେଟ୍ କରନ୍ତୁ"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"ଲକ୍‍ ସ୍କ୍ରୀନ୍‍ ପାସ୍‌ୱର୍ଡ ଓ PINରେ ଅନୁମୋଦିତ ଦୀର୍ଘତା ଓ ବର୍ଣ୍ଣ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ।"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"ସ୍କ୍ରୀନ୍-ଅନଲକ୍ କରିବା ଉଦ୍ୟମ ନୀରିକ୍ଷଣ କରନ୍ତୁ"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 6ec3eda..62c2b83 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ਇਸ ਨਾਲ ਹੋਲਡਰ ਨੂੰ ਕਿਸੇ ਐਪ ਦੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇਖਣ ਦੀ ਆਗਿਆ ਮਿਲਦੀ ਹੈ।"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ਉੱਚ ਸੈਂਪਲਿੰਗ ਰੇਟ \'ਤੇ ਸੈਂਸਰ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"ਐਪ ਨੂੰ 200 Hz ਤੋਂ ਵੱਧ ਦੀ ਦਰ \'ਤੇ ਸੈਂਸਰ ਡਾਟੇ ਦਾ ਨਮੂਨਾ ਲੈਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"ਪਾਸਵਰਡ ਨਿਯਮ ਸੈੱਟ ਕਰੋ"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"ਸਕ੍ਰੀਨ ਲਾਕ ਪਾਸਵਰਡਾਂ ਅਤੇ ਪਿੰਨ ਵਿੱਚ ਆਗਿਆ ਦਿੱਤੀ ਲੰਮਾਈ ਅਤੇ ਅੱਖਰਾਂ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ।"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"ਸਕ੍ਰੀਨ ਅਣਲਾਕ ਕਰਨ ਦੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ \'ਤੇ ਨਿਗਰਾਨੀ ਰੱਖੋ"</string>
@@ -2324,12 +2328,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਸਮੱਗਰੀ ਨੂੰ ਦਿਖਾਉਣ ਲਈ ਦੋਵੇਂ ਡਿਸਪਲੇਆਂ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ਡੀਵਾਈਸ ਬਹੁਤ ਗਰਮ ਹੈ"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ਦੋਹਰੀ ਸਕ੍ਰੀਨ ਵਿਸ਼ੇਸ਼ਤਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਹੋ ਰਿਹਾ ਹੈ"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <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_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-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 274af13..efc1421 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -802,6 +802,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Umożliwia posiadaczowi rozpoczęcie przeglądania informacji o funkcjach aplikacji."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"dostęp do danych czujnika z wysoką częstotliwością"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Zezwala aplikacji na pobieranie próbek danych z czujnika z częstotliwością wyższą niż 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Określ reguły hasła"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolowanie długości haseł blokady ekranu i kodów PIN oraz dozwolonych w nich znaków."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitorowanie prób odblokowania ekranu"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 6d44196..8dca406 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -801,6 +801,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite que o sistema comece a ver as informações de recursos de um app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"acessar os dados do sensor em uma taxa de amostragem elevada"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permite que o app receba amostras de dados do sensor em uma taxa maior que 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"atualizar o app sem a ação do usuário"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Permite que o titular atualize o app instalado anteriormente sem ação do usuário"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Definir regras para senha"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controla o tamanho e os caracteres permitidos nos PINs e nas senhas do bloqueio de tela."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitorar tentativas de desbloqueio de tela"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index ff4fe09..71b34a2 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -801,6 +801,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite que o titular comece a ver as informações das funcionalidades de uma app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"aceder aos dados de sensores a uma taxa de amostragem elevada"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permite que a app obtenha uma amostra dos dados de sensores a uma taxa superior a 200 Hz."</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"atualizar a app sem a ação do utilizador"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Permite que o proprietário atualize a app que instalou anteriormente sem a ação do utilizador"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Definir regras de palavra-passe"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controlar o comprimento e os carateres permitidos nos PINs e nas palavras-passe do bloqueio de ecrã."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitorizar tentativas de desbloqueio do ecrã"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 6d44196..8dca406 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -801,6 +801,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite que o sistema comece a ver as informações de recursos de um app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"acessar os dados do sensor em uma taxa de amostragem elevada"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permite que o app receba amostras de dados do sensor em uma taxa maior que 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"atualizar o app sem a ação do usuário"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Permite que o titular atualize o app instalado anteriormente sem ação do usuário"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Definir regras para senha"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controla o tamanho e os caracteres permitidos nos PINs e nas senhas do bloqueio de tela."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitorar tentativas de desbloqueio de tela"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index b425883..871aeb9 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -801,6 +801,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite proprietarului să înceapă să vadă informațiile despre funcții pentru o aplicație."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"să acceseze date de la senzori la o rată de eșantionare mare"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permite aplicației să colecteze date de la senzori la o rată de eșantionare de peste 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Să seteze reguli pentru parolă"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Stabilește lungimea și tipul de caractere permise pentru parolele și codurile PIN de blocare a ecranului."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Să monitorizeze încercările de deblocare a ecranului"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index eccd18d..88b39ae 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -802,6 +802,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Позволяет просматривать информацию о функциях приложения."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"Доступ к данным датчиков при высокой частоте дискретизации"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Приложение сможет считывать данные датчиков на частоте более 200 Гц."</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"Обновление приложений без действий со стороны пользователя"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Позволяет обновлять ранее установленные приложения без действий со стороны пользователя."</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Настройка правил для паролей"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролировать длину и символы при вводе пароля и PIN-кода."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Отслеживание попыток разблокировать экран"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 01b04ec..32d2170 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"යෙදුමක් සඳහා විශේෂාංග තොරතුරු බැලීම ආරම්භ කිරීමට දරන්නාට ඉඩ දෙන්න."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ඉහළ නියැදි කිරීමේ වේගයකින් සංවේදක දත්ත වෙත පිවිසෙන්න"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"200 Hz ට වඩා වැඩි වේගයකින් සංවේදක දත්ත නියැදි කිරීමට යෙදුමට ඉඩ දෙයි"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"යෙදුම පරිශීලක ක්‍රියාවෙන් තොරව යාවත්කාලීන කරන්න"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"පරිශීලක ක්‍රියාවෙන් තොරව කලින් ස්ථාපිත යෙදුම යාවත්කාලීන කිරීමට දරන්නාට ඉඩ දෙයි"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"මුරපද නීති සකස් කිරීම"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"තිර අගුලු මුරපද සහ PIN තුළ ඉඩ දෙන දිග සහ අනුලකුණු පාලනය කිරීම."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"තිරය අගුළු ඇරීමේ උත්සාහයන් නිරීක්ෂණය කරන්න"</string>
@@ -2324,12 +2326,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"අන්තර්ගතය පෙන්වීමට <xliff:g id="APP_NAME">%1$s</xliff:g> සංදර්ශන දෙකම භාවිත කරයි"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"උපාංගය ඉතා උණුසුම් වේ"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ඔබේ දුරකථනය ඉතා උණුසුම් නිසා ද්විත්ව තිරය ලබා ගත නොහැක"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <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_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-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 2894896..a5aaf89 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -802,6 +802,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Umožňuje držiteľovi zobraziť informácie o funkciách aplikácie."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"prístup k dátam senzorom s vysokou vzorkovacou frekvenciou"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Umožňuje aplikácii vzorkovať dáta senzorov s frekvenciou vyššou ako 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"aktualizovať aplikáciu bez akcie používateľa"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Povolí vlastníkovi aktualizovať aplikáciu, ktorá bola nainštalovaná bez akcie používateľa"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Nastaviť pravidlá pre heslo"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Nastavte dĺžku hesiel na odomknutie obrazovky aj kódov PIN a v nich používané znaky."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Sledovanie pokusov o odomknutie obrazovky"</string>
@@ -2136,7 +2138,7 @@
     <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"Upozornenia"</string>
     <string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"Rýchle nastavenia"</string>
     <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialógové okno napájania"</string>
-    <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Uzamknúť obrazovku"</string>
+    <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zamknúť obrazovku"</string>
     <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snímka obrazovky"</string>
     <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Hák na slúchadlá s mikrofónom"</string>
     <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Skratka dostupnosti na obrazovke"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 6d1d8b0..8a9ff14 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -291,7 +291,7 @@
     <string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"Aplikacija se izvaja"</string>
     <string name="notification_channel_foreground_service" msgid="7102189948158885178">"Aplikacije, ki porabljajo energijo baterije"</string>
     <string name="notification_channel_accessibility_magnification" msgid="1707913872219798098">"Povečava"</string>
-    <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Uporaba funkcij za ljudi s posebnimi potrebami"</string>
+    <string name="notification_channel_accessibility_security_policy" msgid="1727787021725251912">"Uporaba funkcij za dostopnost"</string>
     <string name="foreground_service_app_in_background" msgid="1439289699671273555">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> porablja energijo baterije"</string>
     <string name="foreground_service_apps_in_background" msgid="7340037176412387863">"Toliko aplikacij porablja energijo baterije: <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Dotaknite se za prikaz podrobnosti porabe baterije in prenosa podatkov"</string>
@@ -802,6 +802,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Imetniku omogoča začetek ogledovanja informacij o funkcijah poljubne aplikacije."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"dostop do podatkov tipal z večjo hitrostjo vzorčenja"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Aplikaciji dovoljuje, da vzorči podatke tipal s hitrostjo, večjo od 200 Hz."</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Nastavitev pravil za geslo"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Nadzor nad dolžino in znaki, ki so dovoljeni v geslih in kodah PIN za odklepanje zaslona."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Nadzor nad poskusi odklepanja zaslona"</string>
@@ -1491,7 +1495,7 @@
     <string name="forward_intent_to_work" msgid="3620262405636021151">"To aplikacijo uporabljate v delovnem profilu"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Način vnosa"</string>
     <string name="sync_binding_label" msgid="469249309424662147">"Sinhronizacija"</string>
-    <string name="accessibility_binding_label" msgid="1974602776545801715">"Pripomočki za osebe s posebnimi potrebami"</string>
+    <string name="accessibility_binding_label" msgid="1974602776545801715">"Dostopnost"</string>
     <string name="wallpaper_binding_label" msgid="1197440498000786738">"Ozadje"</string>
     <string name="chooser_wallpaper" msgid="3082405680079923708">"Spreminjanje ozadja"</string>
     <string name="notification_listener_binding_label" msgid="2702165274471499713">"Poslušalec obvestil"</string>
@@ -1688,19 +1692,19 @@
     <string name="csd_dose_repeat_warning" product="default" msgid="6765471037071089401">"Opozorilo!\nZa petkrat ste prekoračili količino glasnih zvočnih signalov, ki je še varna pri poslušanju prek slušalk v enem tednu.\n\nZaradi zaščite sluha je bila glasnost zmanjšana."</string>
     <string name="csd_entering_RS2_warning" product="default" msgid="3699509945325496807">"Raven glasnosti, pri kateri poslušate predstavnost, lahko ob dolgotrajnejši izpostavljenosti povzroči poškodbe sluha.\n\nNadaljnje dolgotrajno poslušanje pri takšni glasnosti vam lahko poškoduje sluh."</string>
     <string name="csd_momentary_exposure_warning" product="default" msgid="7861896191081176454">"Opozorilo!\nTrenutno poslušate glasno vsebino pri ravni glasnosti, ki ni varna.\n\nNadaljnje poslušanje pri takšni glasnosti vam bo povzročilo trajne poškodbe sluha."</string>
-    <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Želite uporabljati bližnjico funkcij za ljudi s posebnimi potrebami?"</string>
-    <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Ko je bližnjica vklopljena, pritisnite gumba za glasnost in ju pridržite tri sekunde, če želite zagnati funkcijo za ljudi s posebnimi potrebami."</string>
-    <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Želite vklopiti bližnjico za funkcije za ljudi s posebnimi potrebami?"</string>
-    <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Če za nekaj sekund pridržite obe tipki za glasnost, boste vklopili funkcije za ljudi s posebnimi potrebami. To lahko spremeni način delovanja naprave.\n\nTrenutne funkcije:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nIzbrane funkcije lahko spremenite v meniju »Nastavitve« &gt; »Funkcije za ljudi s posebnimi potrebami«."</string>
+    <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Želite uporabljati bližnjico za dostopnost?"</string>
+    <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Ko je bližnjica vklopljena, pritisnite gumba za glasnost in ju pridržite tri sekunde, če želite zagnati funkcijo dostopnosti."</string>
+    <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Želite vklopiti bližnjico za funkcije za dostopnost?"</string>
+    <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Če za nekaj sekund pridržite obe tipki za glasnost, boste vklopili funkcije za dostopnost. To lahko spremeni način delovanja naprave.\n\nTrenutne funkcije:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nIzbrane funkcije lahko spremenite v meniju »Nastavitve« &gt; »Funkcije dostopnosti«."</string>
     <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string>
     <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Želite vklopiti bližnjico za <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
-    <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Če za nekaj sekund pridržite obe tipki za glasnost, boste vklopili storitev <xliff:g id="SERVICE">%1$s</xliff:g>, ki je funkcija za ljudi s posebnimi potrebami. To lahko spremeni način delovanja naprave.\n\nTo bližnjico lahko v meniju »Nastavitve« &gt; »Funkcije za ljudi s posebnimi potrebami« spremenite, da bo uporabljena za drugo funkcijo."</string>
+    <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Če za nekaj sekund pridržite obe tipki za glasnost, boste vklopili storitev <xliff:g id="SERVICE">%1$s</xliff:g>, ki je funkcija dostopnosti. To lahko spremeni način delovanja naprave.\n\nTo bližnjico lahko v meniju »Nastavitve« &gt; »Funkcije dostopnosti« spremenite, da bo uporabljena za drugo funkcijo."</string>
     <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Vklopi"</string>
     <string name="accessibility_shortcut_off" msgid="3651336255403648739">"Ne vklopi"</string>
     <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"VKLOPLJENO"</string>
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"IZKLOPLJ."</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Ali storitvi <xliff:g id="SERVICE">%1$s</xliff:g> dovolite popoln nadzor nad svojo napravo?"</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Popoln nadzor je ustrezen za aplikacije, ki vam pomagajo pri funkcijah za ljudi s posebnimi potrebami, vendar ne za večino aplikacij."</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Popoln nadzor je ustrezen za aplikacije, ki vam pomagajo pri dostopnosti, vendar ne za večino aplikacij."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Ogledovanje in upravljanje zaslona"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Bere lahko vso vsebino na zaslonu ter prikaže vsebino prek drugih aplikacij."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Ogledovanje in izvajanje dejanj"</string>
@@ -1708,7 +1712,7 @@
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Dovoli"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Zavrni"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Če želite začeti uporabljati funkcijo, se je dotaknite:"</string>
-    <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Izberite funkcije, ki jih želite uporabljati z gumbom za funkcije za ljudi s posebnimi potrebami"</string>
+    <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Izberite funkcije, ki jih želite uporabljati z gumbom za dostopnost"</string>
     <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Izberite funkcije, ki jih želite uporabljati z bližnjico na tipki za glasnost"</string>
     <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"Storitev <xliff:g id="SERVICE_NAME">%s</xliff:g> je izklopljena"</string>
     <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Uredi bližnjice"</string>
@@ -1723,10 +1727,10 @@
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Tipki za glasnost sta pridržani. Storitev <xliff:g id="SERVICE_NAME">%1$s</xliff:g> je vklopljena."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Tipki za glasnost sta pridržani. Storitev <xliff:g id="SERVICE_NAME">%1$s</xliff:g> je izklopljena."</string>
     <string name="accessibility_shortcut_spoken_feedback" msgid="3760999147597564314">"Spustite gumba za glasnost. Če želite vklopiti storitev <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, znova pritisnite in 3 sekunde pridržite oba gumba za glasnost."</string>
-    <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"Izberite funkcijo, ki jo želite uporabljati, ko se dotaknete gumba za funkcije za ljudi s posebnimi potrebami:"</string>
-    <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Izberite funkcijo, ki jo želite zagnati s potezo za ljudi s posebnimi potrebami (vlečenje z dvema prstoma z dna zaslona navzgor):"</string>
-    <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"Izberite funkcijo, ki jo želite zagnati s potezo za ljudi s posebnimi potrebami (vlečenje s tremi prsti z dna zaslona navzgor):"</string>
-    <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Če želite preklopiti med funkcijami, pridržite gumb za funkcije za ljudi s posebnimi potrebami."</string>
+    <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"Izberite funkcijo, ki jo želite uporabljati, ko se dotaknete gumba za dostopnost:"</string>
+    <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Izberite funkcijo, ki jo želite zagnati s potezo za dostopnost (vlečenje z dvema prstoma z dna zaslona navzgor):"</string>
+    <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"Izberite funkcijo, ki jo želite zagnati s potezo za dostopnost (vlečenje s tremi prsti z dna zaslona navzgor):"</string>
+    <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Če želite preklopiti med funkcijami, pridržite gumb za dostopnost."</string>
     <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Če želite preklopiti med funkcijami, z dvema prstoma povlecite navzgor in pridržite."</string>
     <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Če želite preklopiti med funkcijami, s tremi prsti povlecite navzgor in pridržite."</string>
     <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Povečava"</string>
@@ -2007,7 +2011,7 @@
     <string name="app_category_news" msgid="1172762719574964544">"Novice in revije"</string>
     <string name="app_category_maps" msgid="6395725487922533156">"Zemljevidi in navigacija"</string>
     <string name="app_category_productivity" msgid="1844422703029557883">"Storilnost"</string>
-    <string name="app_category_accessibility" msgid="6643521607848547683">"Funkc. za ljudi s poseb. potreb."</string>
+    <string name="app_category_accessibility" msgid="6643521607848547683">"Dostopnost"</string>
     <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"Shramba naprave"</string>
     <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"Odpravljanje težav prek povezave USB"</string>
     <string name="time_picker_hour_label" msgid="4208590187662336864">"ura"</string>
@@ -2139,9 +2143,9 @@
     <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaklenjen zaslon"</string>
     <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Posnetek zaslona"</string>
     <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Kavelj za slušalke z mikrofonom"</string>
-    <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Zaslonska bližnjica funkcij za ljudi s posebnimi potrebami"</string>
-    <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Izbirnik zaslonske bližnjice funkcij za ljudi s posebnimi potrebami"</string>
-    <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Bližnjica funkcij za ljudi s posebnimi potrebami"</string>
+    <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Zaslonska bližnjica za dostopnost"</string>
+    <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Izbirnik zaslonske bližnjice za dostopnost"</string>
+    <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Bližnjica za dostopnost"</string>
     <string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Opusti zaslon z obvestili"</string>
     <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Smerni gumb gor"</string>
     <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Smerni gumb dol"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index fc94221..eed531a 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Lejon që zotëruesi të fillojë të shikojë informacionin e veçorive për një aplikacion."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"qasu te të dhënat e sensorit me një shpejtësi kampionimi më të lartë"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Lejon aplikacionin të mbledhë shembujt e të dhënave të sensorit me shpejtësi më të lartë se 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"përditëso aplikacionin pa veprimin e përdoruesit"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Lejon zotëruesin të përditësojë aplikacionin që e ka instaluar më parë pa veprimin e përdoruesit"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Cakto rregullat e fjalëkalimit"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrollo gjatësinë dhe karakteret e lejuara në fjalëkalimet dhe kodet PIN të kyçjes së ekranit."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitoro tentativat e shkyçjes së ekranit"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index deb4476..179707d 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -801,6 +801,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Дозвољава носиоцу дозволе да започне прегледање информација о функцијама апликације."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"приступ подацима сензора при великој брзини узорковања"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Дозвољава апликацији да узима узорак података сензора при брзини већој од 200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"ажурирање апликације без радњи корисника"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Дозвољава власнику да ажурира апликацију коју је претходно инсталирала без радњи корисника"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Подешавање правила за лозинку"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролише дужину и знакове дозвољене у лозинкама и PIN-овима за закључавање екрана."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Надгледајте покушаје откључавања екрана"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 823c836..57c31db 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Tillåter att innehavaren börjar visa information om funktioner för en app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"åtkomst till sensordata med en hög samplingsfrekvens"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Tillåter att appen får åtkomst till sensordata med en högre samplingsfrekvens än 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Ange lösenordsregler"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Styr tillåten längd och tillåtna tecken i lösenord och pinkoder för skärmlåset."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Övervaka försök att låsa upp skärmen"</string>
@@ -2324,12 +2328,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> använder båda skärmarna för att visa innehåll"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Enheten är för varm"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dubbel skärm kan inte användas eftersom telefonen börjar bli för varm"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen är inte tillgängligt"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen kan inte användas eftersom battersparläget är aktiverat. Du kan inaktivera detta i inställningarna."</string>
+    <string name="device_state_notification_settings_button" msgid="691937505741872749">"Öppna inställningarna"</string>
     <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Stäng av"</string>
     <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> har konfigurerats"</string>
     <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Tangentbordslayouten har ställts in på <xliff:g id="LAYOUT_1">%s</xliff:g>. Tryck om du vill ändra."</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index e8861fd..6eb0780 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Huruhusu mmiliki kuanza kuangalia maelezo ya vipengele vya programu."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"fikia data ya vitambuzi kwa kasi ya juu ya sampuli"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Huruhusu programu kujaribu sampuli ya data ya vitambuzi kwa kasi inayozidi Hz 200"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"sakinisha programu bila mtumiaji kuchukua hatua yoyote"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Huruhusu mmiliki kusasisha programu iliyosakinisha awali bila mtumiaji kuchukua hatua yoyote"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Kuweka kanuni za nenosiri"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Dhibiti urefu na maandishi yanayokubalika katika nenosiri la kufunga skrini na PIN."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Kuhesabu mara ambazo skrini inajaribu kufunguliwa"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 6c3591e..012444e 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ஆப்ஸின் அம்சங்கள் குறித்த தகவல்களைப் பார்ப்பதற்கான அனுமதியை ஹோல்டருக்கு வழங்கும்."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"அதிகளவிலான சாம்பிளிங் ரேட்டில் சென்சார் தரவை அணுகுதல்"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"200 ஹெர்ட்ஸ்க்கும் அதிகமான வீதத்தில் சென்சார் தரவை மாதிரியாக்க ஆப்ஸை அனுமதிக்கும்"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"கடவுச்சொல் விதிகளை அமைக்கவும்"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"திரைப் பூட்டின் கடவுச்சொற்கள் மற்றும் பின்களில் அனுமதிக்கப்படும் நீளத்தையும் எழுத்துக்குறிகளையும் கட்டுப்படுத்தும்."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"திரையை அன்லாக் செய்வதற்கான முயற்சிகளைக் கண்காணி"</string>
@@ -2324,12 +2328,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"உள்ளடக்கத்தைக் காட்டுவதற்கு இரண்டு டிஸ்ப்ளேக்களையும் <xliff:g id="APP_NAME">%1$s</xliff:g> பயன்படுத்துகிறது"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"சாதனம் மிகவும் சூடாக உள்ளது"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"உங்கள் மொபைல் மிகவும் சூடாக இருப்பதால் இரட்டைத் திரை அம்சத்தைப் பயன்படுத்த முடியாது"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <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_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-te/strings.xml b/core/res/res/values-te/strings.xml
index dce0377..e333a48 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -175,10 +175,10 @@
     <string name="contentServiceSync" msgid="2341041749565687871">"సింక్‌"</string>
     <string name="contentServiceSyncNotificationTitle" msgid="5766411446676388623">"సింక్ చేయడం సాధ్యపడదు"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4562226280528716090">"చాలా ఎక్కువ <xliff:g id="CONTENT_TYPE">%s</xliff:g> తొలగించడానికి ప్రయత్నించారు."</string>
-    <string name="low_memory" product="tablet" msgid="5557552311566179924">"టాబ్లెట్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి."</string>
-    <string name="low_memory" product="watch" msgid="3479447988234030194">"వాచ్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి."</string>
-    <string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV పరికరం నిల్వ నిండింది. కొంత ప్రదేశాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌‌‌లను తొలగించండి."</string>
-    <string name="low_memory" product="default" msgid="2539532364144025569">"ఫోన్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి."</string>
+    <string name="low_memory" product="tablet" msgid="5557552311566179924">"టాబ్లెట్ స్టోరేజ్‌ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి."</string>
+    <string name="low_memory" product="watch" msgid="3479447988234030194">"వాచ్ స్టోరేజ్‌ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి."</string>
+    <string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV పరికరం స్టోరేజ్‌ నిండింది. కొంత ప్రదేశాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌‌‌లను తొలగించండి."</string>
+    <string name="low_memory" product="default" msgid="2539532364144025569">"ఫోన్ స్టోరేజ్‌ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి."</string>
     <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{సర్టిఫికెట్ అధికార యంత్రాంగం ఇన్‌స్టాల్ చేయబడింది}other{సర్టిఫికెట్ అధికార యంత్రాంగాలు ఇన్‌స్టాల్ చేయబడ్డాయి}}"</string>
     <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"తెలియని మూడవ పక్షం ద్వారా"</string>
     <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"మీ కార్యాలయ ప్రొఫైల్ నిర్వాహకుల ద్వారా"</string>
@@ -376,7 +376,7 @@
     <string name="permlab_readSms" msgid="5164176626258800297">"మీ టెక్స్ట్ మెసేజ్‌లు (SMS లేదా MMS) చదవడం"</string>
     <string name="permdesc_readSms" product="tablet" msgid="7912990447198112829">"ఈ యాప్‌ మీ టాబ్లెట్‌లో స్టోర్ చేసిన అన్ని SMS (టెక్స్ట్) మెసేజ్‌లను చదవగలదు."</string>
     <string name="permdesc_readSms" product="tv" msgid="3054753345758011986">"ఈ యాప్ మీ Android TV పరికరంలో స్టోర్ అయిన SMS (టెక్స్ట్) మెసేజ్‌లు అన్నింటిని చదవగలదు."</string>
-    <string name="permdesc_readSms" product="default" msgid="774753371111699782">"ఈ యాప్‌ మీ ఫోన్‌లో నిల్వ చేసిన అన్ని SMS (టెక్స్ట్) మెసేజ్‌లను చదవగలదు."</string>
+    <string name="permdesc_readSms" product="default" msgid="774753371111699782">"ఈ యాప్‌ మీ ఫోన్‌లో స్టోరేజ్‌ చేసిన అన్ని SMS (టెక్స్ట్) మెసేజ్‌లను చదవగలదు."</string>
     <string name="permlab_receiveWapPush" msgid="4223747702856929056">"టెక్స్ట్ మెసేజ్‌లను (WAP) స్వీకరించడం"</string>
     <string name="permdesc_receiveWapPush" msgid="1638677888301778457">"WAP మెసేజ్‌లను స్వీకరించడానికి, ప్రాసెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఈ అనుమతి మీకు వచ్చిన మెసేజ్‌లను మీకు చూపకుండానే పర్యవేక్షించగల లేదా తొలగించగల సామర్థ్యాన్ని కలిగి ఉంటుంది."</string>
     <string name="permlab_getTasks" msgid="7460048811831750262">"అమలవుతున్న యాప్‌లను పునరుద్ధరించడం"</string>
@@ -433,7 +433,7 @@
     <string name="permdesc_foregroundServiceFileManagement" msgid="417103601269698508">"\"fileManagement\" అనే రకంతో ఫోర్‌గ్రౌండ్ సర్వీస్‌లను ఉపయోగించుకోవడానికి యాప్‌ను అనుమతిస్తుంది"</string>
     <string name="permlab_foregroundServiceSpecialUse" msgid="7973536745876645082">"\"specialUse\" రకంతో ఫోర్‌గ్రౌండ్ సర్వీస్‌ను రన్ చేయండి"</string>
     <string name="permdesc_foregroundServiceSpecialUse" msgid="646713654541885919">"\"specialUse\" అనే రకంతో ఫోర్‌గ్రౌండ్ సర్వీస్‌లను ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది"</string>
-    <string name="permlab_getPackageSize" msgid="375391550792886641">"యాప్ నిల్వ స్థలాన్ని అంచనా వేయడం"</string>
+    <string name="permlab_getPackageSize" msgid="375391550792886641">"యాప్ స్టోరేజ్‌ స్థలాన్ని అంచనా వేయడం"</string>
     <string name="permdesc_getPackageSize" msgid="742743530909966782">"యాప్‌ కోడ్, డేటా మరియు కాష్ పరిమాణాలను తిరిగి పొందడానికి దాన్ని అనుమతిస్తుంది"</string>
     <string name="permlab_writeSettings" msgid="8057285063719277394">"సిస్టమ్ సెట్టింగ్‌లను మార్చడం"</string>
     <string name="permdesc_writeSettings" msgid="8293047411196067188">"సిస్టమ్ యొక్క సెట్టింగ్‌ల డేటాను ఎడిట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ సిస్టమ్ యొక్క కాన్ఫిగరేషన్‌ను నాశనం చేయవచ్చు."</string>
@@ -446,13 +446,13 @@
     <string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"ప్రసారం ముగిసిన తర్వాత భద్రపరచబడే ప్రసారాలను పంపడానికి యాప్‌ని అనుమతిస్తుంది. ఎక్కువగా వినియోగిస్తే అధిక పరిమాణంలో మెమరీని ఉపయోగించడం వలన టీవీ నెమ్మదిగా పని చేయవచ్చు లేదా అస్థిరంగా మారవచ్చు."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="134529339678913453">"ప్రసారం ముగిసిన తర్వాత భద్రపరచబడే ప్రసారాలను పంపడానికి యాప్‌ను అనుమతిస్తుంది. అత్యధిక వినియోగం వలన ఫోన్ నెమ్మదిగా పని చేయవచ్చు లేదా అధిక పరిమాణంలో మెమరీని ఉపయోగించడం వలన అస్థిరంగా మారవచ్చు."</string>
     <string name="permlab_readContacts" msgid="8776395111787429099">"మీ కాంటాక్ట్‌లను చదవడం"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"టాబ్లెట్‌లో నిల్వ చేసిన మీ కాంటాక్ట్‌లకు సంబంధించిన డేటాను చదవడానికి యాప్‌ను అనుమతిస్తుంది. కాంటాక్ట్‌లను క్రియేట్ చేసిన మీ టాబ్లెట్‌లోని ఖాతాలకు కూడా యాప్‌లకు యాక్సెస్ ఉంటుంది. ఇందులో మీరు ఇన్‌స్టాల్ చేసిన యాప్‌ల ద్వారా క్రియేట్ చేయబడిన ఖాతాలు ఉండవచ్చు. ఈ అనుమతి, మీ కాంటాక్ట్ డేటాను సేవ్ చేయడానికి యాప్‌లను అనుమతిస్తుంది, హానికరమైన యాప్‌లు మీకు తెలియకుండానే కాంటాక్ట్ డేటాను షేర్ చేయవచ్చు."</string>
-    <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"మీ Android TV పరికరంలో నిల్వ చేసిన కాంటాక్ట్‌లకు సంబంధించిన డేటాను చదవడానికి యాప్‌ను అనుమతిస్తుంది. కాంటాక్ట్‌లను క్రియేట్ చేసిన మీ Android TV పరికరంలోని ఖాతాలకు కూడా యాప్‌లకు యాక్సెస్ ఉంటుంది. ఇందులో మీరు ఇన్‌స్టాల్ చేసిన యాప్‌ల ద్వారా క్రియేట్ చేయబడిన ఖాతాలు ఉండవచ్చు. ఈ అనుమతి, మీ కాంటాక్ట్ డేటాను సేవ్ చేయడానికి యాప్‌లను అనుమతిస్తుంది, హానికరమైన యాప్‌లు మీకు తెలియకుండానే కాంటాక్ట్ డేటాను షేర్ చేయవచ్చు."</string>
-    <string name="permdesc_readContacts" product="default" msgid="4911989776203207644">"ఫోన్‌లో నిల్వ చేసిన మీ కాంటాక్ట్‌లకు సంబంధించిన డేటాను చదవడానికి యాప్‌ను అనుమతిస్తుంది. కాంటాక్ట్‌లను క్రియేట్ చేసిన మీ ఫోన్‌లోని ఖాతాలను కూడా యాప్‌లు యాక్సెస్ చేయగలవు. ఇందులో మీరు ఇన్‌స్టాల్ చేసిన యాప్‌ల ద్వారా క్రియేట్ చేయబడిన ఖాతాలు ఉండవచ్చు. ఈ అనుమతి, మీ కాంటాక్ట్ డేటాను సేవ్ చేయడానికి యాప్‌లను అనుమతిస్తుంది, హానికరమైన యాప్‌లు మీకు తెలియకుండానే కాంటాక్ట్ డేటాను షేర్ చేయవచ్చు."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"టాబ్లెట్‌లో స్టోరేజ్‌ చేసిన మీ కాంటాక్ట్‌లకు సంబంధించిన డేటాను చదవడానికి యాప్‌ను అనుమతిస్తుంది. కాంటాక్ట్‌లను క్రియేట్ చేసిన మీ టాబ్లెట్‌లోని ఖాతాలకు కూడా యాప్‌లకు యాక్సెస్ ఉంటుంది. ఇందులో మీరు ఇన్‌స్టాల్ చేసిన యాప్‌ల ద్వారా క్రియేట్ చేయబడిన ఖాతాలు ఉండవచ్చు. ఈ అనుమతి, మీ కాంటాక్ట్ డేటాను సేవ్ చేయడానికి యాప్‌లను అనుమతిస్తుంది, హానికరమైన యాప్‌లు మీకు తెలియకుండానే కాంటాక్ట్ డేటాను షేర్ చేయవచ్చు."</string>
+    <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"మీ Android TV పరికరంలో స్టోరేజ్‌ చేసిన కాంటాక్ట్‌లకు సంబంధించిన డేటాను చదవడానికి యాప్‌ను అనుమతిస్తుంది. కాంటాక్ట్‌లను క్రియేట్ చేసిన మీ Android TV పరికరంలోని ఖాతాలకు కూడా యాప్‌లకు యాక్సెస్ ఉంటుంది. ఇందులో మీరు ఇన్‌స్టాల్ చేసిన యాప్‌ల ద్వారా క్రియేట్ చేయబడిన ఖాతాలు ఉండవచ్చు. ఈ అనుమతి, మీ కాంటాక్ట్ డేటాను సేవ్ చేయడానికి యాప్‌లను అనుమతిస్తుంది, హానికరమైన యాప్‌లు మీకు తెలియకుండానే కాంటాక్ట్ డేటాను షేర్ చేయవచ్చు."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4911989776203207644">"ఫోన్‌లో స్టోరేజ్‌ చేసిన మీ కాంటాక్ట్‌లకు సంబంధించిన డేటాను చదవడానికి యాప్‌ను అనుమతిస్తుంది. కాంటాక్ట్‌లను క్రియేట్ చేసిన మీ ఫోన్‌లోని ఖాతాలను కూడా యాప్‌లు యాక్సెస్ చేయగలవు. ఇందులో మీరు ఇన్‌స్టాల్ చేసిన యాప్‌ల ద్వారా క్రియేట్ చేయబడిన ఖాతాలు ఉండవచ్చు. ఈ అనుమతి, మీ కాంటాక్ట్ డేటాను సేవ్ చేయడానికి యాప్‌లను అనుమతిస్తుంది, హానికరమైన యాప్‌లు మీకు తెలియకుండానే కాంటాక్ట్ డేటాను షేర్ చేయవచ్చు."</string>
     <string name="permlab_writeContacts" msgid="8919430536404830430">"మీ కాంటాక్ట్‌లను ఎడిట్ చేయడం"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="6422419281427826181">"మీ టాబ్లెట్‌లో నిల్వ చేసి ఉన్న కాంటాక్ట్‌లకు సంబంధించిన డేటాను ఎడిట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఈ అనుమతి, కాంటాక్ట్ డేటాను తొలగించడానికి యాప్‌లను అనుమతిస్తుంది."</string>
-    <string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"మీ Android TV పరికరంలో నిల్వ చేసి ఉన్న కాంటాక్ట్‌లకు సంబంధించిన డేటాను ఎడిట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఈ అనుమతి, కాంటాక్ట్ డేటాను తొలగించడానికి యాప్‌లను అనుమతిస్తుంది."</string>
-    <string name="permdesc_writeContacts" product="default" msgid="8304795696237065281">"మీ ఫోన్‌లో నిల్వ చేసి ఉన్న కాంటాక్ట్‌లకు సంబంధించిన డేటాను ఎడిట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఈ అనుమతి, కాంటాక్ట్ డేటాను తొలగించడానికి యాప్‌లను అనుమతిస్తుంది."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="6422419281427826181">"మీ టాబ్లెట్‌లో స్టోరేజ్‌ చేసి ఉన్న కాంటాక్ట్‌లకు సంబంధించిన డేటాను ఎడిట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఈ అనుమతి, కాంటాక్ట్ డేటాను తొలగించడానికి యాప్‌లను అనుమతిస్తుంది."</string>
+    <string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"మీ Android TV పరికరంలో స్టోరేజ్‌ చేసి ఉన్న కాంటాక్ట్‌లకు సంబంధించిన డేటాను ఎడిట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఈ అనుమతి, కాంటాక్ట్ డేటాను తొలగించడానికి యాప్‌లను అనుమతిస్తుంది."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="8304795696237065281">"మీ ఫోన్‌లో స్టోరేజ్‌ చేసి ఉన్న కాంటాక్ట్‌లకు సంబంధించిన డేటాను ఎడిట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఈ అనుమతి, కాంటాక్ట్ డేటాను తొలగించడానికి యాప్‌లను అనుమతిస్తుంది."</string>
     <string name="permlab_readCallLog" msgid="1739990210293505948">"కాల్ లాగ్‌ను చదవడం"</string>
     <string name="permdesc_readCallLog" msgid="8964770895425873433">"ఈ యాప్‌ మీ కాల్ హిస్టరీని చదవగలదు."</string>
     <string name="permlab_writeCallLog" msgid="670292975137658895">"కాల్ లాగ్‌ను రాయడం"</string>
@@ -468,9 +468,9 @@
     <string name="permlab_bodySensors_wristTemperature_background" msgid="7692772783509074356">"యాప్ బ్యాక్‌గ్రౌండ్‌లో ఉన్నప్పుడు, శరీర సెన్సార్ మణికట్టు ఉష్ణోగ్రత డేటాను యాక్సెస్ చేయండి."</string>
     <string name="permdesc_bodySensors_wristTemperature_background" product="default" msgid="3170369705518699219">"యాప్ బ్యాక్‌గ్రౌండ్‌లో ఉన్నప్పుడు, శరీర సెన్సార్ మణికట్టు ఉష్ణోగ్రత డేటాను యాక్సెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది."</string>
     <string name="permlab_readCalendar" msgid="6408654259475396200">"క్యాలెండర్ ఈవెంట్‌లు మరియు వివరాలను చదవడం"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ఈ యాప్ మీ టాబ్లెట్‌లో నిల్వ చేసిన క్యాలెండర్ ఈవెంట్‌లన్నీ చదవగలదు మరియు మీ క్యాలెండర్ డేటాను షేర్ చేయగలదు లేదా సేవ్ చేయగలదు."</string>
-    <string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ఈ యాప్‌ మీ Android TV పరికరంలో నిల్వ చేసిన క్యాలెండర్ ఈవెంట్‌లన్నీ చదవగలదు, మీ క్యాలెండర్ డేటాను షేర్ చేయగలదు లేదా సేవ్ చేయగలదు."</string>
-    <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"ఈ యాప్ మీ ఫోన్‌లో నిల్వ చేసిన క్యాలెండర్ ఈవెంట్‌లన్నీ చదవగలదు మరియు మీ క్యాలెండర్ డేటాను షేర్ చేయగలదు లేదా సేవ్ చేయగలదు."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ఈ యాప్ మీ టాబ్లెట్‌లో స్టోరేజ్‌ చేసిన క్యాలెండర్ ఈవెంట్‌లన్నీ చదవగలదు మరియు మీ క్యాలెండర్ డేటాను షేర్ చేయగలదు లేదా సేవ్ చేయగలదు."</string>
+    <string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ఈ యాప్‌ మీ Android TV పరికరంలో స్టోరేజ్‌ చేసిన క్యాలెండర్ ఈవెంట్‌లన్నీ చదవగలదు, మీ క్యాలెండర్ డేటాను షేర్ చేయగలదు లేదా సేవ్ చేయగలదు."</string>
+    <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"ఈ యాప్ మీ ఫోన్‌లో స్టోరేజ్‌ చేసిన క్యాలెండర్ ఈవెంట్‌లన్నీ చదవగలదు మరియు మీ క్యాలెండర్ డేటాను షేర్ చేయగలదు లేదా సేవ్ చేయగలదు."</string>
     <string name="permlab_writeCalendar" msgid="6422137308329578076">"యజమానికి తెలియకుండానే క్యాలెండర్ ఈవెంట్‌లను జోడించి లేదా ఎడిట్ చేసి, అతిథులకు ఈమెయిల్‌ పంపడం"</string>
     <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"ఈ యాప్ మీ టాబ్లెట్‌లో క్యాలెండర్ ఈవెంట్లను జోడించగలదు, తీసివేయగలదు లేదా మార్చగలదు. ఈ యాప్ క్యాలెండర్ ఓనర్ల నుండి వచ్చినట్లుగా మెసేజ్‌లను పంపగలదు లేదా ఈవెంట్లను వాటి ఓనర్లకు తెలియకుండానే మార్చగలదు."</string>
     <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"ఈ యాప్ మీ Android TV పరికరంలో క్యాలెండర్ ఈవెంట్లను జోడించగలదు, తీసివేయగలదు లేదా మార్చగలదు. ఈ యాప్ క్యాలెండర్ ఓనర్ల నుండి వచ్చినట్లుగా మెసేజ్‌లను పంపగలదు లేదా ఈవెంట్లను వాటి ఓనర్లకు తెలియకుండానే మార్చగలదు."</string>
@@ -595,7 +595,7 @@
     <string name="permlab_disableKeyguard" msgid="3605253559020928505">"మీ స్క్రీన్ లాక్‌ను నిలిపివేయడం"</string>
     <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"కీలాక్‌ను, అలాగే ఏదైనా అనుబంధించబడిన పాస్‌వర్డ్ సెక్యూరిటీని డిజేబుల్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఉదాహరణకు, ఇన్‌కమింగ్ ఫోన్ కాల్ వస్తున్నప్పుడు ఫోన్ కీలాక్‌ను డిజేబుల్ చేస్తుంది, ఆపై కాల్ ముగిసిన తర్వాత కీలాక్‌ను మళ్లీ ఎనేబుల్ చేస్తుంది."</string>
     <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"స్క్రీన్ లాక్ సంక్లిష్టత రిక్వెస్ట్‌"</string>
-    <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"ఇది మీ స్క్రీన్ లాక్ పాస్‌వర్డ్‌ సంక్లిష్టత స్థాయి (తీవ్రంగా ఉండాలా, ఓ మోస్తరుగా ఉండాలా, తక్కువ తీవ్రంగా ఉండాలా లేదా అస్సలు తీవ్రత ఉండకూడదా) తెలుసుకోవడానికి యాప్‌ను అనుమతిస్తుంది, అంటే పొడుగు ఎంత ఉండాలి, ఏ రకమైన స్క్రీన్ లాక్ పధ్ధతి అనుసరించాలో సూచిస్తుంది. అలాగే, స్క్రీన్ లాక్‌ పాస్‌వర్డ్‌ సంక్లిష్టతను ఏ స్థాయికి సెట్ చేసుకుంటే బాగుంటుందో కూడా వినియోగదారులకు యాప్ సూచించగలదు, కానీ వినియోగదారులు నిరభ్యంతరంగా ఆ సూచనలను పట్టించుకోకుండా వారి ఇష్టం మేరకు చక్కగా సెట్ చేసుకోవచ్చు. ఇంకో ముఖ్య విషయం, స్క్రీన్ లాక్‌ అన్నది సాదా వచన రూపంలో నిల్వ చేయబడదు, కనుక ఖచ్చితమైన పాస్‌వర్డ్‌ ఏమిటనేది యాప్‌కు తెలియదు."</string>
+    <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"ఇది మీ స్క్రీన్ లాక్ పాస్‌వర్డ్‌ సంక్లిష్టత స్థాయి (తీవ్రంగా ఉండాలా, ఓ మోస్తరుగా ఉండాలా, తక్కువ తీవ్రంగా ఉండాలా లేదా అస్సలు తీవ్రత ఉండకూడదా) తెలుసుకోవడానికి యాప్‌ను అనుమతిస్తుంది, అంటే పొడుగు ఎంత ఉండాలి, ఏ రకమైన స్క్రీన్ లాక్ పధ్ధతి అనుసరించాలో సూచిస్తుంది. అలాగే, స్క్రీన్ లాక్‌ పాస్‌వర్డ్‌ సంక్లిష్టతను ఏ స్థాయికి సెట్ చేసుకుంటే బాగుంటుందో కూడా వినియోగదారులకు యాప్ సూచించగలదు, కానీ వినియోగదారులు నిరభ్యంతరంగా ఆ సూచనలను పట్టించుకోకుండా వారి ఇష్టం మేరకు చక్కగా సెట్ చేసుకోవచ్చు. ఇంకో ముఖ్య విషయం, స్క్రీన్ లాక్‌ అన్నది సాదా వచన రూపంలో స్టోరేజ్‌ చేయబడదు, కనుక ఖచ్చితమైన పాస్‌వర్డ్‌ ఏమిటనేది యాప్‌కు తెలియదు."</string>
     <string name="permlab_postNotification" msgid="4875401198597803658">"నోటిఫికేషన్‌లను చూపండి"</string>
     <string name="permdesc_postNotification" msgid="5974977162462877075">"నోటిఫికేషన్‌లను చూపించడానికి యాప్‌ను అనుమతించండి"</string>
     <string name="permlab_turnScreenOn" msgid="219344053664171492">"స్క్రీన్‌ను ఆన్ చేయండి"</string>
@@ -709,7 +709,7 @@
   </string-array>
     <string name="face_error_hw_not_available" msgid="5085202213036026288">"ముఖం ధృవీకరించలేరు. హార్డ్‌వేర్ అందుబాటులో లేదు."</string>
     <string name="face_error_timeout" msgid="2598544068593889762">"ఫేస్ అన్‌లాక్‌ను మళ్లీ ట్రై చేయండి"</string>
-    <string name="face_error_no_space" msgid="5649264057026021723">"కొత్త ముఖం డేటాను నిల్వ చేయడం కాదు. మొదట పాతది తొలిగించండి."</string>
+    <string name="face_error_no_space" msgid="5649264057026021723">"కొత్త ముఖం డేటాను స్టోరేజ్‌ చేయడం కాదు. మొదట పాతది తొలిగించండి."</string>
     <string name="face_error_canceled" msgid="2164434737103802131">"ముఖ యాక్టివిటీ రద్దయింది."</string>
     <string name="face_error_user_canceled" msgid="5766472033202928373">"ఫేస్ అన్‌లాక్‌ను యూజర్ రద్దు చేశారు"</string>
     <string name="face_error_lockout" msgid="7864408714994529437">"చాలా ఎక్కువ ప్రయత్నాలు చేశారు. తర్వాత మళ్లీ ప్రయత్నించండి."</string>
@@ -734,8 +734,8 @@
     <string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"ఖాతా యొక్క సింక్‌ సెట్టింగ్‌లను ఎడిట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఉదాహరణకు, ఇది ఒక ఖాతాతో వ్యక్తుల యాప్ యొక్క సింక్‌ను ప్రారంభించడానికి ఉపయోగించబడవచ్చు."</string>
     <string name="permlab_readSyncStats" msgid="3747407238320105332">"సింక్ గణాంకాలను చదవగలగడం"</string>
     <string name="permdesc_readSyncStats" msgid="3867809926567379434">"ఖాతా యొక్క సింక్‌ గణాంకాలను అలాగే సింక్‌ ఈవెంట్‌ల హిస్టరీని మరియు ఎంత డేటా సింక్ చేయబడింది అనేవాటిని చదవడానికి యాప్‌ను అనుమతిస్తుంది."</string>
-    <string name="permlab_sdcardRead" msgid="5791467020950064920">"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను చదువుతుంది"</string>
-    <string name="permdesc_sdcardRead" msgid="6872973242228240382">"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది."</string>
+    <string name="permlab_sdcardRead" msgid="5791467020950064920">"మీ షేర్ చేసిన స్టోరేజ్‌ యొక్క కంటెంట్‌లను చదువుతుంది"</string>
+    <string name="permdesc_sdcardRead" msgid="6872973242228240382">"మీ షేర్ చేసిన స్టోరేజ్‌ యొక్క కంటెంట్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది."</string>
     <string name="permlab_readMediaAudio" msgid="8723513075731763810">"షేర్ చేయబడిన స్టోరేజ్ నుండి ఆడియో ఫైల్‌లను చదవండి"</string>
     <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"మీ షేర్ చేయబడిన స్టోరేజ్ నుండి ఆడియో ఫైల్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది."</string>
     <string name="permlab_readMediaVideo" msgid="7768003311260655007">"షేర్ చేయబడిన స్టోరేజ్ నుండి వీడియో ఫైల్‌లను చదవండి"</string>
@@ -744,8 +744,8 @@
     <string name="permdesc_readMediaImages" msgid="5836219373138469259">"మీ షేర్ చేయబడిన స్టోరేజ్ నుండి ఇమేజ్ ఫైల్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది."</string>
     <string name="permlab_readVisualUserSelect" msgid="5516204215354667586">"షేర్ చేయబడిన స్టోరేజ్ నుండి యూజర్ ఎంచుకున్న ఇమేజ్ ఫైల్స్‌ను, వీడియో ఫైల్స్‌ను చదువుతుంది"</string>
     <string name="permdesc_readVisualUserSelect" msgid="8027174717714968217">"మీరు మీ షేర్ చేయబడిన స్టోరేజ్ నుండి ఎంచుకున్న ఇమేజ్, వీడియో ఫైల్స్‌ను చదవడానికి యాప్‌ను అనుమతిస్తుంది."</string>
-    <string name="permlab_sdcardWrite" msgid="4863021819671416668">"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను ఎడిట్ చేయండి లేదా తొలగించండి"</string>
-    <string name="permdesc_sdcardWrite" msgid="8376047679331387102">"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను రాయడానికి యాప్‌ను అనుమతిస్తుంది."</string>
+    <string name="permlab_sdcardWrite" msgid="4863021819671416668">"మీ షేర్ చేసిన స్టోరేజ్‌ యొక్క కంటెంట్‌లను ఎడిట్ చేయండి లేదా తొలగించండి"</string>
+    <string name="permdesc_sdcardWrite" msgid="8376047679331387102">"మీ షేర్ చేసిన స్టోరేజ్‌ యొక్క కంటెంట్‌లను రాయడానికి యాప్‌ను అనుమతిస్తుంది."</string>
     <string name="permlab_use_sip" msgid="8250774565189337477">"SIP కాల్స్‌ను చేయడానికి/స్వీకరించడానికి"</string>
     <string name="permdesc_use_sip" msgid="3590270893253204451">"SIP కాల్స్‌ను చేయడానికి మరియు స్వీకరించడానికి యాప్‌ను అనుమతిస్తుంది."</string>
     <string name="permlab_register_sim_subscription" msgid="1653054249287576161">"కొత్త టెలికామ్ SIM కనెక్షన్‌లను నమోదు చేయడం"</string>
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"యాప్ ఫీచర్‌ల సమాచారాన్ని చూడటాన్ని ప్రారంభించడానికి హోల్డర్‌ను అనుమతిస్తుంది."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"అధిక శాంపిల్ రేటు వద్ద సెన్సార్ డేటాను యాక్సెస్ చేయండి"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"200 Hz కంటే ఎక్కువ రేట్ వద్ద శాంపిల్ సెన్సార్ డేటాకు యాప్‌ను అనుమతిస్తుంది"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"పాస్‌వర్డ్ నియమాలను సెట్ చేయండి"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"స్క్రీన్ లాక్ పాస్‌వర్డ్‌లు మరియు PINల్లో అనుమతించబడిన పొడవు మరియు అక్షరాలను నియంత్రిస్తుంది."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"స్క్రీన్ అన్‌లాక్ ప్రయత్నాలను పర్యవేక్షించండి"</string>
@@ -830,8 +834,8 @@
     <string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"విధానాన్ని ప్రారంభించినప్పుడు ఉపయోగించడానికి పరికర గ్లోబల్ ప్రాక్సీని సెట్ చేస్తుంది. పరికర యజమాని మాత్రమే గ్లోబల్ ప్రాక్సీని సెట్ చేయగలరు."</string>
     <string name="policylab_expirePassword" msgid="6015404400532459169">"స్క్రీన్ లాక్ పాస్‌వర్డ్ గడువు ముగింపుని సెట్ చేయండి"</string>
     <string name="policydesc_expirePassword" msgid="9136524319325960675">"స్క్రీన్ లాక్ పాస్‌వర్డ్, పిన్ లేదా నమూనాని తప్పనిసరిగా ఎంత తరచుగా మార్చాలనే దాన్ని మారుస్తుంది."</string>
-    <string name="policylab_encryptedStorage" msgid="9012936958126670110">"నిల్వ ఎన్‌క్రిప్షన్‌ను సెట్ చేయండి"</string>
-    <string name="policydesc_encryptedStorage" msgid="1102516950740375617">"నిల్వ చేయబడిన యాప్ డేటా గుప్తీకరించబడి ఉండటం అవసరం."</string>
+    <string name="policylab_encryptedStorage" msgid="9012936958126670110">"స్టోరేజ్‌ ఎన్‌క్రిప్షన్‌ను సెట్ చేయండి"</string>
+    <string name="policydesc_encryptedStorage" msgid="1102516950740375617">"స్టోరేజ్‌ చేయబడిన యాప్ డేటా గుప్తీకరించబడి ఉండటం అవసరం."</string>
     <string name="policylab_disableCamera" msgid="5749486347810162018">"కెమెరాలను నిలిపివేయండి"</string>
     <string name="policydesc_disableCamera" msgid="3204405908799676104">"అన్ని పరికర కెమెరాల వినియోగాన్ని నిరోధించండి."</string>
     <string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"కొన్ని స్క్రీన్ లాక్ ఫీచర్‌లు నిలిపివేయండి"</string>
@@ -1160,9 +1164,9 @@
     <string name="editTextMenuTitle" msgid="857666911134482176">"వచనానికి సంబంధించిన చర్యలు"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"వెనుకకు"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ఇన్‌పుట్ విధానాన్ని మార్చండి"</string>
-    <string name="low_internal_storage_view_title" msgid="9024241779284783414">"నిల్వ ఖాళీ అయిపోతోంది"</string>
+    <string name="low_internal_storage_view_title" msgid="9024241779284783414">"స్టోరేజ్‌ ఖాళీ అయిపోతోంది"</string>
     <string name="low_internal_storage_view_text" msgid="8172166728369697835">"కొన్ని సిస్టమ్ కార్యాచరణలు పని చేయకపోవచ్చు"</string>
-    <string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"సిస్టమ్ కోసం తగినంత నిల్వ లేదు. మీకు 250MB ఖాళీ స్థలం ఉందని నిర్ధారించుకుని, పునఃప్రారంభించండి."</string>
+    <string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"సిస్టమ్ కోసం తగినంత స్టోరేజ్‌ లేదు. మీకు 250MB ఖాళీ స్థలం ఉందని నిర్ధారించుకుని, పునఃప్రారంభించండి."</string>
     <string name="app_running_notification_title" msgid="8985999749231486569">"<xliff:g id="APP_NAME">%1$s</xliff:g> అమలులో ఉంది"</string>
     <string name="app_running_notification_text" msgid="5120815883400228566">"మరింత సమాచారం కోసం లేదా యాప్‌ను ఆపివేయడం కోసం నొక్కండి."</string>
     <string name="ok" msgid="2646370155170753815">"సరే"</string>
@@ -1427,7 +1431,7 @@
     <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> ఊహించని విధంగా తీసివేయబడింది"</string>
     <string name="ext_media_badremoval_notification_message" msgid="1986514704499809244">"కంటెంట్‌ని కోల్పోవడాన్ని నివారించాలంటే తీసివేయబోయే ముందు మీడియాని తొలగించండి"</string>
     <string name="ext_media_nomedia_notification_title" msgid="742671636376975890">"<xliff:g id="NAME">%s</xliff:g> తీసివేయబడింది"</string>
-    <string name="ext_media_nomedia_notification_message" msgid="2832724384636625852">"కొంత నిర్వాహక ప్రక్రియ సరిగ్గా పని చేయకపోవచ్చు. కొత్త నిల్వని చొప్పించండి."</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2832724384636625852">"కొంత నిర్వాహక ప్రక్రియ సరిగ్గా పని చేయకపోవచ్చు. కొత్త స్టోరేజ్‌ను చొప్పించండి."</string>
     <string name="ext_media_unmounting_notification_title" msgid="4147986383917892162">"<xliff:g id="NAME">%s</xliff:g>ని తొలగిస్తోంది"</string>
     <string name="ext_media_unmounting_notification_message" msgid="5717036261538754203">"తీసివేయవద్దు"</string>
     <string name="ext_media_init_action" msgid="2312974060585056709">"సెటప్ చేయండి"</string>
@@ -1578,7 +1582,7 @@
     <string name="storage_sd_card_label" msgid="7526153141147470509">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD కార్డ్"</string>
     <string name="storage_usb_drive" msgid="448030813201444573">"USB డ్రైవ్"</string>
     <string name="storage_usb_drive_label" msgid="6631740655876540521">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB డ్రైవ్"</string>
-    <string name="storage_usb" msgid="2391213347883616886">"USB నిల్వ"</string>
+    <string name="storage_usb" msgid="2391213347883616886">"USB స్టోరేజ్‌"</string>
     <string name="extract_edit_menu_button" msgid="63954536535863040">"ఎడిట్ చేయండి"</string>
     <string name="data_usage_warning_title" msgid="9034893717078325845">"డేటా హెచ్చరిక"</string>
     <string name="data_usage_warning_body" msgid="1669325367188029454">"మీరు డేటాలో <xliff:g id="APP">%s</xliff:g> ఉపయోగించారు"</string>
@@ -2006,7 +2010,7 @@
     <string name="app_category_maps" msgid="6395725487922533156">"మ్యాప్స్ &amp; నావిగేషన్"</string>
     <string name="app_category_productivity" msgid="1844422703029557883">"ఉత్పాదకత"</string>
     <string name="app_category_accessibility" msgid="6643521607848547683">"యాక్సెసిబిలిటీ"</string>
-    <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"పరికర నిల్వ"</string>
+    <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"పరికర స్టోరేజ్‌"</string>
     <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB డీబగ్గింగ్"</string>
     <string name="time_picker_hour_label" msgid="4208590187662336864">"గంట"</string>
     <string name="time_picker_minute_label" msgid="8307452311269824553">"నిమిషం"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index eef7772..116e31e 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"อนุญาตให้เจ้าของเริ่มดูข้อมูลฟีเจอร์สำหรับแอป"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"เข้าถึงข้อมูลเซ็นเซอร์ที่อัตราการสุ่มตัวอย่างสูง"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"อนุญาตให้แอปสุ่มตัวอย่างข้อมูลเซ็นเซอร์ที่อัตราสูงกว่า 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"ตั้งค่ากฎรหัสผ่าน"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"ควบคุมความยาวและอักขระที่สามารถใช้ในรหัสผ่านของการล็อกหน้าจอและ PIN"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"ตรวจสอบความพยายามในการปลดล็อกหน้าจอ"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index d2137f6..b31e160 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Nagbibigay-daan sa may hawak na simulang tingnan ang impormasyon ng mga feature para sa isang app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"mag-access ng data ng sensor sa mataas na rate ng pag-sample"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Pinapahintulutan ang app na mag-sample ng data ng sensor sa rate na higit sa 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Magtakda ng mga panuntunan sa password"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolin ang haba at ang mga character na pinapayagan sa mga password at PIN sa screen lock."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Subaybayan ang mga pagsubok sa pag-unlock ng screen"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index b2d7617..aaf7644 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"İzin sahibinin, bir uygulamanın özellik bilgilerini görüntülemeye başlamasına izin verir."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"sensör verilerine daha yüksek örnekleme hızında eriş"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Uygulamanın, sensör verilerini 200 Hz\'den daha yüksek bir hızda örneklemesine olanak tanır"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Şifre kuralları ayarla"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Ekran kilidini açma şifrelerinde ve PIN\'lerde izin verilen uzunluğu ve karakterleri denetler."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Ekran kilidini açma denemelerini izle"</string>
@@ -2324,12 +2328,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g>, içeriği göstermek için her iki ekranı da kullanıyor"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Cihaz çok ısındı"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Telefonunuz çok ısındığı için Çift Ekran kullanılamıyor"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen kullanılamıyor"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Pil Tasarrufu açık olduğundan Dual Screen kullanılamıyor. Bu özelliği Ayarlar\'dan kapatabilirsiniz."</string>
+    <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ayarlar\'a git"</string>
     <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Kapat"</string>
     <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> yapılandırıldı"</string>
     <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Klavye düzeni <xliff:g id="LAYOUT_1">%s</xliff:g> olarak ayarlandı. Değiştirmek için dokunun."</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 9296f6a..8ad1c69 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -802,6 +802,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Дозволяє додатку почати перегляд інформації про функції іншого додатка."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"доступ до даних датчиків із високою частотою дикретизації"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Додаток зможе дискретизувати дані даних датчиків із частотою понад 200 Гц"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Устан. правила пароля"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Укажіть максимальну довжину та кількість символів для паролів розблокування екрана та PIN-кодів."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Відстежувати спроби розблокування екрана"</string>
@@ -1491,7 +1495,7 @@
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Ви використовуєте цей додаток у своєму робочому профілі"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Метод введення"</string>
     <string name="sync_binding_label" msgid="469249309424662147">"Синхр."</string>
-    <string name="accessibility_binding_label" msgid="1974602776545801715">"Спеціальні можливості"</string>
+    <string name="accessibility_binding_label" msgid="1974602776545801715">"Доступність"</string>
     <string name="wallpaper_binding_label" msgid="1197440498000786738">"Фоновий мал."</string>
     <string name="chooser_wallpaper" msgid="3082405680079923708">"Змінити фоновий малюнок"</string>
     <string name="notification_listener_binding_label" msgid="2702165274471499713">"Сервіс читання сповіщень"</string>
@@ -1699,8 +1703,8 @@
     <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_off" msgid="5531598275559472393">"ВИМК."</string>
-    <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Надати сервісу <xliff:g id="SERVICE">%1$s</xliff:g> повний доступ до вашого пристрою?"</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Повний доступ доречний для додатків, які надають спеціальні можливості, але його не варто відкривати для більшості інших додатків."</string>
+    <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Надати сервісу \"<xliff:g id="SERVICE">%1$s</xliff:g>\" повний доступ до вашого пристрою?"</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Повний доступ потрібен додаткам, які підтримують функції доступності, але його не варто відкривати для більшості інших додатків."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Перегляд і контроль екрана"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Цей сервіс може переглядати всі дані на екрані й показувати контент поверх інших додатків."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Перегляд і виконання дій"</string>
@@ -2007,7 +2011,7 @@
     <string name="app_category_news" msgid="1172762719574964544">"Новини та журнали"</string>
     <string name="app_category_maps" msgid="6395725487922533156">"Карти й навігація"</string>
     <string name="app_category_productivity" msgid="1844422703029557883">"Продуктивність"</string>
-    <string name="app_category_accessibility" msgid="6643521607848547683">"Спеціальні можливості"</string>
+    <string name="app_category_accessibility" msgid="6643521607848547683">"Доступність"</string>
     <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"Пам’ять пристрою"</string>
     <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"Налагодження USB"</string>
     <string name="time_picker_hour_label" msgid="4208590187662336864">"години"</string>
@@ -2326,12 +2330,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> використовує обидва екрани для показу контенту"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Пристрій сильно нагрівається"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Подвійний екран недоступний, оскільки телефон сильно нагрівається"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <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_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 4970050..09b3f49 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ہولڈر کو ایپ کے لیے خصوصیات کی معلومات دیکھنے کی اجازت دیتا ہے۔"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"نمونہ کاری کی اعلی شرح پر سینسر کے ڈیٹا تک رسائی حاصل کریں"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"‏ایپ کو Hz‏200 سے زیادہ شرح پر سینسر ڈیٹا کا نمونہ لینے کی اجازت دیتی ہے"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"صارف کی کارروائی کے بغیر ایپ کو اپ ڈیٹ کرنا"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"ہولڈر کو صارف کی کارروائی کے بغیر اپنی پہلے انسٹال کردہ ایپ کو اپ ڈیٹ کرنے کی اجازت دیتا ہے"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"پاس ورڈ کے اصول سیٹ کریں"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"‏اسکرین لاک پاس ورڈز اور PINs میں اجازت یافتہ لمبائی اور حروف کو کنٹرول کریں۔"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"اسکرین غیر مقفل کرنے کی کوششیں مانیٹر کریں"</string>
@@ -958,12 +960,12 @@
     <string name="keyguard_password_enter_password_code" msgid="2751130557661643482">"غیر مقفل کرنے کیلئے پاس ورڈ ٹائپ کریں"</string>
     <string name="keyguard_password_enter_pin_password_code" msgid="7792964196473964340">"‏غیر مقفل کرنے کیلئے PIN ٹائپ کریں"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="8583732939138432793">"‏غلط PIN کوڈ۔"</string>
-    <string name="keyguard_label_text" msgid="3841953694564168384">"غیر مقفل کرنے کیلئے، مینو پھر 0 دبائیں۔"</string>
+    <string name="keyguard_label_text" msgid="3841953694564168384">"غیر مقفل کرنے کیلئے، مینیو پھر 0 دبائیں۔"</string>
     <string name="emergency_call_dialog_number_for_display" msgid="2978165477085612673">"ہنگامی نمبر"</string>
     <string name="lockscreen_carrier_default" msgid="6192313772955399160">"کوئی سروس نہیں ہے"</string>
     <string name="lockscreen_screen_locked" msgid="7364905540516041817">"اسکرین مقفل ہے۔"</string>
-    <string name="lockscreen_instructions_when_pattern_enabled" msgid="7982445492532123308">"غیر مقفل کرنے کیلئے مینو دبائیں یا ہنگامی کال کریں۔"</string>
-    <string name="lockscreen_instructions_when_pattern_disabled" msgid="7434061749374801753">"غیر مقفل کرنے کیلئے مینو دبائیں۔"</string>
+    <string name="lockscreen_instructions_when_pattern_enabled" msgid="7982445492532123308">"غیر مقفل کرنے کیلئے مینیو دبائیں یا ہنگامی کال کریں۔"</string>
+    <string name="lockscreen_instructions_when_pattern_disabled" msgid="7434061749374801753">"غیر مقفل کرنے کیلئے مینیو دبائیں۔"</string>
     <string name="lockscreen_pattern_instructions" msgid="3169991838169244941">"غیر مقفل کرنے کیلئے پیٹرن کو ڈرا کریں"</string>
     <string name="lockscreen_emergency_call" msgid="7500692654885445299">"ہنگامی"</string>
     <string name="lockscreen_return_to_call" msgid="3156883574692006382">"کال پر واپس جائیں"</string>
@@ -1072,7 +1074,7 @@
     <string name="permdesc_addVoicemail" msgid="5470312139820074324">"ایپ کو آپ کے صوتی میل کے ان باکس میں پیغامات شامل کرنے کی اجازت دیتا ہے۔"</string>
     <string name="pasted_from_clipboard" msgid="7355790625710831847">"‫<xliff:g id="PASTING_APP_NAME">%1$s</xliff:g> نے آپ کے کلپ بورڈ سے پپیسٹ کر دیا"</string>
     <string name="more_item_label" msgid="7419249600215749115">"مزید"</string>
-    <string name="prepend_shortcut_label" msgid="1743716737502867951">"مینو+"</string>
+    <string name="prepend_shortcut_label" msgid="1743716737502867951">"مینیو+"</string>
     <string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+‎"</string>
     <string name="menu_ctrl_shortcut_label" msgid="131911133027196485">"Ctrl+‎"</string>
     <string name="menu_alt_shortcut_label" msgid="343761069945250991">"Alt+‎"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 69b2efb..27f6329 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -141,7 +141,7 @@
     <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi chaqiruv"</string>
     <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWi-Fi"</string>
     <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-Fi chaqiruv"</string>
-    <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Yoqilmagan"</string>
+    <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Oʻchiq"</string>
     <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi orqali chaqiruv"</string>
     <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Mobil tarmoq orqali chaqiruv"</string>
     <string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Faqat Wi-Fi"</string>
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Qurilma egasiga ilova funksiyalari axborotini koʻrishga ruxsat beradi."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"yuqori diskretlash chastotali sensor axborotiga ruxsat"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Ilova sensor axborotini 200 Hz dan yuqori tezlikda hisoblashi mumkin"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Parol qoidalarini o‘rnatish"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Ekran qulfi paroli va PIN kodlari uchun qo‘yiladigan talablarni (belgilar soni va uzunligi) nazorat qiladi."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Ekranni qulfdan chiqarishga urinishlarni nazorat qilish"</string>
@@ -1489,7 +1493,7 @@
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Siz ushbu ilovadan ishchi profilingizda foydalanmoqdasiz"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Kiritish uslubi"</string>
     <string name="sync_binding_label" msgid="469249309424662147">"Sinx"</string>
-    <string name="accessibility_binding_label" msgid="1974602776545801715">"Maxsus imkoniyatlar"</string>
+    <string name="accessibility_binding_label" msgid="1974602776545801715">"Qulayliklar"</string>
     <string name="wallpaper_binding_label" msgid="1197440498000786738">"Fon rasmi"</string>
     <string name="chooser_wallpaper" msgid="3082405680079923708">"Fon rasmini almashtirish"</string>
     <string name="notification_listener_binding_label" msgid="2702165274471499713">"Bildirishnoma tinglovchisi"</string>
@@ -1687,12 +1691,12 @@
     <string name="csd_entering_RS2_warning" product="default" msgid="3699509945325496807">"Uzoq vaqt davomida bunday balandlikda media fayllarni tinglash eshitish qobiliyatingiz buzilishiga olib kelishi mumkin.\n\nUzoq vaqt davomida bu darajada ijroni davom ettirish eshitishingizga zarar yetkazishi mumkin."</string>
     <string name="csd_momentary_exposure_warning" product="default" msgid="7861896191081176454">"Ogohlantirish\nHozir xavfli darajada baland ovozli kontentni tinglayapsiz.\n\nBu baland tovushda tinglashda davom etsangiz, eshitish qobiliyatingiz butunlay buziladi."</string>
     <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Tezkor ishga tushirishdan foydalanilsinmi?"</string>
-    <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Maxsus imkoniyatlar funksiyasidan foydalanish uchun u yoniqligida ikkala tovush tugmasini 3 soniya bosib turing."</string>
-    <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Maxsus imkoniyatlar uchun tezkor tugma yoqilsinmi?"</string>
-    <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Maxsus imkoniyatlarni yoqish uchun ikkala tovush tugmalarini bir necha soniya bosib turing. Qurilmangiz ishlashida oʻzgarish yuz berishi mumkin.\n\nJoriy funksiyalar:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nTanlangan funksiyalarni Sozlamalar ichidagi Maxsus imkoniyatlar ustiga bosib oʻzgartirishingiz mumkin."</string>
+    <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Qulayliklar funksiyasidan foydalanish uchun u yoniqligida ikkala tovush tugmasini 3 soniya bosib turing."</string>
+    <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Qulayliklar uchun tezkor tugma yoqilsinmi?"</string>
+    <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Qulayliklarni yoqish uchun ikkala tovush tugmalarini bir necha soniya bosib turing. Qurilmangiz ishlashida oʻzgarish yuz berishi mumkin.\n\nJoriy funksiyalar:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nTanlangan funksiyalarni Sozlamalar ichidagi Qulayliklar ustiga bosib oʻzgartirishingiz mumkin."</string>
     <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string>
     <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> tezkor tugmasi yoqilsinmi?"</string>
-    <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"<xliff:g id="SERVICE">%1$s</xliff:g> funksiyasini yoqish uchun ikkala tovush tugmalarini bir necha soniya bosib turing. Qurilmangiz ishlashida oʻzgarish yuz berishi mumkin.\n\nBu tezkor tugmalarni boshqa funksiyaga Sozlamalar ichidagi Maxsus imkoniyatlar orqali tayinlash mumkin."</string>
+    <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"<xliff:g id="SERVICE">%1$s</xliff:g> funksiyasini yoqish uchun ikkala tovush tugmalarini bir necha soniya bosib turing. Qurilmangiz ishlashida oʻzgarish yuz berishi mumkin.\n\nBu tezkor tugmalarni boshqa funksiyaga Sozlamalar ichidagi Qulayliklar orqali tayinlash mumkin."</string>
     <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Yoqilsin"</string>
     <string name="accessibility_shortcut_off" msgid="3651336255403648739">"Yoqilmasin"</string>
     <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"YONIQ"</string>
@@ -1706,7 +1710,7 @@
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Ruxsat"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Rad etish"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Kerakli funksiyani tanlang"</string>
-    <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Maxsus imkoniyatlar tugmasi bilan foydalanish uchun funksiyalarni tanlang"</string>
+    <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Qulayliklar tugmasi bilan foydalanish uchun funksiyalarni tanlang"</string>
     <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Tovush tugmasi bilan ishga tushiriladigan funksiyalarni tanlang"</string>
     <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> faolsizlantirildi"</string>
     <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Tezkor tugmalarni tahrirlash"</string>
@@ -1721,9 +1725,9 @@
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Tovush tugmalari bosib turildi. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> yoqildi."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Tovush tugmalari bosib turildi. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> faolsizlantirildi."</string>
     <string name="accessibility_shortcut_spoken_feedback" msgid="3760999147597564314">"Tovush tugmalarini qoʻyib yuboring. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> xizmatini yoqish uchun ikkala tovush tugmasini 3 soniya bosib turing."</string>
-    <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"Maxsus imkoniyatlar tugmasi bosilganda ishga tushadigan funksiyani tanlang:"</string>
-    <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Maxsus imkoniyatlar ishorasi bilan ishga tushadigan funksiyani tanlang (ikkita barmoq bilan ekranning pastidan tepaga surib tortilganda):"</string>
-    <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"Maxsus imkoniyatlar ishorasi bilan ishga tushadigan funksiyani tanlang (uchta barmoq bilan ekranning pastidan tepaga surib tortilganda):"</string>
+    <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"Qulayliklar tugmasi bosilganda ishga tushadigan funksiyani tanlang:"</string>
+    <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Qulayliklar ishorasi bilan ishga tushadigan funksiyani tanlang (ikkita barmoq bilan ekranning pastidan tepaga surib tortilganda):"</string>
+    <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"Qulayliklar ishorasi bilan ishga tushadigan funksiyani tanlang (uchta barmoq bilan ekranning pastidan tepaga surib tortilganda):"</string>
     <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Funksiyalarni almashtirish uchun maxsus imkoniyatlar tugmasini bosib turing."</string>
     <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Funksiyalarni almashtirish uchun ikkita barmoq bilan tepaga suring va ushlab turing."</string>
     <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Funksiyalarni almashtirish uchun uchta barmoq bilan tepaga suring va ushlab turing."</string>
@@ -2005,7 +2009,7 @@
     <string name="app_category_news" msgid="1172762719574964544">"Yangiliklar va jurnallar"</string>
     <string name="app_category_maps" msgid="6395725487922533156">"Xaritalar va navigatsiya"</string>
     <string name="app_category_productivity" msgid="1844422703029557883">"Ish va unumdorlik"</string>
-    <string name="app_category_accessibility" msgid="6643521607848547683">"Maxsus imkoniyatlar"</string>
+    <string name="app_category_accessibility" msgid="6643521607848547683">"Qulayliklar"</string>
     <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"Qurilma xotirasi"</string>
     <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB orqali nosozliklarni aniqlash"</string>
     <string name="time_picker_hour_label" msgid="4208590187662336864">"soat"</string>
@@ -2130,7 +2134,7 @@
     <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Bu ilovaga yozib olish ruxsati berilmagan, lekin shu USB orqali ovozlarni yozib olishi mumkin."</string>
     <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Bosh sahifa"</string>
     <string name="accessibility_system_action_back_label" msgid="4205361367345537608">"Orqaga"</string>
-    <string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"Yaqinda ishlatilgan ilovalar"</string>
+    <string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"Oxirgi ilovalar"</string>
     <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"Bildirishnomalar"</string>
     <string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"Tezkor sozlamalar"</string>
     <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Quvvat muloqot oynasi"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 93907f9..6dcdb13 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Cho phép chủ sở hữu bắt đầu xem thông tin về tính năng của một ứng dụng."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"truy cập vào dữ liệu cảm biến ở tốc độ lấy mẫu cao"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Cho phép ứng dụng lấy mẫu dữ liệu cảm biến ở tốc độ lớn hơn 200 Hz"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Đặt quy tắc mật khẩu"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kiểm soát độ dài và ký tự được phép trong mật khẩu khóa màn hình và mã PIN."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Giám sát những lần thử mở khóa màn hình"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 818f1ff..51282d3 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -800,6 +800,10 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"允许具有该权限的应用开始查看某个应用的功能信息。"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"以高采样率访问传感器数据"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"允许应用以高于 200 Hz 的频率对传感器数据进行采样"</string>
+    <!-- no translation found for permlab_updatePackagesWithoutUserAction (3363272609642618551) -->
+    <skip />
+    <!-- no translation found for permdesc_updatePackagesWithoutUserAction (4567739631260526366) -->
+    <skip />
     <string name="policylab_limitPassword" msgid="4851829918814422199">"设置密码规则"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"控制锁屏密码和 PIN 码所允许的长度和字符。"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"监控屏幕解锁尝试次数"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 67db060..c7311bd 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"允許擁有者開始查看應用程式的功能資料。"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"以高取樣率存取感應器資料"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"允許應用程式以大於 200 Hz 的頻率對感應器資料進行取樣"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"更新應用程式,無需使用者操作"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"允許擁有者更新先前安裝的應用程式,無需使用者操作"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"設定密碼規則"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"控制螢幕鎖定密碼和 PIN 所允許的長度和字元。"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"監控螢幕解鎖嘗試次數"</string>
@@ -1697,7 +1699,7 @@
     <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_off" msgid="5531598275559472393">"關閉"</string>
-    <string name="accessibility_enable_service_title" msgid="3931558336268541484">"允許 <xliff:g id="SERVICE">%1$s</xliff:g> 完全控制您的裝置?"</string>
+    <string name="accessibility_enable_service_title" msgid="3931558336268541484">"要授予「<xliff:g id="SERVICE">%1$s</xliff:g>」裝置的完整控制權?"</string>
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"對於為您提供無障礙功能的應用程式,您可授予完整控制權,但大部分應用程式都不應獲授予此權限。"</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"查看和控制螢幕"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"這項功能可以讀出螢幕上的所有內容,並透過其他應用程式顯示內容。"</string>
@@ -2324,12 +2326,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在使用雙螢幕顯示內容"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"裝置過熱"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"由於手機過熱,雙螢幕功能無法使用"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"無法使用雙螢幕功能"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"由於「省電模式」已開啟,因此無法使用雙螢幕功能。您可以前往「設定」中關閉此模式。"</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-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index b3af8e3..ca8ac36 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"允許具有這項權限的應用程式開始查看其他應用程式的功能資訊。"</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"以高取樣率存取感應器資料"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"允許應用程式以高於 200 Hz 的頻率對感應器資料進行取樣"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"自動更新應用程式 (使用者不必操作)"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"允許容器更新先前安裝的應用程式,使用者不必操作"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"設定密碼規則"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"管理螢幕鎖定密碼和 PIN 碼支援的字元和長度上限。"</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"監控螢幕解鎖嘗試次數"</string>
@@ -2324,12 +2326,9 @@
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在使用雙螢幕顯示內容"</string>
     <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"裝置過熱"</string>
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"手機過熱,因此無法使用雙螢幕功能"</string>
-    <!-- no translation found for concurrent_display_notification_power_save_title (1794569070730736281) -->
-    <skip />
-    <!-- no translation found for concurrent_display_notification_power_save_content (2198116070583851493) -->
-    <skip />
-    <!-- no translation found for device_state_notification_settings_button (691937505741872749) -->
-    <skip />
+    <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"無法使用雙螢幕功能"</string>
+    <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"省電模式已開啟,因此無法使用雙螢幕功能。你可以前往「設定」頁面關閉這個模式。"</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-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 0f9bde7..fe38bd2 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -800,6 +800,8 @@
     <string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Vumela isibambi ukuthi siqale ukubuka ulwazi lwezakhi lwe-app."</string>
     <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"finyelela idatha yenzwa ngenani eliphezulu lokwenza isampuli"</string>
     <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Ivumela uhlelo lokusebenza lusampule idatha yenzwa ngenani elikhulu kuno-200 Hz"</string>
+    <string name="permlab_updatePackagesWithoutUserAction" msgid="3363272609642618551">"buyekeza i-app ngaphandle kwesenzo somsebenzisi"</string>
+    <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Ivumela obambile ukuthi abuyekeze i-app ayifake ngaphambilini ngaphandle kwesenzo somsebenzisi"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Misa imithetho yephasiwedi"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Lawula ubude nezinhlamvu ezivunyelwe kumaphasiwedi wokukhiya isikrini nama-PIN."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Qapha imizamo yokuvula isikrini sakho"</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 239747a..3ff6351 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -680,6 +680,20 @@
      rotation. -->
     <bool name="config_windowManagerHalfFoldAutoRotateOverride">false</bool>
 
+    <!-- Indicates whether the window manager pauses autorotation when folding or unfolding
+     a foldable device based on hinge angle sensor events and physical display switch events. -->
+    <bool name="config_windowManagerPauseRotationWhenUnfolding">false</bool>
+
+    <!-- Amount of time during which autorotation will be disabled since last hinge angle event -->
+    <integer name="config_pauseRotationWhenUnfolding_maxHingeAngle">0</integer>
+
+    <!-- Maximum hinge angle event to be considered to disable autorotation when folding or
+     unfolding -->
+    <integer name="config_pauseRotationWhenUnfolding_hingeEventTimeout">0</integer>
+
+    <!-- Amount of time during which autorotation will be disabled since last display switch -->
+    <integer name="config_pauseRotationWhenUnfolding_displaySwitchTimeout">0</integer>
+
     <!-- When a device enters any of these states, it should be woken up. States are defined in
          device_state_configuration.xml. -->
     <integer-array name="config_deviceStatesOnWhichToWakeUp">
@@ -4447,7 +4461,8 @@
 
      See android.credentials.CredentialManager
     -->
-    <string name="config_defaultCredentialProviderService" translatable="false"></string>
+    <string-array name="config_defaultCredentialProviderService" translatable="false">
+    </string-array>
 
     <!-- The package name for the system's smartspace service.
      This service returns smartspace results.
@@ -5223,6 +5238,11 @@
          of known compatibility issues. -->
     <string-array name="config_highRefreshRateBlacklist"></string-array>
 
+    <!-- The list of packages to force slowJpegMode for Apps using Camera API1 -->
+    <string-array name="config_forceSlowJpegModeList" translatable="false">
+        <!-- Add packages here -->
+    </string-array>
+
     <!-- Whether or not to hide the navigation bar when the soft keyboard is visible in order to
          create additional screen real estate outside beyond the keyboard. Note that the user needs
          to have a confirmed way to dismiss the keyboard when desired. -->
@@ -6291,10 +6311,6 @@
     -->
     <integer name="config_deviceStateRearDisplay">-1</integer>
 
-    <!-- Whether the lock screen is allowed to run its own live wallpaper,
-         different from the home screen wallpaper. -->
-    <bool name="config_independentLockscreenLiveWallpaper">false</bool>
-
     <!-- Device state that corresponds to concurrent display mode where the default display
          is the internal display. Public API for the feature is provided through Jetpack
          WindowManager.
@@ -6357,23 +6373,6 @@
     <!-- Package name of Health Connect data migrator application.  -->
     <string name="config_healthConnectMigratorPackageName"></string>
 
-    <!-- The Universal Stylus Initiative (USI) protocol version supported by each display.
-         (@see https://universalstylus.org/).
-
-         The i-th value in this array corresponds to the supported USI version of the i-th display
-         listed in config_displayUniqueIdArray. On a single-display device, the
-         config_displayUniqueIdArray may be empty, in which case the only value in this array should
-         be the USI version for the main built-in display.
-
-         If the display does not support USI, the version value should be an empty string. If the
-         display supports USI, the version must be in the following format:
-           "<major-version>.<minor-version>"
-
-         For example, "", "1.0", and "2.0" are valid values. -->
-    <string-array name="config_displayUsiVersionArray" translatable="false">
-        <item>""</item>
-    </string-array>
-
     <!-- Whether system apps should be scanned in the stopped state during initial boot.
         Packages can be added by OEMs in an allowlist, to prevent them from being scanned as
         "stopped" during initial boot of a device, or after an OTA update. Stopped state of
@@ -6391,4 +6390,6 @@
     <!-- Whether we should persist the brightness value in nits for the default display even if
          the underlying display device changes. -->
     <bool name="config_persistBrightnessNitsForDefaultDisplay">false</bool>
+    <!-- Whether to request the approval before commit sessions. -->
+    <bool name="config_isPreApprovalRequestAvailable">true</bool>
 </resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 3ee8af2..8231407 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -5369,15 +5369,11 @@
     <string name="app_suspended_unsuspend_message">Unpause app</string>
 
     <!-- Title of a dialog. This text is confirming that the user wants to turn on access to their work apps, which the user had previously paused. "Work" is an adjective. [CHAR LIMIT=30] -->
-    <string name="work_mode_off_title">Turn on work apps?</string>
-    <!-- Text in a dialog. This text is confirming that the user wants to turn on access to their work apps and notifications, which the user had previously paused. "Work" is an adjective. [CHAR LIMIT=NONE] -->
-    <string name="work_mode_off_message">Get access to your work apps and notifications</string>
-    <!-- Title for button to turn on work profile. [CHAR LIMIT=NONE] -->
-    <string name="work_mode_turn_on">Turn on</string>
+    <string name="work_mode_off_title">Unpause work apps?</string>
+    <!-- Title for button to unpause on work profile. [CHAR LIMIT=NONE] -->
+    <string name="work_mode_turn_on">Unpause</string>
     <!-- Title for button to launch the personal safety app to make an emergency call    -->
     <string name="work_mode_emergency_call_button">Emergency</string>
-    <!-- Text shown in a dialog when the user tries to launch a disabled work profile app when work apps are paused-->
-    <string name="work_mode_dialer_off_message">Get access to your work apps and calls</string>
 
     <!-- Title of the dialog that is shown when the user tries to launch a blocked application [CHAR LIMIT=50] -->
     <string name="app_blocked_title">App is not available</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index a09cee7..7b582da 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2238,6 +2238,7 @@
   <java-symbol type="array" name="config_nonPreemptibleInputMethods" />
   <java-symbol type="bool" name="config_enhancedConfirmationModeEnabled" />
   <java-symbol type="bool" name="config_persistBrightnessNitsForDefaultDisplay" />
+  <java-symbol type="bool" name="config_isPreApprovalRequestAvailable" />
 
   <java-symbol type="layout" name="resolver_list" />
   <java-symbol type="id" name="resolver_list" />
@@ -3753,7 +3754,7 @@
   <java-symbol type="string" name="config_defaultAppPredictionService" />
   <java-symbol type="string" name="config_defaultContentSuggestionsService" />
   <java-symbol type="string" name="config_defaultCredentialManagerHybridService" />
-  <java-symbol type="string" name="config_defaultCredentialProviderService" />
+  <java-symbol type="array" name="config_defaultCredentialProviderService" />
   <java-symbol type="string" name="config_defaultSearchUiService" />
   <java-symbol type="string" name="config_defaultSmartspaceService" />
   <java-symbol type="string" name="config_defaultWallpaperEffectsGenerationService" />
@@ -4016,6 +4017,10 @@
   <java-symbol type="array" name="config_halfFoldedDeviceStates" />
   <java-symbol type="array" name="config_rearDisplayDeviceStates" />
   <java-symbol type="bool" name="config_windowManagerHalfFoldAutoRotateOverride" />
+  <java-symbol type="bool" name="config_windowManagerPauseRotationWhenUnfolding" />
+  <java-symbol type="integer" name="config_pauseRotationWhenUnfolding_hingeEventTimeout" />
+  <java-symbol type="integer" name="config_pauseRotationWhenUnfolding_maxHingeAngle" />
+  <java-symbol type="integer" name="config_pauseRotationWhenUnfolding_displaySwitchTimeout" />
   <java-symbol type="array" name="config_deviceStatesOnWhichToWakeUp" />
   <java-symbol type="array" name="config_deviceStatesOnWhichToSleep" />
   <java-symbol type="string" name="config_foldedArea" />
@@ -4196,6 +4201,7 @@
 
   <java-symbol type="string" name="config_factoryResetPackage" />
   <java-symbol type="array" name="config_highRefreshRateBlacklist" />
+  <java-symbol type="array" name="config_forceSlowJpegModeList" />
 
   <java-symbol type="layout" name="chooser_dialog" />
   <java-symbol type="layout" name="chooser_dialog_item" />
@@ -4954,7 +4960,6 @@
   <java-symbol type="string" name="concurrent_display_notification_power_save_content"/>
   <java-symbol type="string" name="device_state_notification_turn_off_button"/>
   <java-symbol type="string" name="device_state_notification_settings_button"/>
-  <java-symbol type="bool" name="config_independentLockscreenLiveWallpaper"/>
   <java-symbol type="integer" name="config_deviceStateConcurrentRearDisplay" />
   <java-symbol type="string" name="config_rearDisplayPhysicalAddress" />
 
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index 2e3d145..e59b259 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -250,16 +250,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -282,7 +282,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <style name="Theme.DeviceDefault" parent="Theme.DeviceDefaultBase" />
@@ -345,16 +344,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -377,7 +376,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar.  This theme
@@ -439,16 +437,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -471,7 +469,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar and
@@ -535,16 +532,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -567,7 +564,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault} that has no title bar and translucent
@@ -630,16 +626,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -662,7 +658,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- DeviceDefault theme for dialog windows and activities. This changes the window to be
@@ -733,16 +728,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -765,7 +760,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Dialog} that has a nice minimum width for a
@@ -827,16 +821,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -859,7 +853,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Dialog} without an action bar -->
@@ -920,16 +913,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -952,7 +945,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Dialog_NoActionBar} that has a nice minimum width
@@ -1014,16 +1006,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -1046,7 +1038,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- Variant of Theme.DeviceDefault.Dialog that has a fixed size. -->
@@ -1124,16 +1115,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -1156,7 +1147,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- DeviceDefault theme for a window without an action bar that will be displayed either
@@ -1219,16 +1209,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -1251,7 +1241,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- DeviceDefault theme for a presentation window on a secondary display. -->
@@ -1312,16 +1301,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -1344,7 +1333,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- DeviceDefault theme for panel windows. This removes all extraneous window
@@ -1407,16 +1395,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -1439,7 +1427,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear
@@ -1501,16 +1488,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -1533,7 +1520,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear
@@ -1595,16 +1581,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -1627,7 +1613,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- DeviceDefault style for input methods, which is used by the
@@ -1689,16 +1674,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -1721,7 +1706,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- DeviceDefault style for input methods, which is used by the
@@ -1783,16 +1767,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -1815,7 +1799,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <style name="Theme.DeviceDefault.Dialog.Alert" parent="Theme.Material.Dialog.Alert">
@@ -1877,16 +1860,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -1909,7 +1892,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- Theme for the dialog shown when an app crashes or ANRs. -->
@@ -1976,16 +1958,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -2008,7 +1990,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <style name="Theme.DeviceDefault.Dialog.NoFrame" parent="Theme.Material.Dialog.NoFrame">
@@ -2068,16 +2049,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -2100,7 +2081,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault} with a light-colored style -->
@@ -2298,16 +2278,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -2330,8 +2310,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- Variant of the DeviceDefault (light) theme that has a solid (opaque) action bar with an
@@ -2393,16 +2371,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -2425,8 +2403,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar -->
@@ -2487,16 +2463,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -2519,8 +2495,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar and no status bar.
@@ -2582,16 +2556,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -2614,8 +2588,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar and no status bar
@@ -2679,16 +2651,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -2711,8 +2683,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Light} that has no title bar and translucent
@@ -2775,16 +2745,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -2807,8 +2777,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- DeviceDefault light theme for dialog windows and activities. This changes the window to be
@@ -2877,16 +2845,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -2909,8 +2877,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} that has a nice minimum width for a
@@ -2975,16 +2941,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -3007,11 +2973,9 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
-     <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} without an action bar -->
+    <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} without an action bar -->
     <style name="Theme.DeviceDefault.Light.Dialog.NoActionBar" parent="Theme.Material.Light.Dialog.NoActionBar">
         <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault.Light</item>
         <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item>
@@ -3072,16 +3036,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -3104,8 +3068,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog_NoActionBar} that has a nice minimum
@@ -3170,16 +3132,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -3202,8 +3164,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- Variant of Theme.DeviceDefault.Dialog that has a fixed size. -->
@@ -3249,16 +3209,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -3281,8 +3241,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- Variant of Theme.DeviceDefault.Dialog.NoActionBar that has a fixed size. -->
@@ -3328,16 +3286,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -3360,8 +3318,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- DeviceDefault light theme for a window that will be displayed either full-screen on smaller
@@ -3426,16 +3382,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -3458,8 +3414,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- DeviceDefault light theme for a window without an action bar that will be displayed either
@@ -3525,16 +3479,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -3557,8 +3511,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- DeviceDefault light theme for a presentation window on a secondary display. -->
@@ -3622,16 +3574,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -3654,8 +3606,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- DeviceDefault light theme for panel windows. This removes all extraneous window
@@ -3718,16 +3668,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -3750,8 +3700,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <style name="Theme.DeviceDefault.Light.Dialog.Alert" parent="Theme.Material.Light.Dialog.Alert">
@@ -3813,16 +3761,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -3845,8 +3793,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <style name="Theme.DeviceDefault.Dialog.Alert.DayNight" parent="Theme.DeviceDefault.Light.Dialog.Alert" />
@@ -3908,16 +3854,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -3940,8 +3886,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <style name="Theme.DeviceDefault.Light.Voice" parent="Theme.Material.Light.Voice">
@@ -4001,16 +3945,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -4033,8 +3977,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- DeviceDefault theme for a window that should look like the Settings app.  -->
@@ -4092,47 +4034,47 @@
 
         <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
         <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
-        <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
+        <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
         <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
-        <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
-        <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
-        <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
-        <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
+        <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
+        <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
+        <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
+        <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
-        <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
+        <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
-        <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
-        <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
+        <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
+        <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
-        <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
-        <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
+        <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
-        <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
-        <item name="materialColorOnBackground">@color/system_on_background_dark</item>
+        <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
+        <item name="materialColorOnBackground">@color/system_on_background_light</item>
         <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
-        <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
-        <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
-        <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
-        <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
-        <item name="materialColorSecondary">@color/system_secondary_dark</item>
-        <item name="materialColorOnError">@color/system_on_error_dark</item>
-        <item name="materialColorSurface">@color/system_surface_dark</item>
-        <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
-        <item name="materialColorTertiary">@color/system_tertiary_dark</item>
-        <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
-        <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
-        <item name="materialColorOutline">@color/system_outline_dark</item>
-        <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
-        <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
-        <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
+        <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
+        <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
+        <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
+        <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
+        <item name="materialColorSecondary">@color/system_secondary_light</item>
+        <item name="materialColorOnError">@color/system_on_error_light</item>
+        <item name="materialColorSurface">@color/system_surface_light</item>
+        <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
+        <item name="materialColorTertiary">@color/system_tertiary_light</item>
+        <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
+        <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
+        <item name="materialColorOutline">@color/system_outline_light</item>
+        <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
+        <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
+        <item name="materialColorOnSurface">@color/system_on_surface_light</item>
+        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
 
     </style>
 
@@ -4172,47 +4114,47 @@
 
         <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
         <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
-        <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
+        <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
         <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
-        <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
-        <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
-        <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
-        <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
+        <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
+        <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
+        <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
+        <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
-        <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
+        <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
-        <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
-        <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
+        <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
+        <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
-        <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
-        <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
+        <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
-        <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
-        <item name="materialColorOnBackground">@color/system_on_background_dark</item>
+        <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
+        <item name="materialColorOnBackground">@color/system_on_background_light</item>
         <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
-        <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
-        <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
-        <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
-        <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
-        <item name="materialColorSecondary">@color/system_secondary_dark</item>
-        <item name="materialColorOnError">@color/system_on_error_dark</item>
-        <item name="materialColorSurface">@color/system_surface_dark</item>
-        <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
-        <item name="materialColorTertiary">@color/system_tertiary_dark</item>
-        <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
-        <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
-        <item name="materialColorOutline">@color/system_outline_dark</item>
-        <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
-        <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
-        <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
+        <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
+        <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
+        <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
+        <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
+        <item name="materialColorSecondary">@color/system_secondary_light</item>
+        <item name="materialColorOnError">@color/system_on_error_light</item>
+        <item name="materialColorSurface">@color/system_surface_light</item>
+        <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
+        <item name="materialColorTertiary">@color/system_tertiary_light</item>
+        <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
+        <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
+        <item name="materialColorOutline">@color/system_outline_light</item>
+        <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
+        <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
+        <item name="materialColorOnSurface">@color/system_on_surface_light</item>
+        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
 
     </style>
 
@@ -4244,47 +4186,47 @@
 
         <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
         <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
-        <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
+        <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
         <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
-        <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
-        <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
-        <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
-        <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
+        <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
+        <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
+        <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
+        <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
-        <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
+        <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
-        <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
-        <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
+        <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
+        <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
-        <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
-        <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
+        <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
-        <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
-        <item name="materialColorOnBackground">@color/system_on_background_dark</item>
+        <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
+        <item name="materialColorOnBackground">@color/system_on_background_light</item>
         <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
-        <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
-        <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
-        <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
-        <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
-        <item name="materialColorSecondary">@color/system_secondary_dark</item>
-        <item name="materialColorOnError">@color/system_on_error_dark</item>
-        <item name="materialColorSurface">@color/system_surface_dark</item>
-        <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
-        <item name="materialColorTertiary">@color/system_tertiary_dark</item>
-        <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
-        <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
-        <item name="materialColorOutline">@color/system_outline_dark</item>
-        <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
-        <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
-        <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
+        <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
+        <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
+        <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
+        <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
+        <item name="materialColorSecondary">@color/system_secondary_light</item>
+        <item name="materialColorOnError">@color/system_on_error_light</item>
+        <item name="materialColorSurface">@color/system_surface_light</item>
+        <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
+        <item name="materialColorTertiary">@color/system_tertiary_light</item>
+        <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
+        <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
+        <item name="materialColorOutline">@color/system_outline_light</item>
+        <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
+        <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
+        <item name="materialColorOnSurface">@color/system_on_surface_light</item>
+        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
 
     </style>
 
@@ -4347,16 +4289,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -4379,7 +4321,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <style name="Theme.DeviceDefault.Settings.DialogBase" parent="Theme.Material.Light.BaseDialog">
@@ -4416,47 +4357,47 @@
 
         <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
         <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
-        <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
+        <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
         <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
-        <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
-        <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
-        <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
-        <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
+        <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
+        <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
+        <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
+        <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
-        <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
+        <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
-        <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
-        <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
+        <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
+        <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
-        <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
-        <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
+        <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
-        <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
-        <item name="materialColorOnBackground">@color/system_on_background_dark</item>
+        <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
+        <item name="materialColorOnBackground">@color/system_on_background_light</item>
         <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
-        <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
-        <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
-        <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
-        <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
-        <item name="materialColorSecondary">@color/system_secondary_dark</item>
-        <item name="materialColorOnError">@color/system_on_error_dark</item>
-        <item name="materialColorSurface">@color/system_surface_dark</item>
-        <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
-        <item name="materialColorTertiary">@color/system_tertiary_dark</item>
-        <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
-        <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
-        <item name="materialColorOutline">@color/system_outline_dark</item>
-        <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
-        <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
-        <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
+        <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
+        <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
+        <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
+        <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
+        <item name="materialColorSecondary">@color/system_secondary_light</item>
+        <item name="materialColorOnError">@color/system_on_error_light</item>
+        <item name="materialColorSurface">@color/system_surface_light</item>
+        <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
+        <item name="materialColorTertiary">@color/system_tertiary_light</item>
+        <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
+        <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
+        <item name="materialColorOutline">@color/system_outline_light</item>
+        <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
+        <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
+        <item name="materialColorOnSurface">@color/system_on_surface_light</item>
+        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
 
     </style>
 
@@ -4543,16 +4484,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -4575,7 +4516,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <style name="Theme.DeviceDefault.Settings.Dialog.Alert" parent="Theme.Material.Settings.Dialog.Alert">
@@ -4639,16 +4579,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -4671,7 +4611,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <style name="Theme.DeviceDefault.Settings.Dialog.NoActionBar" parent="Theme.DeviceDefault.Light.Dialog.NoActionBar" />
@@ -4813,16 +4752,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -4845,8 +4784,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <!-- Theme overlay that replaces colorAccent with the colorAccent from {@link #Theme_DeviceDefault_DayNight}. -->
@@ -4870,16 +4807,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -4902,7 +4839,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
 
     <style name="Theme.DeviceDefault.Light.Dialog.Alert.UserSwitchingDialog" parent="Theme.DeviceDefault.NoActionBar.Fullscreen">
@@ -4922,16 +4858,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
         <item name="materialColorErrorContainer">@color/system_error_container_light</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -4954,8 +4890,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
         <item name="materialColorOnSurface">@color/system_on_surface_light</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-        <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
-
     </style>
 
     <style name="Theme.DeviceDefault.Notification" parent="@style/Theme.Material.Notification">
@@ -4986,16 +4920,16 @@
         <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
         <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
         <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
-        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_dark</item>
+        <item name="materialColorOnSurfaceInverse">@color/system_on_surface_light</item>
         <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
         <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
         <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
         <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
         <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
         <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
-        <item name="materialColorPrimaryInverse">@color/system_primary_dark</item>
+        <item name="materialColorPrimaryInverse">@color/system_primary_light</item>
         <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
-        <item name="materialColorSurfaceInverse">@color/system_surface_dark</item>
+        <item name="materialColorSurfaceInverse">@color/system_surface_light</item>
         <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
         <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
         <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
@@ -5018,7 +4952,6 @@
         <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
         <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
         <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
-
     </style>
     <style name="Theme.DeviceDefault.AutofillHalfScreenDialogList" parent="Theme.DeviceDefault.DayNight">
         <item name="colorListDivider">@color/list_divider_opacity_device_default_light</item>
diff --git a/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java b/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java
index 180a312..bf8c7c6 100644
--- a/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java
+++ b/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java
@@ -108,8 +108,10 @@
             Paths.get("/data/misc/wmtrace/ime_trace_managerservice.winscope"),
             Paths.get("/data/misc/wmtrace/ime_trace_service.winscope"),
             Paths.get("/data/misc/wmtrace/wm_trace.winscope"),
+            Paths.get("/data/misc/wmtrace/wm_log.winscope"),
             Paths.get("/data/misc/wmtrace/layers_trace.winscope"),
             Paths.get("/data/misc/wmtrace/transactions_trace.winscope"),
+            Paths.get("/data/misc/wmtrace/transition_trace.winscope"),
     };
     private static final Path[] UI_TRACES_GENERATED_DURING_BUGREPORT = {
             Paths.get("/data/misc/wmtrace/layers_trace_from_transactions.winscope"),
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index bf8ca8b..4cccf8e 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -76,7 +76,8 @@
     <uses-permission android:name="android.permission.USE_CREDENTIALS" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
-    <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG" />
+    <uses-permission android:name="android.permission.READ_WRITE_SYNC_DISABLED_MODE_CONFIG" />
+    <uses-permission android:name="android.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
diff --git a/core/tests/coretests/src/android/app/ApplicationLoadersTest.java b/core/tests/coretests/src/android/app/ApplicationLoadersTest.java
index 19e7f80..3cb62b9 100644
--- a/core/tests/coretests/src/android/app/ApplicationLoadersTest.java
+++ b/core/tests/coretests/src/android/app/ApplicationLoadersTest.java
@@ -16,14 +16,17 @@
 
 package android.app;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 
 import android.content.pm.SharedLibraryInfo;
 
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.google.android.collect.Lists;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -48,7 +51,7 @@
     @Test
     public void testGetNonExistantLib() {
         ApplicationLoaders loaders = new ApplicationLoaders();
-        assertEquals(null, loaders.getCachedNonBootclasspathSystemLib(
+        assertNull(loaders.getCachedNonBootclasspathSystemLib(
                 "/system/framework/nonexistantlib.jar", null, null, null));
     }
 
@@ -57,9 +60,9 @@
         ApplicationLoaders loaders = new ApplicationLoaders();
         SharedLibraryInfo libA = createLib(LIB_A);
 
-        loaders.createAndCacheNonBootclasspathSystemClassLoaders(new SharedLibraryInfo[]{libA});
+        loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libA));
 
-        assertNotEquals(null, loaders.getCachedNonBootclasspathSystemLib(
+        assertNotNull(loaders.getCachedNonBootclasspathSystemLib(
                 LIB_A, null, null, null));
     }
 
@@ -71,9 +74,9 @@
         ClassLoader parent = ClassLoader.getSystemClassLoader();
         assertNotEquals(null, parent);
 
-        loaders.createAndCacheNonBootclasspathSystemClassLoaders(new SharedLibraryInfo[]{libA});
+        loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libA));
 
-        assertEquals(null, loaders.getCachedNonBootclasspathSystemLib(
+        assertNull(loaders.getCachedNonBootclasspathSystemLib(
                 LIB_A, parent, null, null));
     }
 
@@ -82,9 +85,9 @@
         ApplicationLoaders loaders = new ApplicationLoaders();
         SharedLibraryInfo libA = createLib(LIB_A);
 
-        loaders.createAndCacheNonBootclasspathSystemClassLoaders(new SharedLibraryInfo[]{libA});
+        loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libA));
 
-        assertEquals(null, loaders.getCachedNonBootclasspathSystemLib(
+        assertNull(loaders.getCachedNonBootclasspathSystemLib(
                 LIB_A, null, "other classloader", null));
     }
 
@@ -98,9 +101,9 @@
         ArrayList<ClassLoader> sharedLibraries = new ArrayList<>();
         sharedLibraries.add(dep);
 
-        loaders.createAndCacheNonBootclasspathSystemClassLoaders(new SharedLibraryInfo[]{libA});
+        loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libA));
 
-        assertEquals(null, loaders.getCachedNonBootclasspathSystemLib(
+        assertNull(loaders.getCachedNonBootclasspathSystemLib(
                 LIB_A, null, null, sharedLibraries));
     }
 
@@ -112,7 +115,7 @@
         libB.addDependency(libA);
 
         loaders.createAndCacheNonBootclasspathSystemClassLoaders(
-                new SharedLibraryInfo[]{libA, libB});
+                Lists.newArrayList(libA, libB));
 
         ClassLoader loadA = loaders.getCachedNonBootclasspathSystemLib(
                 LIB_A, null, null, null);
@@ -121,7 +124,7 @@
         ArrayList<ClassLoader> sharedLibraries = new ArrayList<>();
         sharedLibraries.add(loadA);
 
-        assertNotEquals(null, loaders.getCachedNonBootclasspathSystemLib(
+        assertNotNull(loaders.getCachedNonBootclasspathSystemLib(
                 LIB_DEP_A, null, null, sharedLibraries));
     }
 
@@ -132,7 +135,6 @@
         SharedLibraryInfo libB = createLib(LIB_DEP_A);
         libB.addDependency(libA);
 
-        loaders.createAndCacheNonBootclasspathSystemClassLoaders(
-                new SharedLibraryInfo[]{libB, libA});
+        loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libB, libA));
     }
 }
diff --git a/core/tests/coretests/src/android/provider/DeviceConfigServiceManagerTest.java b/core/tests/coretests/src/android/provider/DeviceConfigServiceManagerTest.java
new file mode 100644
index 0000000..e20258a
--- /dev/null
+++ b/core/tests/coretests/src/android/provider/DeviceConfigServiceManagerTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.provider;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assume.assumeTrue;
+
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Class that tests the APIs of DeviceConfigServiceManager.ServiceRegisterer.
+ */
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DeviceConfigServiceManagerTest {
+
+    private static final String SERVICE_NAME = "device_config_updatable";
+    private DeviceConfigServiceManager.ServiceRegisterer mRegisterer;
+
+    @Before
+    public void setUp() {
+        mRegisterer = new DeviceConfigServiceManager.ServiceRegisterer(SERVICE_NAME);
+    }
+
+    @Test
+    public void testGetOrThrow() throws DeviceConfigServiceManager.ServiceNotFoundException {
+        if (UpdatableDeviceConfigServiceReadiness.shouldStartUpdatableService()) {
+            assertThat(mRegisterer.getOrThrow()).isNotNull();
+        } else {
+            assertThrows(DeviceConfigServiceManager.ServiceNotFoundException.class,
+                    mRegisterer::getOrThrow);
+        }
+    }
+
+    @Test
+    public void testGet() {
+        assumeTrue(UpdatableDeviceConfigServiceReadiness.shouldStartUpdatableService());
+        assertThat(mRegisterer.get()).isNotNull();
+    }
+
+    @Test
+    public void testTryGet() {
+        if (UpdatableDeviceConfigServiceReadiness.shouldStartUpdatableService()) {
+            assertThat(mRegisterer.tryGet()).isNotNull();
+        } else {
+            assertThat(mRegisterer.tryGet()).isNull();
+        }
+    }
+}
diff --git a/core/tests/coretests/src/android/text/format/DateFormatTest.java b/core/tests/coretests/src/android/text/format/DateFormatTest.java
index 8459330..212cc44 100644
--- a/core/tests/coretests/src/android/text/format/DateFormatTest.java
+++ b/core/tests/coretests/src/android/text/format/DateFormatTest.java
@@ -156,8 +156,8 @@
     @DisableCompatChanges({DateFormat.DISALLOW_DUPLICATE_FIELD_IN_SKELETON})
     public void testGetBestDateTimePattern_enableDuplicateField() {
         // en-US uses 12-hour format by default.
-        assertEquals("h:mm\u202fa", DateFormat.getBestDateTimePattern(Locale.US, "jmma"));
-        assertEquals("h:mm\u202fa", DateFormat.getBestDateTimePattern(Locale.US, "ahmma"));
+        assertEquals("h:mm a", DateFormat.getBestDateTimePattern(Locale.US, "jmma"));
+        assertEquals("h:mm a", DateFormat.getBestDateTimePattern(Locale.US, "ahmma"));
     }
 
     private static void assertIllegalArgumentException(Locale l, String skeleton) {
diff --git a/core/tests/coretests/src/android/text/format/DateUtilsTest.java b/core/tests/coretests/src/android/text/format/DateUtilsTest.java
index 39ed82ef..381c051 100644
--- a/core/tests/coretests/src/android/text/format/DateUtilsTest.java
+++ b/core/tests/coretests/src/android/text/format/DateUtilsTest.java
@@ -139,16 +139,16 @@
                 fixedTime, java.text.DateFormat.SHORT, java.text.DateFormat.FULL));
 
         final long hourDuration = 2 * 60 * 60 * 1000;
-        assertEquals("5:30:15\u202fAM Greenwich Mean Time", DateUtils.formatSameDayTime(
+        assertEquals("5:30:15 AM Greenwich Mean Time", DateUtils.formatSameDayTime(
                 fixedTime + hourDuration, fixedTime, java.text.DateFormat.FULL,
                 java.text.DateFormat.FULL));
-        assertEquals("5:30:15\u202fAM", DateUtils.formatSameDayTime(fixedTime + hourDuration,
+        assertEquals("5:30:15 AM", DateUtils.formatSameDayTime(fixedTime + hourDuration,
                 fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.DEFAULT));
-        assertEquals("5:30:15\u202fAM GMT", DateUtils.formatSameDayTime(fixedTime + hourDuration,
+        assertEquals("5:30:15 AM GMT", DateUtils.formatSameDayTime(fixedTime + hourDuration,
                 fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.LONG));
-        assertEquals("5:30:15\u202fAM", DateUtils.formatSameDayTime(fixedTime + hourDuration,
+        assertEquals("5:30:15 AM", DateUtils.formatSameDayTime(fixedTime + hourDuration,
                 fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.MEDIUM));
-        assertEquals("5:30\u202fAM", DateUtils.formatSameDayTime(fixedTime + hourDuration,
+        assertEquals("5:30 AM", DateUtils.formatSameDayTime(fixedTime + hourDuration,
                 fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.SHORT));
     }
 
diff --git a/core/tests/coretests/testdoubles/src/com/android/internal/util/FakeLatencyTracker.java b/core/tests/coretests/testdoubles/src/com/android/internal/util/FakeLatencyTracker.java
index 306ecde..61e976b 100644
--- a/core/tests/coretests/testdoubles/src/com/android/internal/util/FakeLatencyTracker.java
+++ b/core/tests/coretests/testdoubles/src/com/android/internal/util/FakeLatencyTracker.java
@@ -20,8 +20,6 @@
 import static com.android.internal.util.LatencyTracker.ActionProperties.SAMPLE_INTERVAL_SUFFIX;
 import static com.android.internal.util.LatencyTracker.ActionProperties.TRACE_THRESHOLD_SUFFIX;
 
-import static com.google.common.truth.Truth.assertThat;
-
 import android.os.ConditionVariable;
 import android.provider.DeviceConfig;
 import android.util.Log;
@@ -33,7 +31,6 @@
 
 import com.google.common.collect.ImmutableMap;
 
-import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -46,7 +43,6 @@
 public final class FakeLatencyTracker extends LatencyTracker {
 
     private static final String TAG = "FakeLatencyTracker";
-    private static final Duration FORCE_UPDATE_TIMEOUT = Duration.ofSeconds(1);
 
     private final Object mLock = new Object();
     @GuardedBy("mLock")
@@ -203,7 +199,7 @@
             }
         }
         Log.i(TAG, "waiting for condition");
-        assertThat(mDeviceConfigPropertiesUpdated.block(FORCE_UPDATE_TIMEOUT.toMillis())).isTrue();
+        mDeviceConfigPropertiesUpdated.block();
     }
 
     public void waitForMatchingActionProperties(ActionProperties actionProperties)
@@ -232,7 +228,7 @@
             }
         }
         Log.i(TAG, "waiting for condition");
-        assertThat(mDeviceConfigPropertiesUpdated.block(FORCE_UPDATE_TIMEOUT.toMillis())).isTrue();
+        mDeviceConfigPropertiesUpdated.block();
     }
 
     public void waitForActionEnabledState(int action, boolean enabledState) throws Exception {
@@ -260,7 +256,7 @@
             }
         }
         Log.i(TAG, "waiting for condition");
-        assertThat(mDeviceConfigPropertiesUpdated.block(FORCE_UPDATE_TIMEOUT.toMillis())).isTrue();
+        mDeviceConfigPropertiesUpdated.block();
     }
 
     public void waitForGlobalEnabledState(boolean enabledState) throws Exception {
@@ -280,6 +276,6 @@
             }
         }
         Log.i(TAG, "waiting for condition");
-        assertThat(mDeviceConfigPropertiesUpdated.block(FORCE_UPDATE_TIMEOUT.toMillis())).isTrue();
+        mDeviceConfigPropertiesUpdated.block();
     }
 }
diff --git a/core/tests/mockingcoretests/src/android/view/DisplayTest.java b/core/tests/mockingcoretests/src/android/view/DisplayTest.java
index 3b8b8c7..4a12bb3 100644
--- a/core/tests/mockingcoretests/src/android/view/DisplayTest.java
+++ b/core/tests/mockingcoretests/src/android/view/DisplayTest.java
@@ -142,6 +142,31 @@
     }
 
     @Test
+    public void testGetHdrCapabilities_getSupportedHdrTypes_returns_mode_specific_hdr_types() {
+        setDisplayInfoPortrait(mDisplayInfo);
+        float[] alternativeRefreshRates = new float[0];
+        int[] hdrTypesWithDv = new int[] {1, 2, 3, 4};
+        Display.Mode modeWithDv = new Display.Mode(/* modeId= */ 0, 0, 0, 0f,
+                alternativeRefreshRates, hdrTypesWithDv);
+
+        int[] hdrTypesWithoutDv = new int[]{2, 3, 4};
+        Display.Mode modeWithoutDv = new Display.Mode(/* modeId= */ 1, 0, 0, 0f,
+                alternativeRefreshRates, hdrTypesWithoutDv);
+
+        mDisplayInfo.supportedModes = new Display.Mode[] {modeWithoutDv, modeWithDv};
+        mDisplayInfo.hdrCapabilities = new Display.HdrCapabilities(hdrTypesWithDv, 0, 0, 0);
+
+        final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
+                DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
+
+        mDisplayInfo.modeId = 0;
+        assertArrayEquals(hdrTypesWithDv, display.getHdrCapabilities().getSupportedHdrTypes());
+
+        mDisplayInfo.modeId = 1;
+        assertArrayEquals(hdrTypesWithoutDv, display.getHdrCapabilities().getSupportedHdrTypes());
+    }
+
+    @Test
     public void testConstructor_defaultDisplayAdjustments_matchesDisplayInfo() {
         setDisplayInfoPortrait(mDisplayInfo);
         final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index 2afd54b..c106854 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -883,6 +883,12 @@
       "group": "WM_SHOW_TRANSACTIONS",
       "at": "com\/android\/server\/wm\/WindowSurfaceController.java"
     },
+    "-1258739769": {
+      "message": "onTransactionReady, opening: %s, closing: %s, animating: %s, match: %b",
+      "level": "DEBUG",
+      "group": "WM_DEBUG_BACK_PREVIEW",
+      "at": "com\/android\/server\/wm\/BackNavigationController.java"
+    },
     "-1257821162": {
       "message": "OUT SURFACE %s: copied",
       "level": "INFO",
diff --git a/graphics/java/android/graphics/HardwareBufferRenderer.java b/graphics/java/android/graphics/HardwareBufferRenderer.java
index 361dc59..e04f13c 100644
--- a/graphics/java/android/graphics/HardwareBufferRenderer.java
+++ b/graphics/java/android/graphics/HardwareBufferRenderer.java
@@ -275,11 +275,22 @@
             Consumer<RenderResult> wrapped = consumable -> executor.execute(
                     () -> renderCallback.accept(consumable));
             if (!isClosed()) {
+                int renderWidth;
+                int renderHeight;
+                if (mTransform == SurfaceControl.BUFFER_TRANSFORM_ROTATE_90
+                        || mTransform == SurfaceControl.BUFFER_TRANSFORM_ROTATE_270) {
+                    renderWidth = mHardwareBuffer.getHeight();
+                    renderHeight = mHardwareBuffer.getWidth();
+                } else {
+                    renderWidth = mHardwareBuffer.getWidth();
+                    renderHeight = mHardwareBuffer.getHeight();
+                }
+
                 nRender(
                         mProxy,
                         mTransform,
-                        mHardwareBuffer.getWidth(),
-                        mHardwareBuffer.getHeight(),
+                        renderWidth,
+                        renderHeight,
                         mColorSpace.getNativeInstance(),
                         wrapped);
             } else {
diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java
index 51f99ec..0b29973 100644
--- a/graphics/java/android/graphics/ImageDecoder.java
+++ b/graphics/java/android/graphics/ImageDecoder.java
@@ -38,8 +38,11 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.NinePatchDrawable;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecList;
 import android.net.Uri;
 import android.os.Build;
+import android.os.SystemProperties;
 import android.os.Trace;
 import android.system.ErrnoException;
 import android.system.Os;
@@ -928,6 +931,8 @@
             case "image/x-pentax-pef":
             case "image/x-samsung-srw":
                 return true;
+            case "image/avif":
+                return isP010SupportedForAV1();
             default:
                 return false;
         }
@@ -2063,6 +2068,53 @@
         return decodeBitmapImpl(src, null);
     }
 
+    private static boolean sIsP010SupportedForAV1 = false;
+    private static boolean sIsP010SupportedForAV1Initialized = false;
+    private static final Object sIsP010SupportedForAV1Lock = new Object();
+
+    /**
+     * Checks if the device supports decoding 10-bit AV1.
+     */
+    @SuppressWarnings("AndroidFrameworkCompatChange")  // This is not an app-visible API.
+    private static boolean isP010SupportedForAV1() {
+        synchronized (sIsP010SupportedForAV1Lock) {
+            if (sIsP010SupportedForAV1Initialized) {
+                return sIsP010SupportedForAV1;
+            }
+
+            sIsP010SupportedForAV1Initialized = true;
+
+            if (hasHardwareDecoder("video/av01")) {
+                sIsP010SupportedForAV1 = true;
+                return true;
+            }
+
+            sIsP010SupportedForAV1 = Build.VERSION.DEVICE_INITIAL_SDK_INT
+                    >= Build.VERSION_CODES.S;
+            return sIsP010SupportedForAV1;
+        }
+    }
+
+    /**
+     * Checks if the device has hardware decoder for the target mime type.
+     */
+    private static boolean hasHardwareDecoder(String mime) {
+        final MediaCodecList sMCL = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+        for (MediaCodecInfo info : sMCL.getCodecInfos()) {
+            if (info.isEncoder() == false && info.isHardwareAccelerated()) {
+                try {
+                     if (info.getCapabilitiesForType(mime) != null) {
+                         return true;
+                     }
+                } catch (IllegalArgumentException e) {
+                     // mime is not supported
+                     return false;
+                }
+            }
+        }
+        return false;
+    }
+
     /**
      * Private method called by JNI.
      */
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java
index 20b6ae2..53d39d9 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java
@@ -710,24 +710,16 @@
             @NonNull SplitAttributes splitAttributes) {
         final Configuration taskConfiguration = taskProperties.getConfiguration();
         final FoldingFeature foldingFeature = getFoldingFeature(taskProperties);
-        final SplitType splitType = computeSplitType(splitAttributes, taskConfiguration,
-                foldingFeature);
-        final SplitAttributes computedSplitAttributes = new SplitAttributes.Builder()
-                .setSplitType(splitType)
-                .setLayoutDirection(splitAttributes.getLayoutDirection())
-                .build();
-        if (!shouldShowSplit(computedSplitAttributes)) {
+        if (!shouldShowSplit(splitAttributes)) {
             return new Rect();
         }
         final Rect bounds;
         switch (position) {
             case POSITION_START:
-                bounds = getPrimaryBounds(taskConfiguration, computedSplitAttributes,
-                        foldingFeature);
+                bounds = getPrimaryBounds(taskConfiguration, splitAttributes, foldingFeature);
                 break;
             case POSITION_END:
-                bounds = getSecondaryBounds(taskConfiguration, computedSplitAttributes,
-                        foldingFeature);
+                bounds = getSecondaryBounds(taskConfiguration, splitAttributes, foldingFeature);
                 break;
             case POSITION_FILL:
             default:
@@ -742,29 +734,76 @@
     @NonNull
     private Rect getPrimaryBounds(@NonNull Configuration taskConfiguration,
             @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) {
-        if (!shouldShowSplit(splitAttributes)) {
+        final SplitAttributes computedSplitAttributes = updateSplitAttributesType(splitAttributes,
+                computeSplitType(splitAttributes, taskConfiguration, foldingFeature));
+        if (!shouldShowSplit(computedSplitAttributes)) {
             return new Rect();
         }
-        switch (splitAttributes.getLayoutDirection()) {
+        switch (computedSplitAttributes.getLayoutDirection()) {
             case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT: {
-                return getLeftContainerBounds(taskConfiguration, splitAttributes, foldingFeature);
+                return getLeftContainerBounds(taskConfiguration, computedSplitAttributes,
+                        foldingFeature);
             }
             case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT: {
-                return getRightContainerBounds(taskConfiguration, splitAttributes, foldingFeature);
+                return getRightContainerBounds(taskConfiguration, computedSplitAttributes,
+                        foldingFeature);
             }
             case SplitAttributes.LayoutDirection.LOCALE: {
                 final boolean isLtr = taskConfiguration.getLayoutDirection()
                         == View.LAYOUT_DIRECTION_LTR;
                 return isLtr
-                        ? getLeftContainerBounds(taskConfiguration, splitAttributes, foldingFeature)
-                        : getRightContainerBounds(taskConfiguration, splitAttributes,
+                        ? getLeftContainerBounds(taskConfiguration, computedSplitAttributes,
+                                foldingFeature)
+                        : getRightContainerBounds(taskConfiguration, computedSplitAttributes,
                                 foldingFeature);
             }
             case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM: {
-                return getTopContainerBounds(taskConfiguration, splitAttributes, foldingFeature);
+                return getTopContainerBounds(taskConfiguration, computedSplitAttributes,
+                        foldingFeature);
             }
             case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP: {
-                return getBottomContainerBounds(taskConfiguration, splitAttributes, foldingFeature);
+                return getBottomContainerBounds(taskConfiguration, computedSplitAttributes,
+                        foldingFeature);
+            }
+            default:
+                throw new IllegalArgumentException("Unknown layout direction:"
+                        + computedSplitAttributes.getLayoutDirection());
+        }
+    }
+
+    @NonNull
+    private Rect getSecondaryBounds(@NonNull Configuration taskConfiguration,
+            @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) {
+        final SplitAttributes computedSplitAttributes = updateSplitAttributesType(splitAttributes,
+                computeSplitType(splitAttributes, taskConfiguration, foldingFeature));
+        if (!shouldShowSplit(computedSplitAttributes)) {
+            return new Rect();
+        }
+        switch (computedSplitAttributes.getLayoutDirection()) {
+            case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT: {
+                return getRightContainerBounds(taskConfiguration, computedSplitAttributes,
+                        foldingFeature);
+            }
+            case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT: {
+                return getLeftContainerBounds(taskConfiguration, computedSplitAttributes,
+                        foldingFeature);
+            }
+            case SplitAttributes.LayoutDirection.LOCALE: {
+                final boolean isLtr = taskConfiguration.getLayoutDirection()
+                        == View.LAYOUT_DIRECTION_LTR;
+                return isLtr
+                        ? getRightContainerBounds(taskConfiguration, computedSplitAttributes,
+                                foldingFeature)
+                        : getLeftContainerBounds(taskConfiguration, computedSplitAttributes,
+                                foldingFeature);
+            }
+            case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM: {
+                return getBottomContainerBounds(taskConfiguration, computedSplitAttributes,
+                        foldingFeature);
+            }
+            case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP: {
+                return getTopContainerBounds(taskConfiguration, computedSplitAttributes,
+                        foldingFeature);
             }
             default:
                 throw new IllegalArgumentException("Unknown layout direction:"
@@ -772,38 +811,17 @@
         }
     }
 
-    @NonNull
-    private Rect getSecondaryBounds(@NonNull Configuration taskConfiguration,
-            @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) {
-        if (!shouldShowSplit(splitAttributes)) {
-            return new Rect();
-        }
-        switch (splitAttributes.getLayoutDirection()) {
-            case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT: {
-                return getRightContainerBounds(taskConfiguration, splitAttributes, foldingFeature);
-            }
-            case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT: {
-                return getLeftContainerBounds(taskConfiguration, splitAttributes, foldingFeature);
-            }
-            case SplitAttributes.LayoutDirection.LOCALE: {
-                final boolean isLtr = taskConfiguration.getLayoutDirection()
-                        == View.LAYOUT_DIRECTION_LTR;
-                return isLtr
-                        ? getRightContainerBounds(taskConfiguration, splitAttributes,
-                                foldingFeature)
-                        : getLeftContainerBounds(taskConfiguration, splitAttributes,
-                                foldingFeature);
-            }
-            case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM: {
-                return getBottomContainerBounds(taskConfiguration, splitAttributes, foldingFeature);
-            }
-            case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP: {
-                return getTopContainerBounds(taskConfiguration, splitAttributes, foldingFeature);
-            }
-            default:
-                throw new IllegalArgumentException("Unknown layout direction:"
-                        + splitAttributes.getLayoutDirection());
-        }
+    /**
+     * Returns the {@link SplitAttributes} that update the {@link SplitType} to
+     * {@code splitTypeToUpdate}.
+     */
+    private static SplitAttributes updateSplitAttributesType(
+            @NonNull SplitAttributes splitAttributes, @NonNull SplitType splitTypeToUpdate) {
+        return new SplitAttributes.Builder()
+                .setSplitType(splitTypeToUpdate)
+                .setLayoutDirection(splitAttributes.getLayoutDirection())
+                .setAnimationBackgroundColor(splitAttributes.getAnimationBackgroundColor())
+                .build();
     }
 
     @NonNull
@@ -898,7 +916,8 @@
     }
 
     @Nullable
-    private FoldingFeature getFoldingFeature(@NonNull TaskProperties taskProperties) {
+    @VisibleForTesting
+    FoldingFeature getFoldingFeature(@NonNull TaskProperties taskProperties) {
         final int displayId = taskProperties.getDisplayId();
         final WindowConfiguration windowConfiguration = taskProperties.getConfiguration()
                 .windowConfiguration;
diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitPresenterTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitPresenterTest.java
index 8dd1384..6981d9d 100644
--- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitPresenterTest.java
+++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitPresenterTest.java
@@ -730,6 +730,27 @@
     }
 
     @Test
+    public void testComputeSplitAttributesOnHingeSplitTypeOnDeviceWithoutFoldingFeature() {
+        final SplitAttributes hingeSplitAttrs = new SplitAttributes.Builder()
+                .setSplitType(new SplitAttributes.SplitType.HingeSplitType(
+                        SplitAttributes.SplitType.RatioSplitType.splitEqually()))
+                .build();
+        final SplitPairRule splitPairRule = createSplitPairRuleBuilder(
+                activityPair -> true,
+                activityIntentPair -> true,
+                windowMetrics -> windowMetrics.getBounds().equals(TASK_BOUNDS))
+                .setFinishSecondaryWithPrimary(DEFAULT_FINISH_SECONDARY_WITH_PRIMARY)
+                .setFinishPrimaryWithSecondary(DEFAULT_FINISH_PRIMARY_WITH_SECONDARY)
+                .setDefaultSplitAttributes(hingeSplitAttrs)
+                .build();
+        final TaskContainer.TaskProperties taskProperties = getTaskProperties();
+        doReturn(null).when(mPresenter).getFoldingFeature(any());
+
+        assertEquals(hingeSplitAttrs, mPresenter.computeSplitAttributes(taskProperties,
+                splitPairRule, hingeSplitAttrs, null /* minDimensionsPair */));
+    }
+
+    @Test
     public void testGetTaskWindowMetrics() {
         final Configuration taskConfig = new Configuration();
         taskConfig.windowConfiguration.setBounds(TASK_BOUNDS);
diff --git a/libs/WindowManager/Shell/OWNERS b/libs/WindowManager/Shell/OWNERS
index 852edef..f0ed6ee 100644
--- a/libs/WindowManager/Shell/OWNERS
+++ b/libs/WindowManager/Shell/OWNERS
@@ -1,4 +1,4 @@
 [email protected]
 
 # Give submodule owners in shell resource approval
-per-file res*/*/*.xml = [email protected], [email protected], [email protected], [email protected]
+per-file res*/*/*.xml = [email protected], [email protected], [email protected], [email protected], [email protected]
diff --git a/libs/WindowManager/Shell/res/drawable/caption_close_button.xml b/libs/WindowManager/Shell/res/drawable/caption_close_button.xml
deleted file mode 100644
index e258564..0000000
--- a/libs/WindowManager/Shell/res/drawable/caption_close_button.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2023 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="32.0dp"
-        android:height="32.0dp"
-        android:viewportWidth="32.0"
-        android:viewportHeight="32.0"
->
-    <group android:scaleX="0.5"
-           android:scaleY="0.5"
-           android:translateY="4.0">
-        <path
-            android:fillColor="#FFFF0000"
-            android:pathData="M12.45,38.35 L9.65,35.55 21.2,24 9.65,12.45 12.45,9.65 24,21.2 35.55,9.65 38.35,12.45 26.8,24 38.35,35.55 35.55,38.35 24,26.8Z"/>
-    </group>
-</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/caption_desktop_button.xml b/libs/WindowManager/Shell/res/drawable/caption_desktop_button.xml
deleted file mode 100644
index 8779cc0..0000000
--- a/libs/WindowManager/Shell/res/drawable/caption_desktop_button.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2022 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="32.0dp"
-        android:height="32.0dp"
-        android:viewportWidth="32.0"
-        android:viewportHeight="32.0"
->
-    <group android:scaleX="0.5"
-           android:scaleY="0.5"
-           android:translateX="6.0"
-           android:translateY="6.0">
-        <path
-            android:fillColor="@android:color/black"
-            android:pathData="M5.958,37.708Q4.458,37.708 3.354,36.604Q2.25,35.5 2.25,34V18.292Q2.25,16.792 3.354,15.688Q4.458,14.583 5.958,14.583H9.5V5.958Q9.5,4.458 10.625,3.354Q11.75,2.25 13.208,2.25H34Q35.542,2.25 36.646,3.354Q37.75,4.458 37.75,5.958V21.667Q37.75,23.167 36.646,24.271Q35.542,25.375 34,25.375H30.5V34Q30.5,35.5 29.396,36.604Q28.292,37.708 26.792,37.708ZM5.958,34H26.792Q26.792,34 26.792,34Q26.792,34 26.792,34V21.542H5.958V34Q5.958,34 5.958,34Q5.958,34 5.958,34ZM30.5,21.667H34Q34,21.667 34,21.667Q34,21.667 34,21.667V9.208H13.208V14.583H26.833Q28.375,14.583 29.438,15.667Q30.5,16.75 30.5,18.25Z"/>
-    </group>
-</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/caption_floating_button.xml b/libs/WindowManager/Shell/res/drawable/caption_floating_button.xml
deleted file mode 100644
index ea0fbb0..0000000
--- a/libs/WindowManager/Shell/res/drawable/caption_floating_button.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2022 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="32.0dp"
-        android:height="32.0dp"
-        android:viewportWidth="32.0"
-        android:viewportHeight="32.0"
->
-    <group android:scaleX="0.5"
-           android:scaleY="0.5"
-           android:translateX="6.0"
-           android:translateY="6.0">
-        <path
-            android:fillColor="@android:color/black"
-            android:pathData="M18.167,21.875H29.833V10.208H18.167ZM7.875,35.833Q6.375,35.833 5.271,34.729Q4.167,33.625 4.167,32.125V7.875Q4.167,6.375 5.271,5.271Q6.375,4.167 7.875,4.167H32.125Q33.625,4.167 34.729,5.271Q35.833,6.375 35.833,7.875V32.125Q35.833,33.625 34.729,34.729Q33.625,35.833 32.125,35.833ZM7.875,32.125H32.125Q32.125,32.125 32.125,32.125Q32.125,32.125 32.125,32.125V7.875Q32.125,7.875 32.125,7.875Q32.125,7.875 32.125,7.875H7.875Q7.875,7.875 7.875,7.875Q7.875,7.875 7.875,7.875V32.125Q7.875,32.125 7.875,32.125Q7.875,32.125 7.875,32.125ZM7.875,7.875Q7.875,7.875 7.875,7.875Q7.875,7.875 7.875,7.875V32.125Q7.875,32.125 7.875,32.125Q7.875,32.125 7.875,32.125Q7.875,32.125 7.875,32.125Q7.875,32.125 7.875,32.125V7.875Q7.875,7.875 7.875,7.875Q7.875,7.875 7.875,7.875Z"/>
-    </group>
-</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/caption_fullscreen_button.xml b/libs/WindowManager/Shell/res/drawable/caption_fullscreen_button.xml
deleted file mode 100644
index c55cbe2..0000000
--- a/libs/WindowManager/Shell/res/drawable/caption_fullscreen_button.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2022 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="32.0dp"
-        android:height="32.0dp"
-        android:viewportWidth="32.0"
-        android:viewportHeight="32.0"
->
-    <group android:scaleX="0.5"
-           android:scaleY="0.5"
-           android:translateX="6.0"
-           android:translateY="6.0">
-        <path
-            android:fillColor="@android:color/black"
-            android:pathData="M34.042,14.625V9.333Q34.042,9.333 34.042,9.333Q34.042,9.333 34.042,9.333H28.708V5.708H33.917Q35.458,5.708 36.562,6.833Q37.667,7.958 37.667,9.458V14.625ZM2.375,14.625V9.458Q2.375,7.958 3.479,6.833Q4.583,5.708 6.125,5.708H11.292V9.333H6Q6,9.333 6,9.333Q6,9.333 6,9.333V14.625ZM28.708,34.25V30.667H34.042Q34.042,30.667 34.042,30.667Q34.042,30.667 34.042,30.667V25.333H37.667V30.542Q37.667,32 36.562,33.125Q35.458,34.25 33.917,34.25ZM6.125,34.25Q4.583,34.25 3.479,33.125Q2.375,32 2.375,30.542V25.333H6V30.667Q6,30.667 6,30.667Q6,30.667 6,30.667H11.292V34.25ZM9.333,27.292V12.667H30.708V27.292ZM12.917,23.708H27.125V16.25H12.917ZM12.917,23.708V16.25V23.708Z"/>
-    </group>
-</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/caption_more_button.xml b/libs/WindowManager/Shell/res/drawable/caption_more_button.xml
deleted file mode 100644
index 447df43..0000000
--- a/libs/WindowManager/Shell/res/drawable/caption_more_button.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2022 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="32.0dp"
-        android:height="32.0dp"
-        android:viewportWidth="32.0"
-        android:viewportHeight="32.0"
->
-    <group android:scaleX="0.5"
-           android:scaleY="0.5"
-           android:translateX="6.0"
-           android:translateY="6.0">
-        <path
-            android:fillColor="@android:color/black"
-            android:pathData="M8.083,22.833Q6.917,22.833 6.104,22Q5.292,21.167 5.292,20Q5.292,18.833 6.125,18Q6.958,17.167 8.125,17.167Q9.292,17.167 10.125,18Q10.958,18.833 10.958,20Q10.958,21.167 10.125,22Q9.292,22.833 8.083,22.833ZM20,22.833Q18.833,22.833 18,22Q17.167,21.167 17.167,20Q17.167,18.833 18,18Q18.833,17.167 20,17.167Q21.167,17.167 22,18Q22.833,18.833 22.833,20Q22.833,21.167 22,22Q21.167,22.833 20,22.833ZM31.875,22.833Q30.708,22.833 29.875,22Q29.042,21.167 29.042,20Q29.042,18.833 29.875,18Q30.708,17.167 31.917,17.167Q33.083,17.167 33.896,18Q34.708,18.833 34.708,20Q34.708,21.167 33.875,22Q33.042,22.833 31.875,22.833Z"/>
-    </group>
-</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/caption_select_button.xml b/libs/WindowManager/Shell/res/drawable/caption_select_button.xml
deleted file mode 100644
index 8c60c84..0000000
--- a/libs/WindowManager/Shell/res/drawable/caption_select_button.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2023 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="32.0dp"
-        android:height="32.0dp"
-        android:viewportWidth="32.0"
-        android:viewportHeight="32.0"
->
-    <group
-           android:translateX="4.0"
-           android:translateY="6.0">
-        <path
-            android:fillColor="@android:color/black"
-            android:pathData="M13.7021 12.5833L16.5676 15.5L15.426 16.7333L12.526 13.8333L10.4426 15.9167V10.5H15.9176L13.7021 12.5833ZM13.8343 3.83333H15.501V5.5H13.8343V3.83333ZM15.501 2.16667H13.8343V0.566667C14.751 0.566667 15.501 1.33333 15.501 2.16667ZM10.501 0.5H12.1676V2.16667H10.501V0.5ZM13.8343 7.16667H15.501V8.83333H13.8343V7.16667ZM5.50098 15.5H3.83431V13.8333H5.50098V15.5ZM2.16764 5.5H0.500977V3.83333H2.16764V5.5ZM2.16764 0.566667V2.16667H0.500977C0.500977 1.33333 1.33431 0.566667 2.16764 0.566667ZM2.16764 12.1667H0.500977V10.5H2.16764V12.1667ZM5.50098 2.16667H3.83431V0.5H5.50098V2.16667ZM8.83431 2.16667H7.16764V0.5H8.83431V2.16667ZM8.83431 15.5H7.16764V13.8333H8.83431V15.5ZM2.16764 8.83333H0.500977V7.16667H2.16764V8.83333ZM2.16764 15.5667C1.25098 15.5667 0.500977 14.6667 0.500977 13.8333H2.16764V15.5667Z"/>
-    </group>
-</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/caption_split_screen_button.xml b/libs/WindowManager/Shell/res/drawable/caption_split_screen_button.xml
deleted file mode 100644
index c334a54..0000000
--- a/libs/WindowManager/Shell/res/drawable/caption_split_screen_button.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2022 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="32.0dp"
-        android:height="32.0dp"
-        android:viewportWidth="32.0"
-        android:viewportHeight="32.0"
->
-    <group android:translateX="6.0"
-           android:translateY="8.0">
-        <path
-            android:fillColor="@android:color/black"
-            android:pathData="M18 14L13 14L13 2L18 2L18 14ZM20 14L20 2C20 0.9 19.1 -3.93402e-08 18 -8.74228e-08L13 -3.0598e-07C11.9 -3.54062e-07 11 0.9 11 2L11 14C11 15.1 11.9 16 13 16L18 16C19.1 16 20 15.1 20 14ZM7 14L2 14L2 2L7 2L7 14ZM9 14L9 2C9 0.9 8.1 -5.20166e-07 7 -5.68248e-07L2 -7.86805e-07C0.9 -8.34888e-07 -3.93403e-08 0.9 -8.74228e-08 2L-6.11959e-07 14C-6.60042e-07 15.1 0.9 16 2 16L7 16C8.1 16 9 15.1 9 14Z"/>    </group>
-</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_decor_menu_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_decor_menu_background.xml
index c6e634c..4ee10f4 100644
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_decor_menu_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_decor_menu_background.xml
@@ -17,6 +17,5 @@
 <shape android:shape="rectangle"
        xmlns:android="http://schemas.android.com/apk/res/android">
     <solid android:color="@android:color/white" />
-    <corners android:radius="@dimen/caption_menu_corner_radius" />
-    <stroke android:width="1dp" android:color="#b3b3b3"/>
+    <corners android:radius="@dimen/desktop_mode_handle_menu_corner_radius" />
 </shape>
diff --git a/libs/WindowManager/Shell/res/drawable/caption_collapse_menu_button.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_close.xml
similarity index 62%
copy from libs/WindowManager/Shell/res/drawable/caption_collapse_menu_button.xml
copy to libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_close.xml
index 166552d..b7521d4 100644
--- a/libs/WindowManager/Shell/res/drawable/caption_collapse_menu_button.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_close.xml
@@ -15,16 +15,12 @@
   ~ limitations under the License.
   -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
->
-    <group android:scaleX="1.25"
-           android:scaleY="1.75"
-           android:translateY="6.0">
-        <path
-            android:fillColor="@android:color/black"
-            android:pathData="M10.3937 6.93935L11.3337 5.99935L6.00033 0.666016L0.666992 5.99935L1.60699 6.93935L6.00033 2.55268"/>
-    </group>
+    android:height="20dp"
+    android:tint="#000000"
+    android:viewportHeight="24"
+    android:viewportWidth="24"
+    android:width="20dp">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
 </vector>
diff --git a/libs/WindowManager/Shell/res/drawable/caption_screenshot_button.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_desktop.xml
similarity index 60%
copy from libs/WindowManager/Shell/res/drawable/caption_screenshot_button.xml
copy to libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_desktop.xml
index 7c86888..e2b724b 100644
--- a/libs/WindowManager/Shell/res/drawable/caption_screenshot_button.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_desktop.xml
@@ -15,16 +15,12 @@
   ~ limitations under the License.
   -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="32.0dp"
-        android:height="32.0dp"
-        android:viewportWidth="32.0"
-        android:viewportHeight="32.0"
->
-    <group android:scaleX="0.5"
-           android:scaleY="0.5"
-           android:translateY="4.0">
-        <path
-            android:fillColor="@android:color/black"
-            android:pathData="M10,38V28.35H13V35H19.65V38ZM10,19.65V10H19.65V13H13V19.65ZM28.35,38V35H35V28.35H38V38ZM35,19.65V13H28.35V10H38V19.65Z"/>
-    </group>
+    android:width="20dp"
+    android:height="20dp"
+    android:viewportWidth="20"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M16.667,15H3.333V5H16.667V15ZM16.667,16.667C17.583,16.667 18.333,15.917 18.333,15V5C18.333,4.083 17.583,3.333 16.667,3.333H3.333C2.417,3.333 1.667,4.083 1.667,5V15C1.667,15.917 2.417,16.667 3.333,16.667H16.667ZM15,6.667H9.167V8.333H13.333V10H15V6.667ZM5,9.167H12.5V13.333H5V9.167Z"
+      android:fillColor="#1C1C14"
+      android:fillType="evenOdd"/>
 </vector>
diff --git a/libs/WindowManager/Shell/res/drawable/caption_collapse_menu_button.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_floating.xml
similarity index 62%
rename from libs/WindowManager/Shell/res/drawable/caption_collapse_menu_button.xml
rename to libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_floating.xml
index 166552d..b0ea98e 100644
--- a/libs/WindowManager/Shell/res/drawable/caption_collapse_menu_button.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_floating.xml
@@ -15,16 +15,12 @@
   ~ limitations under the License.
   -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
->
-    <group android:scaleX="1.25"
-           android:scaleY="1.75"
-           android:translateY="6.0">
-        <path
-            android:fillColor="@android:color/black"
-            android:pathData="M10.3937 6.93935L11.3337 5.99935L6.00033 0.666016L0.666992 5.99935L1.60699 6.93935L6.00033 2.55268"/>
-    </group>
+    android:width="21dp"
+    android:height="20dp"
+    android:viewportWidth="21"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M3.667,15H17V5H3.667V15ZM18.667,15C18.667,15.917 17.917,16.667 17,16.667H3.667C2.75,16.667 2,15.917 2,15V5C2,4.083 2.75,3.333 3.667,3.333H17C17.917,3.333 18.667,4.083 18.667,5V15ZM11.167,6.667H15.333V11.667H11.167V6.667Z"
+      android:fillColor="#1C1C14"
+      android:fillType="evenOdd"/>
 </vector>
diff --git a/libs/WindowManager/Shell/res/drawable/caption_collapse_menu_button.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_fullscreen.xml
similarity index 62%
copy from libs/WindowManager/Shell/res/drawable/caption_collapse_menu_button.xml
copy to libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_fullscreen.xml
index 166552d..99e1d26 100644
--- a/libs/WindowManager/Shell/res/drawable/caption_collapse_menu_button.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_fullscreen.xml
@@ -15,16 +15,12 @@
   ~ limitations under the License.
   -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
->
-    <group android:scaleX="1.25"
-           android:scaleY="1.75"
-           android:translateY="6.0">
-        <path
-            android:fillColor="@android:color/black"
-            android:pathData="M10.3937 6.93935L11.3337 5.99935L6.00033 0.666016L0.666992 5.99935L1.60699 6.93935L6.00033 2.55268"/>
-    </group>
+    android:width="20dp"
+    android:height="20dp"
+    android:viewportWidth="20"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M3.333,15H16.667V5H3.333V15ZM18.333,15C18.333,15.917 17.583,16.667 16.667,16.667H3.333C2.417,16.667 1.667,15.917 1.667,15V5C1.667,4.083 2.417,3.333 3.333,3.333H16.667C17.583,3.333 18.333,4.083 18.333,5V15ZM5,6.667H15V13.333H5V6.667Z"
+      android:fillColor="#1C1C14"
+      android:fillType="evenOdd"/>
 </vector>
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_screenshot.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_screenshot.xml
new file mode 100644
index 0000000..79a9125
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_screenshot.xml
@@ -0,0 +1,34 @@
+<?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.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="20dp"
+    android:height="20dp"
+    android:viewportWidth="20"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M18.333,5.833L18.333,8.333L16.667,8.333L16.667,5.833L13.333,5.833L13.333,4.167L16.667,4.167C17.587,4.167 18.333,4.913 18.333,5.833Z"
+      android:fillColor="#1C1C14"/>
+  <path
+      android:pathData="M6.667,4.167L3.333,4.167C2.413,4.167 1.667,4.913 1.667,5.833L1.667,8.333L3.333,8.333L3.333,5.833L6.667,5.833L6.667,4.167Z"
+      android:fillColor="#1C1C14"/>
+  <path
+      android:pathData="M6.667,14.167L3.333,14.167L3.333,11.667L1.667,11.667L1.667,14.167C1.667,15.087 2.413,15.833 3.333,15.833L6.667,15.833L6.667,14.167Z"
+      android:fillColor="#1C1C14"/>
+  <path
+      android:pathData="M13.333,15.833L16.667,15.833C17.587,15.833 18.333,15.087 18.333,14.167L18.333,11.667L16.667,11.667L16.667,14.167L13.333,14.167L13.333,15.833Z"
+      android:fillColor="#1C1C14"/>
+</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_select.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_select.xml
new file mode 100644
index 0000000..7c4f499
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_select.xml
@@ -0,0 +1,25 @@
+<?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.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="20dp"
+    android:height="20dp"
+    android:viewportWidth="20"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M15.701,14.583L18.567,17.5L17.425,18.733L14.525,15.833L12.442,17.917V12.5H17.917L15.701,14.583ZM15.833,5.833H17.5V7.5H15.833V5.833ZM17.5,4.167H15.833V2.567C16.75,2.567 17.5,3.333 17.5,4.167ZM12.5,2.5H14.167V4.167H12.5V2.5ZM15.833,9.167H17.5V10.833H15.833V9.167ZM7.5,17.5H5.833V15.833H7.5V17.5ZM4.167,7.5H2.5V5.833H4.167V7.5ZM4.167,2.567V4.167H2.5C2.5,3.333 3.333,2.567 4.167,2.567ZM4.167,14.167H2.5V12.5H4.167V14.167ZM7.5,4.167H5.833V2.5H7.5V4.167ZM10.833,4.167H9.167V2.5H10.833V4.167ZM10.833,17.5H9.167V15.833H10.833V17.5ZM4.167,10.833H2.5V9.167H4.167V10.833ZM4.167,17.567C3.25,17.567 2.5,16.667 2.5,15.833H4.167V17.567Z"
+      android:fillColor="#1C1C14"/>
+</vector>
diff --git a/libs/WindowManager/Shell/res/drawable/caption_screenshot_button.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_splitscreen.xml
similarity index 61%
rename from libs/WindowManager/Shell/res/drawable/caption_screenshot_button.xml
rename to libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_splitscreen.xml
index 7c86888..853ab60 100644
--- a/libs/WindowManager/Shell/res/drawable/caption_screenshot_button.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_ic_handle_menu_splitscreen.xml
@@ -15,16 +15,12 @@
   ~ limitations under the License.
   -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="32.0dp"
-        android:height="32.0dp"
-        android:viewportWidth="32.0"
-        android:viewportHeight="32.0"
->
-    <group android:scaleX="0.5"
-           android:scaleY="0.5"
-           android:translateY="4.0">
-        <path
-            android:fillColor="@android:color/black"
-            android:pathData="M10,38V28.35H13V35H19.65V38ZM10,19.65V10H19.65V13H13V19.65ZM28.35,38V35H35V28.35H38V38ZM35,19.65V13H28.35V10H38V19.65Z"/>
-    </group>
+    android:width="21dp"
+    android:height="20dp"
+    android:viewportWidth="21"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M17.333,15H4V5H17.333V15ZM17.333,16.667C18.25,16.667 19,15.917 19,15V5C19,4.083 18.25,3.333 17.333,3.333H4C3.083,3.333 2.333,4.083 2.333,5V15C2.333,15.917 3.083,16.667 4,16.667H17.333ZM9.833,6.667H5.667V13.333H9.833V6.667ZM11.5,6.667H15.667V13.333H11.5V6.667Z"
+      android:fillColor="#1C1C14"
+      android:fillType="evenOdd"/>
 </vector>
diff --git a/libs/WindowManager/Shell/res/drawable/reachability_education_ic_left_hand.xml b/libs/WindowManager/Shell/res/drawable/reachability_education_ic_left_hand.xml
index c400dc6..029d838 100644
--- a/libs/WindowManager/Shell/res/drawable/reachability_education_ic_left_hand.xml
+++ b/libs/WindowManager/Shell/res/drawable/reachability_education_ic_left_hand.xml
@@ -14,686 +14,15 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
-                 xmlns:aapt="http://schemas.android.com/aapt">
-    <aapt:attr name="android:drawable">
-        <vector android:height="30dp" android:width="30dp" android:viewportHeight="30"
-                android:viewportWidth="30">
-            <group android:name="_R_G" android:scaleX="-1" android:translateX="30">
-                <group android:name="_R_G_L_0_G" android:translateX="-135" android:translateY="-135"
-                       android:pivotX="150" android:pivotY="150" android:scaleX="0.1"
-                       android:scaleY="0.1">
-                    <group android:name="_R_G_L_0_G_L_1_G" android:translateX="134.624"
-                           android:translateY="87.514" android:pivotX="11.625" android:pivotY="6.39"
-                           android:scaleX="10" android:scaleY="10">
-                        <group android:name="_R_G_L_0_G_L_1_G_D_0_P_0_G_0_T_0"
-                               android:translateX="11.625" android:translateY="6.464"
-                               android:scaleX="1" android:scaleY="1">
-                            <path android:name="_R_G_L_0_G_L_1_G_D_0_P_0"
-                                  android:fillColor="@color/letterbox_reachability_education_item_color"
-                                  android:fillAlpha="1"
-                                  android:fillType="nonZero"
-                                  android:pathData=" M-1.54 5.39 C-3.87,4.71 -5.49,2.54 -5.49,0.11 C-5.49,-2.92 -3.03,-5.38 0,-5.38 C3.03,-5.38 5.49,-2.92 5.49,0.11 C5.49,2.11 4.41,3.95 2.66,4.92 C2.66,4.92 1.69,3.17 1.69,3.17 C2.8,2.55 3.49,1.38 3.49,0.11 C3.49,-1.82 1.93,-3.38 0,-3.38 C-1.93,-3.38 -3.49,-1.82 -3.49,0.11 C-3.49,1.65 -2.46,3.03 -0.98,3.47 C-0.98,3.47 -1.54,5.39 -1.54,5.39c "/>
-                        </group>
-                    </group>
-                    <group android:name="_R_G_L_0_G_L_0_G" android:translateX="138"
-                           android:translateY="138" android:pivotX="12" android:pivotY="12"
-                           android:scaleX="10" android:scaleY="10">
-                        <path android:name="_R_G_L_0_G_L_0_G_D_0_P_0"
-                              android:fillColor="@color/letterbox_reachability_education_item_color"
-                              android:fillAlpha="1" android:fillType="nonZero"
-                              android:pathData=" M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c "/>
-                    </group>
-                </group>
-            </group>
-            <group android:name="time_group"/>
-        </vector>
-    </aapt:attr>
-    <target android:name="_R_G_L_0_G_L_1_G_D_0_P_0">
-        <aapt:attr name="android:animation">
-            <set android:ordering="together">
-                <objectAnimator android:propertyName="fillAlpha" android:duration="500"
-                                android:startOffset="0" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="500" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="750" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="833" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="1083" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="833"
-                                android:startOffset="1167" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="2000" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="2250" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="2333" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="2583" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="833"
-                                android:startOffset="2667" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="3500" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="3750" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="3833" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="4083" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="833"
-                                android:startOffset="4167" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="5000" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="5250" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="5333" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="5583" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-            </set>
-        </aapt:attr>
-    </target>
-    <target android:name="_R_G_L_0_G_L_1_G_D_0_P_0_G_0_T_0">
-        <aapt:attr name="android:animation">
-            <set android:ordering="together">
-                <objectAnimator android:propertyName="scaleX" android:duration="500"
-                                android:startOffset="0" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="500"
-                                android:startOffset="0" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="500" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="500" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="750" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="750" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="833" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="833" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="1083" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="1083" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="833"
-                                android:startOffset="1167" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="833"
-                                android:startOffset="1167" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="2000" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="2000" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="2250" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="2250" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="2333" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="2333" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="2583" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="2583" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="833"
-                                android:startOffset="2667" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="833"
-                                android:startOffset="2667" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="3500" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="3500" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="3750" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="3750" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="3833" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="3833" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="4083" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="4083" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="833"
-                                android:startOffset="4167" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="833"
-                                android:startOffset="4167" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="5000" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="5000" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="5250" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="5250" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="5333" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="5333" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="5583" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="5583" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-            </set>
-        </aapt:attr>
-    </target>
-    <target android:name="_R_G_L_0_G_L_0_G_D_0_P_0">
-        <aapt:attr name="android:animation">
-            <set android:ordering="together">
-                <objectAnimator android:propertyName="pathData" android:duration="500"
-                                android:startOffset="0"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="500"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="750"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="833"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="1083"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="833"
-                                android:startOffset="1167"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="2000"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="2250"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="2333"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="2583"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="833"
-                                android:startOffset="2667"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="3500"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="3750"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="3833"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="4083"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="833"
-                                android:startOffset="4167"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="5000"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="5250"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="5333"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="5583"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-            </set>
-        </aapt:attr>
-    </target>
-    <target android:name="time_group">
-        <aapt:attr name="android:animation">
-            <set android:ordering="together">
-                <objectAnimator android:propertyName="translateX" android:duration="6000"
-                                android:startOffset="0" android:valueFrom="0" android:valueTo="1"
-                                android:valueType="floatType"/>
-            </set>
-        </aapt:attr>
-    </target>
-</animated-vector>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="20dp"
+        android:height="20dp"
+        android:viewportWidth="960"
+        android:viewportHeight="960"
+        android:tint="?attr/colorControlNormal">
+    <group android:scaleX="-1" android:translateX="960">
+        <path
+            android:fillColor="?android:attr/textColorSecondary"
+            android:pathData="M432.46,48Q522,48 585,110.92Q648,173.83 648,264Q648,314 627.5,358.5Q607,403 566,432L528,432L528,370Q551,349 563.5,321.5Q576,294 576,263.78Q576,204.39 534,162.2Q492,120 432,120Q372,120 330,162Q288,204 288,264.31Q288,295 300,323Q312,351 336,370L336,456Q280,430 248,378Q216,326 216,264Q216,173.83 278.97,110.92Q341.94,48 432.46,48ZM414,864Q399.53,864 386.77,859Q374,854 363,843L144,624L211,557Q225,543 243,538Q261,533 279,538L336,552L336,288Q337,248 364.57,220Q392.14,192 432.07,192Q472,192 500,219.84Q528,247.68 528,288L528,432L576,432Q576,432 576,432Q576,432 576,432L715,497Q744,511 758,538Q772,565 767,596L737,802Q732,828 711.76,846Q691.52,864 666,864L414,864ZM414,792L666,792L698,569Q698,569 698,569Q698,569 698,569L559,504L456,504L456,288Q456,278 449,271Q442,264 432,264Q422,264 415,271Q408,278 408,288L408,644L262,608L246,624L414,792ZM666,792L414,792L414,792L414,792L414,792L414,792Q414,792 422,792Q430,792 439.5,792Q449,792 454.43,792Q459.86,792 459.86,792L459.86,792L529,792L666,792Q666,792 666,792Q666,792 666,792L666,792Z"/>
+    </group>
+</vector>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/reachability_education_ic_right_hand.xml b/libs/WindowManager/Shell/res/drawable/reachability_education_ic_right_hand.xml
index a807a77..592f899 100644
--- a/libs/WindowManager/Shell/res/drawable/reachability_education_ic_right_hand.xml
+++ b/libs/WindowManager/Shell/res/drawable/reachability_education_ic_right_hand.xml
@@ -14,686 +14,13 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
-                 xmlns:aapt="http://schemas.android.com/aapt">
-    <aapt:attr name="android:drawable">
-        <vector android:height="30dp" android:width="30dp" android:viewportHeight="30"
-                android:viewportWidth="30">
-            <group android:name="_R_G">
-                <group android:name="_R_G_L_0_G" android:translateX="-135" android:translateY="-135"
-                       android:pivotX="150" android:pivotY="150" android:scaleX="0.1"
-                       android:scaleY="0.1">
-                    <group android:name="_R_G_L_0_G_L_1_G" android:translateX="134.624"
-                           android:translateY="87.514" android:pivotX="11.625" android:pivotY="6.39"
-                           android:scaleX="10" android:scaleY="10">
-                        <group android:name="_R_G_L_0_G_L_1_G_D_0_P_0_G_0_T_0"
-                               android:translateX="11.625" android:translateY="6.464"
-                               android:scaleX="1" android:scaleY="1">
-                            <path android:name="_R_G_L_0_G_L_1_G_D_0_P_0"
-                                  android:fillColor="@color/letterbox_reachability_education_item_color"
-                                  android:fillAlpha="1"
-                                  android:fillType="nonZero"
-                                  android:pathData=" M-1.54 5.39 C-3.87,4.71 -5.49,2.54 -5.49,0.11 C-5.49,-2.92 -3.03,-5.38 0,-5.38 C3.03,-5.38 5.49,-2.92 5.49,0.11 C5.49,2.11 4.41,3.95 2.66,4.92 C2.66,4.92 1.69,3.17 1.69,3.17 C2.8,2.55 3.49,1.38 3.49,0.11 C3.49,-1.82 1.93,-3.38 0,-3.38 C-1.93,-3.38 -3.49,-1.82 -3.49,0.11 C-3.49,1.65 -2.46,3.03 -0.98,3.47 C-0.98,3.47 -1.54,5.39 -1.54,5.39c "/>
-                        </group>
-                    </group>
-                    <group android:name="_R_G_L_0_G_L_0_G" android:translateX="138"
-                           android:translateY="138" android:pivotX="12" android:pivotY="12"
-                           android:scaleX="10" android:scaleY="10">
-                        <path android:name="_R_G_L_0_G_L_0_G_D_0_P_0"
-                              android:fillColor="@color/letterbox_reachability_education_item_color"
-                              android:fillAlpha="1" android:fillType="nonZero"
-                              android:pathData=" M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c "/>
-                    </group>
-                </group>
-            </group>
-            <group android:name="time_group"/>
-        </vector>
-    </aapt:attr>
-    <target android:name="_R_G_L_0_G_L_1_G_D_0_P_0">
-        <aapt:attr name="android:animation">
-            <set android:ordering="together">
-                <objectAnimator android:propertyName="fillAlpha" android:duration="500"
-                                android:startOffset="0" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="500" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="750" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="833" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="1083" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="833"
-                                android:startOffset="1167" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="2000" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="2250" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="2333" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="2583" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="833"
-                                android:startOffset="2667" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="3500" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="3750" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="3833" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="4083" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="833"
-                                android:startOffset="4167" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="5000" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="5250" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="250"
-                                android:startOffset="5333" android:valueFrom="1"
-                                android:valueTo="0.1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="fillAlpha" android:duration="83"
-                                android:startOffset="5583" android:valueFrom="0.1"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator
-                            android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-            </set>
-        </aapt:attr>
-    </target>
-    <target android:name="_R_G_L_0_G_L_1_G_D_0_P_0_G_0_T_0">
-        <aapt:attr name="android:animation">
-            <set android:ordering="together">
-                <objectAnimator android:propertyName="scaleX" android:duration="500"
-                                android:startOffset="0" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="500"
-                                android:startOffset="0" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="500" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="500" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="750" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="750" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="833" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="833" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="1083" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="1083" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="833"
-                                android:startOffset="1167" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="833"
-                                android:startOffset="1167" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="2000" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="2000" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="2250" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="2250" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="2333" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="2333" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="2583" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="2583" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="833"
-                                android:startOffset="2667" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="833"
-                                android:startOffset="2667" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="3500" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="3500" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="3750" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="3750" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="3833" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="3833" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="4083" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="4083" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="833"
-                                android:startOffset="4167" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="833"
-                                android:startOffset="4167" android:valueFrom="1" android:valueTo="1"
-                                android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="5000" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="5000" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="5250" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="5250" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="250"
-                                android:startOffset="5333" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="250"
-                                android:startOffset="5333" android:valueFrom="1"
-                                android:valueTo="1.4000000000000001" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleX" android:duration="83"
-                                android:startOffset="5583" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="scaleY" android:duration="83"
-                                android:startOffset="5583" android:valueFrom="1.4000000000000001"
-                                android:valueTo="1" android:valueType="floatType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.999,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-            </set>
-        </aapt:attr>
-    </target>
-    <target android:name="_R_G_L_0_G_L_0_G_D_0_P_0">
-        <aapt:attr name="android:animation">
-            <set android:ordering="together">
-                <objectAnimator android:propertyName="pathData" android:duration="500"
-                                android:startOffset="0"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="500"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="750"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="833"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="1083"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="833"
-                                android:startOffset="1167"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="2000"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="2250"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="2333"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="2583"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="833"
-                                android:startOffset="2667"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="3500"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="3750"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="3833"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="4083"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="833"
-                                android:startOffset="4167"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="5000"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="5250"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="250"
-                                android:startOffset="5333"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.2,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-                <objectAnimator android:propertyName="pathData" android:duration="83"
-                                android:startOffset="5583"
-                                android:valueFrom="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,8 14.13,8 C14.13,7.3 13.88,6.71 13.4,6.23 C12.92,5.74 12.33,5.5 11.63,5.5 C10.93,5.5 10.33,5.74 9.85,6.23 C9.37,6.71 9.13,7.3 9.13,8 C9.13,8 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,8 11.13,8 C11.13,7.85 11.17,7.73 11.26,7.64 C11.35,7.55 11.48,7.5 11.63,7.5 C11.78,7.5 11.9,7.55 11.99,7.64 C12.08,7.73 12.13,7.85 12.13,8 C12.13,8 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueTo="M19.81 13.64 C19.62,13.23 19.33,12.93 18.93,12.75 C18.93,12.75 15.23,10.95 15.23,10.95 C15.16,10.9 15.09,10.86 15.01,10.84 C14.99,10.83 14.96,10.83 14.94,10.83 C14.88,10.81 14.83,10.8 14.78,10.8 C14.78,10.8 14.13,10.8 14.13,10.8 C14.13,10.8 14.13,8.9 14.13,8.9 C14.13,8.9 14.13,6.5 14.13,6.5 C14.13,5.8 13.88,5.21 13.4,4.72 C12.92,4.24 12.33,4 11.63,4 C10.93,4 10.33,4.24 9.85,4.72 C9.37,5.21 9.13,5.8 9.13,6.5 C9.13,6.5 9.13,8.95 9.13,8.95 C9.13,8.95 9.13,11.4 9.13,11.4 C9.13,11.4 9.13,14.65 9.13,14.65 C9.13,14.65 7.18,14.2 7.18,14.2 C6.86,14.12 6.56,14.14 6.26,14.26 C5.97,14.39 5.71,14.57 5.48,14.8 C5.48,14.8 4.08,16.25 4.08,16.25 C4.08,16.25 9.23,21.4 9.23,21.4 C9.41,21.58 9.63,21.73 9.88,21.84 C10.13,21.95 10.39,22 10.68,22 C10.68,22 17.08,22 17.08,22 C17.56,22 17.99,21.85 18.38,21.54 C18.76,21.23 18.99,20.83 19.08,20.35 C19.08,20.35 19.98,14.9 19.98,14.9 C20.06,14.47 20,14.05 19.81,13.64c M17.08 20 C17.08,20 10.68,20 10.68,20 C10.68,20 6.88,16.2 6.88,16.2 C6.88,16.2 11.13,17.1 11.13,17.1 C11.13,17.1 11.13,6.5 11.13,6.5 C11.13,6.35 11.17,6.23 11.26,6.14 C11.35,6.05 11.48,6 11.63,6 C11.78,6 11.9,6.05 11.99,6.14 C12.08,6.23 12.13,6.35 12.13,6.5 C12.13,6.5 12.13,12.5 12.13,12.5 C12.13,12.5 13.88,12.5 13.88,12.5 C13.88,12.5 18.02,14.55 18.02,14.55 C18.02,14.55 17.08,20 17.08,20c "
-                                android:valueType="pathType">
-                    <aapt:attr name="android:interpolator">
-                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0,1 1.0,1.0"/>
-                    </aapt:attr>
-                </objectAnimator>
-            </set>
-        </aapt:attr>
-    </target>
-    <target android:name="time_group">
-        <aapt:attr name="android:animation">
-            <set android:ordering="together">
-                <objectAnimator android:propertyName="translateX" android:duration="6000"
-                                android:startOffset="0" android:valueFrom="0" android:valueTo="1"
-                                android:valueType="floatType"/>
-            </set>
-        </aapt:attr>
-    </target>
-</animated-vector>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="20dp"
+        android:height="20dp"
+        android:viewportWidth="960"
+        android:viewportHeight="960"
+        android:tint="?attr/colorControlNormal">
+    <path
+        android:fillColor="?android:attr/textColorSecondary"
+        android:pathData="M432.46,48Q522,48 585,110.92Q648,173.83 648,264Q648,314 627.5,358.5Q607,403 566,432L528,432L528,370Q551,349 563.5,321.5Q576,294 576,263.78Q576,204.39 534,162.2Q492,120 432,120Q372,120 330,162Q288,204 288,264.31Q288,295 300,323Q312,351 336,370L336,456Q280,430 248,378Q216,326 216,264Q216,173.83 278.97,110.92Q341.94,48 432.46,48ZM414,864Q399.53,864 386.77,859Q374,854 363,843L144,624L211,557Q225,543 243,538Q261,533 279,538L336,552L336,288Q337,248 364.57,220Q392.14,192 432.07,192Q472,192 500,219.84Q528,247.68 528,288L528,432L576,432Q576,432 576,432Q576,432 576,432L715,497Q744,511 758,538Q772,565 767,596L737,802Q732,828 711.76,846Q691.52,864 666,864L414,864ZM414,792L666,792L698,569Q698,569 698,569Q698,569 698,569L559,504L456,504L456,288Q456,278 449,271Q442,264 432,264Q422,264 415,271Q408,278 408,288L408,644L262,608L246,624L414,792ZM666,792L414,792L414,792L414,792L414,792L414,792Q414,792 422,792Q430,792 439.5,792Q449,792 454.43,792Q459.86,792 459.86,792L459.86,792L529,792L666,792Q666,792 666,792Q666,792 666,792L666,792Z"/>
+</vector>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/bubble_bar_expanded_view.xml b/libs/WindowManager/Shell/res/layout/bubble_bar_expanded_view.xml
new file mode 100644
index 0000000..681a52b
--- /dev/null
+++ b/libs/WindowManager/Shell/res/layout/bubble_bar_expanded_view.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2023 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<com.android.wm.shell.bubbles.bar.BubbleBarExpandedView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_height="wrap_content"
+    android:layout_width="wrap_content"
+    android:orientation="vertical"
+    android:id="@+id/bubble_bar_expanded_view">
+
+</com.android.wm.shell.bubbles.bar.BubbleBarExpandedView>
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_app_controls_window_decor.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_app_controls_window_decor.xml
index 35562b6..f6b21ba 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_app_controls_window_decor.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_app_controls_window_decor.xml
@@ -61,7 +61,7 @@
             android:layout_width="32dp"
             android:layout_height="32dp"
             android:padding="4dp"
-            android:contentDescription="@string/collapse_menu_text"
+            android:contentDescription="@string/expand_menu_text"
             android:src="@drawable/ic_baseline_expand_more_24"
             android:tint="@color/desktop_mode_caption_expand_button_dark"
             android:background="@null"
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_decor_handle_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_decor_handle_menu.xml
deleted file mode 100644
index ac13eae..0000000
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_decor_handle_menu.xml
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2022 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<com.android.wm.shell.windowdecor.WindowDecorLinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/handle_menu"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:background="@drawable/desktop_mode_decor_menu_background"
-    android:divider="?android:attr/dividerHorizontal"
-    android:showDividers="middle"
-    android:dividerPadding="18dip">
-    <RelativeLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-        <ImageView
-            android:id="@+id/application_icon"
-            android:layout_width="24dp"
-            android:layout_height="24dp"
-            android:layout_margin="12dp"
-            android:contentDescription="@string/app_icon_text"
-            android:layout_alignParentStart="true"
-            android:layout_centerVertical="true"/>
-        <TextView
-            android:id="@+id/application_name"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_toEndOf="@+id/application_icon"
-            android:layout_toStartOf="@+id/collapse_menu_button"
-            android:textColor="#FF000000"
-            android:layout_centerVertical="true"/>
-        <Button
-            android:id="@+id/collapse_menu_button"
-            android:layout_width="24dp"
-            android:layout_height="24dp"
-            android:layout_marginEnd="10dp"
-            android:contentDescription="@string/collapse_menu_text"
-            android:layout_alignParentEnd="true"
-            android:background="@drawable/ic_baseline_expand_more_24"
-            android:layout_centerVertical="true"/>
-    </RelativeLayout>
-    <LinearLayout
-        android:id="@+id/windowing_mode_buttons"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal">
-        <Space
-            android:layout_width="0dp"
-            android:layout_height="1dp"
-            android:layout_weight="0.5" />
-        <ImageButton
-            style="@style/CaptionWindowingButtonStyle"
-            android:id="@+id/fullscreen_button"
-            android:contentDescription="@string/fullscreen_text"
-            android:src="@drawable/caption_fullscreen_button"
-            android:scaleType="fitCenter"
-            android:background="?android:selectableItemBackgroundBorderless"/>
-        <Space
-            android:layout_width="0dp"
-            android:layout_height="1dp"
-            android:layout_weight="1" />
-        <ImageButton
-            style="@style/CaptionWindowingButtonStyle"
-            android:id="@+id/split_screen_button"
-            android:contentDescription="@string/split_screen_text"
-            android:src="@drawable/caption_split_screen_button"
-            android:scaleType="fitCenter"
-            android:background="?android:selectableItemBackgroundBorderless"/>
-        <Space
-            android:layout_width="0dp"
-            android:layout_height="1dp"
-            android:layout_weight="1" />
-        <ImageButton
-            style="@style/CaptionWindowingButtonStyle"
-            android:id="@+id/floating_button"
-            android:contentDescription="@string/float_button_text"
-            android:src="@drawable/caption_floating_button"
-            android:scaleType="fitCenter"
-            android:background="?android:selectableItemBackgroundBorderless"/>
-        <Space
-            android:layout_width="0dp"
-            android:layout_height="1dp"
-            android:layout_weight="1" />
-        <ImageButton
-            style="@style/CaptionWindowingButtonStyle"
-            android:id="@+id/desktop_button"
-            android:contentDescription="@string/desktop_text"
-            android:src="@drawable/caption_desktop_button"
-            android:scaleType="fitCenter"
-            android:background="?android:selectableItemBackgroundBorderless"/>
-        <Space
-            android:layout_width="0dp"
-            android:layout_height="1dp"
-            android:layout_weight="0.5" />
-
-    </LinearLayout>
-    <LinearLayout
-        android:id="@+id/menu_buttons_misc"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical">
-        <Button
-            style="@style/CaptionMenuButtonStyle"
-            android:id="@+id/screenshot_button"
-            android:contentDescription="@string/screenshot_text"
-            android:text="@string/screenshot_text"
-            android:drawableStart="@drawable/caption_screenshot_button"/>
-        <Button
-            style="@style/CaptionMenuButtonStyle"
-            android:id="@+id/select_button"
-            android:contentDescription="@string/select_text"
-            android:text="@string/select_text"
-            android:drawableStart="@drawable/caption_select_button"/>
-        <Button
-            style="@style/CaptionMenuButtonStyle"
-            android:id="@+id/close_button"
-            android:contentDescription="@string/close_text"
-            android:text="@string/close_text"
-            android:drawableStart="@drawable/caption_close_button"
-            android:textColor="#FFFF0000"/>
-    </LinearLayout>
-</com.android.wm.shell.windowdecor.WindowDecorLinearLayout>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_focused_window_decor.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_focused_window_decor.xml
index 5ab159c..1d6864c 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_focused_window_decor.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_focused_window_decor.xml
@@ -25,8 +25,9 @@
 
     <ImageButton
         android:id="@+id/caption_handle"
-        android:layout_width="128dp"
+        android:layout_width="176dp"
         android:layout_height="42dp"
+        android:paddingHorizontal="24dp"
         android:contentDescription="@string/handle_text"
         android:src="@drawable/decor_handle_dark"
         tools:tint="@color/desktop_mode_caption_handle_bar_dark"
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_app_info_pill.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_app_info_pill.xml
new file mode 100644
index 0000000..167a003
--- /dev/null
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_app_info_pill.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2023 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="@dimen/desktop_mode_handle_menu_width"
+    android:layout_height="@dimen/desktop_mode_handle_menu_app_info_pill_height"
+    android:orientation="horizontal"
+    android:background="@drawable/desktop_mode_decor_menu_background"
+    android:gravity="center_vertical">
+
+    <ImageView
+        android:id="@+id/application_icon"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        android:layout_marginStart="14dp"
+        android:layout_marginEnd="14dp"
+        android:contentDescription="@string/app_icon_text"/>
+
+    <TextView
+        android:id="@+id/application_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        tools:text="Gmail"
+        android:textColor="@color/desktop_mode_caption_menu_text_color"
+        android:textSize="14sp"
+        android:textFontWeight="500"
+        android:lineHeight="20dp"
+        android:textStyle="normal"
+        android:layout_weight="1"/>
+
+    <ImageButton
+        android:id="@+id/collapse_menu_button"
+        android:layout_width="32dp"
+        android:layout_height="32dp"
+        android:padding="4dp"
+        android:layout_marginEnd="14dp"
+        android:layout_marginStart="14dp"
+        android:contentDescription="@string/collapse_menu_text"
+        android:src="@drawable/ic_baseline_expand_more_24"
+        android:rotation="180"
+        android:tint="@color/desktop_mode_caption_menu_buttons_color_inactive"
+        android:background="?android:selectableItemBackgroundBorderless"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_more_actions_pill.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_more_actions_pill.xml
new file mode 100644
index 0000000..40a4b53
--- /dev/null
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_more_actions_pill.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2023 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="@dimen/desktop_mode_handle_menu_width"
+    android:layout_height="@dimen/desktop_mode_handle_menu_more_actions_pill_height"
+    android:orientation="vertical"
+    android:background="@drawable/desktop_mode_decor_menu_background">
+
+    <Button
+        android:id="@+id/screenshot_button"
+        android:contentDescription="@string/screenshot_text"
+        android:text="@string/screenshot_text"
+        android:drawableStart="@drawable/desktop_mode_ic_handle_menu_screenshot"
+        android:drawableTint="@color/desktop_mode_caption_menu_buttons_color_inactive"
+        style="@style/DesktopModeHandleMenuActionButton"/>
+
+    <Button
+        android:id="@+id/select_button"
+        android:contentDescription="@string/select_text"
+        android:text="@string/select_text"
+        android:drawableStart="@drawable/desktop_mode_ic_handle_menu_select"
+        android:drawableTint="@color/desktop_mode_caption_menu_buttons_color_inactive"
+        style="@style/DesktopModeHandleMenuActionButton"/>
+
+    <Button
+        android:id="@+id/close_button"
+        android:contentDescription="@string/close_text"
+        android:text="@string/close_text"
+        android:drawableStart="@drawable/desktop_mode_ic_handle_menu_close"
+        android:drawableTint="@color/desktop_mode_caption_menu_buttons_color_inactive"
+        style="@style/DesktopModeHandleMenuActionButton"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_windowing_pill.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_windowing_pill.xml
new file mode 100644
index 0000000..95283b9
--- /dev/null
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_windowing_pill.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2023 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="@dimen/desktop_mode_handle_menu_width"
+    android:layout_height="@dimen/desktop_mode_handle_menu_windowing_pill_height"
+    android:orientation="horizontal"
+    android:background="@drawable/desktop_mode_decor_menu_background"
+    android:gravity="center_vertical">
+
+    <ImageButton
+        android:id="@+id/fullscreen_button"
+        android:layout_marginEnd="4dp"
+        android:contentDescription="@string/fullscreen_text"
+        android:src="@drawable/desktop_mode_ic_handle_menu_fullscreen"
+        android:tint="@color/desktop_mode_caption_menu_buttons_color_inactive"
+        android:layout_weight="1"
+        style="@style/DesktopModeHandleMenuWindowingButton"/>
+
+    <ImageButton
+        android:id="@+id/split_screen_button"
+        android:layout_marginStart="4dp"
+        android:layout_marginEnd="4dp"
+        android:contentDescription="@string/split_screen_text"
+        android:src="@drawable/desktop_mode_ic_handle_menu_splitscreen"
+        android:tint="@color/desktop_mode_caption_menu_buttons_color_inactive"
+        android:layout_weight="1"
+        style="@style/DesktopModeHandleMenuWindowingButton"/>
+
+    <ImageButton
+        android:id="@+id/floating_button"
+        android:layout_marginStart="4dp"
+        android:layout_marginEnd="4dp"
+        android:contentDescription="@string/float_button_text"
+        android:src="@drawable/desktop_mode_ic_handle_menu_floating"
+        android:tint="@color/desktop_mode_caption_menu_buttons_color_inactive"
+        android:layout_weight="1"
+        style="@style/DesktopModeHandleMenuWindowingButton"/>
+
+    <ImageButton
+        android:id="@+id/desktop_button"
+        android:layout_marginStart="4dp"
+        android:contentDescription="@string/desktop_text"
+        android:src="@drawable/desktop_mode_ic_handle_menu_desktop"
+        android:tint="@color/desktop_mode_caption_menu_buttons_color_active"
+        android:layout_weight="1"
+        style="@style/DesktopModeHandleMenuWindowingButton"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/reachability_ui_layout.xml b/libs/WindowManager/Shell/res/layout/reachability_ui_layout.xml
index 1e36fb6..49491a7 100644
--- a/libs/WindowManager/Shell/res/layout/reachability_ui_layout.xml
+++ b/libs/WindowManager/Shell/res/layout/reachability_ui_layout.xml
@@ -22,48 +22,44 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <com.android.wm.shell.compatui.ReachabilityEduHandLayout
+    <androidx.appcompat.widget.AppCompatTextView
         style="@style/ReachabilityEduHandLayout"
         android:text="@string/letterbox_reachability_reposition_text"
         app:drawableTopCompat="@drawable/reachability_education_ic_right_hand"
         android:layout_gravity="center_horizontal|top"
         android:layout_marginTop="@dimen/letterbox_reachability_education_dialog_margin"
         android:id="@+id/reachability_move_up_button"
-        android:maxWidth="@dimen/letterbox_reachability_education_item_width"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
 
-    <com.android.wm.shell.compatui.ReachabilityEduHandLayout
+    <androidx.appcompat.widget.AppCompatTextView
         style="@style/ReachabilityEduHandLayout"
         android:text="@string/letterbox_reachability_reposition_text"
         app:drawableTopCompat="@drawable/reachability_education_ic_right_hand"
         android:layout_gravity="center_vertical|right"
         android:layout_marginTop="@dimen/letterbox_reachability_education_dialog_margin"
         android:id="@+id/reachability_move_right_button"
-        android:maxWidth="@dimen/letterbox_reachability_education_item_width"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
 
 
-    <com.android.wm.shell.compatui.ReachabilityEduHandLayout
+    <androidx.appcompat.widget.AppCompatTextView
         style="@style/ReachabilityEduHandLayout"
         android:text="@string/letterbox_reachability_reposition_text"
         app:drawableTopCompat="@drawable/reachability_education_ic_left_hand"
         android:layout_gravity="center_vertical|left"
         android:layout_marginTop="@dimen/letterbox_reachability_education_dialog_margin"
         android:id="@+id/reachability_move_left_button"
-        android:maxWidth="@dimen/letterbox_reachability_education_item_width"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
 
-    <com.android.wm.shell.compatui.ReachabilityEduHandLayout
+    <androidx.appcompat.widget.AppCompatTextView
         style="@style/ReachabilityEduHandLayout"
         android:text="@string/letterbox_reachability_reposition_text"
         app:drawableTopCompat="@drawable/reachability_education_ic_right_hand"
         android:layout_gravity="center_horizontal|bottom"
         android:layout_marginTop="@dimen/letterbox_reachability_education_dialog_margin"
         android:id="@+id/reachability_move_down_button"
-        android:maxWidth="@dimen/letterbox_reachability_education_item_width"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
 
diff --git a/libs/WindowManager/Shell/res/layout/tv_pip_menu_background.xml b/libs/WindowManager/Shell/res/layout/tv_pip_menu_background.xml
index 5af4020..bd48ad2 100644
--- a/libs/WindowManager/Shell/res/layout/tv_pip_menu_background.xml
+++ b/libs/WindowManager/Shell/res/layout/tv_pip_menu_background.xml
@@ -19,10 +19,11 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
     <View
+        android:id="@+id/background_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_margin="@dimen/pip_menu_outer_space_frame"
         android:background="@drawable/tv_pip_menu_background"
-        android:elevation="@dimen/pip_menu_elevation"/>
+        android:elevation="@dimen/pip_menu_elevation_no_menu"/>
 </FrameLayout>
 
diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml
index 848f28c..d158cec 100644
--- a/libs/WindowManager/Shell/res/values-af/strings.xml
+++ b/libs/WindowManager/Shell/res/values-af/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Verander grootte"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Hou vas"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Laat los"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Program sal dalk nie met verdeelde skerm werk nie."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Program steun nie verdeelde skerm nie."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"App sal dalk nie met verdeelde skerm werk nie"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"App steun nie verdeelde skerm nie"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Hierdie app kan net in 1 venster oopgemaak word."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Program sal dalk nie op \'n sekondêre skerm werk nie."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Program steun nie begin op sekondêre skerms nie."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Skermverdeler"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Skermverdeler"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Skermverdeler"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Skermverdeler"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Volskerm links"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Links 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Links 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nie opgelos nie?\nTik om terug te stel"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen kamerakwessies nie? Tik om toe te maak."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Sien en doen meer"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Sleep ’n ander program in vir verdeelde skerm"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Sleep ’n ander app in vir verdeelde skerm"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dubbeltik buite ’n program om dit te herposisioneer"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Het dit"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Vou uit vir meer inligting."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Kanselleer"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Herbegin"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Moenie weer wys nie"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Dubbeltik om hierdie app te skuif"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maksimeer"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Maak klein"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Maak toe"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Skermskoot"</string>
     <string name="close_text" msgid="4986518933445178928">"Maak toe"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Maak kieslys toe"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml
index 9ed281f..7831c30 100644
--- a/libs/WindowManager/Shell/res/values-am/strings.xml
+++ b/libs/WindowManager/Shell/res/values-am/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"መጠን ይቀይሩ"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Stash"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Unstash"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"መተግበሪያ ከተከፈለ ማያ ገጽ ጋር ላይሠራ ይችላል"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"መተግበሪያው የተከፈለ ማያ ገጽን አይደግፍም።"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"መተግበሪያ ከተከፈለ ማያ ገጽ ጋር ላይሠራ ይችላል"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"መተግበሪያው የተከፈለ ማያ ገጽን አይደግፍም"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"ይህ መተግበሪያ መከፈት የሚችለው በ1 መስኮት ብቻ ነው።"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"መተግበሪያ በሁለተኛ ማሳያ ላይ ላይሠራ ይችላል።"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"መተግበሪያ በሁለተኛ ማሳያዎች ላይ ማስጀመርን አይደግፍም።"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"የተከፈለ የማያ ገጽ ከፋይ"</string>
-    <string name="divider_title" msgid="5482989479865361192">"የተከፈለ የማያ ገጽ ከፋይ"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"የተከፈለ የማያ ገጽ ከፋይ"</string>
+    <string name="divider_title" msgid="1963391955593749442">"የተከፈለ የማያ ገጽ ከፋይ"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"የግራ ሙሉ ማያ ገጽ"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ግራ 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ግራ 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"አልተስተካከለም?\nለማህደር መታ ያድርጉ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ምንም የካሜራ ችግሮች የሉም? ለማሰናበት መታ ያድርጉ።"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ተጨማሪ ይመልከቱ እና ያድርጉ"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"ለተከፈለ ማያ ገጽ ሌላ መተግበሪያ ይጎትቱ"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ለተከፈለ ማያ ገጽ ሌላ መተግበሪያ ይጎትቱ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ቦታውን ለመቀየር ከመተግበሪያው ውጪ ሁለቴ መታ ያድርጉ"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"ገባኝ"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"ለተጨማሪ መረጃ ይዘርጉ።"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"ይቅር"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"እንደገና ያስጀምሩ"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"ዳግም አታሳይ"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"ይህን መተግበሪያ ለማንቀሳቀስ ሁለቴ መታ ያድርጉ"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"አስፋ"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"አሳንስ"</string>
     <string name="close_button_text" msgid="2913281996024033299">"ዝጋ"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"ቅጽበታዊ ገጽ እይታ"</string>
     <string name="close_text" msgid="4986518933445178928">"ዝጋ"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"ምናሌ ዝጋ"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml
index 8fe0fb9..09781c7 100644
--- a/libs/WindowManager/Shell/res/values-ar/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ar/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"تغيير الحجم"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"إخفاء"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"إظهار"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"قد لا يعمل التطبيق بشكل سليم في وضع \"تقسيم الشاشة\"."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"التطبيق لا يتيح تقسيم الشاشة."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"قد لا يعمل التطبيق بشكل سليم في وضع تقسيم الشاشة."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"لا يعمل التطبيق في وضع تقسيم الشاشة."</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"لا يمكن فتح هذا التطبيق إلا في نافذة واحدة."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"قد لا يعمل التطبيق على شاشة عرض ثانوية."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"لا يمكن تشغيل التطبيق على شاشات عرض ثانوية."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"أداة تقسيم الشاشة"</string>
-    <string name="divider_title" msgid="5482989479865361192">"أداة تقسيم الشاشة"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"أداة تقسيم الشاشة"</string>
+    <string name="divider_title" msgid="1963391955593749442">"أداة تقسيم الشاشة"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"عرض النافذة اليسرى بملء الشاشة"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ضبط حجم النافذة اليسرى ليكون ٧٠%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ضبط حجم النافذة اليسرى ليكون ٥٠%"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"نقل إلى أسفل اليسار"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"إعدادات <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"إغلاق فقاعة المحادثة"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"عدم إظهار فقاعات المحادثات"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"عدم عرض المحادثة كفقاعة محادثة"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"الدردشة باستخدام فقاعات المحادثات"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"تظهر المحادثات الجديدة كرموز عائمة أو كفقاعات. انقر لفتح فقاعة المحادثة، واسحبها لتحريكها."</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ألم يتم حل المشكلة؟\nانقر للعودة"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"أليس هناك مشاكل في الكاميرا؟ انقر للإغلاق."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"استخدام تطبيقات متعدّدة في وقت واحد"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"اسحب تطبيقًا آخر لاستخدام وضع تقسيم الشاشة."</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"اسحب تطبيقًا آخر لاستخدام وضع تقسيم الشاشة."</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"انقر مرّتين خارج تطبيق لتغيير موضعه."</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"حسنًا"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"التوسيع للحصول على مزيد من المعلومات"</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"إلغاء"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"إعادة التشغيل"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"عدم عرض مربّع حوار التأكيد مجددًا"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"انقر مرّتَين لنقل هذا التطبيق."</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"تكبير"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"تصغير"</string>
     <string name="close_button_text" msgid="2913281996024033299">"إغلاق"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"لقطة شاشة"</string>
     <string name="close_text" msgid="4986518933445178928">"إغلاق"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"إغلاق القائمة"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml
index a8480eb..856a132 100644
--- a/libs/WindowManager/Shell/res/values-as/strings.xml
+++ b/libs/WindowManager/Shell/res/values-as/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"আকাৰ সলনি কৰক"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"লুকুৱাওক"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"দেখুৱাওক"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"এপ্‌টোৱে বিভাজিত স্ক্ৰীনৰ সৈতে কাম নকৰিব পাৰে।"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"এপ্‌টোৱে বিভাজিত স্ক্ৰীন সমৰ্থন নকৰে।"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"এপ্‌টোৱে বিভাজিত স্ক্ৰীনৰ সৈতে কাম নকৰিব পাৰে"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"এপ্‌টোৱে বিভাজিত স্ক্ৰীন সমৰ্থন নকৰে"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"এই এপ্‌টো কেৱল ১ খন ৱিণ্ড’ত খুলিব পাৰি।"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"গৌণ ডিছপ্লেত এপে সঠিকভাৱে কাম নকৰিব পাৰে।"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"গৌণ ডিছপ্লেত এপ্ লঞ্চ কৰিব নোৱাৰি।"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"স্প্লিট স্ক্ৰীনৰ বিভাজক"</string>
-    <string name="divider_title" msgid="5482989479865361192">"বিভাজিত স্ক্ৰীনৰ বিভাজক"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"স্প্লিট স্ক্ৰীনৰ বিভাজক"</string>
+    <string name="divider_title" msgid="1963391955593749442">"স্প্লিট স্ক্ৰীনৰ বিভাজক"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"বাওঁফালৰ স্ক্ৰীনখন সম্পূৰ্ণ স্ক্ৰীন কৰক"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"বাওঁফালৰ স্ক্ৰীনখন ৭০% কৰক"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"বাওঁফালৰ স্ক্ৰীনখন ৫০% কৰক"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এইটো সমাধান কৰা নাই নেকি?\nপূৰ্বাৱস্থালৈ নিবলৈ টিপক"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"কেমেৰাৰ কোনো সমস্যা নাই নেকি? অগ্ৰাহ্য কৰিবলৈ টিপক।"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"চাওক আৰু অধিক কৰক"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"বিভাজিত স্ক্ৰীনৰ বাবে অন্য এটা এপ্‌ টানি আনি এৰক"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"বিভাজিত স্ক্ৰীনৰ বাবে অন্য এটা এপ্‌ টানি আনি এৰক"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"এপ্‌টোৰ স্থান সলনি কৰিবলৈ ইয়াৰ বাহিৰত দুবাৰ টিপক"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"বুজি পালোঁ"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"অধিক তথ্যৰ বাবে বিস্তাৰ কৰক।"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"বাতিল কৰক"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"ৰিষ্টাৰ্ট কৰক"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"পুনৰাই নেদেখুৱাব"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"এই এপ্‌টো স্থানান্তৰ কৰিবলৈ দুবাৰ টিপক"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"সৰ্বাধিক মাত্ৰালৈ বঢ়াওক"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"মিনিমাইজ কৰক"</string>
     <string name="close_button_text" msgid="2913281996024033299">"বন্ধ কৰক"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"স্ক্ৰীনশ্বট"</string>
     <string name="close_text" msgid="4986518933445178928">"বন্ধ কৰক"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"মেনু বন্ধ কৰক"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml
index b158cdd..1efeb4a 100644
--- a/libs/WindowManager/Shell/res/values-az/strings.xml
+++ b/libs/WindowManager/Shell/res/values-az/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ölçüsünü dəyişin"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Güvənli məkanda saxlayın"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Güvənli məkandan çıxarın"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Tətbiq bölünmüş ekran ilə işləməyə bilər."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Tətbiq ekran bölünməsini dəstəkləmir."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Tətbiq bölünmüş ekranda işləməyə bilər"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Tətbiq bölünmüş ekranı dəstəkləmir"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Bu tətbiq yalnız 1 pəncərədə açıla bilər."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Tətbiq ikinci ekranda işləməyə bilər."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Tətbiq ikinci ekranda başlamağı dəstəkləmir."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Bölünmüş ekran ayırıcısı"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Bölünmüş ekran ayırıcısı"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Bölünmüş ekran ayırıcısı"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Bölünmüş ekran ayırıcısı"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Sol tam ekran"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Sol 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Sol 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Düzəltməmisiniz?\nGeri qaytarmaq üçün toxunun"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera problemi yoxdur? Qapatmaq üçün toxunun."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Ardını görün və edin"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Bölünmüş ekrandan istifadə etmək üçün başqa tətbiqi sürüşdürüb gətirin"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Bölünmüş ekran üçün başqa tətbiq sürüşdürün"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Tətbiqin yerini dəyişmək üçün kənarına iki dəfə toxunun"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Anladım"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Ətraflı məlumat üçün genişləndirin."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Ləğv edin"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Yenidən başladın"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Yenidən göstərməyin"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Tətbiqi köçürmək üçün iki dəfə toxunun"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Böyüdün"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Kiçildin"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Bağlayın"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Skrinşot"</string>
     <string name="close_text" msgid="4986518933445178928">"Bağlayın"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Menyunu bağlayın"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
index 954d34fd..6c50766 100644
--- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Promenite veličinu"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Stavite u tajnu memoriju"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Uklonite iz tajne memorije"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacija možda neće raditi sa podeljenim ekranom."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacija ne podržava podeljeni ekran."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Aplikacija možda neće raditi sa podeljenim ekranom."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Aplikacija ne podržava podeljeni ekran."</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Ova aplikacija može da se otvori samo u jednom prozoru."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacija možda neće funkcionisati na sekundarnom ekranu."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacija ne podržava pokretanje na sekundarnim ekranima."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Razdelnik podeljenog ekrana"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Razdelnik podeljenog ekrana"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Razdelnik podeljenog ekrana"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Razdelnik podeljenog ekrana"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Režim celog ekrana za levi ekran"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Levi ekran 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Levi ekran 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije rešen?\nDodirnite da biste vratili"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema sa kamerom? Dodirnite da biste odbacili."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Vidite i uradite više"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Prevucite drugu aplikaciju da biste koristili podeljeni ekran"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Prevucite drugu aplikaciju da biste koristili podeljeni ekran"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvaput dodirnite izvan aplikacije da biste promenili njenu poziciju"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Važi"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Proširite za još informacija."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Otkaži"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Restartuj"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Ne prikazuj ponovo"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Dvaput dodirnite da biste premestili ovu aplikaciju"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Uvećajte"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Umanjite"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Zatvorite"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Snimak ekrana"</string>
     <string name="close_text" msgid="4986518933445178928">"Zatvorite"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvorite meni"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml
index cda6e39..88d9793 100644
--- a/libs/WindowManager/Shell/res/values-be/strings.xml
+++ b/libs/WindowManager/Shell/res/values-be/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Змяніць памер"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Схаваць"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Паказаць"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Праграма можа не працаваць у рэжыме падзеленага экрана."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Праграма не падтрымлівае функцыю дзялення экрана."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Праграма можа не працаваць у рэжыме падзеленага экрана"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Праграма не падтрымлівае рэжым падзеленага экрана"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Гэту праграму можна адкрыць толькі ў адным акне."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Праграма можа не працаваць на дадатковых экранах."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Праграма не падтрымлівае запуск на дадатковых экранах."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Раздзяляльнік падзеленага экрана"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Раздзяляльнік падзеленага экрана"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Раздзяляльнік падзеленага экрана"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Раздзяляльнік падзеленага экрана"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Левы экран – поўнаэкранны рэжым"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Левы экран – 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Левы экран – 50%"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Перамясціць правей і ніжэй"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"Налады \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\""</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"Адхіліць апавяшчэнне"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"Выключыць усплывальныя апавяшчэнні"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Не паказваць размову ў выглядзе ўсплывальных апавяшчэнняў"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"Усплывальныя апавяшчэнні"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"Новыя размовы будуць паказвацца як рухомыя значкі ці ўсплывальныя апавяшчэнні. Націсніце, каб адкрыць усплывальнае апавяшчэнне. Перацягніце яго, каб перамясціць."</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не ўдалося выправіць?\nНацісніце, каб аднавіць"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ніякіх праблем з камерай? Націсніце, каб адхіліць."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Адначасова выконвайце розныя задачы"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Перацягніце іншую праграму, каб выкарыстоўваць падзелены экран"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Перацягніце іншую праграму, каб выкарыстоўваць падзелены экран"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Двойчы націсніце экран па-за праграмай, каб перамясціць яе"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Зразумела"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Разгарнуць для дадатковай інфармацыі"</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Скасаваць"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Перазапусціць"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Больш не паказваць"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Каб перамясціць праграму, націсніце двойчы"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Разгарнуць"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Згарнуць"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Закрыць"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Здымак экрана"</string>
     <string name="close_text" msgid="4986518933445178928">"Закрыць"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Закрыць меню"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml
index a7757c6..bf061b2 100644
--- a/libs/WindowManager/Shell/res/values-bg/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bg/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Преоразмеряване"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Съхраняване"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Отмяна на съхраняването"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Приложението може да не работи в режим на разделен екран."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Приложението не поддържа разделен екран."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Приложението може да не работи в режим на разделен екран"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Приложението не поддържа разделен екран"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Това приложение може да се отвори само в 1 прозорец."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Възможно е приложението да не работи на алтернативни дисплеи."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Приложението не поддържа използването на алтернативни дисплеи."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Разделител в режима за разделен екран"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Разделител в режима за разделен екран"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Разделител в режима за разделен екран"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Разделител в режима за разделен екран"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ляв екран: Показване на цял екран"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Ляв екран: 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ляв екран: 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблемът не се отстрани?\nДокоснете за връщане в предишното състояние"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нямате проблеми с камерата? Докоснете, за да отхвърлите."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Преглеждайте и правете повече неща"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Преместете друго приложение с плъзгане, за да преминете в режим за разделен екран"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Преместете друго приложение с плъзгане, за да преминете в режим за разделен екран"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Докоснете два пъти извън дадено приложение, за да промените позицията му"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Разбрах"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Разгъване за още информация."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Отказ"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Рестартиране"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Да не се показва отново"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Докоснете двукратно, за да преместите това приложение"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Увеличаване"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Намаляване"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Затваряне"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Екранна снимка"</string>
     <string name="close_text" msgid="4986518933445178928">"Затваряне"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Затваряне на менюто"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml
index f3f80b8..453a2fc 100644
--- a/libs/WindowManager/Shell/res/values-bn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bn/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"রিসাইজ করুন"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"স্ট্যাস করুন"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"আনস্ট্যাস করুন"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"অ্যাপটি স্প্লিট স্ক্রিনে কাজ নাও করতে পারে।"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"অ্যাপ্লিকেশান বিভক্ত-স্ক্রিন সমর্থন করে না৷"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"স্প্লিট স্ক্রিনে এই অ্যাপ নাও কাজ করতে পারে"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"স্প্লিট স্ক্রিনে এই অ্যাপ কাজ করে না"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"এই অ্যাপটি শুধু ১টি উইন্ডোয় খোলা যেতে পারে।"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"সেকেন্ডারি ডিসপ্লেতে অ্যাপটি কাজ নাও করতে পারে।"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"সেকেন্ডারি ডিসপ্লেতে অ্যাপ লঞ্চ করা যাবে না।"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"বিভক্ত-স্ক্রিন বিভাজক"</string>
-    <string name="divider_title" msgid="5482989479865361192">"স্প্লিট স্ক্রিন বিভাজক"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"স্প্লিট স্ক্রিন বিভাজক"</string>
+    <string name="divider_title" msgid="1963391955593749442">"স্প্লিট স্ক্রিন বিভাজক"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"বাঁ দিকের অংশ নিয়ে পূর্ণ স্ক্রিন"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"৭০% বাকি আছে"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"৫০% বাকি আছে"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এখনও সমাধান হয়নি?\nরিভার্ট করার জন্য ট্যাপ করুন"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ক্যামেরা সংক্রান্ত সমস্যা নেই? বাতিল করতে ট্যাপ করুন।"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"দেখুন ও আরও অনেক কিছু করুন"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"স্প্লিট স্ক্রিনের জন্য অন্য অ্যাপে টেনে আনুন"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"স্প্লিট স্ক্রিনের ক্ষেত্রে অন্য কোনও অ্যাপ টেনে আনুন"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"কোনও অ্যাপের স্থান পরিবর্তন করতে তার বাইরে ডবল ট্যাপ করুন"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"বুঝেছি"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"আরও তথ্যের জন্য বড় করুন।"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"বাতিল করুন"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"রিস্টার্ট করুন"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"আর দেখতে চাই না"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"এই অ্যাপ সরাতে ডবল ট্যাপ করুন"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"বড় করুন"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"ছোট করুন"</string>
     <string name="close_button_text" msgid="2913281996024033299">"বন্ধ করুন"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"স্ক্রিনশট"</string>
     <string name="close_text" msgid="4986518933445178928">"বন্ধ করুন"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"\'মেনু\' বন্ধ করুন"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml
index e7fa212..987f0a7 100644
--- a/libs/WindowManager/Shell/res/values-bs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bs/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Promjena veličine"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Stavljanje u stash"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Vađenje iz stasha"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacija možda neće raditi na podijeljenom ekranu."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacija ne podržava dijeljenje ekrana."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Aplikacija možda neće funkcionirati na podijeljenom ekranu"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Aplikacija ne podržava podijeljeni ekran"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Ova aplikacija se može otvoriti samo u 1 prozoru."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacija možda neće raditi na sekundarnom ekranu."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacija ne podržava pokretanje na sekundarnim ekranima."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Razdjelnik podijeljenog ekrana"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Razdjelnik podijeljenog ekrana"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Razdjelnik podijeljenog ekrana"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Razdjelnik podijeljenog ekrana"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Lijevo cijeli ekran"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Lijevo 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Lijevo 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nije popravljeno?\nDodirnite da vratite"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nema problema s kamerom? Dodirnite da odbacite."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Pogledajte i učinite više"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Prevucite još jednu aplikaciju za podijeljeni ekran"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Prevucite još jednu aplikaciju za podijeljeni ekran"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvaput dodirnite izvan aplikacije da promijenite njen položaj"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Razumijem"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Proširite za više informacija."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Otkaži"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Ponovo pokreni"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Ne prikazuj ponovo"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Dodirnite dvaput da pomjerite aplikaciju"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maksimiziranje"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimiziranje"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Zatvaranje"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Snimak ekrana"</string>
     <string name="close_text" msgid="4986518933445178928">"Zatvaranje"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvaranje menija"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml
index 1021667..499f2d7 100644
--- a/libs/WindowManager/Shell/res/values-ca/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ca/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Canvia la mida"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Amaga"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Deixa d\'amagar"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"És possible que l\'aplicació no funcioni amb la pantalla dividida."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"L\'aplicació no admet la pantalla dividida."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"És possible que l\'aplicació no funcioni amb la pantalla dividida"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"L\'aplicació no admet la pantalla dividida"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Aquesta aplicació només pot obrir-se en 1 finestra."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"És possible que l\'aplicació no funcioni en una pantalla secundària."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"L\'aplicació no es pot obrir en pantalles secundàries."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Divisor de pantalles"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Separador de pantalla dividida"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Separador de pantalla dividida"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Separador de pantalla dividida"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Pantalla esquerra completa"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Pantalla esquerra al 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Pantalla esquerra al 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"El problema no s\'ha resolt?\nToca per desfer els canvis"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No tens cap problema amb la càmera? Toca per ignorar."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Consulta i fes més coses"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Arrossega una altra aplicació per utilitzar la pantalla dividida"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arrossega una altra aplicació per utilitzar la pantalla dividida"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Fes doble toc fora d\'una aplicació per canviar-ne la posició"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Entesos"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Desplega per obtenir més informació."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Cancel·la"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Reinicia"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"No ho tornis a mostrar"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Fes doble toc per moure aquesta aplicació"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximitza"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimitza"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Tanca"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string>
     <string name="close_text" msgid="4986518933445178928">"Tanca"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Tanca el menú"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml
index d6e4f9f..8d80b9a 100644
--- a/libs/WindowManager/Shell/res/values-cs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-cs/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Změnit velikost"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Uložit"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Zrušit uložení"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikace v režimu rozdělené obrazovky nemusí fungovat."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikace nepodporuje režim rozdělené obrazovky."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Aplikace v režimu rozdělené obrazovky nemusí fungovat"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Aplikace nepodporuje režim rozdělené obrazovky"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Tuto aplikaci lze otevřít jen na jednom okně."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikace na sekundárním displeji nemusí fungovat."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikace nepodporuje spuštění na sekundárních displejích."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Čára rozdělující obrazovku"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Čára rozdělující obrazovku"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Čára rozdělující obrazovku"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Čára rozdělující obrazovku"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Levá část na celou obrazovku"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70 % vlevo"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % vlevo"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Přesunout vpravo dolů"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"Nastavení <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"Zavřít bublinu"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"Nezobrazovat bubliny"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nezobrazovat konverzaci v bublinách"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatujte pomocí bublin"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nové konverzace se zobrazují jako plovoucí ikony, neboli bubliny. Klepnutím bublinu otevřete. Přetažením ji posunete."</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepomohlo to?\nKlepnutím se vrátíte"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Žádné problémy s fotoaparátem? Klepnutím zavřete."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Lepší zobrazení a více možností"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Přetáhnutím druhé aplikace použijete rozdělenou obrazovku"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Přetáhnutím druhé aplikace použijete rozdělenou obrazovku"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvojitým klepnutím mimo aplikaci změníte její umístění"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Rozbalením zobrazíte další informace."</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Zrušit"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Restartovat"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Tuto zprávu příště nezobrazovat"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Dvojitým klepnutím přesunete aplikaci"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximalizovat"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimalizovat"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Zavřít"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Snímek obrazovky"</string>
     <string name="close_text" msgid="4986518933445178928">"Zavřít"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zavřít nabídku"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml
index da8723f..86d7021 100644
--- a/libs/WindowManager/Shell/res/values-da/strings.xml
+++ b/libs/WindowManager/Shell/res/values-da/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Rediger størrelse"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Skjul"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Vis"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Appen fungerer muligvis ikke i opdelt skærm."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Appen understøtter ikke opdelt skærm."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Appen fungerer muligvis ikke i opdelt skærm"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Appen understøtter ikke opdelt skærm"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Denne app kan kun åbnes i 1 vindue."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Appen fungerer muligvis ikke på sekundære skærme."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Appen kan ikke åbnes på sekundære skærme."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Adskiller til opdelt skærm"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Adskiller til opdelt skærm"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Adskiller til opdelt skærm"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Adskiller til opdelt skærm"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Vis venstre del i fuld skærm"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Venstre 70 %"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Venstre 50 %"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Flyt ned til højre"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"Indstillinger for <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"Afvis boble"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"Stop med at vise bobler"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Vis ikke samtaler i bobler"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat ved hjælp af bobler"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nye samtaler vises som svævende ikoner eller bobler. Tryk for at åbne boblen. Træk for at flytte den."</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Løste det ikke problemet?\nTryk for at fortryde"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen problemer med dit kamera? Tryk for at afvise."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Se og gør mere"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Træk en anden app hertil for at bruge opdelt skærm"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Træk en anden app hertil for at bruge opdelt skærm"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Tryk to gange uden for en app for at justere dens placering"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Udvid for at få flere oplysninger."</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Annuller"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Genstart"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Vis ikke igen"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Tryk to gange for at flytte appen"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maksimér"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimer"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Luk"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
     <string name="close_text" msgid="4986518933445178928">"Luk"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Luk menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml
index b2b76197..9d08828 100644
--- a/libs/WindowManager/Shell/res/values-de/strings.xml
+++ b/libs/WindowManager/Shell/res/values-de/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Größe anpassen"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"In Stash legen"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Aus Stash entfernen"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Die App funktioniert unter Umständen im Modus für geteilten Bildschirm nicht."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Das Teilen des Bildschirms wird in dieser App nicht unterstützt."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Die App funktioniert bei geteiltem Bildschirm unter Umständen nicht"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"„Geteilter Bildschirm“ wird in dieser App nicht unterstützt"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Diese App kann nur in einem einzigen Fenster geöffnet werden."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Die App funktioniert auf einem sekundären Display möglicherweise nicht."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Die App unterstützt den Start auf sekundären Displays nicht."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Bildschirmteiler"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Bildschirmteiler"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Bildschirmteiler"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Bildschirmteiler"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Vollbild links"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70 % links"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % links"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Das Problem ist nicht behoben?\nZum Rückgängigmachen tippen."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Keine Probleme mit der Kamera? Zum Schließen tippen."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Mehr sehen und erledigen"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Weitere App hineinziehen, um den Bildschirm zu teilen"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Weitere App hineinziehen, um den Bildschirm zu teilen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Außerhalb einer App doppeltippen, um die Position zu ändern"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Ok"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Für weitere Informationen maximieren."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Abbrechen"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Neu starten"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Nicht mehr anzeigen"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Doppeltippen, um die App zu verschieben"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximieren"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimieren"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Schließen"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
     <string name="close_text" msgid="4986518933445178928">"Schließen"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Menü schließen"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml
index a09a647..5f6a293 100644
--- a/libs/WindowManager/Shell/res/values-el/strings.xml
+++ b/libs/WindowManager/Shell/res/values-el/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Αλλαγή μεγέθους"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Απόκρυψη"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Κατάργηση απόκρυψης"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Η εφαρμογή ενδέχεται να μην λειτουργεί με διαχωρισμό οθόνης."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Η εφαρμογή δεν υποστηρίζει διαχωρισμό οθόνης."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Η εφαρμογή ενδέχεται να μην λειτουργεί με διαχωρισμό οθόνης."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Η εφαρμογή δεν υποστηρίζει διαχωρισμό οθόνης."</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Αυτή η εφαρμογή μπορεί να ανοιχθεί μόνο σε 1 παράθυρο."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Η εφαρμογή ίσως να μην λειτουργήσει σε δευτερεύουσα οθόνη."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Η εφαρμογή δεν υποστηρίζει την εκκίνηση σε δευτερεύουσες οθόνες."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Διαχωριστικό οθόνης"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Διαχωριστικό οθόνης"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Διαχωριστικό οθόνης"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Διαχωριστικό οθόνης"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Αριστερή πλήρης οθόνη"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Αριστερή 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Αριστερή 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Δεν διορθώθηκε;\nΠατήστε για επαναφορά."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Δεν αντιμετωπίζετε προβλήματα με την κάμερα; Πατήστε για παράβλεψη."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Δείτε και κάντε περισσότερα"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Σύρετε σε μια άλλη εφαρμογή για διαχωρισμό οθόνης"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Σύρετε σε μια άλλη εφαρμογή για διαχωρισμό οθόνης."</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Πατήστε δύο φορές έξω από μια εφαρμογή για να αλλάξετε τη θέση της"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Το κατάλαβα"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Ανάπτυξη για περισσότερες πληροφορίες."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Ακύρωση"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Επανεκκίνηση"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Να μην εμφανιστεί ξανά"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Διπλό πάτημα για μεταφορά αυτής της εφαρμογής"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Μεγιστοποίηση"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Ελαχιστοποίηση"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Κλείσιμο"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Στιγμιότυπο οθόνης"</string>
     <string name="close_text" msgid="4986518933445178928">"Κλείσιμο"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Κλείσιμο μενού"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
index 0a0b30d..3460894 100644
--- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Resize"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Stash"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Unstash"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"App may not work with split-screen."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"App does not support split-screen."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"App may not work with split screen"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"App does not support split screen"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"This app can only be opened in one window."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"App may not work on a secondary display."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"App does not support launch on secondary displays."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Split screen divider"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Split screen divider"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Split screen divider"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Split screen divider"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Left full screen"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Left 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Drag in another app for split-screen"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Expand for more information."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Cancel"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Restart"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Don\'t show again"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Double-tap to move this app"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximise"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimise"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Close"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
     <string name="close_text" msgid="4986518933445178928">"Close"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
index 33f5333..8cba053 100644
--- a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Resize"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Stash"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Unstash"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"App may not work with split-screen."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"App does not support split-screen."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"App may not work with split screen"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"App does not support split screen"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"This app can only be opened in 1 window."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"App may not work on a secondary display."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"App does not support launch on secondary displays."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Split-screen divider"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Split-screen divider"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Split screen divider"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Split screen divider"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Left full screen"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Left 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Drag in another app for split-screen"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Expand for more information."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Cancel"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Restart"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Don’t show again"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Double-tap to move this app"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximize"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimize"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Close"</string>
@@ -109,4 +110,5 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
     <string name="close_text" msgid="4986518933445178928">"Close"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Close Menu"</string>
+    <string name="expand_menu_text" msgid="3847736164494181168">"Open Menu"</string>
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
index 0a0b30d..3460894 100644
--- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Resize"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Stash"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Unstash"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"App may not work with split-screen."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"App does not support split-screen."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"App may not work with split screen"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"App does not support split screen"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"This app can only be opened in one window."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"App may not work on a secondary display."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"App does not support launch on secondary displays."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Split screen divider"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Split screen divider"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Split screen divider"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Split screen divider"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Left full screen"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Left 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Drag in another app for split-screen"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Expand for more information."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Cancel"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Restart"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Don\'t show again"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Double-tap to move this app"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximise"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimise"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Close"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
     <string name="close_text" msgid="4986518933445178928">"Close"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
index 0a0b30d..3460894 100644
--- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Resize"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Stash"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Unstash"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"App may not work with split-screen."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"App does not support split-screen."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"App may not work with split screen"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"App does not support split screen"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"This app can only be opened in one window."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"App may not work on a secondary display."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"App does not support launch on secondary displays."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Split screen divider"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Split screen divider"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Split screen divider"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Split screen divider"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Left full screen"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Left 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Drag in another app for split-screen"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Expand for more information."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Cancel"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Restart"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Don\'t show again"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Double-tap to move this app"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximise"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimise"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Close"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
     <string name="close_text" msgid="4986518933445178928">"Close"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
index 69823f9..696e714 100644
--- a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎‎Resize‎‏‎‎‏‎"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‎‎‎‏‎‏‏‎‏‏‏‎‎‎‏‎Stash‎‏‎‎‏‎"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‏‎‏‎‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‎‏‏‎‏‏‏‎‎‎‎‎‎‎‏‏‏‎‎Unstash‎‏‎‎‏‎"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎App may not work with split-screen.‎‏‎‎‏‎"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‎‏‏‏‎‎‏‎‏‎‏‏‎‎‏‏‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‏‎App does not support split-screen.‎‏‎‎‏‎"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‏‎‏‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‎‏‏‎‎‎‏‎‎‏‏‎‎‎‏‎‎‏‏‏‏‎App may not work with split screen‎‏‎‎‏‎"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‎‏‎‏‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎App does not support split screen‎‏‎‎‏‎"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‎‎‏‎‎‎‏‏‎‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎‎‎‏‏‎‏‏‎‎‎‏‎This app can only be opened in 1 window.‎‏‎‎‏‎"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‏‎‏‏‏‏‎‏‏‏‎‏‏‎‏‏‎‎‎‏‎‎‏‎‎‏‎‎‏‏‏‏‎App may not work on a secondary display.‎‏‎‎‏‎"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‏‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‏‎‏‏‎‎‏‎App does not support launch on secondary displays.‎‏‎‎‏‎"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‎‎‏‎‎‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‏‏‏‎Split-screen divider‎‏‎‎‏‎"</string>
-    <string name="divider_title" msgid="5482989479865361192">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‎‎‎‎Split-screen divider‎‏‎‎‏‎"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‎‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‏‎Split screen divider‎‏‎‎‏‎"</string>
+    <string name="divider_title" msgid="1963391955593749442">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎Split screen divider‎‏‎‎‏‎"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‏‏‎‎‏‏‎‎‎‎Left full screen‎‏‎‎‏‎"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‏‎‎‏‎‏‎‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‏‏‎‎‏‏‎‎‏‎‎Left 70%‎‏‎‎‏‎"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‏‎‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‎‏‏‎‎‏‎Left 50%‎‏‎‎‏‎"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‏‎Didn’t fix it?‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Tap to revert‎‏‎‎‏‎"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‏‏‎‎‏‎‎‎‎‏‎‎‏‎‎‏‎‎‎‏‎‎‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎No camera issues? Tap to dismiss.‎‏‎‎‏‎"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‏‏‏‏‏‏‎‎See and do more‎‏‎‎‏‎"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‏‏‏‎‎‎‎‎‏‏‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‏‎‏‏‎‏‏‏‎‎Drag in another app for split-screen‎‏‎‎‏‎"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‎‎‎‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‎‎‏‏‏‎‎‎‎‏‏‎Drag in another app for split screen‎‏‎‎‏‎"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‎‎‎‏‏‏‎‏‎‏‏‎‎‏‎‏‎‎‎‎‎‎‎‎‎‏‎‎‏‏‎‏‎‏‎Double-tap outside an app to reposition it‎‏‎‎‏‎"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‎‏‎‎‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‎‎‎‏‏‎‏‎‎‏‎Got it‎‏‎‎‏‎"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‏‎‎‎‏‏‎‏‎‏‎‎Expand for more information.‎‏‎‎‏‎"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎‎‎‎‎‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‎‏‎‎‏‎‎‎‎‏‏‎‏‏‎‎‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎‏‎Cancel‎‏‎‎‏‎"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‎‏‏‎‏‏‎‎‎‎‏‎‏‎‏‎‏‏‏‎‏‎Restart‎‏‎‎‏‎"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‎‏‏‎‎‎‎‏‏‏‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‎‎‎‏‎‎Don’t show again‎‏‎‎‏‎"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‏‏‏‏‎‎‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‎‏‏‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‏‎‏‎Double-tap to move this app‎‏‎‎‏‎"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‎‎‏‎‎‏‎‎‎‎‎‎‎‎‎‎‎‎‎‏‎‏‏‎Maximize‎‏‎‎‏‎"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‎‎‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‏‎Minimize‎‏‎‎‏‎"</string>
     <string name="close_button_text" msgid="2913281996024033299">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‎‎‎‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎Close‎‏‎‎‏‎"</string>
@@ -109,4 +110,5 @@
     <string name="screenshot_text" msgid="1477704010087786671">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎Screenshot‎‏‎‎‏‎"</string>
     <string name="close_text" msgid="4986518933445178928">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‏‎‏‏‎‎‎‏‏‎‎‎‎‎Close‎‏‎‎‏‎"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‎‏‏‎‏‏‎‏‎‎‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‎‏‎Close Menu‎‏‎‎‏‎"</string>
+    <string name="expand_menu_text" msgid="3847736164494181168">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎‏‏‎‎‎‎‎Open Menu‎‏‎‎‏‎"</string>
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
index b7b31f4..fff2749 100644
--- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Cambiar el tamaño"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Almacenar de manera segura"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Dejar de almacenar de manera segura"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Es posible que la app no funcione en el modo de pantalla dividida."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"La app no es compatible con la función de pantalla dividida."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Es posible que la app no funcione en el modo de pantalla dividida"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"La app no es compatible con la función de pantalla dividida"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Esta app solo puede estar abierta en 1 ventana."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Es posible que la app no funcione en una pantalla secundaria."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"La app no puede iniciarse en pantallas secundarias."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Divisor de pantalla dividida"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Divisor de pantalla dividida"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Divisor de pantalla dividida"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Divisor de pantalla dividida"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Pantalla izquierda completa"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Izquierda: 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Izquierda: 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se resolvió?\nPresiona para revertir los cambios"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No tienes problemas con la cámara? Presionar para descartar."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Aprovecha más"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Arrastra otra app para el modo de pantalla dividida"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arrastra otra app para el modo de pantalla dividida"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Presiona dos veces fuera de una app para cambiar su ubicación"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendido"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Expande para obtener más información."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Cancelar"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Reiniciar"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"No volver a mostrar"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Presiona dos veces para mover esta app"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximizar"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimizar"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Cerrar"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string>
     <string name="close_text" msgid="4986518933445178928">"Cerrar"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Cerrar menú"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml
index 5ef402c..5fcd12d 100644
--- a/libs/WindowManager/Shell/res/values-es/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Cambiar tamaño"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Esconder"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"No esconder"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Es posible que la aplicación no funcione con la pantalla dividida."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"La aplicación no admite la pantalla dividida."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Puede que la aplicación no funcione con la pantalla dividida"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"La aplicación no es compatible con la pantalla dividida"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Esta aplicación solo puede abrirse en una ventana."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Es posible que la aplicación no funcione en una pantalla secundaria."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"La aplicación no se puede abrir en pantallas secundarias."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Dividir la pantalla"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Divisor de pantalla dividida"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Divisor de pantalla dividida"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Divisor de pantalla dividida"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Pantalla izquierda completa"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Izquierda 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Izquierda 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se ha solucionado?\nToca para revertir"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No hay problemas con la cámara? Toca para cerrar."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Consulta más información y haz más"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Arrastra otra aplicación para activar la pantalla dividida"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arrastra otra aplicación para activar la pantalla dividida"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toca dos veces fuera de una aplicación para cambiarla de posición"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendido"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Mostrar más información"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Cancelar"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Reiniciar"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"No volver a mostrar"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Toca dos veces para mover esta aplicación"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximizar"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimizar"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Cerrar"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string>
     <string name="close_text" msgid="4986518933445178928">"Cerrar"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Cerrar menú"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml
index e083be4..07fd683 100644
--- a/libs/WindowManager/Shell/res/values-et/strings.xml
+++ b/libs/WindowManager/Shell/res/values-et/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Suuruse muutmine"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Pane hoidlasse"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Eemalda hoidlast"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Rakendus ei pruugi poolitatud ekraaniga töötada."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Rakendus ei toeta jagatud ekraani."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Rakendus ei pruugi jagatud ekraanikuvaga töötada."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Rakendus ei toeta jagatud ekraanikuva."</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Selle rakenduse saab avada ainult ühes aknas."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Rakendus ei pruugi teisesel ekraanil töötada."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Rakendus ei toeta teisestel ekraanidel käivitamist."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Ekraanijagaja"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Ekraanijagaja"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Jagatud ekraanikuva jaotur"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Jagatud ekraanikuva jaotur"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Vasak täisekraan"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Vasak: 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vasak: 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Kas probleemi ei lahendatud?\nPuudutage ennistamiseks."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kas kaameraprobleeme pole? Puudutage loobumiseks."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Vaadake ja tehke rohkem"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Lohistage muusse rakendusse, et jagatud ekraanikuva kasutada"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Lohistage muusse rakendusse, et jagatud ekraanikuva kasutada"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Topeltpuudutage rakendusest väljaspool, et selle asendit muuta"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Selge"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Laiendage lisateabe saamiseks."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Tühista"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Taaskäivita"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Ära kuva uuesti"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Rakenduse teisaldamiseks topeltpuudutage"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maksimeeri"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimeeri"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Sule"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Ekraanipilt"</string>
     <string name="close_text" msgid="4986518933445178928">"Sule"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Sule menüü"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml
index e0922e4..be972d9 100644
--- a/libs/WindowManager/Shell/res/values-eu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-eu/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Aldatu tamaina"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Gorde"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Ez gorde"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Baliteke aplikazioak ez funtzionatzea pantaila zatituan."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikazioak ez du onartzen pantaila zatitua"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Baliteke aplikazioak ez funtzionatzea pantaila zatituan"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Aplikazioak ez du onartzen pantaila zatitua"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Leiho bakar batean ireki daiteke aplikazioa."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Baliteke aplikazioak ez funtzionatzea bigarren mailako pantailetan."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikazioa ezin da abiarazi bigarren mailako pantailatan."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Pantaila-zatitzailea"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Pantaila-zatitzailea"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Pantaila-zatitzailea"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Pantaila-zatitzailea"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ezarri ezkerraldea pantaila osoan"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Ezarri ezkerraldea % 70en"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ezarri ezkerraldea % 50en"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ez al da konpondu?\nLeheneratzeko, sakatu hau."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ez daukazu arazorik kamerarekin? Baztertzeko, sakatu hau."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Ikusi eta egin gauza gehiago"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Pantaila zatituta ikusteko, arrastatu beste aplikazio bat"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Pantaila zatitua ikusteko, arrastatu beste aplikazio bat"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Aplikazioaren posizioa aldatzeko, sakatu birritan haren kanpoaldea"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Ados"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Informazio gehiago lortzeko, zabaldu hau."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Utzi"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Berrabiarazi"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Ez erakutsi berriro"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Sakatu birritan aplikazioa mugitzeko"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximizatu"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimizatu"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Itxi"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Pantaila-argazkia"</string>
     <string name="close_text" msgid="4986518933445178928">"Itxi"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Itxi menua"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml
index e847f6e..26f5fcf 100644
--- a/libs/WindowManager/Shell/res/values-fa/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fa/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"تغییر اندازه"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"مخفی‌سازی"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"لغو مخفی‌سازی"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"ممکن است برنامه با «صفحهٔ دونیمه» کار نکند."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"برنامه از تقسیم صفحه پشتیبانی نمی‌کند."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"ممکن است برنامه با صفحهٔ دونیمه کار نکند"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"برنامه از صفحهٔ دونیمه پشتیبانی نمی‌کند"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"این برنامه فقط در ۱ پنجره می‌تواند باز شود."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ممکن است برنامه در نمایشگر ثانویه کار نکند."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"برنامه از راه‌اندازی در نمایشگرهای ثانویه پشتیبانی نمی‌کند."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"تقسیم‌کننده صفحه"</string>
-    <string name="divider_title" msgid="5482989479865361192">"تقسیم‌کننده صفحهٔ دونیمه"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"تقسیم‌کننده صفحهٔ دونیمه"</string>
+    <string name="divider_title" msgid="1963391955593749442">"تقسیم‌کننده صفحهٔ دونیمه"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"تمام‌صفحه چپ"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"٪۷۰ چپ"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"٪۵۰ چپ"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"مشکل برطرف نشد؟\nبرای برگرداندن ضربه بزنید"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"دوربین مشکلی ندارد؟ برای بستن ضربه بزنید."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"از چندین برنامه به‌طور هم‌زمان استفاده کنید"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"برای حالت صفحهٔ دونیمه، در برنامه‌ای دیگر بکشید"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"برای حالت صفحهٔ دونیمه، در برنامه‌ای دیگر بکشید"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"برای جابه‌جا کردن برنامه، بیرون از آن دوضربه بزنید"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"متوجه‌ام"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"برای اطلاعات بیشتر، گسترده کنید."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"لغو کردن"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"بازراه‌اندازی"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"دوباره نشان داده نشود"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"برای جابه‌جایی این برنامه، دوضربه بزنید"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"بزرگ کردن"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"کوچک کردن"</string>
     <string name="close_button_text" msgid="2913281996024033299">"بستن"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"نماگرفت"</string>
     <string name="close_text" msgid="4986518933445178928">"بستن"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"بستن منو"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml
index 14b3556..5686d9a 100644
--- a/libs/WindowManager/Shell/res/values-fi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fi/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Muuta kokoa"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Lisää turvasäilytykseen"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Poista turvasäilytyksestä"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Sovellus ei ehkä toimi jaetulla näytöllä."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Sovellus ei tue jaetun näytön tilaa."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Sovellus ei ehkä toimi jaetulla näytöllä"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Sovellus ei tue jaetun näytön tilaa"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Tämän sovelluksen voi avata vain yhdessä ikkunassa."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Sovellus ei ehkä toimi toissijaisella näytöllä."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Sovellus ei tue käynnistämistä toissijaisilla näytöillä."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Näytön jakaja"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Näytönjakaja"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Näytönjakaja"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Näytönjakaja"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Vasen koko näytölle"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Vasen 70 %"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vasen 50 %"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Siirrä oikeaan alareunaan"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>: asetukset"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ohita kupla"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"Älä näytä puhekuplia"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Älä näytä kuplia keskusteluista"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chattaile kuplien avulla"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"Uudet keskustelut näkyvät kelluvina kuvakkeina tai kuplina. Avaa kupla napauttamalla. Siirrä sitä vetämällä."</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Eikö ongelma ratkennut?\nKumoa napauttamalla"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ei ongelmia kameran kanssa? Hylkää napauttamalla."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Näe ja tee enemmän"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Käytä jaettua näyttöä vetämällä tähän toinen sovellus"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Käytä jaettua näyttöä vetämällä tähän toinen sovellus"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Kaksoisnapauta sovelluksen ulkopuolella, jos haluat siirtää sitä"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Katso lisätietoja laajentamalla."</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Peru"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Käynnistä uudelleen"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Älä näytä uudelleen"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Siirrä sovellus kaksoisnapauttamalla"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Suurenna"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Pienennä"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Sulje"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Kuvakaappaus"</string>
     <string name="close_text" msgid="4986518933445178928">"Sulje"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Sulje valikko"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
index df3e345..2788de6 100644
--- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
@@ -32,13 +32,17 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Redimensionner"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Ajouter à la réserve"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Retirer de la réserve"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Il est possible que l\'application ne fonctionne pas en mode Écran partagé."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"L\'application n\'est pas compatible avec l\'écran partagé."</string>
+    <!-- no translation found for dock_forced_resizable (7429086980048964687) -->
+    <skip />
+    <!-- no translation found for dock_non_resizeble_failed_to_dock_text (2733543750291266047) -->
+    <skip />
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Cette application ne peut être ouverte que dans une fenêtre."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Il est possible que l\'application ne fonctionne pas sur un écran secondaire."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"L\'application ne peut pas être lancée sur des écrans secondaires."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Séparateur d\'écran partagé"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Séparateur d\'écran partagé"</string>
+    <!-- no translation found for accessibility_divider (6407584574218956849) -->
+    <skip />
+    <!-- no translation found for divider_title (1963391955593749442) -->
+    <skip />
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Plein écran à la gauche"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70 % à la gauche"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % à la gauche"</string>
@@ -68,8 +72,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Déplacer dans coin inf. droit"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"Paramètres <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ignorer la bulle"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"Ne pas afficher de bulles"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ne pas afficher les conversations dans des bulles"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"Clavarder en utilisant des bulles"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"Les nouvelles conversations s\'affichent sous forme d\'icônes flottantes (de bulles). Touchez une bulle pour l\'ouvrir. Faites-la glisser pour la déplacer."</string>
@@ -86,7 +89,8 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu?\nTouchez pour rétablir"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo? Touchez pour ignorer."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Voir et en faire plus"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Faites glisser une autre application pour utiliser l\'écran partagé"</string>
+    <!-- no translation found for letterbox_education_split_screen_text (449233070804658627) -->
+    <skip />
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Touchez deux fois à côté d\'une application pour la repositionner"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Développer pour en savoir plus."</string>
@@ -95,6 +99,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Annuler"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Redémarrer"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Ne plus afficher"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Toucher deux fois pour déplacer cette application"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Agrandir"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Réduire"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Fermer"</string>
@@ -110,4 +115,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Capture d\'écran"</string>
     <string name="close_text" msgid="4986518933445178928">"Fermer"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Fermer le menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml
index c86711e..6e1a583 100644
--- a/libs/WindowManager/Shell/res/values-fr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Redimensionner"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Stash"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Unstash"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Il est possible que l\'application ne fonctionne pas en mode Écran partagé."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Application incompatible avec l\'écran partagé."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"L\'appli peut ne pas fonctionner en mode Écran partagé"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Appli incompatible avec l\'écran partagé"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Cette appli ne peut être ouverte que dans 1 fenêtre."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Il est possible que l\'application ne fonctionne pas sur un écran secondaire."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"L\'application ne peut pas être lancée sur des écrans secondaires."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Séparateur d\'écran partagé"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Séparateur d\'écran partagé"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Séparateur d\'écran partagé"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Séparateur d\'écran partagé"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Écran de gauche en plein écran"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Écran de gauche à 70 %"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Écran de gauche à 50 %"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu ?\nAppuyez pour rétablir"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo ? Appuyez pour ignorer."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Voir et interagir plus"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Faites glisser une autre appli pour utiliser l\'écran partagé"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Faites glisser une autre appli pour utiliser l\'écran partagé"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Appuyez deux fois en dehors d\'une appli pour la repositionner"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Développez pour obtenir plus d\'informations"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Annuler"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Redémarrer"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Ne plus afficher"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Appuyez deux fois pour déplacer cette appli"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Agrandir"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Réduire"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Fermer"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Capture d\'écran"</string>
     <string name="close_text" msgid="4986518933445178928">"Fermer"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Fermer le menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml
index a63930d..aaaf3bd 100644
--- a/libs/WindowManager/Shell/res/values-gl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gl/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Cambiar tamaño"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Esconder"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Non esconder"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Pode que a aplicación non funcione coa pantalla dividida."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"A aplicación non é compatible coa función de pantalla dividida."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"É posible que a aplicación non funcione coa pantalla dividida"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"A aplicación non admite a función de pantalla dividida"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Esta aplicación só se pode abrir en 1 ventá."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"É posible que a aplicación non funcione nunha pantalla secundaria."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"A aplicación non se pode iniciar en pantallas secundarias."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Divisor de pantalla dividida"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Divisor de pantalla dividida"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Divisor de pantalla dividida"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Divisor de pantalla dividida"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Pantalla completa á esquerda"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70 % á esquerda"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % á esquerda"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Mover á parte inferior dereita"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"Configuración de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ignorar burbulla"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"Non mostrar burbullas"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Non mostrar a conversa como burbulla"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatear usando burbullas"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"As conversas novas aparecen como iconas flotantes ou burbullas. Toca para abrir a burbulla e arrastra para movela."</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Non se solucionaron os problemas?\nToca para reverter o seu tratamento"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Non hai problemas coa cámara? Tocar para ignorar."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Ver e facer máis"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Arrastra outra aplicación para usar a pantalla dividida"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arrastra outra aplicación para usar a pantalla dividida"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toca dúas veces fóra da aplicación para cambiala de posición"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendido"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Despregar para obter máis información."</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Cancelar"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Reiniciar"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Non mostrar outra vez"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Toca dúas veces para mover esta aplicación"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximizar"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimizar"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Pechar"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string>
     <string name="close_text" msgid="4986518933445178928">"Pechar"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Pechar o menú"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml
index 8de29c1..ee5a335 100644
--- a/libs/WindowManager/Shell/res/values-gu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gu/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"કદ બદલો"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"છુપાવો"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"બતાવો"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"વિભાજિત-સ્ક્રીન સાથે ઍપ કદાચ કામ ન કરે."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ઍપ્લિકેશન સ્ક્રીન-વિભાજનનું સમર્થન કરતી નથી."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"વિભાજિત સ્ક્રીન સાથે ઍપ કદાચ કામ ન કરે"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"ઍપ વિભાજિત સ્ક્રીનને સપોર્ટ કરતી નથી"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"આ ઍપ માત્ર 1 વિન્ડોમાં ખોલી શકાય છે."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ઍપ્લિકેશન ગૌણ ડિસ્પ્લે પર કદાચ કામ ન કરે."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ઍપ્લિકેશન ગૌણ ડિસ્પ્લે પર લૉન્ચનું સમર્થન કરતી નથી."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"સ્પ્લિટ-સ્ક્રીન વિભાજક"</string>
-    <string name="divider_title" msgid="5482989479865361192">"સ્ક્રીનને વિભાજિત કરતું વિભાજક"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"સ્ક્રીનને વિભાજિત કરતું વિભાજક"</string>
+    <string name="divider_title" msgid="1963391955593749442">"સ્ક્રીનને વિભાજિત કરતું વિભાજક"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ડાબી પૂર્ણ સ્ક્રીન"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ડાબે 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ડાબે 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"સુધારો નથી થયો?\nપહેલાંના પર પાછું ફેરવવા માટે ટૅપ કરો"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"કૅમેરામાં કોઈ સમસ્યા નથી? છોડી દેવા માટે ટૅપ કરો."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"જુઓ અને બીજું ઘણું કરો"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"સ્ક્રીન વિભાજન માટે કોઈ અન્ય ઍપમાં ખેંચો"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"વિભાજિત સ્ક્રીન માટે કોઈ અન્ય ઍપમાં ખેંચો"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"કોઈ ઍપની જગ્યા બદલવા માટે, તેની બહાર બે વાર ટૅપ કરો"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"સમજાઈ ગયું"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"વધુ માહિતી માટે મોટું કરો."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"રદ કરો"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"ફરી શરૂ કરો"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"ફરીથી બતાવશો નહીં"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"આ ઍપને ખસેડવા માટે બે વાર ટૅપ કરો"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"મોટું કરો"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"નાનું કરો"</string>
     <string name="close_button_text" msgid="2913281996024033299">"બંધ કરો"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"સ્ક્રીનશૉટ"</string>
     <string name="close_text" msgid="4986518933445178928">"બંધ કરો"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"મેનૂ બંધ કરો"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml
index d71824f..258862a 100644
--- a/libs/WindowManager/Shell/res/values-hi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hi/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"आकार बदलें"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"छिपाएं"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"दिखाएं"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"ऐप्लिकेशन शायद स्प्लिट स्क्रीन मोड में काम न करे."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ऐप विभाजित स्‍क्रीन का समर्थन नहीं करता है."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"मुमकिन है कि ऐप्लिकेशन, स्प्लिट स्क्रीन मोड में काम न करे"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"यह ऐप्लिकेशन, स्प्लिट स्क्रीन मोड पर काम नहीं करता"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"इस ऐप्लिकेशन को सिर्फ़ एक विंडो में खोला जा सकता है."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"हो सकता है कि ऐप प्राइमरी (मुख्य) डिस्प्ले के अलावा बाकी दूसरे डिस्प्ले पर काम न करे."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"प्राइमरी (मुख्य) डिस्प्ले के अलावा बाकी दूसरे डिस्प्ले पर ऐप लॉन्च नहीं किया जा सकता."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"विभाजित स्क्रीन विभाजक"</string>
-    <string name="divider_title" msgid="5482989479865361192">"स्प्लिट स्क्रीन डिवाइडर"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"स्प्लिट स्क्रीन डिवाइडर मोड"</string>
+    <string name="divider_title" msgid="1963391955593749442">"स्प्लिट स्क्रीन डिवाइडर मोड"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"बाईं स्क्रीन को फ़ुल स्क्रीन बनाएं"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"बाईं स्क्रीन को 70% बनाएं"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"बाईं स्क्रीन को 50% बनाएं"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"क्या समस्या ठीक नहीं हुई?\nपहले जैसा करने के लिए टैप करें"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्या कैमरे से जुड़ी कोई समस्या नहीं है? खारिज करने के लिए टैप करें."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"पूरी जानकारी लेकर, बेहतर तरीके से काम करें"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"स्प्लिट स्क्रीन के लिए, दूसरे ऐप्लिकेशन को खींचें और छोड़ें"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"स्प्लिट स्क्रीन का इस्तेमाल करने के लिए, किसी अन्य ऐप्लिकेशन को खींचें और छोड़ें"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"किसी ऐप्लिकेशन की जगह बदलने के लिए, उसके बाहर दो बार टैप करें"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"ठीक है"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"ज़्यादा जानकारी के लिए बड़ा करें."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"रद्द करें"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"रीस्टार्ट करें"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"फिर से न दिखाएं"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"ऐप्लिकेशन की जगह बदलने के लिए दो बार टैप करें"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"बड़ा करें"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"विंडो छोटी करें"</string>
     <string name="close_button_text" msgid="2913281996024033299">"बंद करें"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"स्क्रीनशॉट"</string>
     <string name="close_text" msgid="4986518933445178928">"बंद करें"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"मेन्यू बंद करें"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-hi/strings_tv.xml b/libs/WindowManager/Shell/res/values-hi/strings_tv.xml
index 595435b..e2f272c 100644
--- a/libs/WindowManager/Shell/res/values-hi/strings_tv.xml
+++ b/libs/WindowManager/Shell/res/values-hi/strings_tv.xml
@@ -18,7 +18,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="notification_channel_tv_pip" msgid="2576686079160402435">"पिक्चर में पिक्चर"</string>
-    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(कोई शीर्षक कार्यक्रम नहीं)"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(कोई टाइटल कार्यक्रम नहीं)"</string>
     <string name="pip_close" msgid="2955969519031223530">"बंद करें"</string>
     <string name="pip_fullscreen" msgid="7278047353591302554">"फ़ुल स्‍क्रीन"</string>
     <string name="pip_move" msgid="158770205886688553">"ले जाएं"</string>
diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml
index de4cac2..21fdf5d 100644
--- a/libs/WindowManager/Shell/res/values-hr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hr/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Promjena veličine"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Sakrijte"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Poništite sakrivanje"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacija možda neće funkcionirati s podijeljenim zaslonom."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacija ne podržava podijeljeni zaslon."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Aplikacija možda neće funkcionirati s podijeljenim zaslonom"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Aplikacija ne podržava podijeljeni zaslon"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Ova se aplikacija može otvoriti samo u jednom prozoru."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacija možda neće funkcionirati na sekundarnom zaslonu."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacija ne podržava pokretanje na sekundarnim zaslonima."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Razdjelnik podijeljenog zaslona"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Razdjelnik podijeljenog zaslona"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Razdjelnik podijeljenog zaslona"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Razdjelnik podijeljenog zaslona"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Lijevi zaslon u cijeli zaslon"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Lijevi zaslon na 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Lijevi zaslon na 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije riješen?\nDodirnite za vraćanje"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema s fotoaparatom? Dodirnite za odbacivanje."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Gledajte i učinite više"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Povucite drugu aplikaciju unutra da biste podijelili zaslon"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Povucite drugu aplikaciju unutra da biste podijelili zaslon"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvaput dodirnite izvan aplikacije da biste je premjestili"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Shvaćam"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Proširite da biste saznali više."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Odustani"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Pokreni ponovno"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Ne prikazuj ponovno"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Dvaput dodirnite da biste premjestili ovu aplikaciju"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maksimiziraj"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimiziraj"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Zatvori"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Snimka zaslona"</string>
     <string name="close_text" msgid="4986518933445178928">"Zatvorite"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvorite izbornik"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml
index 667464f..a0928d3 100644
--- a/libs/WindowManager/Shell/res/values-hu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hu/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Átméretezés"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Félretevés"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Félretevés megszüntetése"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Lehet, hogy az alkalmazás nem működik osztott képernyős nézetben."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Az alkalmazás nem támogatja az osztott képernyős nézetet."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Lehet, hogy az alkalmazás nem működik osztott képernyős nézetben"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Az alkalmazás nem támogatja az osztott képernyőt"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Ez az alkalmazás csak egy ablakban nyitható meg."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Előfordulhat, hogy az alkalmazás nem működik másodlagos kijelzőn."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Az alkalmazást nem lehet másodlagos kijelzőn elindítani."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Elválasztó az osztott nézetben"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Elválasztó az osztott nézetben"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Elválasztó az osztott képernyős nézetben"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Elválasztó az osztott képernyős nézetben"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Bal oldali teljes képernyőre"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Bal oldali 70%-ra"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Bal oldali 50%-ra"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nem sikerült a hiba kijavítása?\nKoppintson a visszaállításhoz."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nincsenek problémái kamerával? Koppintson az elvetéshez."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Több mindent láthat és tehet"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Húzzon ide egy másik alkalmazást az osztott képernyő használatához"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Húzzon ide egy másik alkalmazást az osztott képernyő használatához"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Koppintson duplán az alkalmazáson kívül az áthelyezéséhez"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Értem"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Kibontással további információkhoz juthat."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Mégse"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Újraindítás"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Ne jelenjen meg többé"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Koppintson duplán az alkalmazás áthelyezéséhez"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Teljes méret"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Kis méret"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Bezárás"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Képernyőkép"</string>
     <string name="close_text" msgid="4986518933445178928">"Bezárás"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Menü bezárása"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml
index 4ea668c..f5c2e4b 100644
--- a/libs/WindowManager/Shell/res/values-hy/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hy/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Փոխել չափը"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Թաքցնել"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Ցուցադրել"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Հավելվածը չի կարող աշխատել տրոհված էկրանի ռեժիմում։"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Հավելվածը չի աջակցում էկրանի տրոհումը:"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Հավելվածը չի կարող աշխատել տրոհված էկրանի ռեժիմում"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Հավելվածը չի աջակցում էկրանի տրոհումը"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Այս հավելվածը հնարավոր է բացել միայն մեկ պատուհանում։"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Հավելվածը կարող է չաշխատել լրացուցիչ էկրանի վրա"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Հավելվածը չի աջակցում գործարկումը լրացուցիչ էկրանների վրա"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Տրոհված էկրանի բաժանիչ"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Տրոհված էկրանի բաժանիչ"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Տրոհված էկրանի բաժանիչ"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Տրոհված էկրանի բաժանիչ"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ձախ էկրանը՝ լիաէկրան"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Ձախ էկրանը՝ 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ձախ էկրանը՝ 50%"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Տեղափոխել ներքև՝ աջ"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> – կարգավորումներ"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"Փակել ամպիկը"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"Ցույց չտալ ամպիկները"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Զրույցը չցուցադրել ամպիկի տեսքով"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"Զրույցի ամպիկներ"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"Նոր զրույցները կհայտնվեն լողացող պատկերակների կամ ամպիկների տեսքով։ Հպեք՝ ամպիկը բացելու համար։ Քաշեք՝ այն տեղափոխելու համար։"</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Չհաջողվե՞ց շտկել։\nՀպեք՝ փոփոխությունները չեղարկելու համար։"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Տեսախցիկի հետ կապված խնդիրներ չկա՞ն։ Փակելու համար հպեք։"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Միաժամանակ կատարեք մի քանի առաջադրանք"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Քաշեք մյուս հավելվածի մեջ՝ էկրանի տրոհումն օգտագործելու համար"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Քաշեք մյուս հավելվածի մեջ՝ էկրանի տրոհումն օգտագործելու համար"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Կրկնակի հպեք հավելվածի կողքին՝ այն տեղափոխելու համար"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Եղավ"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Ծավալեք՝ ավելին իմանալու համար։"</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Չեղարկել"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Վերագործարկել"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Այլևս ցույց չտալ"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Կրկնակի հպեք՝ հավելվածը տեղափոխելու համար"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Ծավալել"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Ծալել"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Փակել"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Սքրինշոթ"</string>
     <string name="close_text" msgid="4986518933445178928">"Փակել"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Փակել ընտրացանկը"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml
index 8cd0bc5..3a7d4b3 100644
--- a/libs/WindowManager/Shell/res/values-in/strings.xml
+++ b/libs/WindowManager/Shell/res/values-in/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ubah ukuran"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Stash"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Batalkan stash"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikasi mungkin tidak berfungsi dengan layar terpisah."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"App tidak mendukung layar terpisah."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Aplikasi mungkin tidak berfungsi dengan layar terpisah"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Aplikasi tidak mendukung layar terpisah"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Aplikasi ini hanya dapat dibuka di 1 jendela."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikasi mungkin tidak berfungsi pada layar sekunder."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikasi tidak mendukung peluncuran pada layar sekunder."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Pembagi layar terpisah"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Pembagi layar terpisah"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Pembagi layar terpisah"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Pembagi layar terpisah"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Layar penuh di kiri"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Kiri 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kiri 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tidak dapat diperbaiki?\nKetuk untuk mengembalikan"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tidak ada masalah kamera? Ketuk untuk menutup."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Lihat dan lakukan lebih banyak hal"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Tarik aplikasi lain untuk menggunakan layar terpisah"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Tarik aplikasi lain untuk menggunakan layar terpisah"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Ketuk dua kali di luar aplikasi untuk mengubah posisinya"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Oke"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Luaskan untuk melihat informasi selengkapnya."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Batal"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Mulai ulang"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Jangan tampilkan lagi"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Ketuk dua kali untuk memindahkan aplikasi ini"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maksimalkan"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimalkan"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Tutup"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
     <string name="close_text" msgid="4986518933445178928">"Tutup"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Tutup Menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml
index ae5e182..f745305 100644
--- a/libs/WindowManager/Shell/res/values-is/strings.xml
+++ b/libs/WindowManager/Shell/res/values-is/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Breyta stærð"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Geymsla"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Taka úr geymslu"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Hugsanlega virkar forritið ekki með skjáskiptingu."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Forritið styður ekki að skjánum sé skipt."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Forritið virkar hugsanlega ekki með skjáskiptingu"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Forritið styður ekki skjáskiptingu"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Aðeins er hægt að opna þetta forrit í 1 glugga."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Hugsanlegt er að forritið virki ekki á öðrum skjá."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Forrit styður ekki opnun á öðrum skjá."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Skjáskipting"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Skjáskipting"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Skilrúm skjáskiptingar"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Skilrúm skjáskiptingar"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Vinstri á öllum skjánum"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Vinstri 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vinstri 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ennþá vesen?\nÝttu til að afturkalla"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ekkert myndavélavesen? Ýttu til að hunsa."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Sjáðu og gerðu meira"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Dragðu annað forrit inn til að nota skjáskiptingu"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Dragðu annað forrit inn til að nota skjáskiptingu"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Ýttu tvisvar utan við forrit til að færa það"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Ég skil"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Stækka til að sjá frekari upplýsingar."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Hætta við"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Endurræsa"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Ekki sýna þetta aftur"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Ýttu tvisvar til að færa þetta forrit"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Stækka"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minnka"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Loka"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Skjámynd"</string>
     <string name="close_text" msgid="4986518933445178928">"Loka"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Loka valmynd"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml
index 3755116..f1edced 100644
--- a/libs/WindowManager/Shell/res/values-it/strings.xml
+++ b/libs/WindowManager/Shell/res/values-it/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ridimensiona"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Accantona"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Annulla accantonamento"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"L\'app potrebbe non funzionare con lo schermo diviso."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"L\'app non supporta la modalità Schermo diviso."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"L\'app potrebbe non funzionare con lo schermo diviso"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"L\'app non supporta la modalità schermo diviso"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Questa app può essere aperta soltanto in 1 finestra."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"L\'app potrebbe non funzionare su un display secondario."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"L\'app non supporta l\'avvio su display secondari."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Strumento per schermo diviso"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Strumento per schermo diviso"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Strumento per schermo diviso"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Strumento per schermo diviso"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Schermata sinistra a schermo intero"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Schermata sinistra al 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Schermata sinistra al 50%"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Sposta in basso a destra"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"Impostazioni <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ignora bolla"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"Non mostrare i fumetti"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Non mettere la conversazione nella bolla"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatta utilizzando le bolle"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"Le nuove conversazioni vengono mostrate come icone mobili o bolle. Tocca per aprire la bolla. Trascinala per spostarla."</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Il problema non si è risolto?\nTocca per ripristinare"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nessun problema con la fotocamera? Tocca per ignorare."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Visualizza più contenuti e fai di più"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Trascina in un\'altra app per usare lo schermo diviso"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Trascina in un\'altra app per usare lo schermo diviso"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Tocca due volte fuori da un\'app per riposizionarla"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Espandi per avere ulteriori informazioni."</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Annulla"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Riavvia"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Non mostrare più"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Tocca due volte per spostare questa app"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Ingrandisci"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Riduci a icona"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Chiudi"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
     <string name="close_text" msgid="4986518933445178928">"Chiudi"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Chiudi il menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml
index 9963ace..d07c91f 100644
--- a/libs/WindowManager/Shell/res/values-iw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-iw/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"שינוי גודל"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"הסתרה זמנית"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"ביטול ההסתרה הזמנית"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"ייתכן שהאפליקציה לא תפעל במסך מפוצל."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"האפליקציה אינה תומכת במסך מפוצל."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"יכול להיות שהאפליקציה לא תפעל עם מסך מפוצל"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"האפליקציה לא תומכת במסך מפוצל"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"ניתן לפתוח את האפליקציה הזו רק בחלון אחד."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ייתכן שהאפליקציה לא תפעל במסך משני."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"האפליקציה אינה תומכת בהפעלה במסכים משניים."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"מחלק מסך מפוצל"</string>
-    <string name="divider_title" msgid="5482989479865361192">"מחלק מסך מפוצל"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"מחלק מסך מפוצל"</string>
+    <string name="divider_title" msgid="1963391955593749442">"מחלק מסך מפוצל"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"מסך שמאלי מלא"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"שמאלה 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"שמאלה 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"הבעיה לא נפתרה?\nאפשר להקיש כדי לחזור לגרסה הקודמת"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"אין בעיות במצלמה? אפשר להקיש כדי לסגור."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"רוצה לראות ולעשות יותר?"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"צריך לגרור אפליקציה אחרת כדי להשתמש במסך מפוצל"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"צריך לגרור אפליקציה אחרת כדי להשתמש במסך המפוצל"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"צריך להקיש הקשה כפולה מחוץ לאפליקציה כדי למקם אותה מחדש"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"הבנתי"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"מרחיבים כדי לקבל מידע נוסף."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"ביטול"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"הפעלה מחדש"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"אין צורך להציג את זה שוב"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"אפשר להקיש הקשה כפולה כדי להזיז את האפליקציה הזו"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"הגדלה"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"מזעור"</string>
     <string name="close_button_text" msgid="2913281996024033299">"סגירה"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"צילום מסך"</string>
     <string name="close_text" msgid="4986518933445178928">"סגירה"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"סגירת התפריט"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml
index b7c30a3..ea42aa5 100644
--- a/libs/WindowManager/Shell/res/values-ja/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ja/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"サイズ変更"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"非表示"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"表示"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"アプリは分割画面では動作しないことがあります。"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"アプリで分割画面がサポートされていません。"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"アプリは分割画面では動作しないことがあります"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"アプリで分割画面がサポートされていません"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"このアプリはウィンドウが 1 つの場合のみ開くことができます。"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"アプリはセカンダリ ディスプレイでは動作しないことがあります。"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"アプリはセカンダリ ディスプレイでの起動に対応していません。"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"分割画面の分割線"</string>
-    <string name="divider_title" msgid="5482989479865361192">"分割画面の分割線"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"分割画面の分割線"</string>
+    <string name="divider_title" msgid="1963391955593749442">"分割画面の分割線"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"左全画面"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"左 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"左 50%"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"右下に移動"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> の設定"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"バブルを閉じる"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"バブルで表示しない"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"会話をバブルで表示しない"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"チャットでバブルを使う"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"新しい会話はフローティング アイコン(バブル)として表示されます。タップするとバブルが開きます。ドラッグしてバブルを移動できます。"</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"修正されなかった場合は、\nタップすると元に戻ります"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"カメラに関する問題でない場合は、タップすると閉じます。"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"表示を拡大して機能を強化"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"分割画面にするにはもう 1 つのアプリをドラッグしてください"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"分割画面にするにはもう 1 つのアプリをドラッグしてください"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"位置を変えるにはアプリの外側をダブルタップしてください"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"開くと詳細が表示されます。"</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"キャンセル"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"再起動"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"次回から表示しない"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"ダブルタップすると、このアプリを移動できます"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"最大化"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"最小化"</string>
     <string name="close_button_text" msgid="2913281996024033299">"閉じる"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"スクリーンショット"</string>
     <string name="close_text" msgid="4986518933445178928">"閉じる"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"メニューを閉じる"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml
index 02cf02f..16ba1aa 100644
--- a/libs/WindowManager/Shell/res/values-ka/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ka/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ზომის შეცვლა"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"გადანახვა"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"გადანახვის გაუქმება"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"აპმა შეიძლება არ იმუშაოს გაყოფილი ეკრანის რეჟიმში."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ეკრანის გაყოფა არ არის მხარდაჭერილი აპის მიერ."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"აპმა შეიძლება არ იმუშაოს გაყოფილი ეკრანის რეჟიმში"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"ეკრანის გაყოფა არ არის მხარდაჭერილი აპის მიერ"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"ამ აპის გახსნა შესაძლებელია მხოლოდ 1 ფანჯარაში."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"აპმა შეიძლება არ იმუშაოს მეორეულ ეკრანზე."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"აპს არ გააჩნია მეორეული ეკრანის მხარდაჭერა."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"გაყოფილი ეკრანის რეჟიმის გამყოფი"</string>
-    <string name="divider_title" msgid="5482989479865361192">"ეკრანის გაყოფის გამყოფი"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"ეკრანის გაყოფის გამყოფი"</string>
+    <string name="divider_title" msgid="1963391955593749442">"ეკრანის გაყოფის გამყოფი"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"მარცხენა ნაწილის სრულ ეკრანზე გაშლა"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"მარცხენა ეკრანი — 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"მარცხენა ეკრანი — 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"არ გამოსწორდა?\nშეეხეთ წინა ვერსიის დასაბრუნებლად"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"კამერას პრობლემები არ აქვს? შეეხეთ უარყოფისთვის."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"მეტის ნახვა და გაკეთება"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"ეკრანის გასაყოფად ჩავლებით გადაიტანეთ სხვა აპში"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ეკრანის გასაყოფად ჩავლებით გადაიტანეთ სხვა აპში"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ორმაგად შეეხეთ აპის გარშემო სივრცეს, რათა ის სხვაგან გადაიტანოთ"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"გასაგებია"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"დამატებითი ინფორმაციისთვის გააფართოეთ."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"გაუქმება"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"გადატვირთვა"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"აღარ გამოჩნდეს"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"ამ აპის გადასატანად ორმაგად შეეხეთ მას"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"მაქსიმალურად გაშლა"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"ჩაკეცვა"</string>
     <string name="close_button_text" msgid="2913281996024033299">"დახურვა"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"ეკრანის ანაბეჭდი"</string>
     <string name="close_text" msgid="4986518933445178928">"დახურვა"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"მენიუს დახურვა"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml
index b60c231..f42cdc3 100644
--- a/libs/WindowManager/Shell/res/values-kk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kk/strings.xml
@@ -32,13 +32,17 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Өлшемін өзгерту"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Жасыру"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Көрсету"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Қолданба экранды бөлу режимінде жұмыс істемеуі мүмкін."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Қодланба бөлінген экранды қолдамайды."</string>
+    <!-- no translation found for dock_forced_resizable (7429086980048964687) -->
+    <skip />
+    <!-- no translation found for dock_non_resizeble_failed_to_dock_text (2733543750291266047) -->
+    <skip />
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Бұл қолданбаны тек 1 терезеден ашуға болады."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Қолданба қосымша дисплейде жұмыс істемеуі мүмкін."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Қолданба қосымша дисплейлерде іске қосуды қолдамайды."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Бөлінген экран бөлгіші"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Бөлінген экран бөлгіші"</string>
+    <!-- no translation found for accessibility_divider (6407584574218956849) -->
+    <skip />
+    <!-- no translation found for divider_title (1963391955593749442) -->
+    <skip />
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Сол жағын толық экранға шығару"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70% сол жақта"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% сол жақта"</string>
@@ -85,7 +89,8 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Жөнделмеді ме?\nҚайтару үшін түртіңіз."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада қателер шықпады ма? Жабу үшін түртіңіз."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Қосымша ақпаратты қарап, әрекеттер жасау"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Экранды бөлу үшін басқа қолданбаға сүйреңіз."</string>
+    <!-- no translation found for letterbox_education_split_screen_text (449233070804658627) -->
+    <skip />
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Қолданбаның орнын өзгерту үшін одан тыс жерді екі рет түртіңіз."</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Түсінікті"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Толығырақ ақпарат алу үшін терезені жайыңыз."</string>
@@ -94,6 +99,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Бас тарту"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Өшіріп қосу"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Қайта көрсетілмесін"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Бұл қолданбаны басқа орынға жылжыту үшін екі рет түртіңіз."</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Жаю"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Кішірейту"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Жабу"</string>
@@ -109,4 +115,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Скриншот"</string>
     <string name="close_text" msgid="4986518933445178928">"Жабу"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Мәзірді жабу"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml
index 29ff6c3..be5047ea 100644
--- a/libs/WindowManager/Shell/res/values-km/strings.xml
+++ b/libs/WindowManager/Shell/res/values-km/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ប្ដូរ​ទំហំ"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"លាក់ជាបណ្ដោះអាសន្ន"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"ឈប់លាក់ជាបណ្ដោះអាសន្ន"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"កម្មវិធី​អាចនឹងមិន​ដំណើរការ​ជាមួយ​មុខងារបំបែកអេក្រង់​ទេ។"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"កម្មវិធីមិនគាំទ្រអេក្រង់បំបែកជាពីរទេ"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"កម្មវិធី​អាចមិន​ដំណើរការ​ជាមួយ​មុខងារបំបែកអេក្រង់​ទេ"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"កម្មវិធីមិនអាចប្រើមុខងារ​បំបែកអេក្រង់បានទេ"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"កម្មវិធីនេះអាចបើកនៅក្នុងវិនដូតែ 1 ប៉ុណ្ណោះ។"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"កម្មវិធីនេះ​ប្រហែល​ជាមិនដំណើរការ​នៅលើ​អេក្រង់បន្ទាប់បន្សំទេ។"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"កម្មវិធី​នេះមិន​អាច​ចាប់ផ្តើម​នៅលើ​អេក្រង់បន្ទាប់បន្សំបានទេ។"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"កម្មវិធីចែកអេក្រង់បំបែក"</string>
-    <string name="divider_title" msgid="5482989479865361192">"បន្ទាត់ខណ្ឌចែកអេក្រង់បំបែក"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"បន្ទាត់ខណ្ឌចែកក្នុងមុខងារ​បំបែកអេក្រង់"</string>
+    <string name="divider_title" msgid="1963391955593749442">"បន្ទាត់ខណ្ឌចែកក្នុងមុខងារ​បំបែកអេក្រង់"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"អេក្រង់ពេញខាងឆ្វេង"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ឆ្វេង 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ឆ្វេង 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"មិនបាន​ដោះស្រាយ​បញ្ហានេះទេឬ?\nចុចដើម្បី​ត្រឡប់"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"មិនមាន​បញ្ហាពាក់ព័ន្ធនឹង​កាមេរ៉ាទេឬ? ចុចដើម្បី​ច្រានចោល។"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"មើលឃើញ និងធ្វើបានកាន់តែច្រើន"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"អូស​កម្មវិធី​មួយ​ទៀត​ចូល ដើម្បី​ប្រើ​មុខងារ​បំបែកអេក្រង់"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"អូស​កម្មវិធី​មួយ​ទៀត​ចូល ដើម្បី​ប្រើ​មុខងារ​បំបែកអេក្រង់"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ចុចពីរដង​នៅ​ក្រៅ​កម្មវិធី ដើម្បី​ប្ដូរ​ទីតាំង​កម្មវិធី​នោះ"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"យល់ហើយ"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"ពង្រីកដើម្បីទទួលបានព័ត៌មានបន្ថែម។"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"បោះបង់"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"ចាប់ផ្ដើម​ឡើង​វិញ"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"កុំ​បង្ហាញ​ម្ដង​ទៀត"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"ចុចពីរដង ដើម្បីផ្លាស់ទីកម្មវិធីនេះ"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"ពង្រីក"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"បង្រួម"</string>
     <string name="close_button_text" msgid="2913281996024033299">"បិទ"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"រូបថតអេក្រង់"</string>
     <string name="close_text" msgid="4986518933445178928">"បិទ"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"បិទ​ម៉ឺនុយ"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml
index a67e066..8b0fae8 100644
--- a/libs/WindowManager/Shell/res/values-kn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kn/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ಮರುಗಾತ್ರಗೊಳಿಸಿ"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"ಸ್ಟ್ಯಾಶ್ ಮಾಡಿ"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"ಅನ್‌ಸ್ಟ್ಯಾಶ್ ಮಾಡಿ"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"ವಿಭಜಿಸಿದ ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿ ಆ್ಯಪ್ ಕೆಲಸ ಮಾಡದೇ ಇರಬಹುದು."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ಅಪ್ಲಿಕೇಶನ್ ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"ಸ್ಪ್ಲಿಟ್‌ ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿ ಆ್ಯಪ್ ಕೆಲಸ ಮಾಡದೇ ಇರಬಹುದು"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"ಸ್ಪ್ಲಿಟ್‌ ಸ್ಕ್ರೀನ್‌ ಅನ್ನು ಆ್ಯಪ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"ಈ ಆ್ಯಪ್ ಅನ್ನು 1 ವಿಂಡೋದಲ್ಲಿ ಮಾತ್ರ ತೆರೆಯಬಹುದು."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ಸೆಕೆಂಡರಿ ಡಿಸ್‌ಪ್ಲೇಗಳಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್‌ ಕಾರ್ಯ ನಿರ್ವಹಿಸದೇ ಇರಬಹುದು."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ಸೆಕೆಂಡರಿ ಡಿಸ್‌ಪ್ಲೇಗಳಲ್ಲಿ ಪ್ರಾರಂಭಿಸುವಿಕೆಯನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"ಸ್ಪ್ಲಿಟ್-ಪರದೆ ಡಿವೈಡರ್"</string>
-    <string name="divider_title" msgid="5482989479865361192">"ಸ್ಪ್ಲಿಟ್-ಪರದೆ ಡಿವೈಡರ್"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"ಸ್ಪ್ಲಿಟ್‌ ಸ್ಕ್ರೀನ್ ಡಿವೈಡರ್"</string>
+    <string name="divider_title" msgid="1963391955593749442">"ಸ್ಪ್ಲಿಟ್‌ ಸ್ಕ್ರೀನ್ ಡಿವೈಡರ್"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ಎಡ ಪೂರ್ಣ ಪರದೆ"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70% ಎಡಕ್ಕೆ"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% ಎಡಕ್ಕೆ"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ಅದನ್ನು ಸರಿಪಡಿಸಲಿಲ್ಲವೇ?\nಹಿಂತಿರುಗಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿಲ್ಲವೇ? ವಜಾಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ನೋಡಿ ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಮಾಡಿ"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್‌ಗಾಗಿ ಮತ್ತೊಂದು ಆ್ಯಪ್‌ನಲ್ಲಿ ಎಳೆಯಿರಿ"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ಸ್ಪ್ಲಿಟ್‌ ಸ್ಕ್ರೀನ್‌ಗಾಗಿ ಮತ್ತೊಂದು ಆ್ಯಪ್‌ನಲ್ಲಿ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ಆ್ಯಪ್ ಒಂದರ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸಲು ಅದರ ಹೊರಗೆ ಡಬಲ್-ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"ಸರಿ"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"ಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ವಿಸ್ತೃತಗೊಳಿಸಿ."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"ರದ್ದುಮಾಡಿ"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"ಮರುಪ್ರಾರಂಭಿಸಿ"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"ಮತ್ತೊಮ್ಮೆ ತೋರಿಸಬೇಡಿ"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಸರಿಸಲು ಡಬಲ್-ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"ಹಿಗ್ಗಿಸಿ"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"ಕುಗ್ಗಿಸಿ"</string>
     <string name="close_button_text" msgid="2913281996024033299">"ಮುಚ್ಚಿರಿ"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್"</string>
     <string name="close_text" msgid="4986518933445178928">"ಮುಚ್ಚಿ"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"ಮೆನು ಮುಚ್ಚಿ"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml
index 0b88d7a..1978989 100644
--- a/libs/WindowManager/Shell/res/values-ko/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ko/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"크기 조절"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"숨기기"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"숨기기 취소"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"앱이 분할 화면에서 작동하지 않을 수 있습니다."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"앱이 화면 분할을 지원하지 않습니다."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"앱이 화면 분할 모드로는 작동하지 않을 수 있습니다"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"앱이 화면 분할을 지원하지 않습니다"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"이 앱은 창 1개에서만 열 수 있습니다."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"앱이 보조 디스플레이에서 작동하지 않을 수도 있습니다."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"앱이 보조 디스플레이에서의 실행을 지원하지 않습니다."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"화면 분할기"</string>
-    <string name="divider_title" msgid="5482989479865361192">"화면 분할기"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"화면 분할기"</string>
+    <string name="divider_title" msgid="1963391955593749442">"화면 분할기"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"왼쪽 화면 전체화면"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"왼쪽 화면 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"왼쪽 화면 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"해결되지 않았나요?\n되돌리려면 탭하세요."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"카메라에 문제가 없나요? 닫으려면 탭하세요."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"더 많은 정보를 보고 더 많은 작업을 처리하세요"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"화면 분할을 사용하려면 다른 앱을 드래그해 가져옵니다."</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"화면 분할을 사용하려면 다른 앱을 드래그해 가져옵니다."</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"앱 위치를 조정하려면 앱 외부를 두 번 탭합니다."</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"확인"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"추가 정보는 펼쳐서 확인하세요."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"취소"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"다시 시작"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"다시 표시 안함"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"두 번 탭하여 이 앱 이동"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"최대화"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"최소화"</string>
     <string name="close_button_text" msgid="2913281996024033299">"닫기"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"스크린샷"</string>
     <string name="close_text" msgid="4986518933445178928">"닫기"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"메뉴 닫기"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml
index 683a903..745cea3 100644
--- a/libs/WindowManager/Shell/res/values-ky/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ky/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Өлчөмүн өзгөртүү"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Сейфке салуу"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Сейфтен чыгаруу"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Колдонмодо экран бөлүнбөшү мүмкүн."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Колдонмодо экран бөлүнбөйт."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Колдонмодо экран бөлүнбөшү мүмкүн"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Колдонмодо экран бөлүнбөйт"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Бул колдонмону 1 терезеде гана ачууга болот."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Колдонмо кошумча экранда иштебей коюшу мүмкүн."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Колдонмону кошумча экрандарда иштетүүгө болбойт."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Экранды бөлгүч"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Экранды бөлгүч"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Экранды бөлгүч"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Экранды бөлгүч"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Сол жактагы экранды толук экран режимине өткөрүү"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Сол жактагы экранды 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Сол жактагы экранды 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Оңдолгон жокпу?\nАртка кайтаруу үчүн таптаңыз"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада маселе жокпу? Этибарга албоо үчүн таптаңыз."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Көрүп, көбүрөөк нерселерди жасаңыз"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Экранды бөлүү үчүн башка колдонмону сүйрөңүз"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Экранды бөлүү үчүн башка колдонмону сүйрөңүз"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Колдонмону жылдыруу үчүн сырт жагын эки жолу таптаңыз"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Түшүндүм"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Толук маалымат алуу үчүн жайып көрүңүз."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Токтотуу"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Өчүрүп күйгүзүү"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Экинчи көрүнбөсүн"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Бул колдонмону жылдыруу үчүн эки жолу таптаңыз"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Чоңойтуу"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Кичирейтүү"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Жабуу"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Скриншот"</string>
     <string name="close_text" msgid="4986518933445178928">"Жабуу"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Менюну жабуу"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml
index c311410..4dd5ade 100644
--- a/libs/WindowManager/Shell/res/values-lo/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lo/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ປ່ຽນຂະໜາດ"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"ເກັບໄວ້ບ່ອນເກັບສ່ວນຕົວ"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"ເອົາອອກຈາກບ່ອນເກັບສ່ວນຕົວ"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"ແອັບອາດໃຊ້ບໍ່ໄດ້ກັບການແບ່ງໜ້າຈໍ."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ແອັບບໍ່ຮອງຮັບໜ້າຈໍແບບແຍກກັນ."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"ແອັບອາດໃຊ້ບໍ່ໄດ້ກັບໂໝດແບ່ງໜ້າຈໍ"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"ແອັບບໍ່ຮອງຮັບການແບ່ງໜ້າຈໍ"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"ແອັບນີ້ສາມາດເປີດໄດ້ໃນ 1 ໜ້າຈໍເທົ່ານັ້ນ."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ແອັບອາດບໍ່ສາມາດໃຊ້ໄດ້ໃນໜ້າຈໍທີສອງ."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ແອັບບໍ່ຮອງຮັບການເປີດໃນໜ້າຈໍທີສອງ."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"ຕົວຂັ້ນການແບ່ງໜ້າຈໍ"</string>
-    <string name="divider_title" msgid="5482989479865361192">"ຕົວຂັ້ນການແບ່ງໜ້າຈໍ"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"ເສັ້ນແບ່ງໜ້າຈໍ"</string>
+    <string name="divider_title" msgid="1963391955593749442">"ເສັ້ນແບ່ງໜ້າຈໍ"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ເຕັມໜ້າຈໍຊ້າຍ"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ຊ້າຍ 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ຊ້າຍ 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ບໍ່ໄດ້ແກ້ໄຂມັນບໍ?\nແຕະເພື່ອແປງກັບຄືນ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ບໍ່ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ? ແຕະເພື່ອ​ປິດ​ໄວ້."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ເບິ່ງ ແລະ ເຮັດຫຼາຍຂຶ້ນ"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"ລາກແອັບອື່ນເຂົ້າມາເພື່ອແບ່ງໜ້າຈໍ"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ລາກໄປໄວ້ໃນແອັບອື່ນເພື່ອແບ່ງໜ້າຈໍ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ແຕະສອງເທື່ອໃສ່ນອກແອັບໃດໜຶ່ງເພື່ອຈັດຕຳແໜ່ງຂອງມັນຄືນໃໝ່"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"ເຂົ້າໃຈແລ້ວ"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"ຂະຫຍາຍເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"ຍົກເລີກ"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"ຣີສະຕາດ"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"ບໍ່ຕ້ອງສະແດງອີກ"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"ແຕະສອງເທື່ອເພື່ອຍ້າຍແອັບນີ້"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"ຂະຫຍາຍໃຫຍ່ສຸດ"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"ຫຍໍ້ລົງ"</string>
     <string name="close_button_text" msgid="2913281996024033299">"ປິດ"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"ຮູບໜ້າຈໍ"</string>
     <string name="close_text" msgid="4986518933445178928">"ປິດ"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"ປິດເມນູ"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml
index be8e247..7c1e7e1 100644
--- a/libs/WindowManager/Shell/res/values-lt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lt/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Pakeisti dydį"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Paslėpti"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Nebeslėpti"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Programa gali neveikti naudojant išskaidyto ekrano režimą."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Programoje nepalaikomas skaidytas ekranas."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Programa gali neveikti naudojant išskaidyto ekrano režimą"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Programoje nepalaikomas išskaidyto ekrano režimas"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Šią programą galima atidaryti tik viename lange."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Programa gali neveikti antriniame ekrane."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Programa nepalaiko paleisties antriniuose ekranuose."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Skaidyto ekrano daliklis"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Skaidyto ekrano daliklis"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Išskaidyto ekrano režimo daliklis"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Išskaidyto ekrano režimo daliklis"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Kairysis ekranas viso ekrano režimu"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Kairysis ekranas 70 %"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kairysis ekranas 50 %"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepavyko pataisyti?\nPalieskite, kad grąžintumėte"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nėra jokių problemų dėl kameros? Palieskite, kad atsisakytumėte."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Daugiau turinio ir funkcijų"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Vilkite kitoje programoje, kad galėtumėte naudoti išskaidyto ekrano režimą"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Vilkite kitoje programoje, kad galėtumėte naudoti išskaidyto ekrano režimą"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dukart palieskite už programos ribų, kad pakeistumėte jos poziciją"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Supratau"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Išskleiskite, jei reikia daugiau informacijos."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Atšaukti"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Paleisti iš naujo"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Daugiau neberodyti"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Dukart palieskite, kad perkeltumėte šią programą"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Padidinti"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Sumažinti"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Uždaryti"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Ekrano kopija"</string>
     <string name="close_text" msgid="4986518933445178928">"Uždaryti"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Uždaryti meniu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml
index d6a1f16..69db08a 100644
--- a/libs/WindowManager/Shell/res/values-lv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lv/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Mainīt lielumu"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Paslēpt"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Rādīt"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Iespējams, lietotne nedarbosies ekrāna sadalīšanas režīmā."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Lietotnē netiek atbalstīta ekrāna sadalīšana."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Iespējams, lietotne nedarbosies ekrāna sadalīšanas režīmā"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Lietotnē netiek atbalstīta ekrāna sadalīšana"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Šo lietotni var atvērt tikai vienā logā."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Lietotne, iespējams, nedarbosies sekundārajā displejā."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Lietotnē netiek atbalstīta palaišana sekundārajos displejos."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Ekrāna sadalītājs"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Ekrāna sadalītājs"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Ekrāna sadalītājs"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Ekrāna sadalītājs"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Kreisā daļa pa visu ekrānu"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Pa kreisi 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Pa kreisi 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Vai problēma netika novērsta?\nPieskarieties, lai atjaunotu."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Vai nav problēmu ar kameru? Pieskarieties, lai nerādītu."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Uzziniet un paveiciet vairāk"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Lai izmantotu sadalītu ekrānu, ievelciet vēl vienu lietotni"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Lai izmantotu sadalītu ekrānu, ievelciet vēl vienu lietotni"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Lai pārvietotu lietotni, veiciet dubultskārienu ārpus lietotnes"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Labi"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Izvērsiet, lai iegūtu plašāku informāciju."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Atcelt"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Restartēt"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Vairs nerādīt"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Lai pārvietotu šo lietotni, veiciet dubultskārienu"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maksimizēt"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimizēt"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Aizvērt"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Ekrānuzņēmums"</string>
     <string name="close_text" msgid="4986518933445178928">"Aizvērt"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Aizvērt izvēlni"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml
index 385dc32..d9479d3 100644
--- a/libs/WindowManager/Shell/res/values-mk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mk/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Промени големина"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Сокријте"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Прикажете"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Апликацијата може да не работи со поделен екран."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Апликацијата не поддржува поделен екран."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Апликацијата можеби нема да работи со поделен екран"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Апликацијата не поддржува поделен екран"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Апликацијава може да се отвори само во еден прозорец."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Апликацијата може да не функционира на друг екран."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Апликацијата не поддржува стартување на други екрани."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Разделник на поделен екран"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Разделник на поделен екран"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Разделник на поделен екран"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Разделник на поделен екран"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Левиот на цел екран"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Левиот 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Левиот 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не се поправи?\nДопрете за враќање"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нема проблеми со камерата? Допрете за отфрлање."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Погледнете и направете повеќе"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Повлечете во друга апликација за поделен екран"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Повлечете друга апликација за поделен екран"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Допрете двапати надвор од некоја апликација за да ја преместите"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Сфатив"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Проширете за повеќе информации."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Откажи"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Рестартирај"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Не прикажувај повторно"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Допрете двапати за да ја поместите апликацијава"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Зголеми"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Минимизирај"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Затвори"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Слика од екранот"</string>
     <string name="close_text" msgid="4986518933445178928">"Затворете"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Затворете го менито"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml
index 561806c6..2afde7b 100644
--- a/libs/WindowManager/Shell/res/values-ml/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ml/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"വലുപ്പം മാറ്റുക"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"സ്റ്റാഷ് ചെയ്യൽ"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"അൺസ്റ്റാഷ് ചെയ്യൽ"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"സ്‌ക്രീൻ വിഭജന മോഡിൽ ആപ്പ് പ്രവർത്തിച്ചേക്കില്ല."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"സ്പ്ലിറ്റ്-സ്ക്രീനിനെ ആപ്പ് പിന്തുണയ്ക്കുന്നില്ല."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"സ്‌ക്രീൻ വിഭജന മോഡിൽ ആപ്പ് പ്രവർത്തിച്ചേക്കില്ല"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"സ്‌ക്രീൻ വിഭജന മോഡിനെ ആപ്പ് പിന്തുണയ്ക്കുന്നില്ല"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"ഈ ആപ്പ് ഒരു വിൻഡോയിൽ മാത്രമേ തുറക്കാനാകൂ."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"രണ്ടാം ഡിസ്‌പ്ലേയിൽ ആപ്പ് പ്രവർത്തിച്ചേക്കില്ല."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"രണ്ടാം ഡിസ്‌പ്ലേകളിൽ സമാരംഭിക്കുന്നതിനെ ആപ്പ് അനുവദിക്കുന്നില്ല."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"സ്പ്ലിറ്റ്-സ്ക്രീൻ ഡിവൈഡർ"</string>
-    <string name="divider_title" msgid="5482989479865361192">"സ്‌ക്രീൻ വിഭജന മോഡ് ഡിവൈഡർ"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"സ്‌ക്രീൻ വിഭജന മോഡ് ഡിവൈഡർ"</string>
+    <string name="divider_title" msgid="1963391955593749442">"സ്‌ക്രീൻ വിഭജന മോഡ് ഡിവൈഡർ"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ഇടത് പൂർണ്ണ സ്ക്രീൻ"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ഇടത് 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ഇടത് 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"അത് പരിഹരിച്ചില്ലേ?\nപുനഃസ്ഥാപിക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ക്യാമറാ പ്രശ്നങ്ങളൊന്നുമില്ലേ? നിരസിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"കൂടുതൽ കാണുക, ചെയ്യുക"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"സ്‌ക്രീൻ വിഭജന മോഡിന്, മറ്റൊരു ആപ്പ് വലിച്ചിടുക"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"സ്‌ക്രീൻ വിഭജന മോഡിന്, മറ്റൊരു ആപ്പ് വലിച്ചിടുക"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ആപ്പിന്റെ സ്ഥാനം മാറ്റാൻ അതിന് പുറത്ത് ഡബിൾ ടാപ്പ് ചെയ്യുക"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"മനസ്സിലായി"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"കൂടുതൽ വിവരങ്ങൾക്ക് വികസിപ്പിക്കുക."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"റദ്ദാക്കുക"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"റീസ്റ്റാർട്ട് ചെയ്യൂ"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"വീണ്ടും കാണിക്കരുത്"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"ഈ ആപ്പ് നീക്കാൻ ഡബിൾ ടാപ്പ് ചെയ്യുക"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"വലുതാക്കുക"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"ചെറുതാക്കുക"</string>
     <string name="close_button_text" msgid="2913281996024033299">"അടയ്ക്കുക"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"സ്ക്രീൻഷോട്ട്"</string>
     <string name="close_text" msgid="4986518933445178928">"അടയ്ക്കുക"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"മെനു അടയ്ക്കുക"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml
index c0c9eb7..69bd08e 100644
--- a/libs/WindowManager/Shell/res/values-mn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mn/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Хэмжээг өөрчлөх"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Нуух"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Ил гаргах"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Апп хуваагдсан дэлгэц дээр ажиллахгүй байж болзошгүй."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Энэ апп нь дэлгэц хуваах тохиргоог дэмждэггүй."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Апп дэлгэцийг хуваах горимтой ажиллахгүй байж магадгүй"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Апп дэлгэцийг хуваах горимыг дэмждэггүй"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Энэ аппыг зөвхөн 1 цонхонд нээх боломжтой."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Апп хоёрдогч дэлгэцэд ажиллахгүй."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Аппыг хоёрдогч дэлгэцэд эхлүүлэх боломжгүй."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"\"Дэлгэц хуваах\" хуваагч"</string>
-    <string name="divider_title" msgid="5482989479865361192">"\"Дэлгэцийг хуваах\" хуваагч"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Дэлгэцийг хуваах хуваагч"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Дэлгэцийг хуваах хуваагч"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Зүүн талын бүтэн дэлгэц"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Зүүн 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Зүүн 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Үүнийг засаагүй юу?\nБуцаахын тулд товшино уу"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерын асуудал байхгүй юу? Хаахын тулд товшино уу."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Харж илүү ихийг хий"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Дэлгэцийг хуваахын тулд өөр апп руу чирнэ үү"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Дэлгэц хуваах горимд ашиглахын тулд өөр аппыг чирнэ үү"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Аппыг дахин байрлуулахын тулд гадна талд нь хоёр товшино"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Ойлголоо"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Нэмэлт мэдээлэл авах бол дэлгэнэ үү."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Цуцлах"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Дахин эхлүүлэх"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Дахиж бүү харуул"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Энэ аппыг зөөхийн тулд хоёр товшино уу"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Томруулах"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Багасгах"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Хаах"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Дэлгэцийн агшин"</string>
     <string name="close_text" msgid="4986518933445178928">"Хаах"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Цэсийг хаах"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml
index a18d1f1..5382b94 100644
--- a/libs/WindowManager/Shell/res/values-mr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mr/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"आकार बदला"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"स्टॅश करा"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"अनस्टॅश करा"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"अ‍ॅप कदाचित स्प्लिट स्क्रीनसह काम करू शकत नाही."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"अ‍ॅप स्क्रीन-विभाजनास समर्थन देत नाही."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"अ‍ॅप कदाचित स्प्लिट स्क्रीनसह काम करणार नाही"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"अ‍ॅप हे स्प्लिट स्क्रीनला सपोर्ट करत नाही"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"हे अ‍ॅप फक्त एका विंडोमध्ये उघडले जाऊ शकते."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"दुसऱ्या डिस्प्लेवर अ‍ॅप कदाचित चालणार नाही."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"दुसऱ्या डिस्प्लेवर अ‍ॅप लाँच होणार नाही."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"विभाजित-स्क्रीन विभाजक"</string>
-    <string name="divider_title" msgid="5482989479865361192">"स्प्लिट-स्क्रीन विभाजक"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"स्प्लिट स्क्रीन विभाजक"</string>
+    <string name="divider_title" msgid="1963391955593749442">"स्प्लिट स्क्रीन विभाजक"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"डावी फुल स्क्रीन"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"डावी 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"डावी 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"निराकरण झाले नाही?\nरिव्हर्ट करण्यासाठी कृपया टॅप करा"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"कॅमेराशी संबंधित कोणत्याही समस्या नाहीत का? डिसमिस करण्‍यासाठी टॅप करा."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"पहा आणि आणखी बरेच काही करा"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"स्प्लिट-स्क्रीन वापरण्यासाठी दुसऱ्या ॲपमध्ये ड्रॅग करा"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"स्प्लिट स्क्रीन वापरण्यासाठी दुसरे ॲप ड्रॅग करा"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ॲपची स्थिती पुन्हा बदलण्यासाठी, त्याच्या बाहेर दोनदा टॅप करा"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"समजले"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"अधिक माहितीसाठी विस्तार करा."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"रद्द करा"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"रीस्टार्ट करा"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"पुन्हा दाखवू नका"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"हे ॲप हलवण्यासाठी दोनदा टॅप करा"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"मोठे करा"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"लहान करा"</string>
     <string name="close_button_text" msgid="2913281996024033299">"बंद करा"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"स्क्रीनशॉट"</string>
     <string name="close_text" msgid="4986518933445178928">"बंद करा"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"मेनू बंद करा"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml
index b891c59..c1b2d49 100644
--- a/libs/WindowManager/Shell/res/values-ms/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ms/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ubah saiz"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Sembunyikan"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Tunjukkan"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Apl mungkin tidak berfungsi dengan skrin pisah."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Apl tidak menyokong skrin pisah."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Apl mungkin tidak berfungsi dengan skrin pisah"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Apl tidak menyokong skrin pisah"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Apl ini hanya boleh dibuka dalam 1 tetingkap."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Apl mungkin tidak berfungsi pada paparan kedua."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Apl tidak menyokong pelancaran pada paparan kedua."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Pembahagi skrin pisah"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Pembahagi skrin pisah"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Pembahagi skrin pisah"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Pembahagi skrin pisah"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Skrin penuh kiri"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Kiri 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kiri 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Isu tidak dibetulkan?\nKetik untuk kembali"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tiada isu kamera? Ketik untuk mengetepikan."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Lihat dan lakukan lebih"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Seret apl lain untuk skrin pisah"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Seret masuk apl lain untuk menggunakan skrin pisah"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Ketik dua kali di luar apl untuk menempatkan semula apl itu"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Kembangkan untuk mendapatkan maklumat lanjut."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Batal"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Mulakan semula"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Jangan tunjukkan lagi"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Ketik dua kali untuk mengalihkan apl ini"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maksimumkan"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimumkan"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Tutup"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Tangkapan skrin"</string>
     <string name="close_text" msgid="4986518933445178928">"Tutup"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Tutup Menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml
index 2b6adc1..f3b7bfc 100644
--- a/libs/WindowManager/Shell/res/values-my/strings.xml
+++ b/libs/WindowManager/Shell/res/values-my/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"အရွယ်အစားပြောင်းရန်"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"သိုဝှက်ရန်"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"မသိုဝှက်ရန်"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းဖြင့် အက်ပ်သည် အလုပ်မလုပ်ပါ။"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"အက်ပ်သည် မျက်နှာပြင်ခွဲပြရန် ပံ့ပိုးထားခြင်းမရှိပါ။"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းဖြင့် အက်ပ်သည် အလုပ်မလုပ်ပါ"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"အက်ပ်တွင် မျက်နှာပြင် ခွဲ၍ပြသခြင်းကို မပံ့ပိုးပါ"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"ဤအက်ပ်ကို ဝင်းဒိုး ၁ ခုတွင်သာ ဖွင့်နိုင်သည်။"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ဤအက်ပ်အနေဖြင့် ဒုတိယဖန်သားပြင်ပေါ်တွင် အလုပ်လုပ်မည် မဟုတ်ပါ။"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ဤအက်ပ်အနေဖြင့် ဖွင့်ရန်စနစ်ကို ဒုတိယဖန်သားပြင်မှ အသုံးပြုရန် ပံ့ပိုးမထားပါ။"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"မျက်နှာပြင်ခွဲခြမ်း ပိုင်းခြားပေးသည့်စနစ်"</string>
-    <string name="divider_title" msgid="5482989479865361192">"မျက်နှာပြင်ခွဲ၍ပြသသည့် စနစ်"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"မျက်နှာပြင် ခွဲ၍ပြသခြင်း ပိုင်းခြားစနစ်"</string>
+    <string name="divider_title" msgid="1963391955593749442">"မျက်နှာပြင် ခွဲ၍ပြသခြင်း ပိုင်းခြားစနစ်"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ဘယ်ဘက် မျက်နှာပြင်အပြည့်"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ဘယ်ဘက်မျက်နှာပြင် ၇၀%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ဘယ်ဘက် မျက်နှာပြင် ၅၀%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ကောင်းမသွားဘူးလား။\nပြန်ပြောင်းရန် တို့ပါ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ကင်မရာပြဿနာ မရှိဘူးလား။ ပယ်ရန် တို့ပါ။"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ကြည့်ပြီး ပိုမိုလုပ်ဆောင်ပါ"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"မျက်နှာပြင် ခွဲ၍ပြသနိုင်ရန် နောက်အက်ပ်တစ်ခုကို ဖိဆွဲပါ"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းအတွက် အက်ပ်နောက်တစ်ခုကို ဖိဆွဲပါ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"နေရာပြန်ချရန် အက်ပ်အပြင်ဘက်ကို နှစ်ချက်တို့ပါ"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"နားလည်ပြီ"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"နောက်ထပ်အချက်အလက်များအတွက် ချဲ့နိုင်သည်။"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"မလုပ်တော့"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"ပြန်စရန်"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"နောက်ထပ်မပြပါနှင့်"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"နှစ်ချက်တို့ပြီး ဤအက်ပ်ကို ရွှေ့ပါ"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"ချဲ့ရန်"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"ချုံ့ရန်"</string>
     <string name="close_button_text" msgid="2913281996024033299">"ပိတ်ရန်"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"ဖန်သားပြင်ဓာတ်ပုံ"</string>
     <string name="close_text" msgid="4986518933445178928">"ပိတ်ရန်"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"မီနူး ပိတ်ရန်"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml
index da5f4ca..bf197d5 100644
--- a/libs/WindowManager/Shell/res/values-nb/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nb/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Endre størrelse"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Oppbevar"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Avslutt oppbevaring"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Det kan hende at appen ikke fungerer med delt skjerm."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Appen støtter ikke delt skjerm."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Det kan hende at appen ikke fungerer med delt skjerm"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Appen støtter ikke delt skjerm"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Denne appen kan bare åpnes i ett vindu."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Appen fungerer kanskje ikke på en sekundær skjerm."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Appen kan ikke kjøres på sekundære skjermer."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Skilleelement for delt skjerm"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Skilleelement for delt skjerm"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Skilleelement for delt skjerm"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Skilleelement for delt skjerm"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Utvid den venstre delen av skjermen til hele skjermen"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Sett størrelsen på den venstre delen av skjermen til 70 %"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Sett størrelsen på den venstre delen av skjermen til 50 %"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Flytt til nederst til høyre"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-innstillinger"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"Lukk boblen"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"Ikke vis bobler"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ikke vis samtaler i bobler"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat med bobler"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nye samtaler vises som flytende ikoner eller bobler. Trykk for å åpne en boble. Dra for å flytte den."</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ble ikke problemet løst?\nTrykk for å gå tilbake"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen kameraproblemer? Trykk for å lukke."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Se og gjør mer"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Dra inn en annen app for å bruke delt skjerm"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Dra inn en annen app for å bruke delt skjerm"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dobbelttrykk utenfor en app for å flytte den"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Greit"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Vis for å få mer informasjon."</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Avbryt"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Start på nytt"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Ikke vis dette igjen"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Dobbelttrykk for å flytte denne appen"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maksimer"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimer"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Lukk"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Skjermdump"</string>
     <string name="close_text" msgid="4986518933445178928">"Lukk"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Lukk menyen"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml
index 3afa9fb..519a7cb 100644
--- a/libs/WindowManager/Shell/res/values-ne/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ne/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"आकार बदल्नुहोस्"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"स्ट्यास गर्नुहोस्"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"अनस्ट्यास गर्नुहोस्"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"एप विभाजित स्क्रिनमा काम नगर्न सक्छ।"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"अनुप्रयोगले विभाजित-स्क्रिनलाई समर्थन गर्दैन।"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"यो एपले स्प्लिट स्क्रिन मोडमा काम नगर्न सक्छ"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"यो एप स्प्लिट स्क्रिन मोडमा प्रयोग गर्न मिल्दैन"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"यो एप एउटा विन्डोमा मात्र खोल्न मिल्छ।"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"यो एपले सहायक प्रदर्शनमा काम नगर्नसक्छ।"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"अनुप्रयोगले सहायक प्रदर्शनहरूमा लञ्च सुविधालाई समर्थन गर्दैन।"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"विभाजित-स्क्रिन छुट्याउने"</string>
-    <string name="divider_title" msgid="5482989479865361192">"स्प्लिट स्क्रिन डिभाइडर"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"स्प्लिट स्क्रिन डिभाइडर"</string>
+    <string name="divider_title" msgid="1963391955593749442">"स्प्लिट स्क्रिन डिभाइडर"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"बायाँ भाग फुल स्क्रिन"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"बायाँ भाग ७०%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"बायाँ भाग ५०%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"समस्या हल भएन?\nपहिलेको जस्तै बनाउन ट्याप गर्नुहोस्"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्यामेरासम्बन्धी कुनै पनि समस्या छैन? खारेज गर्न ट्याप गर्नुहोस्।"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"थप कुरा हेर्नुहोस् र गर्नुहोस्"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"स्प्लिट स्क्रिन मोड प्रयोग गर्न अर्को एप ड्रयाग एन्ड ड्रप गर्नुहोस्"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"स्प्लिट स्क्रिन मोड प्रयोग गर्न अर्को एप ड्रयाग एन्ड ड्रप गर्नुहोस्"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"तपाईं जुन एपको स्थिति मिलाउन चाहनुहुन्छ सोही एपको बाहिर डबल ट्याप गर्नुहोस्"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"बुझेँ"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"थप जानकारी प्राप्त गर्न चाहनुहुन्छ भने एक्स्पान्ड गर्नुहोस्।"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"रद्द गर्नुहोस्"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"रिस्टार्ट गर्नुहोस्"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"फेरि नदेखाइयोस्"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"यो एप सार्न डबल ट्याप गर्नुहोस्"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"ठुलो बनाउनुहोस्"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"मिनिमाइज गर्नुहोस्"</string>
     <string name="close_button_text" msgid="2913281996024033299">"बन्द गर्नुहोस्"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"स्क्रिनसट"</string>
     <string name="close_text" msgid="4986518933445178928">"बन्द गर्नुहोस्"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"मेनु बन्द गर्नुहोस्"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml
index 21e89c3..7847901 100644
--- a/libs/WindowManager/Shell/res/values-nl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nl/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Formaat aanpassen"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Verbergen"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Niet meer verbergen"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"De app werkt mogelijk niet met gesplitst scherm."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"App biedt geen ondersteuning voor gesplitst scherm."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"De app werkt misschien niet met gesplitst scherm"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"App ondersteunt geen gesplitst scherm"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Deze app kan slechts in 1 venster worden geopend."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"App werkt mogelijk niet op een secundair scherm."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"App kan niet op secundaire displays worden gestart."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Scheiding voor gesplitst scherm"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Scheiding voor gesplitst scherm"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Scheiding voor gesplitst scherm"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Scheiding voor gesplitst scherm"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Linkerscherm op volledig scherm"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Linkerscherm 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Linkerscherm 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Is dit geen oplossing?\nTik om terug te zetten."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen cameraproblemen? Tik om te sluiten."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Zie en doe meer"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Sleep een andere app hier naartoe om het scherm te splitsen"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Sleep een andere app hier naartoe om het scherm te splitsen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dubbeltik naast een app om deze opnieuw te positioneren"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Uitvouwen voor meer informatie."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Annuleren"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Opnieuw opstarten"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Niet opnieuw tonen"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Dubbeltik om deze app te verplaatsen"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximaliseren"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimaliseren"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Sluiten"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
     <string name="close_text" msgid="4986518933445178928">"Sluiten"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Menu sluiten"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml
index e781f45..efc1af3 100644
--- a/libs/WindowManager/Shell/res/values-or/strings.xml
+++ b/libs/WindowManager/Shell/res/values-or/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ରିସାଇଜ୍ କରନ୍ତୁ"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"ଲୁଚାନ୍ତୁ"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"ଦେଖାନ୍ତୁ"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"ସ୍ପ୍ଲିଟ୍-ସ୍କ୍ରିନରେ ଆପ୍ କାମ କରିନପାରେ।"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ଆପ୍‍ ସ୍ପ୍ଲିଟ୍‍-ସ୍କ୍ରୀନକୁ ସପୋର୍ଟ କରେ ନାହିଁ।"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନରେ ଆପ କାମ କରିନପାରେ"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ଆପ ସମର୍ଥନ କରେ ନାହିଁ"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"ଏହି ଆପକୁ କେବଳ 1ଟି ୱିଣ୍ଡୋରେ ଖୋଲାଯାଇପାରିବ।"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ସେକେଣ୍ଡାରୀ ଡିସପ୍ଲେରେ ଆପ୍‍ କାମ ନକରିପାରେ।"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ସେକେଣ୍ଡାରୀ ଡିସପ୍ଲେରେ ଆପ୍‍ ଲଞ୍ଚ ସପୋର୍ଟ କରେ ନାହିଁ।"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"ସ୍ପ୍ଲିଟ୍‍-ସ୍କ୍ରୀନ ବିଭାଜକ"</string>
-    <string name="divider_title" msgid="5482989479865361192">"ସ୍ପ୍ଲିଟ-ସ୍କ୍ରିନ ଡିଭାଇଡର"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ଡିଭାଇଡର"</string>
+    <string name="divider_title" msgid="1963391955593749442">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ଡିଭାଇଡର"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ବାମ ପଟକୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍‍ କରନ୍ତୁ"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ବାମ ପଟକୁ 70% କରନ୍ତୁ"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ବାମ ପଟକୁ 50% କରନ୍ତୁ"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ଏହାର ସମାଧାନ ହୋଇନାହିଁ?\nଫେରିଯିବା ପାଇଁ ଟାପ କରନ୍ତୁ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"କ୍ୟାମେରାରେ କିଛି ସମସ୍ୟା ନାହିଁ? ଖାରଜ କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ଦେଖନ୍ତୁ ଏବଂ ଆହୁରି ଅନେକ କିଛି କରନ୍ତୁ"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"ସ୍ପ୍ଲିଟ-ସ୍କ୍ରିନ ପାଇଁ ଅନ୍ୟ ଏକ ଆପକୁ ଡ୍ରାଗ କରନ୍ତୁ"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ପାଇଁ ଅନ୍ୟ ଏକ ଆପକୁ ଡ୍ରାଗ କରନ୍ତୁ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ଏକ ଆପକୁ ରିପୋଜିସନ କରିବା ପାଇଁ ଏହାର ବାହାରେ ଦୁଇଥର-ଟାପ କରନ୍ତୁ"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"ବୁଝିଗଲି"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"ଅଧିକ ସୂଚନା ପାଇଁ ବିସ୍ତାର କରନ୍ତୁ।"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"ବାତିଲ କରନ୍ତୁ"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"ଏହି ଆପକୁ ମୁଭ କରାଇବାକୁ ଦୁଇଥର-ଟାପ କରନ୍ତୁ"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"ବଡ଼ କରନ୍ତୁ"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"ଛୋଟ କରନ୍ତୁ"</string>
     <string name="close_button_text" msgid="2913281996024033299">"ବନ୍ଦ କରନ୍ତୁ"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"ସ୍କ୍ରିନସଟ"</string>
     <string name="close_text" msgid="4986518933445178928">"ବନ୍ଦ କରନ୍ତୁ"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"ମେନୁ ବନ୍ଦ କରନ୍ତୁ"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml
index d39fe95..fbcaf6e 100644
--- a/libs/WindowManager/Shell/res/values-pa/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pa/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ਆਕਾਰ ਬਦਲੋ"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"ਸਟੈਸ਼"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"ਅਣਸਟੈਸ਼"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ।"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ।"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"ਐਪ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"ਇਹ ਐਪ ਸਿਰਫ਼ 1 ਵਿੰਡੋ ਵਿੱਚ ਖੋਲ੍ਹੀ ਜਾ ਸਕਦੀ ਹੈ।"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇ \'ਤੇ ਕੰਮ ਨਾ ਕਰੇ।"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇਆਂ \'ਤੇ ਲਾਂਚ ਕਰਨ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਡਿਵਾਈਡਰ"</string>
-    <string name="divider_title" msgid="5482989479865361192">"ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਵਿਭਾਜਕ"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿਭਾਜਕ"</string>
+    <string name="divider_title" msgid="1963391955593749442">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿਭਾਜਕ"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ਖੱਬੇ ਪੂਰੀ ਸਕ੍ਰੀਨ"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ਖੱਬੇ 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ਖੱਬੇ 50%"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"ਹੇਠਾਂ ਵੱਲ ਸੱਜੇ ਲਿਜਾਓ"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ਸੈਟਿੰਗਾਂ"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"ਬਬਲ ਨੂੰ ਖਾਰਜ ਕਰੋ"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"ਬਬਲ ਨਾ ਕਰੋ"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ਗੱਲਬਾਤ \'ਤੇ ਬਬਲ ਨਾ ਲਾਓ"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"ਬਬਲ ਵਰਤਦੇ ਹੋਏ ਚੈਟ ਕਰੋ"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"ਨਵੀਆਂ ਗੱਲਾਂਬਾਤਾਂ ਫਲੋਟਿੰਗ ਪ੍ਰਤੀਕਾਂ ਜਾਂ ਬਬਲ ਦੇ ਰੂਪ ਵਿੱਚ ਦਿਸਦੀਆਂ ਹਨ। ਬਬਲ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ। ਇਸਨੂੰ ਲਿਜਾਣ ਲਈ ਘਸੀਟੋ।"</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ਕੀ ਇਹ ਠੀਕ ਨਹੀਂ ਹੋਈ?\nਵਾਪਸ ਉਹੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਕੋਈ ਸਮੱਸਿਆ ਨਹੀਂ ਹੈ? ਖਾਰਜ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ਦੇਖੋ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਕਰੋ"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੇ ਲਈ ਕਿਸੇ ਹੋਰ ਐਪ ਵਿੱਚ ਘਸੀਟੋ"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੇ ਲਈ ਕਿਸੇ ਹੋਰ ਐਪ ਵਿੱਚ ਘਸੀਟੋ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ਕਿਸੇ ਐਪ ਦੀ ਜਗ੍ਹਾ ਬਦਲਣ ਲਈ ਉਸ ਦੇ ਬਾਹਰ ਡਬਲ ਟੈਪ ਕਰੋ"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"ਸਮਝ ਲਿਆ"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਵਿਸਤਾਰ ਕਰੋ।"</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"ਰੱਦ ਕਰੋ"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"ਇਸ ਐਪ ਦੀ ਟਿਕਾਣਾ ਬਦਲਣ ਲਈ ਡਬਲ ਟੈਪ ਕਰੋ"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"ਵੱਡਾ ਕਰੋ"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"ਛੋਟਾ ਕਰੋ"</string>
     <string name="close_button_text" msgid="2913281996024033299">"ਬੰਦ ਕਰੋ"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string>
     <string name="close_text" msgid="4986518933445178928">"ਬੰਦ ਕਰੋ"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"ਮੀਨੂ ਬੰਦ ਕਰੋ"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml
index ef7773b9..9451c6e 100644
--- a/libs/WindowManager/Shell/res/values-pl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pl/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Zmień rozmiar"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Przenieś do schowka"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Zabierz ze schowka"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacja może nie działać przy podzielonym ekranie."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacja nie obsługuje dzielonego ekranu."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Aplikacja może nie działać przy podzielonym ekranie"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Aplikacja nie obsługuje podzielonego ekranu"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Ta aplikacja może być otwarta tylko w 1 oknie."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacja może nie działać na dodatkowym ekranie."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacja nie obsługuje uruchamiania na dodatkowych ekranach."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Linia dzielenia ekranu"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Linia dzielenia ekranu"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Linia dzielenia ekranu"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Linia dzielenia ekranu"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Lewa część ekranu na pełnym ekranie"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70% lewej części ekranu"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% lewej części ekranu"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Naprawa się nie udała?\nKliknij, aby cofnąć"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Brak problemów z aparatem? Kliknij, aby zamknąć"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Zobacz i zrób więcej"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Przeciągnij drugą aplikację, aby podzielić ekran"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Aby podzielić ekran, przeciągnij drugą aplikację"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Kliknij dwukrotnie poza aplikacją, aby ją przenieść"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Rozwiń, aby wyświetlić więcej informacji."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Anuluj"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Uruchom ponownie"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Nie pokazuj ponownie"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Kliknij dwukrotnie, aby przenieść tę aplikację"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maksymalizuj"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimalizuj"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Zamknij"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Zrzut ekranu"</string>
     <string name="close_text" msgid="4986518933445178928">"Zamknij"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zamknij menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
index b034990..6b18719 100644
--- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Redimensionar"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Ocultar"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Exibir"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"É possível que o app não funcione com a tela dividida."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"O app não é compatível com a divisão de tela."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"É possível que o app não funcione com a tela dividida"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"O app não oferece suporte à divisão de tela"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Este app só pode ser aberto em uma única janela."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"É possível que o app não funcione em uma tela secundária."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"O app não é compatível com a inicialização em telas secundárias."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Divisor de tela"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Divisor de tela"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Divisor de tela"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Divisor de tela"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Lado esquerdo em tela cheia"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Esquerda a 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Esquerda a 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Veja e faça mais"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Arraste outro app para a tela dividida"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arraste outro app para dividir a tela"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toque duas vezes fora de um app para reposicionar"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendi"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Abra para ver mais informações."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Cancelar"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Reiniciar"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Não mostrar novamente"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Toque duas vezes para mover o app"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximizar"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimizar"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Fechar"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Captura de tela"</string>
     <string name="close_text" msgid="4986518933445178928">"Fechar"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
index c739ba0..ede86fa 100644
--- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Redimensionar"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Armazenar"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Remover do armazenamento"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"A app pode não funcionar com o ecrã dividido."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"A app não é compatível com o ecrã dividido."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"A app pode não funcionar com o ecrã dividido"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"A app não é compatível com o ecrã dividido"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Esta app só pode ser aberta em 1 janela."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"A app pode não funcionar num ecrã secundário."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"A app não é compatível com o início em ecrãs secundários."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Divisor do ecrã dividido"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Divisor do ecrã dividido"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Divisor do ecrã dividido"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Divisor do ecrã dividido"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ecrã esquerdo inteiro"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70% no ecrã esquerdo"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% no ecrã esquerdo"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Não foi corrigido?\nToque para reverter"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nenhum problema com a câmara? Toque para ignorar."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Veja e faça mais"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Arraste outra app para usar o ecrã dividido"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arraste outra app para usar o ecrã dividido"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toque duas vezes fora de uma app para a reposicionar"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Expandir para obter mais informações"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Cancelar"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Reiniciar"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Não mostrar de novo"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Toque duas vezes para mover esta app"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximizar"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimizar"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Fechar"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Captura de ecrã"</string>
     <string name="close_text" msgid="4986518933445178928">"Fechar"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml
index b034990..6b18719 100644
--- a/libs/WindowManager/Shell/res/values-pt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Redimensionar"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Ocultar"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Exibir"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"É possível que o app não funcione com a tela dividida."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"O app não é compatível com a divisão de tela."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"É possível que o app não funcione com a tela dividida"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"O app não oferece suporte à divisão de tela"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Este app só pode ser aberto em uma única janela."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"É possível que o app não funcione em uma tela secundária."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"O app não é compatível com a inicialização em telas secundárias."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Divisor de tela"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Divisor de tela"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Divisor de tela"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Divisor de tela"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Lado esquerdo em tela cheia"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Esquerda a 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Esquerda a 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Veja e faça mais"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Arraste outro app para a tela dividida"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arraste outro app para dividir a tela"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toque duas vezes fora de um app para reposicionar"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendi"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Abra para ver mais informações."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Cancelar"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Reiniciar"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Não mostrar novamente"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Toque duas vezes para mover o app"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximizar"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimizar"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Fechar"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Captura de tela"</string>
     <string name="close_text" msgid="4986518933445178928">"Fechar"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml
index cbe11dd..4aade7f 100644
--- a/libs/WindowManager/Shell/res/values-ro/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ro/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Redimensionează"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Stochează"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Anulează stocarea"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Este posibil ca aplicația să nu funcționeze cu ecranul împărțit."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplicația nu acceptă ecranul împărțit."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Este posibil ca aplicația să nu funcționeze cu ecranul împărțit"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Aplicația nu acceptă ecranul împărțit"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Aplicația poate fi deschisă într-o singură fereastră."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Este posibil ca aplicația să nu funcționeze pe un ecran secundar."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplicația nu acceptă lansare pe ecrane secundare."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Separator pentru ecranul împărțit"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Separator pentru ecranul împărțit"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Separator pentru ecranul împărțit"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Separator pentru ecranul împărțit"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Partea stângă pe ecran complet"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Partea stângă: 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Partea stângă: 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nu ai remediat problema?\nAtinge pentru a reveni"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nu ai probleme cu camera foto? Atinge pentru a închide."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Vezi și fă mai multe"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Trage în altă aplicație pentru a folosi ecranul împărțit"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Trage în altă aplicație pentru a folosi ecranul împărțit"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Atinge de două ori lângă o aplicație pentru a o repoziționa"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Extinde pentru mai multe informații"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Anulează"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Repornește"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Nu mai afișa"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Atinge de două ori ca să muți aplicația"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximizează"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimizează"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Închide"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Captură de ecran"</string>
     <string name="close_text" msgid="4986518933445178928">"Închide"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Închide meniul"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml
index 7602282..b9733dd 100644
--- a/libs/WindowManager/Shell/res/values-ru/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ru/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Изменить размер"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Скрыть"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Показать"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"В режиме разделения экрана приложение может работать нестабильно."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Приложение не поддерживает разделение экрана."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Когда включено разделение экрана, приложение может работать нестабильно."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Приложение не поддерживает разделение экрана."</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Это приложение можно открыть только в одном окне."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Приложение может не работать на дополнительном экране"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Приложение не поддерживает запуск на дополнительных экранах"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Разделитель экрана"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Разделитель экрана"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Разделитель экрана"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Разделитель экрана"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Левый во весь экран"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Левый на 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Левый на 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не помогло?\nНажмите, чтобы отменить изменения."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нет проблем с камерой? Нажмите, чтобы закрыть."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Выполняйте несколько задач одновременно"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Перетащите сюда другое приложение, чтобы использовать разделение экрана."</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Перетащите сюда другое приложение, чтобы использовать разделение экрана."</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Чтобы переместить приложение, дважды нажмите рядом с ним."</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"ОК"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Развернуть, чтобы узнать больше."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Отмена"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Перезапустить"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Больше не показывать"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Нажмите дважды, чтобы переместить приложение."</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Развернуть"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Свернуть"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Закрыть"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Скриншот"</string>
     <string name="close_text" msgid="4986518933445178928">"Закрыть"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Закрыть меню"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml
index 680f138..3b67693 100644
--- a/libs/WindowManager/Shell/res/values-si/strings.xml
+++ b/libs/WindowManager/Shell/res/values-si/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ප්‍රතිප්‍රමාණ කරන්න"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"සඟවා තබන්න"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"සඟවා තැබීම ඉවත් කරන්න"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"යෙදුම බෙදුම් තිරය සමග ක්‍රියා නොකළ හැකිය"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"යෙදුම බෙදුණු-තිරය සඳහා සහාය නොදක්වයි."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"යෙදුම බෙදීම් තිරය සමග ක්‍රියා නොකළ හැක"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"යෙදුම බෙදුම් තිරයට සහාය නොදක්වයි"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"මෙම යෙදුම විවෘත කළ හැක්කේ 1 කවුළුවක පමණයි."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"යෙදුම ද්විතියික සංදර්ශකයක ක්‍රියා නොකළ හැකිය."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"යෙදුම ද්විතීයික සංදර්ශක මත දියත් කිරීම සඳහා සහාය නොදක්වයි."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"බෙදුම්-තිර වෙන්කරණය"</string>
-    <string name="divider_title" msgid="5482989479865361192">"බෙදුම්-තිර වෙන්කරණය"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"බෙදුම් තිර වෙන්කරණය"</string>
+    <string name="divider_title" msgid="1963391955593749442">"බෙදුම් තිර වෙන්කරණය"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"වම් පූර්ණ තිරය"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"වම් 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"වම් 50%"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"පහළ දකුණට ගෙන යන්න"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> සැකසීම්"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"බුබුලු ඉවත ලන්න"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"බුබුළු නොකරන්න"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"සංවාදය බුබුලු නොදමන්න"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"බුබුලු භාවිතයෙන් කතාබහ කරන්න"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"නව සංවාද පාවෙන අයිකන හෝ බුබුලු ලෙස දිස් වේ. බුබුල විවෘත කිරීමට තට්ටු කරන්න. එය ගෙන යාමට අදින්න."</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"එය විසඳුවේ නැතිද?\nප්‍රතිවර්තනය කිරීමට තට්ටු කරන්න"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"කැමරා ගැටලු නොමැතිද? ඉවත දැමීමට තට්ටු කරන්න"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"බලන්න සහ තවත් දේ කරන්න"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"බෙදුම් තිරය සඳහා වෙනත් යෙදුමකට අදින්න"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"බෙදුම් තිරය සඳහා වෙනත් යෙදුමකට අදින්න"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"යෙදුමක් නැවත ස්ථානගත කිරීමට පිටතින් දෙවරක් තට්ටු කරන්න"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"තේරුණා"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"වැඩිදුර තොරතුරු සඳහා දිග හරින්න"</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"අවලංගු කරන්න"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"යළි අරඹන්න"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"නැවත නොපෙන්වන්න"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"මෙම යෙදුම ගෙන යාමට දෙවරක් තට්ටු කරන්න"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"විහිදන්න"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"කුඩා කරන්න"</string>
     <string name="close_button_text" msgid="2913281996024033299">"වසන්න"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"තිර රුව"</string>
     <string name="close_text" msgid="4986518933445178928">"වසන්න"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"මෙනුව වසන්න"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml
index c908184..adf582f 100644
--- a/libs/WindowManager/Shell/res/values-sk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sk/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Zmeniť veľkosť"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Skryť"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Zrušiť skrytie"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikácia nemusí fungovať s rozdelenou obrazovkou."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikácia nepodporuje rozdelenú obrazovku."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Aplikácia nemusí fungovať s rozdelenou obrazovkou"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Aplikácia nepodporuje rozdelenú obrazovku"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Táto aplikácia môže byť otvorená iba v jednom okne."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikácia nemusí fungovať na sekundárnej obrazovke."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikácia nepodporuje spúšťanie na sekundárnych obrazovkách."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Rozdeľovač obrazovky"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Rozdeľovač obrazovky"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Rozdeľovač obrazovky"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Rozdeľovač obrazovky"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ľavá – na celú obrazovku"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Ľavá – 70 %"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ľavá – 50 %"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nevyriešilo sa to?\nKlepnutím sa vráťte."</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemáte problémy s kamerou? Klepnutím zatvoríte."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Zobrazte si a zvládnite toho viac"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Rozdelenú obrazovku aktivujete presunutím ďalšie aplikácie"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Rozdelenú obrazovku môžete použiť presunutím do inej aplikácie"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvojitým klepnutím mimo aplikácie zmeníte jej pozíciu"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Dobre"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Po rozbalení sa dozviete viac."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Zrušiť"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Reštartovať"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Už nezobrazovať"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Túto aplikáciu presuniete dvojitým klepnutím"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maximalizovať"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimalizovať"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Zavrieť"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Snímka obrazovky"</string>
     <string name="close_text" msgid="4986518933445178928">"Zavrieť"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zavrieť ponuku"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml
index ed7feb9..08c1b38 100644
--- a/libs/WindowManager/Shell/res/values-sl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sl/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Spremeni velikost"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Zakrij"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Razkrij"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacija morda ne deluje v načinu razdeljenega zaslona."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacija ne podpira načina razdeljenega zaslona."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Aplikacija morda ne deluje v načinu razdeljenega zaslona."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Aplikacija ne podpira načina razdeljenega zaslona."</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"To aplikacijo je mogoče odpreti samo v enem oknu."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacija morda ne bo delovala na sekundarnem zaslonu."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacija ne podpira zagona na sekundarnih zaslonih."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Razdelilnik zaslonov"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Razdelilnik zaslonov"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Razdelilnik zaslonov"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Razdelilnik zaslonov"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Levi v celozaslonski način"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Levi 70 %"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Levi 50 %"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"To ni odpravilo težave?\nDotaknite se za povrnitev"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nimate težav s fotoaparatom? Dotaknite se za opustitev."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Oglejte si in naredite več"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Za razdeljeni zaslon povlecite sem še eno aplikacijo."</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Za razdeljeni zaslon povlecite sem še eno aplikacijo."</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvakrat se dotaknite zunaj aplikacije, če jo želite prestaviti."</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"V redu"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Razširitev za več informacij"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Prekliči"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Znova zaženi"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Ne prikaži več"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Dvakrat se dotaknite, če želite premakniti to aplikacijo"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maksimiraj"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimiraj"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Zapri"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Posnetek zaslona"</string>
     <string name="close_text" msgid="4986518933445178928">"Zapri"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zapri meni"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml
index 0b64d5d..e184ee0 100644
--- a/libs/WindowManager/Shell/res/values-sq/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sq/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ndrysho përmasat"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Fshih"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Mos e fshih"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacioni mund të mos funksionojë me ekranin e ndarë."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacioni nuk mbështet ekranin e ndarë."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Aplikacioni mund të mos funksionojë me ekranin e ndarë"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Aplikacioni nuk mbështet ekranin e ndarë"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Ky aplikacion mund të hapet vetëm në 1 dritare."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacioni mund të mos funksionojë në një ekran dytësor."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacioni nuk mbështet nisjen në ekrane dytësore."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Ndarësi i ekranit të ndarë"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Ndarësi i ekranit të ndarë"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Ndarësi i ekranit të ndarë"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Ndarësi i ekranit të ndarë"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ekrani i plotë majtas"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Majtas 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Majtas 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nuk u rregullua?\nTrokit për ta rikthyer"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nuk ka probleme me kamerën? Trokit për ta shpërfillur."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Shiko dhe bëj më shumë"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Zvarrite në një aplikacion tjetër për ekranin e ndarë"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Zvarrite në një aplikacion tjetër për ekranin e ndarë"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Trokit dy herë jashtë një aplikacioni për ta ripozicionuar"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"E kuptova"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Zgjeroje për më shumë informacion."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Anulo"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Rinis"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Mos e shfaq përsëri"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Trokit dy herë për ta lëvizur këtë aplikacion"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Maksimizo"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimizo"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Mbyll"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Pamja e ekranit"</string>
     <string name="close_text" msgid="4986518933445178928">"Mbyll"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Mbyll menynë"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml
index 8f44eeb..e6be8d3 100644
--- a/libs/WindowManager/Shell/res/values-sr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sr/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Промените величину"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Ставите у тајну меморију"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Уклоните из тајне меморије"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Апликација можда неће радити са подељеним екраном."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Апликација не подржава подељени екран."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Апликација можда неће радити са подељеним екраном."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Апликација не подржава подељени екран."</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Ова апликација може да се отвори само у једном прозору."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Апликација можда неће функционисати на секундарном екрану."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Апликација не подржава покретање на секундарним екранима."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Разделник подељеног екрана"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Разделник подељеног екрана"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Разделник подељеног екрана"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Разделник подељеног екрана"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Режим целог екрана за леви екран"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Леви екран 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Леви екран 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблем није решен?\nДодирните да бисте вратили"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немате проблема са камером? Додирните да бисте одбацили."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Видите и урадите више"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Превуците другу апликацију да бисте користили подељени екран"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Превуците другу апликацију да бисте користили подељени екран"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Двапут додирните изван апликације да бисте променили њену позицију"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Важи"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Проширите за још информација."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Откажи"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Рестартуј"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Не приказуј поново"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Двапут додирните да бисте преместили ову апликацију"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Увећајте"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Умањите"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Затворите"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Снимак екрана"</string>
     <string name="close_text" msgid="4986518933445178928">"Затворите"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Затворите мени"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml
index 1bd744a..a5c4e23 100644
--- a/libs/WindowManager/Shell/res/values-sv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sv/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ändra storlek"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Utför stash"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Återställ stash"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Appen kanske inte fungerar med delad skärm."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Appen har inte stöd för delad skärm."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Appen kanske inte fungerar med delad skärm"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Appen har inte stöd för delad skärm"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Denna app kan bara vara öppen i ett fönster."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Appen kanske inte fungerar på en sekundär skärm."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Appen kan inte köras på en sekundär skärm."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Avdelare för delad skärm"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Avdelare för delad skärm"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Avdelare för delad skärm"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Avdelare för delad skärm"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Helskärm på vänster skärm"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Vänster 70 %"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vänster 50 %"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Löstes inte problemet?\nTryck för att återställa"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Inga problem med kameran? Tryck för att ignorera."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Se och gör mer"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Dra till en annan app för läget Delad skärm"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Dra till en annan app för att dela upp skärmen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Tryck snabbt två gånger utanför en app för att flytta den"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Utöka för mer information."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Avbryt"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Starta om"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Visa inte igen"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Tryck snabbt två gånger för att flytta denna app"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Utöka"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Minimera"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Stäng"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Skärmbild"</string>
     <string name="close_text" msgid="4986518933445178928">"Stäng"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Stäng menyn"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml
index f2f3bbc..f25f7db 100644
--- a/libs/WindowManager/Shell/res/values-sw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sw/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Badilisha ukubwa"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Ficha"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Fichua"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Huenda programu isifanye kazi kwenye skrini inayogawanywa."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Programu haiwezi kutumia skrini iliyogawanywa."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Huenda programu isifanye kazi kwenye skrini iliyogawanywa"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Programu haifanyi kazi kwenye skrini iliyogawanywa"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Programu hii inaweza kufunguliwa katika dirisha 1 pekee."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Huenda programu isifanye kazi kwenye dirisha lingine."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Programu hii haiwezi kufunguliwa kwenye madirisha mengine."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Kitenganishi cha skrini inayogawanywa"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Kitenganishi cha kugawa skrini"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Kitenganishi cha kugawa skrini"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Kitenganishi cha kugawa skrini"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Skrini nzima ya kushoto"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Kushoto 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kushoto 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Umeshindwa kurekebisha?\nGusa ili urejeshe nakala ya awali"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Je, hakuna hitilafu za kamera? Gusa ili uondoe."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Angalia na ufanye zaidi"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Buruta ndani programu nyingine ili utumie hali ya skrini iliyogawanywa"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Buruta katika programu nyingine ili utumie skrini iliyogawanywa"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Gusa mara mbili nje ya programu ili uihamishe"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Nimeelewa"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Panua ili upate maelezo zaidi."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Ghairi"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Zima kisha uwashe"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Usionyeshe tena"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Gusa mara mbili ili usogeze programu hii"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Panua"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Punguza"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Funga"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Picha ya skrini"</string>
     <string name="close_text" msgid="4986518933445178928">"Funga"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Funga Menyu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml
index 10f040b..b150164 100644
--- a/libs/WindowManager/Shell/res/values-ta/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ta/strings.xml
@@ -32,13 +32,17 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"அளவு மாற்று"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Stash"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Unstash"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"திரைப் பிரிப்பு அம்சத்தில் ஆப்ஸ் செயல்படாமல் போகக்கூடும்."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"திரையைப் பிரிப்பதைப் ஆப்ஸ் ஆதரிக்கவில்லை."</string>
+    <!-- no translation found for dock_forced_resizable (7429086980048964687) -->
+    <skip />
+    <!-- no translation found for dock_non_resizeble_failed_to_dock_text (2733543750291266047) -->
+    <skip />
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"இந்த ஆப்ஸை 1 சாளரத்தில் மட்டுமே திறக்க முடியும்."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"இரண்டாம்நிலைத் திரையில் ஆப்ஸ் வேலை செய்யாமல் போகக்கூடும்."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"இரண்டாம்நிலைத் திரைகளில் பயன்பாட்டைத் தொடங்க முடியாது."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"திரையைப் பிரிக்கும் பிரிப்பான்"</string>
-    <string name="divider_title" msgid="5482989479865361192">"திரைப் பிரிப்பான்"</string>
+    <!-- no translation found for accessibility_divider (6407584574218956849) -->
+    <skip />
+    <!-- no translation found for divider_title (1963391955593749442) -->
+    <skip />
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"இடது புறம் முழுத் திரை"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"இடது புறம் 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"இடது புறம் 50%"</string>
@@ -68,8 +72,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"கீழே வலதுபுறமாக நகர்த்து"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> அமைப்புகள்"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"குமிழை அகற்று"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"குமிழ்களைக் காட்ட வேண்டாம்"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"உரையாடலைக் குமிழாக்காதே"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"குமிழ்களைப் பயன்படுத்தி அரட்டையடியுங்கள்"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"புதிய உரையாடல்கள் மிதக்கும் ஐகான்களாகவோ குமிழ்களாகவோ தோன்றும். குமிழைத் திறக்க தட்டவும். நகர்த்த இழுக்கவும்."</string>
@@ -86,7 +89,8 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"சிக்கல்கள் சரிசெய்யப்படவில்லையா?\nமாற்றியமைக்க தட்டவும்"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"கேமரா தொடர்பான சிக்கல்கள் எதுவும் இல்லையா? நிராகரிக்க தட்டவும்."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"பலவற்றைப் பார்த்தல் மற்றும் செய்தல்"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"திரைப் பிரிப்புக்கு மற்றொரு ஆப்ஸை இழுக்கலாம்"</string>
+    <!-- no translation found for letterbox_education_split_screen_text (449233070804658627) -->
+    <skip />
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ஆப்ஸை இடம் மாற்ற அதன் வெளியில் இருமுறை தட்டலாம்"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"சரி"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"கூடுதல் தகவல்களுக்கு விரிவாக்கலாம்."</string>
@@ -95,6 +99,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"ரத்துசெய்"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"மீண்டும் தொடங்கு"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"மீண்டும் காட்டாதே"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"இந்த ஆப்ஸை நகர்த்த இருமுறை தட்டவும்"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"பெரிதாக்கும்"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"சிறிதாக்கும்"</string>
     <string name="close_button_text" msgid="2913281996024033299">"மூடும்"</string>
@@ -110,4 +115,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"ஸ்கிரீன்ஷாட்"</string>
     <string name="close_text" msgid="4986518933445178928">"மூடும்"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"மெனுவை மூடும்"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml
index 581a5ab..c75930b 100644
--- a/libs/WindowManager/Shell/res/values-te/strings.xml
+++ b/libs/WindowManager/Shell/res/values-te/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"సైజ్‌ మార్చు"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"స్టాచ్"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"ఆన్‌స్టాచ్"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"స్క్రీన్ విభజనతో యాప్‌ పని చేయకపోవచ్చు."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"యాప్‌లో స్క్రీన్ విభజనకు మద్దతు లేదు."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"స్ప్లిట్ స్క్రీన్‌తో యాప్ పని చేయకపోవచ్చు"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"యాప్‌లో స్ప్లిట్ స్క్రీన్‌కు సపోర్ట్ లేదు"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"ఈ యాప్‌ను 1 విండోలో మాత్రమే తెరవవచ్చు."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ప్రత్యామ్నాయ డిస్‌ప్లేలో యాప్ పని చేయకపోవచ్చు."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ప్రత్యామ్నాయ డిస్‌ప్లేల్లో ప్రారంభానికి యాప్ మద్దతు లేదు."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"విభజన స్క్రీన్ విభాగిని"</string>
-    <string name="divider_title" msgid="5482989479865361192">"స్ప్లిట్ స్క్రీన్ డివైడర్"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"స్ప్లిట్ స్క్రీన్ డివైడర్"</string>
+    <string name="divider_title" msgid="1963391955593749442">"స్ప్లిట్ స్క్రీన్ డివైడర్"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ఎడమవైపు ఫుల్-స్క్రీన్‌"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ఎడమవైపు 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ఎడమవైపు 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"దాని సమస్యను పరిష్కరించలేదా?\nపూర్వస్థితికి మార్చడానికి ట్యాప్ చేయండి"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"కెమెరా సమస్యలు లేవా? తీసివేయడానికి ట్యాప్ చేయండి."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"చూసి, మరిన్ని చేయండి"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"స్ప్లిట్-స్క్రీన్ కోసం మరొక యాప్‌లోకి లాగండి"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"స్ప్లిట్ స్క్రీన్ కోసం మరొక యాప్‌లోకి లాగండి"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"యాప్ స్థానాన్ని మార్చడానికి దాని వెలుపల డబుల్-ట్యాప్ చేయండి"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"అర్థమైంది"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"మరింత సమాచారం కోసం విస్తరించండి."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"రద్దు చేయండి"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"రీస్టార్ట్ చేయండి"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"మళ్లీ చూపవద్దు"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"ఈ యాప్‌ను తరలించడానికి డబుల్-ట్యాప్ చేయండి"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"గరిష్టీకరించండి"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"కుదించండి"</string>
     <string name="close_button_text" msgid="2913281996024033299">"మూసివేయండి"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"స్క్రీన్‌షాట్"</string>
     <string name="close_text" msgid="4986518933445178928">"మూసివేయండి"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"మెనూను మూసివేయండి"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml
index 44afb58..22368c0 100644
--- a/libs/WindowManager/Shell/res/values-th/strings.xml
+++ b/libs/WindowManager/Shell/res/values-th/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ปรับขนาด"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"เก็บเข้าที่เก็บส่วนตัว"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"เอาออกจากที่เก็บส่วนตัว"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"แอปอาจใช้ไม่ได้กับโหมดแบ่งหน้าจอ"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"แอปไม่สนับสนุนการแยกหน้าจอ"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"แอปอาจใช้ไม่ได้กับโหมดแยกหน้าจอ"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"แอปไม่รองรับการแยกหน้าจอ"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"แอปนี้เปิดได้ใน 1 หน้าต่างเท่านั้น"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"แอปอาจไม่ทำงานในจอแสดงผลรอง"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"แอปไม่รองรับการเรียกใช้ในจอแสดงผลรอง"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"เส้นแบ่งหน้าจอ"</string>
-    <string name="divider_title" msgid="5482989479865361192">"เส้นแยกหน้าจอ"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"เส้นแยกหน้าจอ"</string>
+    <string name="divider_title" msgid="1963391955593749442">"เส้นแยกหน้าจอ"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"เต็มหน้าจอทางซ้าย"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ซ้าย 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ซ้าย 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"หากไม่ได้แก้ไข\nแตะเพื่อเปลี่ยนกลับ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"หากไม่พบปัญหากับกล้อง แตะเพื่อปิด"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"รับชมและทำสิ่งต่างๆ ได้มากขึ้น"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"ลากไปไว้ในแอปอื่นเพื่อแยกหน้าจอ"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ลากไปไว้ในแอปอื่นเพื่อแยกหน้าจอ"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"แตะสองครั้งด้านนอกแอปเพื่อเปลี่ยนตำแหน่ง"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"รับทราบ"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"ขยายเพื่อดูข้อมูลเพิ่มเติม"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"ยกเลิก"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"รีสตาร์ท"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"ไม่ต้องแสดงข้อความนี้อีก"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"แตะสองครั้งเพื่อย้ายแอปนี้"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"ขยายใหญ่สุด"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"ย่อ"</string>
     <string name="close_button_text" msgid="2913281996024033299">"ปิด"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"ภาพหน้าจอ"</string>
     <string name="close_text" msgid="4986518933445178928">"ปิด"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"ปิดเมนู"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml
index d287e9d..de25366 100644
--- a/libs/WindowManager/Shell/res/values-tl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tl/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"I-resize"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"I-stash"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"I-unstash"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Posibleng hindi gumana ang app sa split screen."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Hindi sinusuportahan ng app ang split-screen."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Posibleng hindi gumana sa split screen ang app"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Hindi sinusuportahan ng app ang split-screen"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Sa 1 window lang puwedeng buksan ang app na ito."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Maaaring hindi gumana ang app sa pangalawang display."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Hindi sinusuportahan ng app ang paglulunsad sa mga pangalawang display."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Divider ng split-screen"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Divider ng split-screen"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Divider ng split screen"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Divider ng split screen"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"I-full screen ang nasa kaliwa"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Gawing 70% ang nasa kaliwa"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Gawing 50% ang nasa kaliwa"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Hindi ito naayos?\nI-tap para i-revert"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Walang isyu sa camera? I-tap para i-dismiss."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Tumingin at gumawa ng higit pa"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Mag-drag ng ibang app para sa split screen"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Mag-drag ng isa pang app para sa split screen"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Mag-double tap sa labas ng app para baguhin ang posisyon nito"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"I-expand para sa higit pang impormasyon."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Kanselahin"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"I-restart"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Huwag nang ipakita ulit"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"I-double tap para ilipat ang app na ito"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"I-maximize"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"I-minimize"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Isara"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string>
     <string name="close_text" msgid="4986518933445178928">"Isara"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Isara ang Menu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml
index 969e403..bf4feda 100644
--- a/libs/WindowManager/Shell/res/values-tr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tr/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Yeniden boyutlandır"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Depola"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Depolama"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Uygulama bölünmüş ekranda çalışmayabilir."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Uygulama bölünmüş ekranı desteklemiyor."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Uygulama bölünmüş ekranda çalışmayabilir"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Uygulama bölünmüş ekranı desteklemiyor."</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Bu uygulama yalnızca 1 pencerede açılabilir."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Uygulama ikincil ekranda çalışmayabilir."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Uygulama ikincil ekranlarda başlatılmayı desteklemiyor."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Bölünmüş ekran ayırıcı"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Bölünmüş ekran ayırıcı"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Bölünmüş ekran ayırıcı"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Bölünmüş ekran ayırıcı"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Solda tam ekran"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Solda %70"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Solda %50"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Sağ alta taşı"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ayarları"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"Baloncuğu kapat"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"Bildirim baloncuğu gösterme"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Görüşmeyi baloncuk olarak görüntüleme"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"Baloncukları kullanarak sohbet edin"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"Yeni görüşmeler kayan simgeler veya baloncuk olarak görünür. Açmak için baloncuğa dokunun. Baloncuğu taşımak için sürükleyin."</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bu işlem sorunu düzeltmedi mi?\nİşlemi geri almak için dokunun"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kameranızda sorun yok mu? Kapatmak için dokunun."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Daha fazlasını görün ve yapın"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Bölünmüş ekran için başka bir uygulamayı sürükleyin"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Bölünmüş ekran için başka bir uygulamayı sürükleyin"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Yeniden konumlandırmak için uygulamanın dışına iki kez dokunun"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Anladım"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Daha fazla bilgi için genişletin."</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"İptal"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Yeniden başlat"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Bir daha gösterme"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Bu uygulamayı taşımak için iki kez dokunun"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Ekranı Kapla"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Küçült"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Kapat"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Ekran görüntüsü"</string>
     <string name="close_text" msgid="4986518933445178928">"Kapat"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Menüyü kapat"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-tvdpi/dimen.xml b/libs/WindowManager/Shell/res/values-tvdpi/dimen.xml
index 0b61d7a..adbf656 100644
--- a/libs/WindowManager/Shell/res/values-tvdpi/dimen.xml
+++ b/libs/WindowManager/Shell/res/values-tvdpi/dimen.xml
@@ -36,7 +36,9 @@
     <dimen name="pip_menu_arrow_size">24dp</dimen>
     <dimen name="pip_menu_arrow_elevation">5dp</dimen>
 
-    <dimen name="pip_menu_elevation">1dp</dimen>
+    <dimen name="pip_menu_elevation_no_menu">1dp</dimen>
+    <dimen name="pip_menu_elevation_move_menu">7dp</dimen>
+    <dimen name="pip_menu_elevation_all_actions_menu">4dp</dimen>
 
     <dimen name="pip_menu_edu_text_view_height">24dp</dimen>
     <dimen name="pip_menu_edu_text_home_icon">9sp</dimen>
diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml
index e265e2f..2800e4c 100644
--- a/libs/WindowManager/Shell/res/values-uk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uk/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Змінити розмір"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Сховати"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Показати"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Додаток може не працювати в режимі розділеного екрана."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Додаток не підтримує розділення екрана."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Додаток може не працювати в режимі розділення екрана"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Додаток не підтримує розділення екрана"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Цей додаток можна відкрити лише в одному вікні."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Додаток може не працювати на додатковому екрані."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Додаток не підтримує запуск на додаткових екранах."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Розділювач екрана"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Розділювач екрана"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Розділювач екрана"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Розділювач екрана"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ліве вікно на весь екран"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Ліве вікно на 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ліве вікно на 50%"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Перемістити праворуч униз"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"Налаштування параметра \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\""</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"Закрити підказку"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"Не показувати спливаючі чати"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Не показувати спливаючі чати для розмов"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"Спливаючий чат"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"Нові повідомлення чату з\'являються у вигляді спливаючих значків. Щоб відкрити чат, натисніть його, а щоб перемістити – перетягніть."</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблему не вирішено?\nНатисніть, щоб скасувати зміни"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немає проблем із камерою? Торкніться, щоб закрити."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Більше простору та можливостей"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Щоб перейти в режим розділення екрана, перетягніть сюди інший додаток"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Щоб перейти в режим розділення екрана, перетягніть сюди інший додаток"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Щоб перемістити додаток, двічі торкніться області поза ним"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"ОK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Розгорніть, щоб дізнатися більше."</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Скасувати"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Перезапустити"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Більше не показувати"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Двічі торкніться, щоб перемістити цей додаток"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Збільшити"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Згорнути"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Закрити"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Знімок екрана"</string>
     <string name="close_text" msgid="4986518933445178928">"Закрити"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Закрити меню"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml
index 5599351..f94ee98 100644
--- a/libs/WindowManager/Shell/res/values-ur/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ur/strings.xml
@@ -21,8 +21,8 @@
     <string name="pip_phone_expand" msgid="2579292903468287504">"پھیلائیں"</string>
     <string name="pip_phone_settings" msgid="5468987116750491918">"ترتیبات"</string>
     <string name="pip_phone_enter_split" msgid="7042877263880641911">"اسپلٹ اسکرین تک رسائی"</string>
-    <string name="pip_menu_title" msgid="5393619322111827096">"مینو"</string>
-    <string name="pip_menu_accessibility_title" msgid="8129016817688656249">"تصویر میں تصویر کا مینو"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"مینیو"</string>
+    <string name="pip_menu_accessibility_title" msgid="8129016817688656249">"تصویر میں تصویر کا مینیو"</string>
     <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> تصویر میں تصویر میں ہے"</string>
     <string name="pip_notification_message" msgid="8854051911700302620">"اگر آپ نہیں چاہتے ہیں کہ <xliff:g id="NAME">%s</xliff:g> اس خصوصیت کا استعمال کرے تو ترتیبات کھولنے کے لیے تھپتھپا کر اسے آف کرے۔"</string>
     <string name="pip_play" msgid="3496151081459417097">"چلائیں"</string>
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"سائز تبدیل کریں"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Stash"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Unstash"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"ممکن ہے کہ ایپ اسپلٹ اسکرین کے ساتھ کام نہ کرے۔"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ایپ سپلٹ اسکرین کو سپورٹ نہیں کرتی۔"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"ممکن ہے کہ ایپ اسپلٹ اسکرین کے ساتھ کام نہ کرے"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"ایپ اسپلٹ اسکرین کو سپورٹ نہیں کرتی ہے"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"یہ ایپ صرف 1 ونڈو میں کھولی جا سکتی ہے۔"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ممکن ہے ایپ ثانوی ڈسپلے پر کام نہ کرے۔"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ایپ ثانوی ڈسپلیز پر شروعات کا تعاون نہیں کرتی۔"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"سپلٹ اسکرین تقسیم کار"</string>
-    <string name="divider_title" msgid="5482989479865361192">"اسپلٹ اسکرین ڈیوائیڈر"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"اسپلٹ اسکرین ڈیوائیڈر"</string>
+    <string name="divider_title" msgid="1963391955593749442">"اسپلٹ اسکرین ڈیوائیڈر"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"بائیں فل اسکرین"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"بائیں %70"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"بائیں %50"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"یہ حل نہیں ہوا؟\nلوٹانے کیلئے تھپتھپائیں"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"کوئی کیمرے کا مسئلہ نہیں ہے؟ برخاست کرنے کیلئے تھپتھپائیں۔"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"دیکھیں اور بہت کچھ کریں"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"اسپلٹ اسکرین کے ليے دوسری ایپ میں گھسیٹیں"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"اسپلٹ اسکرین کے ليے دوسری ایپ میں گھسیٹیں"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"کسی ایپ کی پوزیشن تبدیل کرنے کے لیے اس ایپ کے باہر دو بار تھپتھپائیں"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"سمجھ آ گئی"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"مزید معلومات کے لیے پھیلائیں۔"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"منسوخ کریں"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"ری اسٹارٹ کریں"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"دوبارہ نہ دکھائیں"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"اس ایپ کو منتقل کرنے کیلئے دو بار تھپتھپائیں"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"بڑا کریں"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"چھوٹا کریں"</string>
     <string name="close_button_text" msgid="2913281996024033299">"بند کریں"</string>
@@ -108,5 +109,7 @@
     <string name="select_text" msgid="5139083974039906583">"منتخب کریں"</string>
     <string name="screenshot_text" msgid="1477704010087786671">"اسکرین شاٹ"</string>
     <string name="close_text" msgid="4986518933445178928">"بند کریں"</string>
-    <string name="collapse_menu_text" msgid="7515008122450342029">"مینو بند کریں"</string>
+    <string name="collapse_menu_text" msgid="7515008122450342029">"مینیو بند کریں"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-ur/strings_tv.xml b/libs/WindowManager/Shell/res/values-ur/strings_tv.xml
index 42b9564..d0f011c 100644
--- a/libs/WindowManager/Shell/res/values-ur/strings_tv.xml
+++ b/libs/WindowManager/Shell/res/values-ur/strings_tv.xml
@@ -25,7 +25,7 @@
     <string name="pip_expand" msgid="1051966011679297308">"پھیلائیں"</string>
     <string name="pip_collapse" msgid="3903295106641385962">"سکیڑیں"</string>
     <string name="pip_edu_text" msgid="7930546669915337998">"کنٹرولز کے لیے "<annotation icon="home_icon">"ہوم "</annotation>" کو دو بار دبائیں"</string>
-    <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"تصویر میں تصویر کا مینو۔"</string>
+    <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"تصویر میں تصویر کا مینیو۔"</string>
     <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"دائیں منتقل کریں"</string>
     <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"بائیں منتقل کریں"</string>
     <string name="a11y_action_pip_move_up" msgid="98502616918621959">"اوپر منتقل کریں"</string>
diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml
index 54898156..ac7cc72 100644
--- a/libs/WindowManager/Shell/res/values-uz/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uz/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Oʻlchamini oʻzgartirish"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Berkitish"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Chiqarish"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Bu ilova ekranni ikkiga ajratish rejimini dastaklamaydi."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Bu ilova ekranni bo‘lish xususiyatini qo‘llab-quvvatlamaydi."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Bu ilovada ekranni ikkiga ajratish rejimi ishlamaydi."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"Bu ilovada ekranni ikkiga ajratish ishlamaydi."</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Bu ilovani faqat 1 ta oynada ochish mumkin."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Bu ilova qo‘shimcha ekranda ishlamasligi mumkin."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Bu ilova qo‘shimcha ekranlarda ishga tushmaydi."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Ekranni ikkiga bo‘lish chizig‘i"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Ekranni ikkiga ajratish chizigʻi"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Ekranni ikkiga ajratish chizigʻi"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Ekranni ikkiga ajratish chizigʻi"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Chapda to‘liq ekran"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Chapda 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Chapda 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tuzatilmadimi?\nQaytarish uchun bosing"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera muammosizmi? Yopish uchun bosing."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Yana boshqa amallar"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Ekranni ikkiga ajratish uchun boshqa ilovani bu yerga torting"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Ekranni ikkiga ajratish uchun boshqa ilovani bu yerga torting"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Qayta joylash uchun ilova tashqarisiga ikki marta bosing"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Batafsil axborot olish uchun kengaytiring."</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Bekor qilish"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Qaytadan"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Boshqa chiqmasin"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Bu ilovaga olish uchun ikki marta bosing"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Yoyish"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Kichraytirish"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Yopish"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Skrinshot"</string>
     <string name="close_text" msgid="4986518933445178928">"Yopish"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Menyuni yopish"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml
index bb144a7..fab5ec1 100644
--- a/libs/WindowManager/Shell/res/values-vi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-vi/strings.xml
@@ -32,13 +32,17 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Đổi kích thước"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Ẩn"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Hiện"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Ứng dụng có thể không hoạt động với tính năng chia đôi màn hình."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Ứng dụng không hỗ trợ chia đôi màn hình."</string>
+    <!-- no translation found for dock_forced_resizable (7429086980048964687) -->
+    <skip />
+    <!-- no translation found for dock_non_resizeble_failed_to_dock_text (2733543750291266047) -->
+    <skip />
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Ứng dụng này chỉ có thể mở 1 cửa sổ."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Ứng dụng có thể không hoạt động trên màn hình phụ."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Ứng dụng không hỗ trợ khởi chạy trên màn hình phụ."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Bộ chia chia đôi màn hình"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Bộ chia màn hình"</string>
+    <!-- no translation found for accessibility_divider (6407584574218956849) -->
+    <skip />
+    <!-- no translation found for divider_title (1963391955593749442) -->
+    <skip />
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Toàn màn hình bên trái"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Trái 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Trái 50%"</string>
@@ -85,7 +89,8 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bạn chưa khắc phục vấn đề?\nHãy nhấn để hủy bỏ"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Không có vấn đề với máy ảnh? Hãy nhấn để đóng."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Xem và làm được nhiều việc hơn"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Kéo vào một ứng dụng khác để chia đôi màn hình"</string>
+    <!-- no translation found for letterbox_education_split_screen_text (449233070804658627) -->
+    <skip />
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Nhấn đúp bên ngoài ứng dụng để đặt lại vị trí"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Mở rộng để xem thêm thông tin."</string>
@@ -94,6 +99,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Huỷ"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Khởi động lại"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Không hiện lại"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Nhấn đúp để di chuyển ứng dụng này"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Phóng to"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Thu nhỏ"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Đóng"</string>
@@ -109,4 +115,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Ảnh chụp màn hình"</string>
     <string name="close_text" msgid="4986518933445178928">"Đóng"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Đóng trình đơn"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
index 4b2ee18..5cf7ab2 100644
--- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"调整大小"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"隐藏"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"取消隐藏"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"应用可能无法在分屏模式下正常运行。"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"应用不支持分屏。"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"应用可能无法在分屏模式下正常运行"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"应用不支持分屏"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"此应用只能在 1 个窗口中打开。"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"应用可能无法在辅显示屏上正常运行。"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"应用不支持在辅显示屏上启动。"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"分屏分隔线"</string>
-    <string name="divider_title" msgid="5482989479865361192">"分屏分隔线"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"分屏分隔线"</string>
+    <string name="divider_title" msgid="1963391955593749442">"分屏分隔线"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"左侧全屏"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"左侧 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"左侧 50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"没有解决此问题?\n点按即可恢复"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相机没有问题?点按即可忽略。"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"查看和处理更多任务"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"拖入另一个应用,即可使用分屏模式"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"拖入另一个应用,即可使用分屏模式"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"在某个应用外连续点按两次,即可调整它的位置"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"知道了"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"展开即可了解详情。"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"取消"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"重启"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"不再显示"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"点按两次即可移动此应用"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"最大化"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"最小化"</string>
     <string name="close_button_text" msgid="2913281996024033299">"关闭"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"屏幕截图"</string>
     <string name="close_text" msgid="4986518933445178928">"关闭"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"关闭菜单"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
index 7a2d348..03a1438 100644
--- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"調整大小"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"保護"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"取消保護"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"應用程式可能無法在分割畫面中運作。"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"應用程式不支援分割畫面。"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"應用程式可能無法在分割螢幕中運作"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"應用程式不支援分割螢幕"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"此應用程式只可在 1 個視窗中開啟"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"應用程式可能無法在次要顯示屏上運作。"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"應用程式無法在次要顯示屏上啟動。"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"分割畫面分隔線"</string>
-    <string name="divider_title" msgid="5482989479865361192">"分割螢幕分隔線"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"分割螢幕分隔線"</string>
+    <string name="divider_title" msgid="1963391955593749442">"分割螢幕分隔線"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"左邊全螢幕"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"左邊 70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"左邊 50%"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"移去右下角"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"「<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>」設定"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"關閉小視窗氣泡"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"不要顯示對話氣泡"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"不要透過小視窗顯示對話"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"使用小視窗進行即時通訊"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"新對話會以浮動圖示 (小視窗) 顯示。輕按即可開啟小視窗。拖曳即可移動小視窗。"</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未能修正問題?\n輕按即可還原"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機冇問題?㩒一下就可以即可閂咗佢。"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"瀏覽更多內容及執行更多操作"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"拖入另一個應用程式即可分割螢幕"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"拖入另一個應用程式即可分割螢幕"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"在應用程式外輕按兩下即可調整位置"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"知道了"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"展開即可查看詳情。"</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"取消"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"重新啟動"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"不要再顯示"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"輕按兩下即可移動此應用程式"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"最大化"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"最小化"</string>
     <string name="close_button_text" msgid="2913281996024033299">"關閉"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"螢幕截圖"</string>
     <string name="close_text" msgid="4986518933445178928">"關閉"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"關閉選單"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
index b0ccd8a..d0e52b4 100644
--- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"調整大小"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"暫時隱藏"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"取消暫時隱藏"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"應用程式可能無法在分割畫面中運作。"</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"這個應用程式不支援分割畫面。"</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"應用程式可能無法在分割畫面中運作"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"這個應用程式不支援分割畫面"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"這個應用程式只能在 1 個視窗中開啟。"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"應用程式可能無法在次要顯示器上運作。"</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"應用程式無法在次要顯示器上啟動。"</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"分割畫面分隔線"</string>
-    <string name="divider_title" msgid="5482989479865361192">"分割畫面分隔線"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"分割畫面分隔線"</string>
+    <string name="divider_title" msgid="1963391955593749442">"分割畫面分隔線"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"以全螢幕顯示左側畫面"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"以 70% 的螢幕空間顯示左側畫面"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"以 50% 的螢幕空間顯示左側畫面"</string>
@@ -68,8 +68,7 @@
     <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"移至右下方"</string>
     <string name="bubbles_app_settings" msgid="3617224938701566416">"「<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>」設定"</string>
     <string name="bubble_dismiss_text" msgid="8816558050659478158">"關閉對話框"</string>
-    <!-- no translation found for bubbles_dont_bubble (3216183855437329223) -->
-    <skip />
+    <string name="bubbles_dont_bubble" msgid="3216183855437329223">"不要顯示對話框"</string>
     <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"不要以對話框形式顯示對話"</string>
     <string name="bubbles_user_education_title" msgid="2112319053732691899">"透過對話框來聊天"</string>
     <string name="bubbles_user_education_description" msgid="4215862563054175407">"新的對話會以浮動圖示或對話框形式顯示。輕觸即可開啟對話框,拖曳則可移動對話框。"</string>
@@ -86,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未修正問題嗎?\n輕觸即可還原"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機沒問題嗎?輕觸即可關閉。"</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"瀏覽更多內容及執行更多操作"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"拖進另一個應用程式即可使用分割畫面模式"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"拖進另一個應用程式即可使用分割畫面模式"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"在應用程式外輕觸兩下即可調整位置"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"我知道了"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"展開即可查看詳細資訊。"</string>
@@ -95,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"取消"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"重新啟動"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"不要再顯示"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"輕觸兩下可移動這個應用程式"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"最大化"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"最小化"</string>
     <string name="close_button_text" msgid="2913281996024033299">"關閉"</string>
@@ -110,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"螢幕截圖"</string>
     <string name="close_text" msgid="4986518933445178928">"關閉"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"關閉選單"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml
index 1a6e46c..0eb3148 100644
--- a/libs/WindowManager/Shell/res/values-zu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zu/strings.xml
@@ -32,13 +32,13 @@
     <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Shintsha usayizi"</string>
     <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Yenza isiteshi"</string>
     <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Susa isiteshi"</string>
-    <string name="dock_forced_resizable" msgid="1749750436092293116">"Izinhlelo zokusebenza kungenzeka zingasebenzi ngesikrini esihlukanisiwe."</string>
-    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Uhlelo lokusebenza alusekeli isikrini esihlukanisiwe."</string>
+    <string name="dock_forced_resizable" msgid="7429086980048964687">"Ama-app okungenzeka angasebenzi ngesikrini esihlukanisiwe"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"I-app ayisekeli isikrini esihlukanisiwe."</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5242868470666346929">"Le-app ingavulwa kuphela ewindini eli-1."</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Uhlelo lokusebenza kungenzeka lungasebenzi kusibonisi sesibili."</string>
     <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Uhlelo lokusebenza alusekeli ukuqalisa kuzibonisi zesibili."</string>
-    <string name="accessibility_divider" msgid="703810061635792791">"Isihlukanisi sokuhlukanisa isikrini"</string>
-    <string name="divider_title" msgid="5482989479865361192">"Isihlukanisi sokuhlukanisa isikrini"</string>
+    <string name="accessibility_divider" msgid="6407584574218956849">"Isihlukanisi sokuhlukanisa isikrini"</string>
+    <string name="divider_title" msgid="1963391955593749442">"Isihlukanisi sokuhlukanisa isikrini"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Isikrini esigcwele esingakwesokunxele"</string>
     <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Kwesokunxele ngo-70%"</string>
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kwesokunxele ngo-50%"</string>
@@ -85,7 +85,7 @@
     <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Akuyilungisanga?\nThepha ukuze ubuyele"</string>
     <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Azikho izinkinga zekhamera? Thepha ukuze ucashise."</string>
     <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Bona futhi wenze okuningi"</string>
-    <string name="letterbox_education_split_screen_text" msgid="6206339484068670830">"Hudula kwenye i-app mayelana nokuhlukanisa isikrini"</string>
+    <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Hudula kwenye i-app mayelana nokuhlukanisa isikrini"</string>
     <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Thepha kabili ngaphandle kwe-app ukuze uyimise kabusha"</string>
     <string name="letterbox_education_got_it" msgid="4057634570866051177">"Ngiyezwa"</string>
     <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"Nweba ukuze uthole ulwazi olwengeziwe"</string>
@@ -94,6 +94,7 @@
     <string name="letterbox_restart_cancel" msgid="1342209132692537805">"Khansela"</string>
     <string name="letterbox_restart_restart" msgid="8529976234412442973">"Qala kabusha"</string>
     <string name="letterbox_restart_dialog_checkbox_title" msgid="5252918008140768386">"Ungabonisi futhi"</string>
+    <string name="letterbox_reachability_reposition_text" msgid="4507890186297500893">"Thepha kabili ukuze uhambise le-app"</string>
     <string name="maximize_button_text" msgid="1650859196290301963">"Khulisa"</string>
     <string name="minimize_button_text" msgid="271592547935841753">"Nciphisa"</string>
     <string name="close_button_text" msgid="2913281996024033299">"Vala"</string>
@@ -109,4 +110,6 @@
     <string name="screenshot_text" msgid="1477704010087786671">"Isithombe-skrini"</string>
     <string name="close_text" msgid="4986518933445178928">"Vala"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Vala Imenyu"</string>
+    <!-- no translation found for expand_menu_text (3847736164494181168) -->
+    <skip />
 </resources>
diff --git a/libs/WindowManager/Shell/res/values/colors.xml b/libs/WindowManager/Shell/res/values/colors.xml
index 4a1635d..c487e4a 100644
--- a/libs/WindowManager/Shell/res/values/colors.xml
+++ b/libs/WindowManager/Shell/res/values/colors.xml
@@ -45,9 +45,6 @@
     <!-- Letterbox Dialog -->
     <color name="letterbox_dialog_background">@android:color/system_neutral1_900</color>
 
-    <!-- Reachability Education color for hand icon and text-->
-    <color name="letterbox_reachability_education_item_color">#BFC8CC</color>
-
     <!-- GM2 colors -->
     <color name="GM2_grey_200">#E8EAED</color>
     <color name="GM2_grey_700">#5F6368</color>
@@ -67,4 +64,7 @@
     <color name="desktop_mode_caption_close_button_dark">#1C1C17</color>
     <color name="desktop_mode_caption_app_name_light">#EFF1F2</color>
     <color name="desktop_mode_caption_app_name_dark">#1C1C17</color>
+    <color name="desktop_mode_caption_menu_text_color">#191C1D</color>
+    <color name="desktop_mode_caption_menu_buttons_color_inactive">#191C1D</color>
+    <color name="desktop_mode_caption_menu_buttons_color_active">#00677E</color>
 </resources>
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index 3a8614a..2be34c9 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -228,6 +228,8 @@
     <dimen name="bubble_user_education_stack_padding">16dp</dimen>
     <!-- Size of the bubble bar (height), should match transient_taskbar_size in Launcher. -->
     <dimen name="bubblebar_size">72dp</dimen>
+    <!-- The size of the drag handle / menu shown along with a bubble bar expanded view. -->
+    <dimen name="bubblebar_expanded_view_menu_size">16dp</dimen>
 
     <!-- Bottom and end margin for compat buttons. -->
     <dimen name="compat_button_margin">24dp</dimen>
@@ -332,9 +334,6 @@
     <!-- The margin between the reachability dialog container and its parent. -->
     <dimen name="letterbox_reachability_education_dialog_margin">16dp</dimen>
 
-    <!-- The width of each item in the reachability education -->
-    <dimen name="letterbox_reachability_education_item_width">118dp</dimen>
-
     <!-- The size of the icon in the item of reachability education -->
     <dimen name="letterbox_reachability_education_item_image_size">24dp</dimen>
 
@@ -372,20 +371,34 @@
     <!-- Height of button (32dp)  + 2 * margin (5dp each). -->
     <dimen name="freeform_decor_caption_height">42dp</dimen>
 
-    <!-- Width of buttons (32dp each) + padding (128dp total). -->
-    <dimen name="freeform_decor_caption_menu_width">256dp</dimen>
+    <!-- The width of the handle menu in desktop mode. -->
+    <dimen name="desktop_mode_handle_menu_width">216dp</dimen>
 
-    <dimen name="freeform_decor_caption_menu_height">250dp</dimen>
-    <dimen name="freeform_decor_caption_menu_height_no_windowing_controls">210dp</dimen>
+    <!-- The height of the handle menu's "App Info" pill in desktop mode. -->
+    <dimen name="desktop_mode_handle_menu_app_info_pill_height">52dp</dimen>
+
+    <!-- The height of the handle menu's "Windowing" pill in desktop mode. -->
+    <dimen name="desktop_mode_handle_menu_windowing_pill_height">52dp</dimen>
+
+    <!-- The height of the handle menu's "More Actions" pill in desktop mode. -->
+    <dimen name="desktop_mode_handle_menu_more_actions_pill_height">156dp</dimen>
+
+    <!-- The top margin of the handle menu in desktop mode. -->
+    <dimen name="desktop_mode_handle_menu_margin_top">4dp</dimen>
+
+    <!-- The start margin of the handle menu in desktop mode. -->
+    <dimen name="desktop_mode_handle_menu_margin_start">6dp</dimen>
+
+    <!-- The margin between pills of the handle menu in desktop mode. -->
+    <dimen name="desktop_mode_handle_menu_pill_spacing_margin">2dp</dimen>
+
+    <!-- The radius of the caption menu corners. -->
+    <dimen name="desktop_mode_handle_menu_corner_radius">26dp</dimen>
+
+    <!-- The radius of the caption menu shadow. -->
+    <dimen name="desktop_mode_handle_menu_shadow_radius">2dp</dimen>
 
     <dimen name="freeform_resize_handle">30dp</dimen>
 
     <dimen name="freeform_resize_corner">44dp</dimen>
-
-    <!-- The radius of the caption menu shadow. -->
-    <dimen name="caption_menu_shadow_radius">4dp</dimen>
-
-    <!-- The radius of the caption menu corners. -->
-    <dimen name="caption_menu_corner_radius">20dp</dimen>
-
 </resources>
diff --git a/libs/WindowManager/Shell/res/values/strings.xml b/libs/WindowManager/Shell/res/values/strings.xml
index 395fdd1..87a7c3e 100644
--- a/libs/WindowManager/Shell/res/values/strings.xml
+++ b/libs/WindowManager/Shell/res/values/strings.xml
@@ -228,9 +228,10 @@
          the screen. This time the double-tap can happen on the top or bottom of the screen.
          To teach the user about this feature, we display an education explaining how the double-tap
          works and how the app can be moved on the screen.
-         This is the text we show to the user below an animated icon visualizing the double-tap
-         action. [CHAR LIMIT=NONE] -->
-    <string name="letterbox_reachability_reposition_text">Double-tap to move this app</string>
+         This is the text we show to the user below an icon visualizing the double-tap
+         action. The description should be split in two lines separated by "\n" like for this
+         locale. [CHAR LIMIT=NONE] -->
+    <string name="letterbox_reachability_reposition_text">Double-tap to\nmove this app</string>
 
     <!-- Freeform window caption strings -->
     <!-- Accessibility text for the maximize window button [CHAR LIMIT=NONE] -->
@@ -263,4 +264,6 @@
     <string name="close_text">Close</string>
     <!-- Accessibility text for the handle menu close menu button [CHAR LIMIT=NONE] -->
     <string name="collapse_menu_text">Close Menu</string>
+    <!-- Accessibility text for the handle menu open menu button [CHAR LIMIT=NONE] -->
+    <string name="expand_menu_text">Open Menu</string>
 </resources>
diff --git a/libs/WindowManager/Shell/res/values/styles.xml b/libs/WindowManager/Shell/res/values/styles.xml
index d0782ad..ee80c472 100644
--- a/libs/WindowManager/Shell/res/values/styles.xml
+++ b/libs/WindowManager/Shell/res/values/styles.xml
@@ -30,6 +30,26 @@
         <item name="android:activityCloseExitAnimation">@anim/forced_resizable_exit</item>
     </style>
 
+    <style name="DesktopModeHandleMenuActionButton">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">52dp</item>
+        <item name="android:gravity">start|center_vertical</item>
+        <item name="android:padding">16dp</item>
+        <item name="android:textSize">14sp</item>
+        <item name="android:textFontWeight">500</item>
+        <item name="android:textColor">@color/desktop_mode_caption_menu_text_color</item>
+        <item name="android:drawablePadding">16dp</item>
+        <item name="android:background">?android:selectableItemBackground</item>
+    </style>
+
+    <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>
+
     <style name="CaptionButtonStyle">
         <item name="android:layout_width">32dp</item>
         <item name="android:layout_height">32dp</item>
@@ -37,20 +57,6 @@
         <item name="android:padding">4dp</item>
     </style>
 
-    <style name="CaptionWindowingButtonStyle">
-        <item name="android:layout_width">40dp</item>
-        <item name="android:layout_height">40dp</item>
-        <item name="android:padding">4dp</item>
-    </style>
-
-    <style name="CaptionMenuButtonStyle" parent="@style/Widget.AppCompat.Button.Borderless">
-        <item name="android:layout_width">match_parent</item>
-        <item name="android:layout_height">52dp</item>
-        <item name="android:layout_marginStart">10dp</item>
-        <item name="android:padding">4dp</item>
-        <item name="android:gravity">start|center_vertical</item>
-    </style>
-
     <style name="DockedDividerBackground">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">@dimen/split_divider_bar_width</item>
@@ -145,7 +151,7 @@
         </item>
     </style>
 
-    <style name="ReachabilityEduHandLayout" parent="Theme.AppCompat">
+    <style name="ReachabilityEduHandLayout">
         <item name="android:focusable">false</item>
         <item name="android:focusableInTouchMode">false</item>
         <item name="android:background">@android:color/transparent</item>
@@ -154,7 +160,7 @@
         <item name="android:lineSpacingExtra">-1sp</item>
         <item name="android:textSize">12sp</item>
         <item name="android:textAlignment">center</item>
-        <item name="android:textColor">@color/letterbox_reachability_education_item_color</item>
+        <item name="android:textColor">?android:attr/textColorSecondary</item>
         <item name="android:textAppearance">
             @*android:style/TextAppearance.DeviceDefault.Body2
         </item>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java
index 8cbe44b..e84a78f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java
@@ -52,4 +52,10 @@
      * @param progressThreshold the max threshold to keep progressing back animation.
      */
     void setSwipeThresholds(float triggerThreshold, float progressThreshold);
+
+    /**
+     * Sets the system bar listener to control the system bar color.
+     * @param customizer the controller to control system bar color.
+     */
+    void setStatusBarCustomizer(StatusBarCustomizer customizer);
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationBackground.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationBackground.java
index 36cf29a..9bf3b80 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationBackground.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationBackground.java
@@ -17,11 +17,17 @@
 package com.android.wm.shell.back;
 
 import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
+
+import static com.android.wm.shell.back.BackAnimationConstants.UPDATE_SYSUI_FLAGS_THRESHOLD;
 
 import android.annotation.NonNull;
 import android.graphics.Color;
+import android.graphics.Rect;
 import android.view.SurfaceControl;
 
+import com.android.internal.graphics.ColorUtils;
+import com.android.internal.view.AppearanceRegion;
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
 
 /**
@@ -29,18 +35,35 @@
  */
 public class BackAnimationBackground {
     private static final int BACKGROUND_LAYER = -1;
+
+    private static final int NO_APPEARANCE = 0;
+
     private final RootTaskDisplayAreaOrganizer mRootTaskDisplayAreaOrganizer;
     private SurfaceControl mBackgroundSurface;
 
+    private StatusBarCustomizer mCustomizer;
+    private boolean mIsRequestingStatusBarAppearance;
+    private boolean mBackgroundIsDark;
+    private Rect mStartBounds;
+
     public BackAnimationBackground(RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) {
         mRootTaskDisplayAreaOrganizer = rootTaskDisplayAreaOrganizer;
     }
 
-    void ensureBackground(int color, @NonNull SurfaceControl.Transaction transaction) {
+    /**
+     * Ensures the back animation background color layer is present.
+     * @param startRect The start bounds of the closing target.
+     * @param color The background color.
+     * @param transaction The animation transaction.
+     */
+    void ensureBackground(Rect startRect, int color,
+            @NonNull SurfaceControl.Transaction transaction) {
         if (mBackgroundSurface != null) {
             return;
         }
 
+        mBackgroundIsDark = ColorUtils.calculateLuminance(color) < 0.5f;
+
         final float[] colorComponents = new float[] { Color.red(color) / 255.f,
                 Color.green(color) / 255.f, Color.blue(color) / 255.f };
 
@@ -54,6 +77,8 @@
         transaction.setColor(mBackgroundSurface, colorComponents)
                 .setLayer(mBackgroundSurface, BACKGROUND_LAYER)
                 .show(mBackgroundSurface);
+        mStartBounds = startRect;
+        mIsRequestingStatusBarAppearance = false;
     }
 
     void removeBackground(@NonNull SurfaceControl.Transaction transaction) {
@@ -65,5 +90,31 @@
             transaction.remove(mBackgroundSurface);
         }
         mBackgroundSurface = null;
+        mIsRequestingStatusBarAppearance = false;
+    }
+
+    void setStatusBarCustomizer(StatusBarCustomizer customizer) {
+        mCustomizer = customizer;
+    }
+
+    void onBackProgressed(float progress) {
+        if (mCustomizer == null || mStartBounds.isEmpty()) {
+            return;
+        }
+
+        final boolean shouldCustomizeSystemBar = progress > UPDATE_SYSUI_FLAGS_THRESHOLD;
+        if (shouldCustomizeSystemBar == mIsRequestingStatusBarAppearance) {
+            return;
+        }
+
+        mIsRequestingStatusBarAppearance = shouldCustomizeSystemBar;
+        if (mIsRequestingStatusBarAppearance) {
+            final AppearanceRegion region = new AppearanceRegion(!mBackgroundIsDark
+                    ? APPEARANCE_LIGHT_STATUS_BARS : NO_APPEARANCE,
+                    mStartBounds);
+            mCustomizer.customizeStatusBarAppearance(region);
+        } else {
+            mCustomizer.customizeStatusBarAppearance(null);
+        }
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationConstants.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationConstants.java
new file mode 100644
index 0000000..e06d3ef
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationConstants.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.back;
+
+/**
+ * The common constant values used in back animators.
+ */
+class BackAnimationConstants {
+    static final float UPDATE_SYSUI_FLAGS_THRESHOLD = 0.20f;
+    static final float PROGRESS_COMMIT_THRESHOLD = 0.1f;
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
index 6f993ae..210c9aa 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
@@ -55,6 +55,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.protolog.common.ProtoLog;
+import com.android.internal.view.AppearanceRegion;
 import com.android.wm.shell.common.ExternalInterfaceBinder;
 import com.android.wm.shell.common.RemoteCallable;
 import com.android.wm.shell.common.ShellExecutor;
@@ -142,6 +143,7 @@
             });
 
     private final BackAnimationBackground mAnimationBackground;
+    private StatusBarCustomizer mCustomizer;
 
     public BackAnimationController(
             @NonNull ShellInit shellInit,
@@ -268,6 +270,12 @@
             mShellExecutor.execute(() -> BackAnimationController.this.setSwipeThresholds(
                     triggerThreshold, progressThreshold));
         }
+
+        @Override
+        public void setStatusBarCustomizer(StatusBarCustomizer customizer) {
+            mCustomizer = customizer;
+            mAnimationBackground.setStatusBarCustomizer(customizer);
+        }
     }
 
     private static class IBackAnimationImpl extends IBackAnimation.Stub
@@ -294,12 +302,23 @@
                             BackNavigationInfo.TYPE_RETURN_TO_HOME));
         }
 
+        public void customizeStatusBarAppearance(AppearanceRegion appearance) {
+            executeRemoteCallWithTaskPermission(mController, "useLauncherSysBarFlags",
+                    (controller) -> controller.customizeStatusBarAppearance(appearance));
+        }
+
         @Override
         public void invalidate() {
             mController = null;
         }
     }
 
+    private void customizeStatusBarAppearance(AppearanceRegion appearance) {
+        if (mCustomizer != null) {
+            mCustomizer.customizeStatusBarAppearance(appearance);
+        }
+    }
+
     void registerAnimation(@BackNavigationInfo.BackTargetType int type,
             @NonNull BackAnimationRunner runner) {
         mAnimationDefinition.set(type, runner);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossActivityAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossActivityAnimation.java
index da113cb..22c9015 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossActivityAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossActivityAnimation.java
@@ -19,6 +19,7 @@
 import static android.view.RemoteAnimationTarget.MODE_CLOSING;
 import static android.view.RemoteAnimationTarget.MODE_OPENING;
 
+import static com.android.wm.shell.back.BackAnimationConstants.PROGRESS_COMMIT_THRESHOLD;
 import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_BACK_PREVIEW;
 
 import android.animation.Animator;
@@ -89,7 +90,6 @@
     private static final float WINDOW_X_SHIFT_DP = 96;
     private static final int SCALE_FACTOR = 100;
     // TODO(b/264710590): Use the progress commit threshold from ViewConfiguration once it exists.
-    private static final float PROGRESS_COMMIT_THRESHOLD = 0.1f;
     private static final float TARGET_COMMIT_PROGRESS = 0.5f;
     private static final float ENTER_ALPHA_THRESHOLD = 0.22f;
 
@@ -184,7 +184,7 @@
         mStartTaskRect.offsetTo(0, 0);
 
         // Draw background with task background color.
-        mBackground.ensureBackground(
+        mBackground.ensureBackground(mClosingTarget.windowConfiguration.getBounds(),
                 mEnteringTarget.taskInfo.taskDescription.getBackgroundColor(), mTransaction);
     }
 
@@ -244,6 +244,7 @@
                 : mapLinear(progress, 0, 1f, 0, TARGET_COMMIT_PROGRESS)) * SCALE_FACTOR;
         mLeavingProgressSpring.animateToFinalPosition(springProgress);
         mEnteringProgressSpring.animateToFinalPosition(springProgress);
+        mBackground.onBackProgressed(progress);
     }
 
     private void onGestureCommitted() {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java
index 99a434a..a7dd27a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java
@@ -141,7 +141,8 @@
         mStartTaskRect.offsetTo(0, 0);
 
         // Draw background.
-        mBackground.ensureBackground(BACKGROUNDCOLOR, mTransaction);
+        mBackground.ensureBackground(mClosingTarget.windowConfiguration.getBounds(),
+                BACKGROUNDCOLOR, mTransaction);
     }
 
     private void updateGestureBackProgress(float progress, BackEvent event) {
@@ -189,6 +190,8 @@
         applyColorTransform(mClosingTarget.leash, closingColorScale);
         applyTransform(mEnteringTarget.leash, mEnteringCurrentRect, mCornerRadius);
         mTransaction.apply();
+
+        mBackground.onBackProgressed(progress);
     }
 
     private void updatePostCommitClosingAnimation(float progress) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CustomizeActivityAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CustomizeActivityAnimation.java
index 4eaedd3..f0c5d8b2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CustomizeActivityAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CustomizeActivityAnimation.java
@@ -150,9 +150,11 @@
 
         // Draw background with task background color.
         if (mEnteringTarget.taskInfo != null && mEnteringTarget.taskInfo.taskDescription != null) {
-            mBackground.ensureBackground(mNextBackgroundColor == Color.TRANSPARENT
-                    ? mEnteringTarget.taskInfo.taskDescription.getBackgroundColor()
-                    : mNextBackgroundColor, mTransaction);
+            mBackground.ensureBackground(mClosingTarget.windowConfiguration.getBounds(),
+                    mNextBackgroundColor == Color.TRANSPARENT
+                            ? mEnteringTarget.taskInfo.taskDescription.getBackgroundColor()
+                            : mNextBackgroundColor,
+                    mTransaction);
         }
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/IBackAnimation.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/back/IBackAnimation.aidl
index 2b2a0e3..1a35de4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/IBackAnimation.aidl
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/IBackAnimation.aidl
@@ -16,8 +16,9 @@
 
 package com.android.wm.shell.back;
 
-import android.window.IOnBackInvokedCallback;
+import com.android.internal.view.AppearanceRegion;
 import android.view.IRemoteAnimationRunner;
+import android.window.IOnBackInvokedCallback;
 
 /**
  * Interface for Launcher process to register back invocation callbacks.
@@ -34,4 +35,9 @@
      * Clears the previously registered {@link IOnBackInvokedCallback}.
      */
     void clearBackToLauncherCallback();
+
+    /**
+     * Uses launcher flags to update the system bar color.
+     */
+    void customizeStatusBarAppearance(in AppearanceRegion appearance);
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/StatusBarCustomizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/StatusBarCustomizer.java
new file mode 100644
index 0000000..5e87612
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/StatusBarCustomizer.java
@@ -0,0 +1,30 @@
+/*
+ * 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.back;
+
+import com.android.internal.view.AppearanceRegion;
+
+/**
+ * Interface to customize the system bar color.
+ */
+public interface StatusBarCustomizer {
+    /**
+     * Called when the status bar color needs to be changed.
+     * @param appearance The region of appearance.
+     */
+    void customizeStatusBarAppearance(AppearanceRegion appearance);
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
index 5f2b630..026ea069 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
@@ -47,6 +47,10 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.InstanceId;
+import com.android.launcher3.icons.BubbleBadgeIconFactory;
+import com.android.launcher3.icons.BubbleIconFactory;
+import com.android.wm.shell.bubbles.bar.BubbleBarExpandedView;
+import com.android.wm.shell.bubbles.bar.BubbleBarLayerView;
 import com.android.wm.shell.common.bubbles.BubbleInfo;
 
 import java.io.PrintWriter;
@@ -87,8 +91,18 @@
     private String mAppName;
     private ShortcutInfo mShortcutInfo;
     private String mMetadataShortcutId;
+
+    /**
+     * If {@link BubbleController#isShowingAsBubbleBar()} is true, the only view that will be
+     * populated will be {@link #mBubbleBarExpandedView}. If it is false, {@link #mIconView}
+     * and {@link #mExpandedView} will be populated.
+     */
+    @Nullable
     private BadgedImageView mIconView;
+    @Nullable
     private BubbleExpandedView mExpandedView;
+    @Nullable
+    private BubbleBarExpandedView mBubbleBarExpandedView;
 
     private BubbleViewInfoTask mInflationTask;
     private boolean mInflateSynchronously;
@@ -327,13 +341,19 @@
         return mIconView;
     }
 
-    @Override
     @Nullable
+    @Override
     public BubbleExpandedView getExpandedView() {
         return mExpandedView;
     }
 
     @Nullable
+    @Override
+    public BubbleBarExpandedView getBubbleBarExpandedView() {
+        return mBubbleBarExpandedView;
+    }
+
+    @Nullable
     public String getTitle() {
         return mTitle;
     }
@@ -364,6 +384,9 @@
             mExpandedView.cleanUpExpandedState();
             mExpandedView = null;
         }
+        if (mBubbleBarExpandedView != null) {
+            mBubbleBarExpandedView.cleanUpExpandedState();
+        }
         if (mIntent != null) {
             mIntent.unregisterCancelListener(mIntentCancelListener);
         }
@@ -410,14 +433,16 @@
      * @param callback the callback to notify one the bubble is ready to be displayed.
      * @param context the context for the bubble.
      * @param controller the bubble controller.
-     * @param stackView the stackView the bubble is eventually added to.
+     * @param stackView the view the bubble is added to, iff showing as floating.
+     * @param layerView the layer the bubble is added to, iff showing in the bubble bar.
      * @param iconFactory the icon factory use to create images for the bubble.
      * @param badgeIconFactory the icon factory to create app badges for the bubble.
      */
     void inflate(BubbleViewInfoTask.Callback callback,
             Context context,
             BubbleController controller,
-            BubbleStackView stackView,
+            @Nullable BubbleStackView stackView,
+            @Nullable BubbleBarLayerView layerView,
             BubbleIconFactory iconFactory,
             BubbleBadgeIconFactory badgeIconFactory,
             boolean skipInflation) {
@@ -428,6 +453,7 @@
                 context,
                 controller,
                 stackView,
+                layerView,
                 iconFactory,
                 badgeIconFactory,
                 skipInflation,
@@ -445,7 +471,7 @@
     }
 
     boolean isInflated() {
-        return mIconView != null && mExpandedView != null;
+        return (mIconView != null && mExpandedView != null) || mBubbleBarExpandedView != null;
     }
 
     void stopInflation() {
@@ -459,6 +485,7 @@
         if (!isInflated()) {
             mIconView = info.imageView;
             mExpandedView = info.expandedView;
+            mBubbleBarExpandedView = info.bubbleBarExpandedView;
         }
 
         mShortcutInfo = info.shortcutInfo;
@@ -469,7 +496,7 @@
         mFlyoutMessage = info.flyoutMessage;
 
         mBadgeBitmap = info.badgeBitmap;
-        mRawBadgeBitmap = info.mRawBadgeBitmap;
+        mRawBadgeBitmap = info.rawBadgeBitmap;
         mBubbleBitmap = info.bubbleBitmap;
 
         mDotColor = info.dotColor;
@@ -478,6 +505,9 @@
         if (mExpandedView != null) {
             mExpandedView.update(this /* bubble */);
         }
+        if (mBubbleBarExpandedView != null) {
+            mBubbleBarExpandedView.update(this /* bubble */);
+        }
         if (mIconView != null) {
             mIconView.setRenderedBubble(this /* bubble */);
         }
@@ -607,6 +637,9 @@
      */
     @Override
     public int getTaskId() {
+        if (mBubbleBarExpandedView != null) {
+            return mBubbleBarExpandedView.getTaskId();
+        }
         return mExpandedView != null ? mExpandedView.getTaskId() : mTaskId;
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleBadgeIconFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleBadgeIconFactory.java
deleted file mode 100644
index 56b13b8..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleBadgeIconFactory.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.wm.shell.bubbles;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Path;
-import android.graphics.Rect;
-import android.graphics.drawable.AdaptiveIconDrawable;
-import android.graphics.drawable.Drawable;
-
-import com.android.launcher3.icons.BaseIconFactory;
-import com.android.launcher3.icons.BitmapInfo;
-import com.android.wm.shell.R;
-
-/**
- * Factory for creating app badge icons that are shown on bubbles.
- */
-public class BubbleBadgeIconFactory extends BaseIconFactory {
-
-    public BubbleBadgeIconFactory(Context context) {
-        super(context, context.getResources().getConfiguration().densityDpi,
-                context.getResources().getDimensionPixelSize(R.dimen.bubble_badge_size));
-    }
-
-    /**
-     * Returns a {@link BitmapInfo} for the app-badge that is shown on top of each bubble. This
-     * will include the workprofile indicator on the badge if appropriate.
-     */
-    BitmapInfo getBadgeBitmap(Drawable userBadgedAppIcon, boolean isImportantConversation) {
-        if (userBadgedAppIcon instanceof AdaptiveIconDrawable) {
-            AdaptiveIconDrawable ad = (AdaptiveIconDrawable) userBadgedAppIcon;
-            userBadgedAppIcon = new CircularAdaptiveIcon(ad.getBackground(), ad.getForeground());
-        }
-        if (isImportantConversation) {
-            userBadgedAppIcon = new CircularRingDrawable(userBadgedAppIcon);
-        }
-        Bitmap userBadgedBitmap = createIconBitmap(
-                userBadgedAppIcon, 1, MODE_WITH_SHADOW);
-        return createIconBitmap(userBadgedBitmap);
-    }
-
-    private class CircularRingDrawable extends CircularAdaptiveIcon {
-
-        final int mImportantConversationColor;
-        final int mRingWidth;
-        final Rect mInnerBounds = new Rect();
-
-        final Drawable mDr;
-
-        CircularRingDrawable(Drawable dr) {
-            super(null, null);
-            mDr = dr;
-            mImportantConversationColor = mContext.getResources().getColor(
-                    R.color.important_conversation, null);
-            mRingWidth = mContext.getResources().getDimensionPixelSize(
-                    com.android.internal.R.dimen.importance_ring_stroke_width);
-        }
-
-        @Override
-        public void draw(Canvas canvas) {
-            int save = canvas.save();
-            canvas.clipPath(getIconMask());
-            canvas.drawColor(mImportantConversationColor);
-            mInnerBounds.set(getBounds());
-            mInnerBounds.inset(mRingWidth, mRingWidth);
-            canvas.translate(mInnerBounds.left, mInnerBounds.top);
-            mDr.setBounds(0, 0, mInnerBounds.width(), mInnerBounds.height());
-            mDr.draw(canvas);
-            canvas.restoreToCount(save);
-        }
-    }
-
-    private static class CircularAdaptiveIcon extends AdaptiveIconDrawable {
-
-        final Path mPath = new Path();
-
-        CircularAdaptiveIcon(Drawable bg, Drawable fg) {
-            super(bg, fg);
-        }
-
-        @Override
-        public Path getIconMask() {
-            mPath.reset();
-            Rect bounds = getBounds();
-            mPath.addOval(bounds.left, bounds.top, bounds.right, bounds.bottom, Path.Direction.CW);
-            return mPath;
-        }
-
-        @Override
-        public void draw(Canvas canvas) {
-            int save = canvas.save();
-            canvas.clipPath(getIconMask());
-
-            Drawable d;
-            if ((d = getBackground()) != null) {
-                d.draw(canvas);
-            }
-            if ((d = getForeground()) != null) {
-                d.draw(canvas);
-            }
-            canvas.restoreToCount(save);
-        }
-    }
-}
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 4b4b1af..fd66153 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
@@ -74,8 +74,10 @@
 import android.util.Pair;
 import android.util.SparseArray;
 import android.view.IWindowManager;
+import android.view.SurfaceControl;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewRootImpl;
 import android.view.WindowInsets;
 import android.view.WindowManager;
 import android.window.ScreenCapture;
@@ -87,9 +89,12 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.statusbar.IStatusBarService;
+import com.android.launcher3.icons.BubbleBadgeIconFactory;
+import com.android.launcher3.icons.BubbleIconFactory;
+import com.android.wm.shell.R;
 import com.android.wm.shell.ShellTaskOrganizer;
-import com.android.wm.shell.TaskViewTransitions;
 import com.android.wm.shell.WindowManagerShellWrapper;
+import com.android.wm.shell.bubbles.bar.BubbleBarLayerView;
 import com.android.wm.shell.common.DisplayController;
 import com.android.wm.shell.common.ExternalInterfaceBinder;
 import com.android.wm.shell.common.FloatingContentCoordinator;
@@ -110,6 +115,8 @@
 import com.android.wm.shell.sysui.ShellCommandHandler;
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
+import com.android.wm.shell.taskview.TaskView;
+import com.android.wm.shell.taskview.TaskViewTransitions;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -200,6 +207,7 @@
     private BubbleLogger mLogger;
     private BubbleData mBubbleData;
     @Nullable private BubbleStackView mStackView;
+    @Nullable private BubbleBarLayerView mLayerView;
     private BubbleIconFactory mBubbleIconFactory;
     private BubbleBadgeIconFactory mBubbleBadgeIconFactory;
     private BubblePositioner mBubblePositioner;
@@ -259,6 +267,9 @@
     /** Used to send bubble events to launcher. */
     private Bubbles.BubbleStateListener mBubbleStateListener;
 
+    /** Used to send updates to the views from {@link #mBubbleDataListener}. */
+    private BubbleViewCallback mBubbleViewCallback;
+
     public BubbleController(Context context,
             ShellInit shellInit,
             ShellCommandHandler shellCommandHandler,
@@ -309,8 +320,13 @@
         mBubblePositioner = positioner;
         mBubbleData = data;
         mSavedUserBubbleData = new SparseArray<>();
-        mBubbleIconFactory = new BubbleIconFactory(context);
-        mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(context);
+        mBubbleIconFactory = new BubbleIconFactory(context,
+                context.getResources().getDimensionPixelSize(R.dimen.bubble_size));
+        mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(context,
+                context.getResources().getDimensionPixelSize(R.dimen.bubble_badge_size),
+                context.getResources().getColor(R.color.important_conversation),
+                context.getResources().getDimensionPixelSize(
+                        com.android.internal.R.dimen.importance_ring_stroke_width));
         mDisplayController = displayController;
         mTaskViewTransitions = taskViewTransitions;
         mOneHandedOptional = oneHandedOptional;
@@ -340,6 +356,9 @@
     }
 
     protected void onInit() {
+        mBubbleViewCallback = isShowingAsBubbleBar()
+                ? mBubbleBarViewCallback
+                : mBubbleStackViewCallback;
         mBubbleData.setListener(mBubbleDataListener);
         mBubbleData.setSuppressionChangedListener(this::onBubbleMetadataFlagChanged);
         mDataRepository.setSuppressionChangedListener(this::onBubbleMetadataFlagChanged);
@@ -545,7 +564,7 @@
     }
 
     private void openBubbleOverflow() {
-        ensureStackViewCreated();
+        ensureBubbleViewsAndWindowCreated();
         mBubbleData.setShowingOverflow(true);
         mBubbleData.setSelectedBubble(mBubbleData.getOverflow());
         mBubbleData.setExpanded(true);
@@ -585,7 +604,7 @@
             expandStackAndSelectBubble(mNotifEntryToExpandOnShadeUnlock);
         }
 
-        updateStack();
+        updateBubbleViews();
     }
 
     @VisibleForTesting
@@ -681,39 +700,59 @@
         return mBubblePositioner;
     }
 
-    Bubbles.SysuiProxy getSysuiProxy() {
+    public Bubbles.SysuiProxy getSysuiProxy() {
         return mSysuiProxy;
     }
 
     /**
-     * BubbleStackView is lazily created by this method the first time a Bubble is added. This
-     * method initializes the stack view and adds it to window manager.
+     * The view and window for bubbles is lazily created by this method the first time a Bubble
+     * is added. Depending on the device state, this method will:
+     * - initialize a {@link BubbleStackView} and add it to window manager OR
+     * - initialize a {@link com.android.wm.shell.bubbles.bar.BubbleBarLayerView} and adds
+     *   it to window manager.
      */
-    private void ensureStackViewCreated() {
-        if (mStackView == null) {
-            mStackView = new BubbleStackView(
-                    mContext, this, mBubbleData, mSurfaceSynchronizer, mFloatingContentCoordinator,
-                    mMainExecutor);
-            mStackView.onOrientationChanged();
-            if (mExpandListener != null) {
-                mStackView.setExpandListener(mExpandListener);
+    private void ensureBubbleViewsAndWindowCreated() {
+        mBubblePositioner.setShowingInBubbleBar(isShowingAsBubbleBar());
+        if (isShowingAsBubbleBar()) {
+            // When we're showing in launcher / bubble bar is enabled, we don't have bubble stack
+            // view, instead we just show the expanded bubble view as necessary. We still need a
+            // window to show this in, but we use a separate code path.
+            // TODO(b/273312602): consider foldables where we do need a stack view when folded
+            if (mLayerView == null) {
+                mLayerView = new BubbleBarLayerView(mContext, this);
             }
-            mStackView.setUnbubbleConversationCallback(mSysuiProxy::onUnbubbleConversation);
+        } else {
+            if (mStackView == null) {
+                mStackView = new BubbleStackView(
+                        mContext, this, mBubbleData, mSurfaceSynchronizer,
+                        mFloatingContentCoordinator,
+                        mMainExecutor);
+                mStackView.onOrientationChanged();
+                if (mExpandListener != null) {
+                    mStackView.setExpandListener(mExpandListener);
+                }
+                mStackView.setUnbubbleConversationCallback(mSysuiProxy::onUnbubbleConversation);
+            }
         }
-
         addToWindowManagerMaybe();
     }
 
-    /** Adds the BubbleStackView to the WindowManager if it's not already there. */
+    /** Adds the appropriate view to WindowManager if it's not already there. */
     private void addToWindowManagerMaybe() {
-        // If the stack is null, or already added, don't add it.
-        if (mStackView == null || mAddedToWindowManager) {
+        // If already added, don't add it.
+        if (mAddedToWindowManager) {
+            return;
+        }
+        // If the appropriate view is null, don't add it.
+        if (isShowingAsBubbleBar() && mLayerView == null) {
+            return;
+        } else if (!isShowingAsBubbleBar() && mStackView == null) {
             return;
         }
 
         mWmLayoutParams = new WindowManager.LayoutParams(
                 // Fill the screen so we can use translation animations to position the bubble
-                // stack. We'll use touchable regions to ignore touches that are not on the bubbles
+                // views. We'll use touchable regions to ignore touches that are not on the bubbles
                 // themselves.
                 ViewGroup.LayoutParams.MATCH_PARENT,
                 ViewGroup.LayoutParams.MATCH_PARENT,
@@ -736,17 +775,30 @@
             mAddedToWindowManager = true;
             registerBroadcastReceiver();
             mBubbleData.getOverflow().initialize(this);
-            mWindowManager.addView(mStackView, mWmLayoutParams);
-            mStackView.setOnApplyWindowInsetsListener((view, windowInsets) -> {
-                if (!windowInsets.equals(mWindowInsets)) {
-                    mWindowInsets = windowInsets;
-                    mBubblePositioner.update();
-                    mStackView.onDisplaySizeChanged();
-                }
-                return windowInsets;
-            });
+            // (TODO: b/273314541) some duplication in the inset listener
+            if (isShowingAsBubbleBar()) {
+                mWindowManager.addView(mLayerView, mWmLayoutParams);
+                mLayerView.setOnApplyWindowInsetsListener((view, windowInsets) -> {
+                    if (!windowInsets.equals(mWindowInsets)) {
+                        mWindowInsets = windowInsets;
+                        mBubblePositioner.update();
+                        mLayerView.onDisplaySizeChanged();
+                    }
+                    return windowInsets;
+                });
+            } else {
+                mWindowManager.addView(mStackView, mWmLayoutParams);
+                mStackView.setOnApplyWindowInsetsListener((view, windowInsets) -> {
+                    if (!windowInsets.equals(mWindowInsets)) {
+                        mWindowInsets = windowInsets;
+                        mBubblePositioner.update();
+                        mStackView.onDisplaySizeChanged();
+                    }
+                    return windowInsets;
+                });
+            }
         } catch (IllegalStateException e) {
-            // This means the stack has already been added. This shouldn't happen...
+            // This means the view has already been added. This shouldn't happen...
             e.printStackTrace();
         }
     }
@@ -769,7 +821,7 @@
         }
     }
 
-    /** Removes the BubbleStackView from the WindowManager if it's there. */
+    /** Removes any bubble views from the WindowManager that exist. */
     private void removeFromWindowManagerMaybe() {
         if (!mAddedToWindowManager) {
             return;
@@ -790,8 +842,10 @@
             if (mStackView != null) {
                 mWindowManager.removeView(mStackView);
                 mBubbleData.getOverflow().cleanUpExpandedState();
-            } else {
-                Log.w(TAG, "StackView added to WindowManager, but was null when removing!");
+            }
+            if (mLayerView != null) {
+                mWindowManager.removeView(mLayerView);
+                mBubbleData.getOverflow().cleanUpExpandedState();
             }
         } catch (IllegalArgumentException e) {
             // This means the stack has already been removed - it shouldn't happen, but ignore if it
@@ -881,17 +935,32 @@
         if (mStackView != null) {
             mStackView.onThemeChanged();
         }
-        mBubbleIconFactory = new BubbleIconFactory(mContext);
-        mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(mContext);
+        mBubbleIconFactory = new BubbleIconFactory(mContext,
+                mContext.getResources().getDimensionPixelSize(R.dimen.bubble_size));
+        mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(mContext,
+                mContext.getResources().getDimensionPixelSize(R.dimen.bubble_badge_size),
+                mContext.getResources().getColor(R.color.important_conversation),
+                mContext.getResources().getDimensionPixelSize(
+                        com.android.internal.R.dimen.importance_ring_stroke_width));
 
         // Reload each bubble
         for (Bubble b : mBubbleData.getBubbles()) {
-            b.inflate(null /* callback */, mContext, this, mStackView, mBubbleIconFactory,
+            b.inflate(null /* callback */,
+                    mContext,
+                    this,
+                    mStackView,
+                    mLayerView,
+                    mBubbleIconFactory,
                     mBubbleBadgeIconFactory,
                     false /* skipInflation */);
         }
         for (Bubble b : mBubbleData.getOverflowBubbles()) {
-            b.inflate(null /* callback */, mContext, this, mStackView, mBubbleIconFactory,
+            b.inflate(null /* callback */,
+                    mContext,
+                    this,
+                    mStackView,
+                    mLayerView,
+                    mBubbleIconFactory,
                     mBubbleBadgeIconFactory,
                     false /* skipInflation */);
         }
@@ -908,8 +977,13 @@
                 mDensityDpi = newConfig.densityDpi;
                 mScreenBounds.set(newConfig.windowConfiguration.getBounds());
                 mBubbleData.onMaxBubblesChanged();
-                mBubbleIconFactory = new BubbleIconFactory(mContext);
-                mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(mContext);
+                mBubbleIconFactory = new BubbleIconFactory(mContext,
+                        mContext.getResources().getDimensionPixelSize(R.dimen.bubble_size));
+                mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(mContext,
+                        mContext.getResources().getDimensionPixelSize(R.dimen.bubble_badge_size),
+                        mContext.getResources().getColor(R.color.important_conversation),
+                        mContext.getResources().getDimensionPixelSize(
+                                com.android.internal.R.dimen.importance_ring_stroke_width));
                 mStackView.onDisplaySizeChanged();
             }
             if (newConfig.fontScale != mFontScale) {
@@ -958,7 +1032,7 @@
      */
     @VisibleForTesting
     public boolean hasBubbles() {
-        if (mStackView == null) {
+        if (mStackView == null && mLayerView == null) {
             return false;
         }
         return mBubbleData.hasBubbles() || mBubbleData.isShowingOverflow();
@@ -996,7 +1070,27 @@
      * Expands and selects the provided bubble as long as it already exists in the stack or the
      * overflow.
      *
-     * This is currently only used when opening a bubble via clicking on a conversation widget.
+     * This is used by external callers (launcher).
+     */
+    public void expandStackAndSelectBubbleFromLauncher(String key) {
+        Bubble b = mBubbleData.getAnyBubbleWithkey(key);
+        if (b == null) {
+            return;
+        }
+        if (mBubbleData.hasBubbleInStackWithKey(b.getKey())) {
+            // already in the stack
+            mBubbleData.setSelectedBubbleFromLauncher(b);
+            mLayerView.showExpandedView(b);
+        } else if (mBubbleData.hasOverflowBubbleWithKey(b.getKey())) {
+            // TODO: (b/271468319) handle overflow
+        } else {
+            Log.w(TAG, "didn't add bubble from launcher: " + key);
+        }
+    }
+
+    /**
+     * Expands and selects the provided bubble as long as it already exists in the stack or the
+     * overflow. This is currently used when opening a bubble via clicking on a conversation widget.
      */
     public void expandStackAndSelectBubble(Bubble b) {
         if (b == null) {
@@ -1132,13 +1226,24 @@
     /**
      * Performs a screenshot that may exclude the bubble layer, if one is present. The screenshot
      * can be access via the supplied {@link ScreenshotSync#get()} asynchronously.
-     *
-     * TODO(b/267324693): Implement the exclude layer functionality in screenshot.
      */
     public void getScreenshotExcludingBubble(int displayId,
             Pair<ScreenCaptureListener, ScreenshotSync> screenCaptureListener) {
         try {
-            mWmService.captureDisplay(displayId, null, screenCaptureListener.first);
+            ScreenCapture.CaptureArgs args = null;
+            if (mStackView != null) {
+                ViewRootImpl viewRoot = mStackView.getViewRootImpl();
+                if (viewRoot != null) {
+                    SurfaceControl bubbleLayer = viewRoot.getSurfaceControl();
+                    if (bubbleLayer != null) {
+                        args = new ScreenCapture.CaptureArgs.Builder<>()
+                                .setExcludeLayers(new SurfaceControl[] {bubbleLayer})
+                                .build();
+                    }
+                }
+            }
+
+            mWmService.captureDisplay(displayId, args, screenCaptureListener.first);
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to capture screenshot");
         }
@@ -1165,7 +1270,12 @@
                 }
                 bubble.inflate(
                         (b) -> mBubbleData.overflowBubble(Bubbles.DISMISS_RELOAD_FROM_DISK, bubble),
-                        mContext, this, mStackView, mBubbleIconFactory, mBubbleBadgeIconFactory,
+                        mContext,
+                        this,
+                        mStackView,
+                        mLayerView,
+                        mBubbleIconFactory,
+                        mBubbleBadgeIconFactory,
                         true /* skipInflation */);
             });
             return null;
@@ -1237,10 +1347,11 @@
     @VisibleForTesting
     public void inflateAndAdd(Bubble bubble, boolean suppressFlyout, boolean showInShade) {
         // Lazy init stack view when a bubble is created
-        ensureStackViewCreated();
+        ensureBubbleViewsAndWindowCreated();
         bubble.setInflateSynchronously(mInflateSynchronously);
         bubble.inflate(b -> mBubbleData.notificationEntryUpdated(b, suppressFlyout, showInShade),
-                mContext, this, mStackView, mBubbleIconFactory, mBubbleBadgeIconFactory,
+                mContext, this, mStackView,  mLayerView,
+                mBubbleIconFactory, mBubbleBadgeIconFactory,
                 false /* skipInflation */);
     }
 
@@ -1405,7 +1516,8 @@
         });
     }
 
-    private final BubbleViewCallback mBubbleViewCallback = new BubbleViewCallback() {
+    /** When bubbles are floating, this will be used to notify the floating views. */
+    private final BubbleViewCallback mBubbleStackViewCallback = new BubbleViewCallback() {
         @Override
         public void removeBubble(Bubble removedBubble) {
             if (mStackView != null) {
@@ -1457,6 +1569,62 @@
         }
     };
 
+    /** When bubbles are in the bubble bar, this will be used to notify bubble bar views. */
+    private final BubbleViewCallback mBubbleBarViewCallback = new BubbleViewCallback() {
+        @Override
+        public void removeBubble(Bubble removedBubble) {
+            if (mLayerView != null) {
+                // TODO: need to check if there's something that needs to happen here, e.g. if
+                //  the currently selected & expanded bubble is removed?
+            }
+        }
+
+        @Override
+        public void addBubble(Bubble addedBubble) {
+            // Nothing to do for adds, these are handled by launcher / in the bubble bar.
+        }
+
+        @Override
+        public void updateBubble(Bubble updatedBubble) {
+            // Nothing to do for updates, these are handled by launcher / in the bubble bar.
+        }
+
+        @Override
+        public void bubbleOrderChanged(List<Bubble> bubbleOrder, boolean updatePointer) {
+            // Nothing to do for order changes, these are handled by launcher / in the bubble bar.
+        }
+
+        @Override
+        public void suppressionChanged(Bubble bubble, boolean isSuppressed) {
+            if (mLayerView != null) {
+                // TODO (b/273316505) handle suppression changes, although might not need to
+                //  to do anything on the layerview side for this...
+            }
+        }
+
+        @Override
+        public void expansionChanged(boolean isExpanded) {
+            if (mLayerView != null) {
+                if (!isExpanded) {
+                    mLayerView.collapse();
+                } else {
+                    BubbleViewProvider selectedBubble = mBubbleData.getSelectedBubble();
+                    if (selectedBubble != null) {
+                        mLayerView.showExpandedView(selectedBubble);
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void selectionChanged(BubbleViewProvider selectedBubble) {
+            // Only need to update the layer view if we're currently expanded for selection changes.
+            if (mLayerView != null && isStackExpanded()) {
+                mLayerView.showExpandedView(selectedBubble);
+            }
+        }
+    };
+
     @SuppressWarnings("FieldCanBeLocal")
     private final BubbleData.Listener mBubbleDataListener = new BubbleData.Listener() {
 
@@ -1474,7 +1642,7 @@
                         + " unsuppressed=" + (update.unsuppressedBubble != null));
             }
 
-            ensureStackViewCreated();
+            ensureBubbleViewsAndWindowCreated();
 
             // Lazy load overflow bubbles from disk
             loadOverflowBubblesFromDisk();
@@ -1569,10 +1737,18 @@
             }
 
             mSysuiProxy.notifyInvalidateNotifications("BubbleData.Listener.applyUpdate");
-            updateStack();
+            updateBubbleViews();
 
             // Update the cached state for queries from SysUI
             mImpl.mCachedState.update(update);
+
+            if (isShowingAsBubbleBar() && mBubbleStateListener != null) {
+                BubbleBarUpdate bubbleBarUpdate = update.toBubbleBarUpdate();
+                // Some updates aren't relevant to the bubble bar so check first.
+                if (bubbleBarUpdate.anythingChanged()) {
+                    mBubbleStateListener.onBubbleStateChange(bubbleBarUpdate);
+                }
+            }
         }
     };
 
@@ -1649,28 +1825,42 @@
 
     /**
      * Updates the visibility of the bubbles based on current state.
-     * Does not un-bubble, just hides or un-hides.
-     * Updates stack description for TalkBack focus.
-     * Updates bubbles' icon views clickable states
+     * Does not un-bubble, just hides or un-hides the views themselves.
+     *
+     * Updates view description for TalkBack focus.
+     * Updates bubbles' icon views clickable states (when floating).
      */
-    public void updateStack() {
-        if (mStackView == null) {
+    public void updateBubbleViews() {
+        if (mStackView == null && mLayerView == null) {
             return;
         }
 
         if (!mIsStatusBarShade) {
-            // Bubbles don't appear over the locked shade.
-            mStackView.setVisibility(INVISIBLE);
+            // Bubbles don't appear when the device is locked.
+            if (mStackView != null) {
+                mStackView.setVisibility(INVISIBLE);
+            }
+            if (mLayerView != null) {
+                mLayerView.setVisibility(INVISIBLE);
+            }
         } else if (hasBubbles()) {
             // If we're unlocked, show the stack if we have bubbles. If we don't have bubbles, the
             // stack will be set to INVISIBLE in onAllBubblesAnimatedOut after the bubbles animate
             // out.
-            mStackView.setVisibility(VISIBLE);
+            if (mStackView != null) {
+                mStackView.setVisibility(VISIBLE);
+            }
+            if (mLayerView != null && isStackExpanded()) {
+                mLayerView.setVisibility(VISIBLE);
+            }
         }
 
-        mStackView.updateContentDescription();
-
-        mStackView.updateBubblesAcessibillityStates();
+        if (mStackView != null) {
+            mStackView.updateContentDescription();
+            mStackView.updateBubblesAcessibillityStates();
+        } else if (mLayerView != null) {
+            // TODO(b/273313561): handle a11y for BubbleBarLayerView
+        }
     }
 
     @VisibleForTesting
@@ -1706,7 +1896,7 @@
 
     /**
      * Whether an intent is properly configured to display in a
-     * {@link com.android.wm.shell.TaskView}.
+     * {@link TaskView}.
      *
      * Keep checks in sync with BubbleExtractor#canLaunchInTaskView. Typically
      * that should filter out any invalid bubbles, but should protect SysUI side just in case.
@@ -1828,17 +2018,20 @@
 
         @Override
         public void showBubble(String key, boolean onLauncherHome) {
-            // TODO
+            mMainExecutor.execute(() -> {
+                mBubblePositioner.setShowingInBubbleBar(onLauncherHome);
+                mController.expandStackAndSelectBubbleFromLauncher(key);
+            });
         }
 
         @Override
         public void removeBubble(String key, int reason) {
-            // TODO
+            // TODO (b/271466616) allow removals from launcher
         }
 
         @Override
         public void collapseBubbles() {
-            // TODO
+            mMainExecutor.execute(() -> mController.collapseStack());
         }
 
         @Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
index a26c0c4..f9cf9d3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
@@ -334,6 +334,35 @@
         dispatchPendingChanges();
     }
 
+    /**
+     * Sets the selected bubble and expands it, but doesn't dispatch changes
+     * to {@link BubbleData.Listener}. This is used for updates coming from launcher whose views
+     * will already be updated so we don't need to notify them again, but BubbleData should be
+     * updated to have the correct state.
+     */
+    public void setSelectedBubbleFromLauncher(BubbleViewProvider bubble) {
+        if (DEBUG_BUBBLE_DATA) {
+            Log.d(TAG, "setSelectedBubbleFromLauncher: " + bubble);
+        }
+        mExpanded = true;
+        if (Objects.equals(bubble, mSelectedBubble)) {
+            return;
+        }
+        boolean isOverflow = bubble != null && BubbleOverflow.KEY.equals(bubble.getKey());
+        if (bubble != null
+                && !mBubbles.contains(bubble)
+                && !mOverflowBubbles.contains(bubble)
+                && !isOverflow) {
+            Log.e(TAG, "Cannot select bubble which doesn't exist!"
+                    + " (" + bubble + ") bubbles=" + mBubbles);
+            return;
+        }
+        if (bubble != null && !isOverflow) {
+            ((Bubble) bubble).markAsAccessedAt(mTimeSource.currentTimeMillis());
+        }
+        mSelectedBubble = bubble;
+    }
+
     public void setSelectedBubble(BubbleViewProvider bubble) {
         if (DEBUG_BUBBLE_DATA) {
             Log.d(TAG, "setSelectedBubble: " + bubble);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
index 9ccd6eb..a317c44 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
@@ -67,10 +67,10 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.policy.ScreenDecorationsUtils;
 import com.android.wm.shell.R;
-import com.android.wm.shell.TaskView;
-import com.android.wm.shell.TaskViewTaskController;
 import com.android.wm.shell.common.AlphaOptimizedButton;
 import com.android.wm.shell.common.TriangleShape;
+import com.android.wm.shell.taskview.TaskView;
+import com.android.wm.shell.taskview.TaskViewTaskController;
 
 import java.io.PrintWriter;
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
deleted file mode 100644
index 4ded3ea..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.wm.shell.bubbles;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.LauncherApps;
-import android.content.pm.ShortcutInfo;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.launcher3.icons.BaseIconFactory;
-import com.android.wm.shell.R;
-
-/**
- * Factory for creating normalized bubble icons.
- * We are not using Launcher's IconFactory because bubbles only runs on the UI thread,
- * so there is no need to manage a pool across multiple threads.
- */
-@VisibleForTesting
-public class BubbleIconFactory extends BaseIconFactory {
-
-    public BubbleIconFactory(Context context) {
-        super(context, context.getResources().getConfiguration().densityDpi,
-                context.getResources().getDimensionPixelSize(R.dimen.bubble_size));
-    }
-
-    /**
-     * Returns the drawable that the developer has provided to display in the bubble.
-     */
-    Drawable getBubbleDrawable(@NonNull final Context context,
-            @Nullable final ShortcutInfo shortcutInfo, @Nullable final Icon ic) {
-        if (shortcutInfo != null) {
-            LauncherApps launcherApps =
-                    (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE);
-            int density = context.getResources().getConfiguration().densityDpi;
-            return launcherApps.getShortcutIconDrawable(shortcutInfo, density);
-        } else {
-            if (ic != null) {
-                if (ic.getType() == Icon.TYPE_URI
-                        || ic.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {
-                    context.grantUriPermission(context.getPackageName(),
-                            ic.getUri(),
-                            Intent.FLAG_GRANT_READ_URI_PERMISSION);
-                }
-                return ic.loadDrawable(context);
-            }
-            return null;
-        }
-    }
-
-    /**
-     * Creates the bitmap for the provided drawable and returns the scale used for
-     * drawing the actual drawable.
-     */
-    public Bitmap createIconBitmap(@NonNull Drawable icon, float[] outScale) {
-        if (outScale == null) {
-            outScale = new float[1];
-        }
-        icon = normalizeAndWrapToAdaptiveIcon(icon,
-                true /* shrinkNonAdaptiveIcons */,
-                null /* outscale */,
-                outScale);
-        return createIconBitmap(icon, outScale[0], MODE_WITH_SHADOW);
-    }
-}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt
index eb7929b..c2a05b7 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt
@@ -28,7 +28,9 @@
 import android.util.TypedValue
 import android.view.LayoutInflater
 import android.widget.FrameLayout
+import com.android.launcher3.icons.BubbleIconFactory
 import com.android.wm.shell.R
+import com.android.wm.shell.bubbles.bar.BubbleBarExpandedView
 
 class BubbleOverflow(
     private val context: Context,
@@ -92,7 +94,8 @@
         val shapeColor = res.getColor(android.R.color.system_accent1_1000)
         overflowBtn?.iconDrawable?.setTint(shapeColor)
 
-        val iconFactory = BubbleIconFactory(context)
+        val iconFactory = BubbleIconFactory(context,
+                context.getResources().getDimensionPixelSize(R.dimen.bubble_size))
 
         // Update bitmap
         val fg = InsetDrawable(overflowBtn?.iconDrawable, overflowIconInset)
@@ -136,6 +139,10 @@
         return expandedView
     }
 
+    override fun getBubbleBarExpandedView(): BubbleBarExpandedView? {
+        return null
+    }
+
     override fun getDotColor(): Int {
         return dotColor
     }
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
index 2a31629..7a58159 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTaskViewHelper.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTaskViewHelper.java
@@ -34,10 +34,10 @@
 
 import androidx.annotation.Nullable;
 
-import com.android.wm.shell.TaskView;
-import com.android.wm.shell.TaskViewTaskController;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.annotations.ShellMainThread;
+import com.android.wm.shell.taskview.TaskView;
+import com.android.wm.shell.taskview.TaskViewTaskController;
 
 /**
  * Handles creating and updating the {@link TaskView} associated with a {@link Bubble}.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
index f437553..d1081de 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
@@ -22,6 +22,7 @@
 import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
@@ -38,12 +39,14 @@
 import android.util.PathParser;
 import android.view.LayoutInflater;
 
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.graphics.ColorUtils;
 import com.android.launcher3.icons.BitmapInfo;
+import com.android.launcher3.icons.BubbleBadgeIconFactory;
+import com.android.launcher3.icons.BubbleIconFactory;
 import com.android.wm.shell.R;
+import com.android.wm.shell.bubbles.bar.BubbleBarExpandedView;
+import com.android.wm.shell.bubbles.bar.BubbleBarLayerView;
 
 import java.lang.ref.WeakReference;
 import java.util.Objects;
@@ -70,6 +73,7 @@
     private WeakReference<Context> mContext;
     private WeakReference<BubbleController> mController;
     private WeakReference<BubbleStackView> mStackView;
+    private WeakReference<BubbleBarLayerView> mLayerView;
     private BubbleIconFactory mIconFactory;
     private BubbleBadgeIconFactory mBadgeIconFactory;
     private boolean mSkipInflation;
@@ -83,7 +87,8 @@
     BubbleViewInfoTask(Bubble b,
             Context context,
             BubbleController controller,
-            BubbleStackView stackView,
+            @Nullable BubbleStackView stackView,
+            @Nullable BubbleBarLayerView layerView,
             BubbleIconFactory factory,
             BubbleBadgeIconFactory badgeFactory,
             boolean skipInflation,
@@ -93,6 +98,7 @@
         mContext = new WeakReference<>(context);
         mController = new WeakReference<>(controller);
         mStackView = new WeakReference<>(stackView);
+        mLayerView = new WeakReference<>(layerView);
         mIconFactory = factory;
         mBadgeIconFactory = badgeFactory;
         mSkipInflation = skipInflation;
@@ -102,8 +108,13 @@
 
     @Override
     protected BubbleViewInfo doInBackground(Void... voids) {
-        return BubbleViewInfo.populate(mContext.get(), mController.get(), mStackView.get(),
-                mIconFactory, mBadgeIconFactory, mBubble, mSkipInflation);
+        if (mController.get().isShowingAsBubbleBar()) {
+            return BubbleViewInfo.populateForBubbleBar(mContext.get(), mController.get(),
+                    mLayerView.get(), mBadgeIconFactory, mBubble, mSkipInflation);
+        } else {
+            return BubbleViewInfo.populate(mContext.get(), mController.get(), mStackView.get(),
+                    mIconFactory, mBadgeIconFactory, mBubble, mSkipInflation);
+        }
     }
 
     @Override
@@ -124,16 +135,70 @@
      */
     @VisibleForTesting
     public static class BubbleViewInfo {
-        BadgedImageView imageView;
-        BubbleExpandedView expandedView;
+        // TODO(b/273312602): for foldables it might make sense to populate all of the views
+
+        // Always populated
         ShortcutInfo shortcutInfo;
         String appName;
-        Bitmap bubbleBitmap;
-        Bitmap badgeBitmap;
-        Bitmap mRawBadgeBitmap;
+        Bitmap rawBadgeBitmap;
+
+        // Only populated when showing in taskbar
+        BubbleBarExpandedView bubbleBarExpandedView;
+
+        // These are only populated when not showing in taskbar
+        BadgedImageView imageView;
+        BubbleExpandedView expandedView;
         int dotColor;
         Path dotPath;
         Bubble.FlyoutMessage flyoutMessage;
+        Bitmap bubbleBitmap;
+        Bitmap badgeBitmap;
+
+        @Nullable
+        public static BubbleViewInfo populateForBubbleBar(Context c, BubbleController controller,
+                BubbleBarLayerView layerView, BubbleBadgeIconFactory badgeIconFactory, Bubble b,
+                boolean skipInflation) {
+            BubbleViewInfo info = new BubbleViewInfo();
+
+            if (!skipInflation && !b.isInflated()) {
+                LayoutInflater inflater = LayoutInflater.from(c);
+                info.bubbleBarExpandedView = (BubbleBarExpandedView) inflater.inflate(
+                        R.layout.bubble_bar_expanded_view, layerView, false /* attachToRoot */);
+                info.bubbleBarExpandedView.initialize(controller);
+            }
+
+            if (b.getShortcutInfo() != null) {
+                info.shortcutInfo = b.getShortcutInfo();
+            }
+
+            // App name & app icon
+            PackageManager pm = BubbleController.getPackageManagerForUser(c,
+                    b.getUser().getIdentifier());
+            ApplicationInfo appInfo;
+            Drawable badgedIcon;
+            Drawable appIcon;
+            try {
+                appInfo = pm.getApplicationInfo(
+                        b.getPackageName(),
+                        PackageManager.MATCH_UNINSTALLED_PACKAGES
+                                | PackageManager.MATCH_DISABLED_COMPONENTS
+                                | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
+                                | PackageManager.MATCH_DIRECT_BOOT_AWARE);
+                if (appInfo != null) {
+                    info.appName = String.valueOf(pm.getApplicationLabel(appInfo));
+                }
+                appIcon = pm.getApplicationIcon(b.getPackageName());
+                badgedIcon = pm.getUserBadgedIcon(appIcon, b.getUser());
+            } catch (PackageManager.NameNotFoundException exception) {
+                // If we can't find package... don't think we should show the bubble.
+                Log.w(TAG, "Unable to find package: " + b.getPackageName());
+                return null;
+            }
+
+            info.rawBadgeBitmap = badgeIconFactory.getBadgeBitmap(badgedIcon, false).icon;
+
+            return info;
+        }
 
         @VisibleForTesting
         @Nullable
@@ -195,7 +260,7 @@
                     b.isImportantConversation());
             info.badgeBitmap = badgeBitmapInfo.icon;
             // Raw badge bitmap never includes the important conversation ring
-            info.mRawBadgeBitmap = b.isImportantConversation()
+            info.rawBadgeBitmap = b.isImportantConversation()
                     ? badgeIconFactory.getBadgeBitmap(badgedIcon, false).icon
                     : badgeBitmapInfo.icon;
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java
index 3f6d41b..6bdc3b9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java
@@ -22,18 +22,40 @@
 
 import androidx.annotation.Nullable;
 
+import com.android.wm.shell.bubbles.bar.BubbleBarExpandedView;
+
 /**
  * Interface to represent actual Bubbles and UI elements that act like bubbles, like BubbleOverflow.
  */
 public interface BubbleViewProvider {
-    @Nullable BubbleExpandedView getExpandedView();
+
+    /**
+     * Returns the icon view used for a bubble (the click target when collapsed). This is populated
+     * when bubbles are floating, i.e. when {@link BubbleController#isShowingAsBubbleBar()} is
+     * false.
+     */
+    @Nullable
+    View getIconView();
+
+    /**
+     * Returns the expanded view used for a bubble. This is populated when bubbles are floating,
+     * i.e. when {@link BubbleController#isShowingAsBubbleBar()} is false.
+     */
+    @Nullable
+    BubbleExpandedView getExpandedView();
+
+    /**
+     * Returns the expanded view used for a bubble being show in the bubble bar. This is populated
+     * when {@link BubbleController#isShowingAsBubbleBar()} is true.
+     */
+    @Nullable
+    BubbleBarExpandedView getBubbleBarExpandedView();
 
     /**
      * Sets whether the contents of the bubble's TaskView should be visible.
      */
     void setTaskViewVisibility(boolean visible);
 
-    @Nullable View getIconView();
 
     String getKey();
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarAnimationHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarAnimationHelper.java
new file mode 100644
index 0000000..23f65f9
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarAnimationHelper.java
@@ -0,0 +1,233 @@
+/*
+ * 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.bar;
+
+import static android.view.View.VISIBLE;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.graphics.PointF;
+import android.util.Log;
+import android.widget.FrameLayout;
+
+import com.android.wm.shell.animation.Interpolators;
+import com.android.wm.shell.animation.PhysicsAnimator;
+import com.android.wm.shell.bubbles.BubblePositioner;
+import com.android.wm.shell.bubbles.BubbleViewProvider;
+import com.android.wm.shell.bubbles.animation.AnimatableScaleMatrix;
+
+/**
+ * Helper class to animate a {@link BubbleBarExpandedView} on a bubble.
+ */
+public class BubbleBarAnimationHelper {
+
+    private static final String TAG = BubbleBarAnimationHelper.class.getSimpleName();
+
+    private static final float EXPANDED_VIEW_ANIMATE_SCALE_AMOUNT = 0.1f;
+    private static final float EXPANDED_VIEW_ANIMATE_OUT_SCALE_AMOUNT = .75f;
+    private static final int EXPANDED_VIEW_ALPHA_ANIMATION_DURATION = 150;
+
+    /** Spring config for the expanded view scale-in animation. */
+    private final PhysicsAnimator.SpringConfig mScaleInSpringConfig =
+            new PhysicsAnimator.SpringConfig(300f, 0.9f);
+
+    /** Spring config for the expanded view scale-out animation. */
+    private final PhysicsAnimator.SpringConfig mScaleOutSpringConfig =
+            new PhysicsAnimator.SpringConfig(900f, 1f);
+
+    /** Matrix used to scale the expanded view container with a given pivot point. */
+    private final AnimatableScaleMatrix mExpandedViewContainerMatrix = new AnimatableScaleMatrix();
+
+    /** Animator for animating the expanded view's alpha (including the TaskView inside it). */
+    private final ValueAnimator mExpandedViewAlphaAnimator = ValueAnimator.ofFloat(0f, 1f);
+
+    private final Context mContext;
+    private final BubbleBarLayerView mLayerView;
+    private final BubblePositioner mPositioner;
+
+    private BubbleViewProvider mExpandedBubble;
+    private boolean mIsExpanded = false;
+
+    public BubbleBarAnimationHelper(Context context,
+            BubbleBarLayerView bubbleBarLayerView,
+            BubblePositioner positioner) {
+        mContext = context;
+        mLayerView = bubbleBarLayerView;
+        mPositioner = positioner;
+
+        mExpandedViewAlphaAnimator.setDuration(EXPANDED_VIEW_ALPHA_ANIMATION_DURATION);
+        mExpandedViewAlphaAnimator.setInterpolator(Interpolators.PANEL_CLOSE_ACCELERATED);
+        mExpandedViewAlphaAnimator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+                if (mExpandedBubble != null && mExpandedBubble.getBubbleBarExpandedView() != null) {
+                    // We need to be Z ordered on top in order for alpha animations to work.
+                    mExpandedBubble.getBubbleBarExpandedView().setSurfaceZOrderedOnTop(true);
+                    mExpandedBubble.getBubbleBarExpandedView().setAnimating(true);
+                }
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                if (mExpandedBubble != null && mExpandedBubble.getBubbleBarExpandedView() != null) {
+                    // The surface needs to be Z ordered on top for alpha values to work on the
+                    // TaskView, and if we're temporarily hidden, we are still on the screen
+                    // with alpha = 0f until we animate back. Stay Z ordered on top so the alpha
+                    // = 0f remains in effect.
+                    if (mIsExpanded) {
+                        mExpandedBubble.getBubbleBarExpandedView().setSurfaceZOrderedOnTop(false);
+                    }
+
+                    mExpandedBubble.getBubbleBarExpandedView().setContentVisibility(mIsExpanded);
+                    mExpandedBubble.getBubbleBarExpandedView().setAnimating(false);
+                }
+            }
+        });
+        mExpandedViewAlphaAnimator.addUpdateListener(valueAnimator -> {
+            if (mExpandedBubble != null && mExpandedBubble.getBubbleBarExpandedView() != null) {
+                float alpha = (float) valueAnimator.getAnimatedValue();
+                mExpandedBubble.getBubbleBarExpandedView().setTaskViewAlpha(alpha);
+                mExpandedBubble.getBubbleBarExpandedView().setAlpha(alpha);
+            }
+        });
+    }
+
+    /**
+     * Animates the provided bubble's expanded view to the expanded state.
+     */
+    public void animateExpansion(BubbleViewProvider expandedBubble) {
+        mExpandedBubble = expandedBubble;
+        if (mExpandedBubble == null) {
+            return;
+        }
+        BubbleBarExpandedView bev = mExpandedBubble.getBubbleBarExpandedView();
+        if (bev == null) {
+            return;
+        }
+        mIsExpanded = true;
+
+        mExpandedViewContainerMatrix.setScaleX(0f);
+        mExpandedViewContainerMatrix.setScaleY(0f);
+
+        updateExpandedView();
+        bev.setAnimating(true);
+        bev.setContentVisibility(false);
+        bev.setAlpha(0f);
+        bev.setTaskViewAlpha(0f);
+        bev.setVisibility(VISIBLE);
+
+        // Set the pivot point for the scale, so the view animates out from the bubble bar.
+        PointF bubbleBarPosition = mPositioner.getBubbleBarPosition();
+        mExpandedViewContainerMatrix.setScale(
+                1f - EXPANDED_VIEW_ANIMATE_SCALE_AMOUNT,
+                1f - EXPANDED_VIEW_ANIMATE_SCALE_AMOUNT,
+                bubbleBarPosition.x,
+                bubbleBarPosition.y);
+
+        bev.setAnimationMatrix(mExpandedViewContainerMatrix);
+
+        mExpandedViewAlphaAnimator.start();
+
+        PhysicsAnimator.getInstance(mExpandedViewContainerMatrix).cancel();
+        PhysicsAnimator.getInstance(mExpandedViewContainerMatrix)
+                .spring(AnimatableScaleMatrix.SCALE_X,
+                        AnimatableScaleMatrix.getAnimatableValueForScaleFactor(1f),
+                        mScaleInSpringConfig)
+                .spring(AnimatableScaleMatrix.SCALE_Y,
+                        AnimatableScaleMatrix.getAnimatableValueForScaleFactor(1f),
+                        mScaleInSpringConfig)
+                .addUpdateListener((target, values) -> {
+                    mExpandedBubble.getBubbleBarExpandedView().setAnimationMatrix(
+                            mExpandedViewContainerMatrix);
+                })
+                .withEndActions(() -> {
+                    bev.setAnimationMatrix(null);
+                    updateExpandedView();
+                    bev.setSurfaceZOrderedOnTop(false);
+                })
+                .start();
+    }
+
+    /**
+     * Collapses the currently expanded bubble.
+     *
+     * @param endRunnable a runnable to run at the end of the animation.
+     */
+    public void animateCollapse(Runnable endRunnable) {
+        mIsExpanded = false;
+        if (mExpandedBubble == null || mExpandedBubble.getBubbleBarExpandedView() == null) {
+            Log.w(TAG, "Trying to animate collapse without a bubble");
+            return;
+        }
+
+        mExpandedViewContainerMatrix.setScaleX(1f);
+        mExpandedViewContainerMatrix.setScaleY(1f);
+
+        PhysicsAnimator.getInstance(mExpandedViewContainerMatrix).cancel();
+        PhysicsAnimator.getInstance(mExpandedViewContainerMatrix)
+                .spring(AnimatableScaleMatrix.SCALE_X,
+                        AnimatableScaleMatrix.getAnimatableValueForScaleFactor(
+                                EXPANDED_VIEW_ANIMATE_OUT_SCALE_AMOUNT),
+                        mScaleOutSpringConfig)
+                .spring(AnimatableScaleMatrix.SCALE_Y,
+                        AnimatableScaleMatrix.getAnimatableValueForScaleFactor(
+                                EXPANDED_VIEW_ANIMATE_OUT_SCALE_AMOUNT),
+                        mScaleOutSpringConfig)
+                .addUpdateListener((target, values) -> {
+                    if (mExpandedBubble != null
+                            && mExpandedBubble.getBubbleBarExpandedView() != null) {
+                        mExpandedBubble.getBubbleBarExpandedView().setAnimationMatrix(
+                                mExpandedViewContainerMatrix);
+                    }
+                })
+                .withEndActions(() -> {
+                    if (mExpandedBubble != null
+                            && mExpandedBubble.getBubbleBarExpandedView() != null) {
+                        mExpandedBubble.getBubbleBarExpandedView().setAnimationMatrix(null);
+                    }
+                    if (endRunnable != null) {
+                        endRunnable.run();
+                    }
+                })
+                .start();
+        mExpandedViewAlphaAnimator.reverse();
+    }
+
+    private void updateExpandedView() {
+        if (mExpandedBubble == null || mExpandedBubble.getBubbleBarExpandedView() == null) {
+            Log.w(TAG, "Trying to update the expanded view without a bubble");
+            return;
+        }
+        BubbleBarExpandedView bbev = mExpandedBubble.getBubbleBarExpandedView();
+
+        final int padding = mPositioner.getBubbleBarExpandedViewPadding();
+        final int width = mPositioner.getExpandedViewWidthForBubbleBar();
+        final int height = mPositioner.getExpandedViewHeightForBubbleBar();
+        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) bbev.getLayoutParams();
+        lp.width = width;
+        lp.height = height;
+        bbev.setLayoutParams(lp);
+        if (mLayerView.isOnLeft()) {
+            bbev.setX(mPositioner.getInsets().left + padding);
+        } else {
+            bbev.setX(mPositioner.getAvailableRect().width() - width - padding);
+        }
+        bbev.setY(mPositioner.getInsets().top + padding);
+        bbev.updateLocation();
+    }
+}
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
new file mode 100644
index 0000000..b8f049b
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
@@ -0,0 +1,267 @@
+/*
+ * 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.bar;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.graphics.Outline;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewOutlineProvider;
+import android.widget.FrameLayout;
+
+import com.android.internal.policy.ScreenDecorationsUtils;
+import com.android.wm.shell.R;
+import com.android.wm.shell.bubbles.Bubble;
+import com.android.wm.shell.bubbles.BubbleController;
+import com.android.wm.shell.bubbles.BubbleTaskViewHelper;
+import com.android.wm.shell.taskview.TaskView;
+
+/**
+ * Expanded view of a bubble when it's part of the bubble bar.
+ *
+ * {@link BubbleController#isShowingAsBubbleBar()}
+ */
+public class BubbleBarExpandedView extends FrameLayout implements BubbleTaskViewHelper.Listener {
+
+    private static final String TAG = BubbleBarExpandedView.class.getSimpleName();
+    private static final int INVALID_TASK_ID = -1;
+
+    private BubbleController mController;
+    private BubbleTaskViewHelper mBubbleTaskViewHelper;
+
+    private HandleView mMenuView;
+    private TaskView mTaskView;
+
+    private int mMenuHeight;
+    private int mBackgroundColor;
+    private float mCornerRadius = 0f;
+
+    /**
+     * Whether we want the {@code TaskView}'s content to be visible (alpha = 1f). If
+     * {@link #mIsAnimating} is true, this may not reflect the {@code TaskView}'s actual alpha
+     * value until the animation ends.
+     */
+    private boolean mIsContentVisible = false;
+    private boolean mIsAnimating;
+
+    public BubbleBarExpandedView(Context context) {
+        this(context, null);
+    }
+
+    public BubbleBarExpandedView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public BubbleBarExpandedView(Context context, AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public BubbleBarExpandedView(Context context, AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        Context context = getContext();
+        setElevation(getResources().getDimensionPixelSize(R.dimen.bubble_elevation));
+        mMenuHeight = context.getResources().getDimensionPixelSize(
+                R.dimen.bubblebar_expanded_view_menu_size);
+        mMenuView = new HandleView(context);
+        addView(mMenuView);
+
+        applyThemeAttrs();
+        setClipToOutline(true);
+        setOutlineProvider(new ViewOutlineProvider() {
+            @Override
+            public void getOutline(View view, Outline outline) {
+                outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), mCornerRadius);
+            }
+        });
+    }
+
+    /** Set the BubbleController on the view, must be called before doing anything else. */
+    public void initialize(BubbleController controller) {
+        mController = controller;
+        mBubbleTaskViewHelper = new BubbleTaskViewHelper(mContext, mController,
+                /* listener= */ this,
+                /* viewParent= */ this);
+        mTaskView = mBubbleTaskViewHelper.getTaskView();
+        addView(mTaskView);
+        mTaskView.setEnableSurfaceClipping(true);
+        mTaskView.setCornerRadius(mCornerRadius);
+    }
+
+    // TODO (b/275087636): call this when theme/config changes
+    void applyThemeAttrs() {
+        boolean supportsRoundedCorners = ScreenDecorationsUtils.supportsRoundedCornersOnWindows(
+                mContext.getResources());
+        final TypedArray ta = mContext.obtainStyledAttributes(new int[] {
+                android.R.attr.dialogCornerRadius,
+                android.R.attr.colorBackgroundFloating});
+        mCornerRadius = supportsRoundedCorners ? ta.getDimensionPixelSize(0, 0) : 0;
+        mCornerRadius = mCornerRadius / 2f;
+        mBackgroundColor = ta.getColor(1, Color.WHITE);
+
+        ta.recycle();
+
+        mMenuView.setCornerRadius(mCornerRadius);
+        mMenuHeight = getResources().getDimensionPixelSize(
+                R.dimen.bubblebar_expanded_view_menu_size);
+
+        if (mTaskView != null) {
+            mTaskView.setCornerRadius(mCornerRadius);
+            mTaskView.setElevation(150);
+            updateMenuColor();
+        }
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        int height = MeasureSpec.getSize(heightMeasureSpec);
+
+        // Add corner radius here so that the menu extends behind the rounded corners of TaskView.
+        int menuViewHeight = Math.min((int) (mMenuHeight + mCornerRadius), height);
+        measureChild(mMenuView, widthMeasureSpec, MeasureSpec.makeMeasureSpec(menuViewHeight,
+                MeasureSpec.getMode(heightMeasureSpec)));
+
+        if (mTaskView != null) {
+            int taskViewHeight = height - menuViewHeight;
+            measureChild(mTaskView, widthMeasureSpec, MeasureSpec.makeMeasureSpec(taskViewHeight,
+                    MeasureSpec.getMode(heightMeasureSpec)));
+        }
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        // Drag handle above
+        final int dragHandleBottom = t + mMenuView.getMeasuredHeight();
+        mMenuView.layout(l, t, r, dragHandleBottom);
+        if (mTaskView != null) {
+            // Subtract radius so that the menu extends behind the rounded corners of TaskView.
+            mTaskView.layout(l, (int) (dragHandleBottom - mCornerRadius), r,
+                    dragHandleBottom + mTaskView.getMeasuredHeight());
+        }
+    }
+
+    @Override
+    public void onTaskCreated() {
+        setContentVisibility(true);
+        updateMenuColor();
+    }
+
+    @Override
+    public void onContentVisibilityChanged(boolean visible) {
+        setContentVisibility(visible);
+    }
+
+    @Override
+    public void onBackPressed() {
+        mController.collapseStack();
+    }
+
+    /** Cleans up task view, should be called when the bubble is no longer active. */
+    public void cleanUpExpandedState() {
+        if (mBubbleTaskViewHelper != null) {
+            if (mTaskView != null) {
+                removeView(mTaskView);
+            }
+            mBubbleTaskViewHelper.cleanUpTaskView();
+        }
+    }
+
+    /** Updates the bubble shown in this task view. */
+    public void update(Bubble bubble) {
+        mBubbleTaskViewHelper.update(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;
+    }
+
+    /**
+     * Call when the location or size of the view has changed to update TaskView.
+     */
+    public void updateLocation() {
+        if (mTaskView == null) return;
+        mTaskView.onLocationChanged();
+    }
+
+    /** Sets the alpha of the task view. */
+    public void setContentVisibility(boolean visible) {
+        mIsContentVisible = visible;
+
+        if (mTaskView == null) return;
+
+        if (!mIsAnimating) {
+            mTaskView.setAlpha(visible ? 1f : 0f);
+        }
+    }
+
+    /** Updates the menu bar to be the status bar color specified by the app. */
+    private void updateMenuColor() {
+        if (mTaskView == null) return;
+        ActivityManager.RunningTaskInfo info = mTaskView.getTaskInfo();
+        final int taskBgColor = info.taskDescription.getStatusBarColor();
+        final int color = Color.valueOf(taskBgColor == -1 ? Color.WHITE : taskBgColor).toArgb();
+        if (color != -1) {
+            mMenuView.setBackgroundColor(color);
+        } else {
+            mMenuView.setBackgroundColor(mBackgroundColor);
+        }
+    }
+
+    /**
+     * Sets the alpha of both this view and the task view.
+     */
+    public void setTaskViewAlpha(float alpha) {
+        if (mTaskView != null) {
+            mTaskView.setAlpha(alpha);
+        }
+        setAlpha(alpha);
+    }
+
+    /**
+     * Sets whether the surface displaying app content should sit on top. This is useful for
+     * ordering surfaces during animations. When content is drawn on top of the app (e.g. bubble
+     * being dragged out, the manage menu) this is set to false, otherwise it should be true.
+     */
+    public void setSurfaceZOrderedOnTop(boolean onTop) {
+        if (mTaskView == null) {
+            return;
+        }
+        mTaskView.setZOrderedOnTop(onTop, true /* allowDynamicChange */);
+    }
+
+    /**
+     * Sets whether the view is animating, in this case we won't change the content visibility
+     * until the animation is done.
+     */
+    public void setAnimating(boolean animating) {
+        mIsAnimating = animating;
+        // If we're done animating, apply the correct visibility.
+        if (!animating) {
+            setContentVisibility(mIsContentVisible);
+        }
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java
new file mode 100644
index 0000000..b1a725b
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java
@@ -0,0 +1,212 @@
+/*
+ * 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.bar;
+
+import static com.android.wm.shell.animation.Interpolators.ALPHA_IN;
+import static com.android.wm.shell.animation.Interpolators.ALPHA_OUT;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.Rect;
+import android.graphics.Region;
+import android.graphics.drawable.ColorDrawable;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.widget.FrameLayout;
+
+import com.android.wm.shell.bubbles.BubbleController;
+import com.android.wm.shell.bubbles.BubblePositioner;
+import com.android.wm.shell.bubbles.BubbleViewProvider;
+
+/**
+ * Similar to {@link com.android.wm.shell.bubbles.BubbleStackView}, this view is added to window
+ * manager to display bubbles. However, it is only used when bubbles are being displayed in
+ * launcher in the bubble bar. This view does not show a stack of bubbles that can be moved around
+ * on screen and instead shows & animates the expanded bubble for the bubble bar.
+ */
+public class BubbleBarLayerView extends FrameLayout
+        implements ViewTreeObserver.OnComputeInternalInsetsListener {
+
+    private static final String TAG = BubbleBarLayerView.class.getSimpleName();
+
+    private static final float SCRIM_ALPHA = 0.2f;
+
+    private final BubbleController mBubbleController;
+    private final BubblePositioner mPositioner;
+    private final BubbleBarAnimationHelper mAnimationHelper;
+    private final View mScrimView;
+
+    @Nullable
+    private BubbleViewProvider mExpandedBubble;
+    private BubbleBarExpandedView mExpandedView;
+
+    // TODO(b/273310265) - currently the view is always on the right, need to update for RTL.
+    /** Whether the expanded view is displaying on the left of the screen or not. */
+    private boolean mOnLeft = false;
+
+    /** Whether a bubble is expanded. */
+    private boolean mIsExpanded = false;
+
+    private final Region mTouchableRegion = new Region();
+    private final Rect mTempRect = new Rect();
+
+    public BubbleBarLayerView(Context context, BubbleController controller) {
+        super(context);
+        mBubbleController = controller;
+        mPositioner = mBubbleController.getPositioner();
+
+        mAnimationHelper = new BubbleBarAnimationHelper(context,
+                this, mPositioner);
+
+        mScrimView = new View(getContext());
+        mScrimView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
+        mScrimView.setBackgroundDrawable(new ColorDrawable(
+                getResources().getColor(android.R.color.system_neutral1_1000)));
+        addView(mScrimView);
+        mScrimView.setAlpha(0f);
+        mScrimView.setBackgroundDrawable(new ColorDrawable(
+                getResources().getColor(android.R.color.system_neutral1_1000)));
+
+        setOnClickListener(view -> {
+            mBubbleController.collapseStack();
+        });
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        mPositioner.update();
+        getViewTreeObserver().addOnComputeInternalInsetsListener(this);
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        getViewTreeObserver().removeOnComputeInternalInsetsListener(this);
+
+        if (mExpandedView != null) {
+            removeView(mExpandedView);
+            mExpandedView = null;
+        }
+    }
+
+    @Override
+    public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo inoutInfo) {
+        inoutInfo.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
+        mTouchableRegion.setEmpty();
+        getTouchableRegion(mTouchableRegion);
+        inoutInfo.touchableRegion.set(mTouchableRegion);
+    }
+
+    /** Updates the sizes of any displaying expanded view. */
+    public void onDisplaySizeChanged() {
+        if (mIsExpanded && mExpandedView != null) {
+            updateExpandedView();
+        }
+    }
+
+    /** Whether the stack of bubbles is expanded or not. */
+    public boolean isExpanded() {
+        return mIsExpanded;
+    }
+
+    // (TODO: b/273310265): BubblePositioner should be source of truth when this work is done.
+    /** Whether the expanded view is positioned on the left or right side of the screen. */
+    public boolean isOnLeft() {
+        return mOnLeft;
+    }
+
+    /** Shows the expanded view of the provided bubble. */
+    public void showExpandedView(BubbleViewProvider b) {
+        BubbleBarExpandedView expandedView = b.getBubbleBarExpandedView();
+        if (expandedView == null) {
+            return;
+        }
+        if (mExpandedBubble != null && !b.getKey().equals(mExpandedBubble.getKey())) {
+            removeView(mExpandedView);
+            mExpandedView = null;
+        }
+        if (mExpandedView == null) {
+            mExpandedBubble = b;
+            mExpandedView = expandedView;
+            final int width = mPositioner.getExpandedViewWidthForBubbleBar();
+            final int height = mPositioner.getExpandedViewHeightForBubbleBar();
+            mExpandedView.setVisibility(GONE);
+            addView(mExpandedView, new FrameLayout.LayoutParams(width, height));
+        }
+
+        mIsExpanded = true;
+        mBubbleController.getSysuiProxy().onStackExpandChanged(true);
+        mAnimationHelper.animateExpansion(mExpandedBubble);
+        showScrim(true);
+    }
+
+    /** Collapses any showing expanded view */
+    public void collapse() {
+        mIsExpanded = false;
+        final BubbleBarExpandedView viewToRemove = mExpandedView;
+        mAnimationHelper.animateCollapse(() -> removeView(viewToRemove));
+        mBubbleController.getSysuiProxy().onStackExpandChanged(false);
+        mExpandedView = null;
+        showScrim(false);
+    }
+
+    /** Updates the expanded view size and position. */
+    private void updateExpandedView() {
+        if (mExpandedView == null) return;
+        final int padding = mPositioner.getBubbleBarExpandedViewPadding();
+        final int width = mPositioner.getExpandedViewWidthForBubbleBar();
+        final int height = mPositioner.getExpandedViewHeightForBubbleBar();
+        FrameLayout.LayoutParams lp = (LayoutParams) mExpandedView.getLayoutParams();
+        lp.width = width;
+        lp.height = height;
+        mExpandedView.setLayoutParams(lp);
+        if (mOnLeft) {
+            mExpandedView.setX(mPositioner.getInsets().left + padding);
+        } else {
+            mExpandedView.setX(mPositioner.getAvailableRect().width() - width - padding);
+        }
+        mExpandedView.setY(mPositioner.getInsets().top + padding);
+        mExpandedView.updateLocation();
+    }
+
+    private void showScrim(boolean show) {
+        if (show) {
+            mScrimView.animate()
+                    .setInterpolator(ALPHA_IN)
+                    .alpha(SCRIM_ALPHA)
+                    .start();
+        } else {
+            mScrimView.animate()
+                    .alpha(0f)
+                    .setInterpolator(ALPHA_OUT)
+                    .start();
+        }
+    }
+
+    /**
+     * Fills in the touchable region for expanded view. This is used by window manager to
+     * decide which touch events go to the expanded view.
+     */
+    private void getTouchableRegion(Region outRegion) {
+        mTempRect.setEmpty();
+        if (mIsExpanded) {
+            getBoundsOnScreen(mTempRect);
+            outRegion.op(mTempRect, Region.Op.UNION);
+        }
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/HandleView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/HandleView.java
new file mode 100644
index 0000000..9ee8a9d
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/HandleView.java
@@ -0,0 +1,42 @@
+/*
+ * 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.bar;
+
+import android.content.Context;
+import android.view.Gravity;
+import android.widget.LinearLayout;
+
+/**
+ * Handle / menu view to show at the top of a bubble bar expanded view.
+ */
+public class HandleView extends LinearLayout {
+
+    // TODO(b/273307221): implement the manage menu in this view.
+    public HandleView(Context context) {
+        super(context);
+        setOrientation(LinearLayout.HORIZONTAL);
+        setGravity(Gravity.CENTER);
+    }
+
+    /**
+     * The menu extends past the top of the TaskView because of the rounded corners. This means
+     * to center content in the menu we must subtract the radius (i.e. the amount of space covered
+     * by TaskView).
+     */
+    public void setCornerRadius(float radius) {
+        setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), (int) radius);
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
index 5459094..9eba5ec 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
@@ -1120,7 +1120,7 @@
             setDividerInteractive(!mImeShown || !mHasImeFocus || isFloating, true,
                     "onImeStartPositioning");
 
-            return needOffset ? IME_ANIMATION_NO_ALPHA : 0;
+            return mTargetYOffset != mLastYOffset ? IME_ANIMATION_NO_ALPHA : 0;
         }
 
         @Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIConfiguration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIConfiguration.java
index 4e10ce8..09d99b2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIConfiguration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIConfiguration.java
@@ -58,11 +58,18 @@
             "has_seen_letterbox_education";
 
     /**
-     * Key prefix for the {@link SharedPreferences} entries related to the reachability
+     * Key prefix for the {@link SharedPreferences} entries related to the horizontal
+     * reachability education.
+     */
+    private static final String HAS_SEEN_HORIZONTAL_REACHABILITY_EDUCATION_KEY_PREFIX =
+            "has_seen_horizontal_reachability_education";
+
+    /**
+     * Key prefix for the {@link SharedPreferences} entries related to the vertical reachability
      * education.
      */
-    private static final String HAS_SEEN_REACHABILITY_EDUCATION_KEY_PREFIX =
-            "has_seen_reachability_education";
+    private static final String HAS_SEEN_VERTICAL_REACHABILITY_EDUCATION_KEY_PREFIX =
+            "has_seen_vertical_reachability_education";
 
     /**
      * The {@link SharedPreferences} instance for the restart dialog and the reachability
@@ -129,14 +136,6 @@
     }
 
     /**
-     * @return {@value true} if the reachability education is enabled.
-     */
-    boolean isReachabilityEducationEnabled() {
-        return mIsReachabilityEducationOverrideEnabled || (mIsReachabilityEducationEnabled
-                && mIsLetterboxReachabilityEducationAllowed);
-    }
-
-    /**
      * Enables/Disables the reachability education
      */
     void setIsReachabilityEducationOverrideEnabled(boolean enabled) {
@@ -145,33 +144,48 @@
 
     void setDontShowRestartDialogAgain(TaskInfo taskInfo) {
         mCompatUISharedPreferences.edit().putBoolean(
-                getDontShowAgainRestartKey(taskInfo.userId, taskInfo.topActivity.getPackageName()),
+                dontShowAgainRestartKey(taskInfo.userId, taskInfo.topActivity.getPackageName()),
                 true).apply();
     }
 
     boolean shouldShowRestartDialogAgain(TaskInfo taskInfo) {
-        return !mCompatUISharedPreferences.getBoolean(getDontShowAgainRestartKey(taskInfo.userId,
+        return !mCompatUISharedPreferences.getBoolean(dontShowAgainRestartKey(taskInfo.userId,
                 taskInfo.topActivity.getPackageName()), /* default= */ false);
     }
 
-    void setDontShowReachabilityEducationAgain(TaskInfo taskInfo) {
+    void setUserHasSeenHorizontalReachabilityEducation(TaskInfo taskInfo) {
         mCompatUISharedPreferences.edit().putBoolean(
-                getDontShowAgainReachabilityEduKey(taskInfo.userId), true).apply();
+                hasSeenHorizontalReachabilityEduKey(taskInfo.userId), true).apply();
+    }
+
+    void setUserHasSeenVerticalReachabilityEducation(TaskInfo taskInfo) {
+        mCompatUISharedPreferences.edit().putBoolean(
+                hasSeenVerticalReachabilityEduKey(taskInfo.userId), true).apply();
+    }
+
+    boolean hasSeenHorizontalReachabilityEducation(@NonNull TaskInfo taskInfo) {
+        return mCompatUISharedPreferences.getBoolean(
+                hasSeenHorizontalReachabilityEduKey(taskInfo.userId), /* default= */false);
+    }
+
+    boolean hasSeenVerticalReachabilityEducation(@NonNull TaskInfo taskInfo) {
+        return mCompatUISharedPreferences.getBoolean(
+                hasSeenVerticalReachabilityEduKey(taskInfo.userId), /* default= */false);
     }
 
     boolean shouldShowReachabilityEducation(@NonNull TaskInfo taskInfo) {
-        return getHasSeenLetterboxEducation(taskInfo.userId)
-                && !mCompatUISharedPreferences.getBoolean(
-                getDontShowAgainReachabilityEduKey(taskInfo.userId), /* default= */false);
+        return isReachabilityEducationEnabled()
+                && (!hasSeenHorizontalReachabilityEducation(taskInfo)
+                    || !hasSeenVerticalReachabilityEducation(taskInfo));
     }
 
     boolean getHasSeenLetterboxEducation(int userId) {
         return mLetterboxEduSharedPreferences
-                .getBoolean(getDontShowLetterboxEduKey(userId), /* default= */ false);
+                .getBoolean(dontShowLetterboxEduKey(userId), /* default= */ false);
     }
 
     void setSeenLetterboxEducation(int userId) {
-        mLetterboxEduSharedPreferences.edit().putBoolean(getDontShowLetterboxEduKey(userId),
+        mLetterboxEduSharedPreferences.edit().putBoolean(dontShowLetterboxEduKey(userId),
                 true).apply();
     }
 
@@ -204,15 +218,24 @@
         }
     }
 
-    private static String getDontShowAgainReachabilityEduKey(int userId) {
-        return HAS_SEEN_REACHABILITY_EDUCATION_KEY_PREFIX + "@" + userId;
+    private boolean isReachabilityEducationEnabled() {
+        return mIsReachabilityEducationOverrideEnabled || (mIsReachabilityEducationEnabled
+                && mIsLetterboxReachabilityEducationAllowed);
     }
 
-    private static String getDontShowLetterboxEduKey(int userId) {
+    private static String hasSeenHorizontalReachabilityEduKey(int userId) {
+        return HAS_SEEN_HORIZONTAL_REACHABILITY_EDUCATION_KEY_PREFIX + "@" + userId;
+    }
+
+    private static String hasSeenVerticalReachabilityEduKey(int userId) {
+        return HAS_SEEN_VERTICAL_REACHABILITY_EDUCATION_KEY_PREFIX + "@" + userId;
+    }
+
+    private static String dontShowLetterboxEduKey(int userId) {
         return String.valueOf(userId);
     }
 
-    private String getDontShowAgainRestartKey(int userId, String packageName) {
+    private String dontShowAgainRestartKey(int userId, String packageName) {
         return packageName + "@" + userId;
     }
 }
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java
index 4d83247..838e37a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java
@@ -201,7 +201,9 @@
         createOrUpdateCompatLayout(taskInfo, taskListener);
         createOrUpdateLetterboxEduLayout(taskInfo, taskListener);
         createOrUpdateRestartDialogLayout(taskInfo, taskListener);
-        createOrUpdateReachabilityEduLayout(taskInfo, taskListener, false);
+        if (mCompatUIConfiguration.getHasSeenLetterboxEducation(taskInfo.userId)) {
+            createOrUpdateReachabilityEduLayout(taskInfo, taskListener);
+        }
     }
 
     @Override
@@ -370,7 +372,7 @@
             Pair<TaskInfo, ShellTaskOrganizer.TaskListener> stateInfo) {
         mActiveLetterboxEduLayout = null;
         // We need to update the UI
-        createOrUpdateReachabilityEduLayout(stateInfo.first, stateInfo.second, true);
+        createOrUpdateReachabilityEduLayout(stateInfo.first, stateInfo.second);
     }
 
     private void createOrUpdateRestartDialogLayout(TaskInfo taskInfo,
@@ -429,9 +431,8 @@
     }
 
     private void createOrUpdateReachabilityEduLayout(TaskInfo taskInfo,
-            ShellTaskOrganizer.TaskListener taskListener, boolean forceUpdate) {
+            ShellTaskOrganizer.TaskListener taskListener) {
         if (mActiveReachabilityEduLayout != null) {
-            mActiveReachabilityEduLayout.forceUpdate(forceUpdate);
             // UI already exists, update the UI layout.
             if (!mActiveReachabilityEduLayout.updateCompatInfo(taskInfo, taskListener,
                     showOnDisplay(mActiveReachabilityEduLayout.getDisplayId()))) {
@@ -463,7 +464,7 @@
     ReachabilityEduWindowManager createReachabilityEduWindowManager(Context context,
             TaskInfo taskInfo,
             ShellTaskOrganizer.TaskListener taskListener) {
-        return new ReachabilityEduWindowManager(context, taskInfo, mSyncQueue, mCallback,
+        return new ReachabilityEduWindowManager(context, taskInfo, mSyncQueue,
                 taskListener, mDisplayController.getDisplayLayout(taskInfo.displayId),
                 mCompatUIConfiguration, mMainExecutor);
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduHandLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduHandLayout.java
deleted file mode 100644
index 6081ef1..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduHandLayout.java
+++ /dev/null
@@ -1,66 +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.compatui;
-
-import android.content.Context;
-import android.graphics.drawable.Animatable;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.view.View;
-
-import androidx.appcompat.widget.AppCompatTextView;
-
-/**
- * Custom layout for Reachability Education hand.
- */
-public class ReachabilityEduHandLayout extends AppCompatTextView {
-
-    private Drawable mHandDrawable;
-
-    public ReachabilityEduHandLayout(Context context) {
-        this(context, null);
-    }
-
-    public ReachabilityEduHandLayout(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public ReachabilityEduHandLayout(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        mHandDrawable = getCompoundDrawables()[/* top */ 1];
-    }
-
-    void hide() {
-        stopAnimation();
-        setAlpha(0);
-        setVisibility(View.INVISIBLE);
-    }
-
-    void startAnimation() {
-        if (mHandDrawable instanceof Animatable) {
-            final Animatable animatedBg = (Animatable) mHandDrawable;
-            animatedBg.start();
-        }
-    }
-
-    void stopAnimation() {
-        if (mHandDrawable instanceof Animatable) {
-            final Animatable animatedBg = (Animatable) mHandDrawable;
-            animatedBg.stop();
-        }
-    }
-}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduLayout.java
index 6a72d28..dc3d1d3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduLayout.java
@@ -16,14 +16,16 @@
 
 package com.android.wm.shell.compatui;
 
+import static android.app.TaskInfo.PROPERTY_VALUE_UNSET;
+
 import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
 import android.animation.ValueAnimator;
 import android.app.TaskInfo;
 import android.content.Context;
 import android.util.AttributeSet;
 import android.view.View;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
 import android.widget.FrameLayout;
 
 import com.android.wm.shell.R;
@@ -40,27 +42,23 @@
 
     private static final float ALPHA_FULL_OPAQUE = 1f;
 
-    private static final long VISIBILITY_SHOW_ANIMATION_DURATION_MS = 167;
-
-    private static final long VISIBILITY_SHOW_ANIMATION_DELAY_MS = 250;
-
-    private static final long VISIBILITY_SHOW_DOUBLE_TAP_ANIMATION_DELAY_MS = 80;
+    private static final long VISIBILITY_ANIMATION_DURATION_MS = 400;
 
     private static final long MARGINS_ANIMATION_DURATION_MS = 250;
 
+    private static final String ALPHA_PROPERTY_NAME = "alpha";
+
     private ReachabilityEduWindowManager mWindowManager;
 
-    private ReachabilityEduHandLayout mMoveLeftButton;
-    private ReachabilityEduHandLayout mMoveRightButton;
-    private ReachabilityEduHandLayout mMoveUpButton;
-    private ReachabilityEduHandLayout mMoveDownButton;
+    private View mMoveLeftButton;
+    private View mMoveRightButton;
+    private View mMoveUpButton;
+    private View mMoveDownButton;
 
-    private int mLastLeftMargin = TaskInfo.PROPERTY_VALUE_UNSET;
-    private int mLastRightMargin = TaskInfo.PROPERTY_VALUE_UNSET;
-    private int mLastTopMargin = TaskInfo.PROPERTY_VALUE_UNSET;
-    private int mLastBottomMargin = TaskInfo.PROPERTY_VALUE_UNSET;
-
-    private boolean mIsLayoutActive;
+    private int mLastLeftMargin = PROPERTY_VALUE_UNSET;
+    private int mLastRightMargin = PROPERTY_VALUE_UNSET;
+    private int mLastTopMargin = PROPERTY_VALUE_UNSET;
+    private int mLastBottomMargin = PROPERTY_VALUE_UNSET;
 
     public ReachabilityEduLayout(Context context) {
         this(context, null);
@@ -83,36 +81,29 @@
         mWindowManager = windowManager;
     }
 
-    void handleVisibility(boolean isActivityLetterboxed, int letterboxVerticalPosition,
+    void handleVisibility(boolean horizontalEnabled, boolean verticalEnabled,
+            int letterboxVerticalPosition,
             int letterboxHorizontalPosition, int availableWidth, int availableHeight,
-            boolean isDoubleTap) {
-        // If the app is not letterboxed we hide all the buttons.
-        if (!mIsLayoutActive || !isActivityLetterboxed || (
-                letterboxHorizontalPosition == TaskInfo.PROPERTY_VALUE_UNSET
-                        && letterboxVerticalPosition == TaskInfo.PROPERTY_VALUE_UNSET)) {
-            hideAllImmediately();
-        } else if (letterboxHorizontalPosition != TaskInfo.PROPERTY_VALUE_UNSET) {
-            handleLetterboxHorizontalPosition(availableWidth, letterboxHorizontalPosition,
-                    isDoubleTap);
-        } else {
-            handleLetterboxVerticalPosition(availableHeight, letterboxVerticalPosition,
-                    isDoubleTap);
+            CompatUIConfiguration compatUIConfiguration, TaskInfo taskInfo) {
+        hideAllImmediately();
+        if (horizontalEnabled && letterboxHorizontalPosition != PROPERTY_VALUE_UNSET) {
+            handleLetterboxHorizontalPosition(availableWidth, letterboxHorizontalPosition);
+            compatUIConfiguration.setUserHasSeenHorizontalReachabilityEducation(taskInfo);
+        } else if (verticalEnabled && letterboxVerticalPosition != PROPERTY_VALUE_UNSET) {
+            handleLetterboxVerticalPosition(availableHeight, letterboxVerticalPosition);
+            compatUIConfiguration.setUserHasSeenVerticalReachabilityEducation(taskInfo);
         }
     }
 
     void hideAllImmediately() {
-        mMoveLeftButton.hide();
-        mMoveRightButton.hide();
-        mMoveUpButton.hide();
-        mMoveDownButton.hide();
-        mLastLeftMargin = TaskInfo.PROPERTY_VALUE_UNSET;
-        mLastRightMargin = TaskInfo.PROPERTY_VALUE_UNSET;
-        mLastTopMargin = TaskInfo.PROPERTY_VALUE_UNSET;
-        mLastBottomMargin = TaskInfo.PROPERTY_VALUE_UNSET;
-    }
-
-    void setIsLayoutActive(boolean isLayoutActive) {
-        this.mIsLayoutActive = isLayoutActive;
+        hideImmediately(mMoveLeftButton);
+        hideImmediately(mMoveRightButton);
+        hideImmediately(mMoveUpButton);
+        hideImmediately(mMoveDownButton);
+        mLastLeftMargin = PROPERTY_VALUE_UNSET;
+        mLastRightMargin = PROPERTY_VALUE_UNSET;
+        mLastTopMargin = PROPERTY_VALUE_UNSET;
+        mLastBottomMargin = PROPERTY_VALUE_UNSET;
     }
 
     @Override
@@ -128,6 +119,11 @@
         mMoveDownButton.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
     }
 
+    private void hideImmediately(View view) {
+        view.setAlpha(0);
+        view.setVisibility(View.INVISIBLE);
+    }
+
     private Animator marginAnimator(View view, Function<LayoutParams, Integer> marginSupplier,
             BiConsumer<LayoutParams, Integer> marginConsumer, int from, int to) {
         final LayoutParams layoutParams = ((LayoutParams) view.getLayoutParams());
@@ -141,11 +137,11 @@
     }
 
     private void handleLetterboxHorizontalPosition(int availableWidth,
-            int letterboxHorizontalPosition, boolean isDoubleTap) {
-        mMoveUpButton.hide();
-        mMoveDownButton.hide();
-        mLastTopMargin = TaskInfo.PROPERTY_VALUE_UNSET;
-        mLastBottomMargin = TaskInfo.PROPERTY_VALUE_UNSET;
+            int letterboxHorizontalPosition) {
+        hideItem(mMoveUpButton);
+        hideItem(mMoveDownButton);
+        mLastTopMargin = PROPERTY_VALUE_UNSET;
+        mLastBottomMargin = PROPERTY_VALUE_UNSET;
         // We calculate the available space on the left and right
         final int horizontalGap = availableWidth / 2;
         final int leftAvailableSpace = letterboxHorizontalPosition * horizontalGap;
@@ -153,7 +149,7 @@
         // We show the button if we have enough space
         if (leftAvailableSpace >= mMoveLeftButton.getMeasuredWidth()) {
             int newLeftMargin = (horizontalGap - mMoveLeftButton.getMeasuredWidth()) / 2;
-            if (mLastLeftMargin == TaskInfo.PROPERTY_VALUE_UNSET) {
+            if (mLastLeftMargin == PROPERTY_VALUE_UNSET) {
                 mLastLeftMargin = newLeftMargin;
             }
             if (mLastLeftMargin != newLeftMargin) {
@@ -165,14 +161,14 @@
                 leftParams.leftMargin = mLastLeftMargin;
                 mMoveLeftButton.setLayoutParams(leftParams);
             }
-            showItem(mMoveLeftButton, isDoubleTap);
+            showItem(mMoveLeftButton);
         } else {
-            mMoveLeftButton.hide();
-            mLastLeftMargin = TaskInfo.PROPERTY_VALUE_UNSET;
+            hideItem(mMoveLeftButton);
+            mLastLeftMargin = PROPERTY_VALUE_UNSET;
         }
         if (rightAvailableSpace >= mMoveRightButton.getMeasuredWidth()) {
             int newRightMargin = (horizontalGap - mMoveRightButton.getMeasuredWidth()) / 2;
-            if (mLastRightMargin == TaskInfo.PROPERTY_VALUE_UNSET) {
+            if (mLastRightMargin == PROPERTY_VALUE_UNSET) {
                 mLastRightMargin = newRightMargin;
             }
             if (mLastRightMargin != newRightMargin) {
@@ -185,26 +181,26 @@
                 rightParams.rightMargin = mLastRightMargin;
                 mMoveRightButton.setLayoutParams(rightParams);
             }
-            showItem(mMoveRightButton, isDoubleTap);
+            showItem(mMoveRightButton);
         } else {
-            mMoveRightButton.hide();
-            mLastRightMargin = TaskInfo.PROPERTY_VALUE_UNSET;
+            hideItem(mMoveRightButton);
+            mLastRightMargin = PROPERTY_VALUE_UNSET;
         }
     }
 
     private void handleLetterboxVerticalPosition(int availableHeight,
-            int letterboxVerticalPosition, boolean isDoubleTap) {
-        mMoveLeftButton.hide();
-        mMoveRightButton.hide();
-        mLastLeftMargin = TaskInfo.PROPERTY_VALUE_UNSET;
-        mLastRightMargin = TaskInfo.PROPERTY_VALUE_UNSET;
+            int letterboxVerticalPosition) {
+        hideItem(mMoveLeftButton);
+        hideItem(mMoveRightButton);
+        mLastLeftMargin = PROPERTY_VALUE_UNSET;
+        mLastRightMargin = PROPERTY_VALUE_UNSET;
         // We calculate the available space on the left and right
         final int verticalGap = availableHeight / 2;
         final int topAvailableSpace = letterboxVerticalPosition * verticalGap;
         final int bottomAvailableSpace = availableHeight - topAvailableSpace;
         if (topAvailableSpace >= mMoveUpButton.getMeasuredHeight()) {
             int newTopMargin = (verticalGap - mMoveUpButton.getMeasuredHeight()) / 2;
-            if (mLastTopMargin == TaskInfo.PROPERTY_VALUE_UNSET) {
+            if (mLastTopMargin == PROPERTY_VALUE_UNSET) {
                 mLastTopMargin = newTopMargin;
             }
             if (mLastTopMargin != newTopMargin) {
@@ -216,14 +212,14 @@
                 topParams.topMargin = mLastTopMargin;
                 mMoveUpButton.setLayoutParams(topParams);
             }
-            showItem(mMoveUpButton, isDoubleTap);
+            showItem(mMoveUpButton);
         } else {
-            mMoveUpButton.hide();
-            mLastTopMargin = TaskInfo.PROPERTY_VALUE_UNSET;
+            hideItem(mMoveUpButton);
+            mLastTopMargin = PROPERTY_VALUE_UNSET;
         }
         if (bottomAvailableSpace >= mMoveDownButton.getMeasuredHeight()) {
             int newBottomMargin = (verticalGap - mMoveDownButton.getMeasuredHeight()) / 2;
-            if (mLastBottomMargin == TaskInfo.PROPERTY_VALUE_UNSET) {
+            if (mLastBottomMargin == PROPERTY_VALUE_UNSET) {
                 mLastBottomMargin = newBottomMargin;
             }
             if (mLastBottomMargin != newBottomMargin) {
@@ -236,43 +232,38 @@
                 bottomParams.bottomMargin = mLastBottomMargin;
                 mMoveDownButton.setLayoutParams(bottomParams);
             }
-            showItem(mMoveDownButton, isDoubleTap);
+            showItem(mMoveDownButton);
         } else {
-            mMoveDownButton.hide();
-            mLastBottomMargin = TaskInfo.PROPERTY_VALUE_UNSET;
+            hideItem(mMoveDownButton);
+            mLastBottomMargin = PROPERTY_VALUE_UNSET;
         }
     }
 
-    private void showItem(ReachabilityEduHandLayout view, boolean fromDoubleTap) {
-        if (view.getVisibility() == View.VISIBLE) {
-            // Already visible we just start animation
-            view.startAnimation();
-            return;
-        }
+    private void showItem(View view) {
         view.setVisibility(View.VISIBLE);
-        final long delay = fromDoubleTap ? VISIBILITY_SHOW_DOUBLE_TAP_ANIMATION_DELAY_MS
-                : VISIBILITY_SHOW_ANIMATION_DELAY_MS;
-        AlphaAnimation alphaAnimation = new AlphaAnimation(ALPHA_FULL_TRANSPARENT,
-                ALPHA_FULL_OPAQUE);
-        alphaAnimation.setDuration(VISIBILITY_SHOW_ANIMATION_DURATION_MS);
-        alphaAnimation.setStartOffset(delay);
-        alphaAnimation.setFillAfter(true);
-        alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
+        ObjectAnimator fadeIn = ObjectAnimator.ofFloat(view, ALPHA_PROPERTY_NAME,
+                ALPHA_FULL_TRANSPARENT, ALPHA_FULL_OPAQUE);
+        fadeIn.setDuration(VISIBILITY_ANIMATION_DURATION_MS);
+        fadeIn.addListener(new AnimatorListenerAdapter() {
             @Override
-            public void onAnimationStart(Animation animation) {
-            }
-
-            @Override
-            public void onAnimationEnd(Animation animation) {
-                // We trigger the hand animation
-                view.setAlpha(ALPHA_FULL_OPAQUE);
-                view.startAnimation();
-            }
-
-            @Override
-            public void onAnimationRepeat(Animation animation) {
+            public void onAnimationEnd(Animator animation) {
+                view.setVisibility(View.VISIBLE);
             }
         });
-        view.startAnimation(alphaAnimation);
+        fadeIn.start();
     }
+
+    private void hideItem(View view) {
+        ObjectAnimator fadeOut = ObjectAnimator.ofFloat(view, ALPHA_PROPERTY_NAME,
+                ALPHA_FULL_OPAQUE, ALPHA_FULL_TRANSPARENT);
+        fadeOut.setDuration(VISIBILITY_ANIMATION_DURATION_MS);
+        fadeOut.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                view.setVisibility(View.INVISIBLE);
+            }
+        });
+        fadeOut.start();
+    }
+
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduWindowManager.java
index f1b098e..b6e396d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduWindowManager.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduWindowManager.java
@@ -35,7 +35,6 @@
 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.compatui.CompatUIController.CompatUICallback;
 
 /**
  * Window manager for the reachability education
@@ -50,7 +49,8 @@
     // The time to wait before hiding the education
     private static final long DISAPPEAR_DELAY_MS = 4000L;
 
-    private final CompatUICallback mCallback;
+    private static final int REACHABILITY_LEFT_OR_UP_POSITION = 0;
+    private static final int REACHABILITY_RIGHT_OR_BOTTOM_POSITION = 2;
 
     private final CompatUIConfiguration mCompatUIConfiguration;
 
@@ -86,11 +86,10 @@
     ReachabilityEduLayout mLayout;
 
     ReachabilityEduWindowManager(Context context, TaskInfo taskInfo,
-            SyncTransactionQueue syncQueue, CompatUICallback callback,
+            SyncTransactionQueue syncQueue,
             ShellTaskOrganizer.TaskListener taskListener, DisplayLayout displayLayout,
             CompatUIConfiguration compatUIConfiguration, ShellExecutor mainExecutor) {
         super(context, taskInfo, syncQueue, taskListener, displayLayout);
-        mCallback = callback;
         mTaskInfo = taskInfo;
         mIsActivityLetterboxed = taskInfo.isLetterboxDoubleTapEnabled;
         mLetterboxVerticalPosition = taskInfo.topActivityLetterboxVerticalPosition;
@@ -118,8 +117,7 @@
 
     @Override
     protected boolean eligibleToShowLayout() {
-        return mCompatUIConfiguration.isReachabilityEducationEnabled()
-                && mIsActivityLetterboxed
+        return mIsActivityLetterboxed
                 && (mLetterboxVerticalPosition != -1 || mLetterboxHorizontalPosition != -1);
     }
 
@@ -155,12 +153,6 @@
         mTopActivityLetterboxHeight = taskInfo.topActivityLetterboxHeight;
         mHasUserDoubleTapped = taskInfo.isFromLetterboxDoubleTap;
 
-        if (taskInfo.isFromLetterboxDoubleTap) {
-            // In this case we disable the reachability for the following launch of
-            // the current application. Anyway because a double tap event happened,
-            // the reachability education is displayed
-            mCompatUIConfiguration.setDontShowReachabilityEducationAgain(taskInfo);
-        }
         if (!super.updateCompatInfo(taskInfo, taskListener, canShow)) {
             return false;
         }
@@ -168,13 +160,12 @@
         mHasLetterboxSizeChanged = prevTopActivityLetterboxWidth != mTopActivityLetterboxWidth
                 || prevTopActivityLetterboxHeight != mTopActivityLetterboxHeight;
 
-        if (mForceUpdate || prevIsActivityLetterboxed != mIsActivityLetterboxed
+        if (mHasUserDoubleTapped || prevIsActivityLetterboxed != mIsActivityLetterboxed
                 || prevLetterboxVerticalPosition != mLetterboxVerticalPosition
                 || prevLetterboxHorizontalPosition != mLetterboxHorizontalPosition
                 || prevTopActivityLetterboxWidth != mTopActivityLetterboxWidth
                 || prevTopActivityLetterboxHeight != mTopActivityLetterboxHeight) {
             updateVisibilityOfViews();
-            mForceUpdate = false;
         }
 
         return true;
@@ -235,41 +226,41 @@
         if (mLayout == null) {
             return;
         }
-        if (shouldUpdateEducation()) {
-            if (!mHasLetterboxSizeChanged) {
-                mLayout.setIsLayoutActive(true);
-            }
+
+        final boolean eligibleForDisplayHorizontalEducation = mForceUpdate
+                || !mCompatUIConfiguration.hasSeenHorizontalReachabilityEducation(mTaskInfo)
+                || (mHasUserDoubleTapped
+                    && (mLetterboxHorizontalPosition == REACHABILITY_LEFT_OR_UP_POSITION
+                        || mLetterboxHorizontalPosition == REACHABILITY_RIGHT_OR_BOTTOM_POSITION));
+        final boolean eligibleForDisplayVerticalEducation = mForceUpdate
+                || !mCompatUIConfiguration.hasSeenVerticalReachabilityEducation(mTaskInfo)
+                || (mHasUserDoubleTapped
+                    && (mLetterboxVerticalPosition == REACHABILITY_LEFT_OR_UP_POSITION
+                        || mLetterboxVerticalPosition == REACHABILITY_RIGHT_OR_BOTTOM_POSITION));
+
+        if (mIsActivityLetterboxed && (eligibleForDisplayHorizontalEducation
+                || eligibleForDisplayVerticalEducation)) {
             int availableWidth = getTaskBounds().width() - mTopActivityLetterboxWidth;
             int availableHeight = getTaskBounds().height() - mTopActivityLetterboxHeight;
-            mLayout.handleVisibility(mIsActivityLetterboxed, mLetterboxVerticalPosition,
-                    mLetterboxHorizontalPosition, availableWidth, availableHeight,
-                    mHasUserDoubleTapped);
+            mLayout.handleVisibility(eligibleForDisplayHorizontalEducation,
+                    eligibleForDisplayVerticalEducation,
+                    mLetterboxVerticalPosition, mLetterboxHorizontalPosition, availableWidth,
+                    availableHeight, mCompatUIConfiguration, mTaskInfo);
             if (!mHasLetterboxSizeChanged) {
                 updateHideTime();
                 mMainExecutor.executeDelayed(this::hideReachability, DISAPPEAR_DELAY_MS);
             }
             mHasUserDoubleTapped = false;
         } else {
-            hideReachability();
+            mLayout.hideAllImmediately();
         }
     }
 
     private void hideReachability() {
-        if (mLayout != null) {
-            mLayout.setIsLayoutActive(false);
-        }
         if (mLayout == null || !shouldHideEducation()) {
             return;
         }
         mLayout.hideAllImmediately();
-        // We need this in case the icons disappear after the timeout without an explicit
-        // double tap of the user.
-        mCompatUIConfiguration.setDontShowReachabilityEducationAgain(mTaskInfo);
-    }
-
-    private boolean shouldUpdateEducation() {
-        return mForceUpdate || mHasUserDoubleTapped || mHasLetterboxSizeChanged
-                || mCompatUIConfiguration.shouldShowReachabilityEducation(mTaskInfo);
     }
 
     private boolean shouldHideEducation() {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java
index 3d1ed87..14daae0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java
@@ -157,14 +157,21 @@
     @WMSingleton
     @Provides
     static PipTransitionController provideTvPipTransition(
+            Context context,
             ShellInit shellInit,
             ShellTaskOrganizer shellTaskOrganizer,
             Transitions transitions,
-            PipAnimationController pipAnimationController,
+            TvPipBoundsState tvPipBoundsState,
+            PipDisplayLayoutState pipDisplayLayoutState,
+            PipTransitionState pipTransitionState,
+            TvPipMenuController pipMenuController,
             TvPipBoundsAlgorithm tvPipBoundsAlgorithm,
-            TvPipBoundsState tvPipBoundsState, TvPipMenuController pipMenuController) {
-        return new TvPipTransition(shellInit, shellTaskOrganizer, transitions, tvPipBoundsState,
-                pipMenuController, tvPipBoundsAlgorithm, pipAnimationController);
+            PipAnimationController pipAnimationController,
+            PipSurfaceTransactionHelper pipSurfaceTransactionHelper) {
+        return new TvPipTransition(context, shellInit, shellTaskOrganizer, transitions,
+                tvPipBoundsState, pipDisplayLayoutState, pipTransitionState, pipMenuController,
+                tvPipBoundsAlgorithm, pipAnimationController, pipSurfaceTransactionHelper,
+                Optional.empty());
     }
 
     @WMSingleton
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
index 57b5b8f..9808c59 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
@@ -32,9 +32,6 @@
 import com.android.wm.shell.RootDisplayAreaOrganizer;
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
 import com.android.wm.shell.ShellTaskOrganizer;
-import com.android.wm.shell.TaskViewFactory;
-import com.android.wm.shell.TaskViewFactoryController;
-import com.android.wm.shell.TaskViewTransitions;
 import com.android.wm.shell.WindowManagerShellWrapper;
 import com.android.wm.shell.activityembedding.ActivityEmbeddingController;
 import com.android.wm.shell.back.BackAnimation;
@@ -93,6 +90,9 @@
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
 import com.android.wm.shell.sysui.ShellInterface;
+import com.android.wm.shell.taskview.TaskViewFactory;
+import com.android.wm.shell.taskview.TaskViewFactoryController;
+import com.android.wm.shell.taskview.TaskViewTransitions;
 import com.android.wm.shell.transition.ShellTransitions;
 import com.android.wm.shell.transition.Transitions;
 import com.android.wm.shell.unfold.ShellUnfoldProgressProvider;
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 f8743ed..d8e2f5c 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
@@ -30,7 +30,6 @@
 import com.android.launcher3.icons.IconProvider;
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
 import com.android.wm.shell.ShellTaskOrganizer;
-import com.android.wm.shell.TaskViewTransitions;
 import com.android.wm.shell.WindowManagerShellWrapper;
 import com.android.wm.shell.bubbles.BubbleController;
 import com.android.wm.shell.bubbles.BubbleData;
@@ -55,6 +54,7 @@
 import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
 import com.android.wm.shell.desktopmode.DesktopTasksController;
 import com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler;
+import com.android.wm.shell.desktopmode.ExitDesktopTaskTransitionHandler;
 import com.android.wm.shell.draganddrop.DragAndDropController;
 import com.android.wm.shell.freeform.FreeformComponents;
 import com.android.wm.shell.freeform.FreeformTaskListener;
@@ -89,6 +89,7 @@
 import com.android.wm.shell.sysui.ShellCommandHandler;
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
+import com.android.wm.shell.taskview.TaskViewTransitions;
 import com.android.wm.shell.transition.DefaultMixedHandler;
 import com.android.wm.shell.transition.Transitions;
 import com.android.wm.shell.unfold.ShellUnfoldProgressProvider;
@@ -677,13 +678,15 @@
             SyncTransactionQueue syncQueue,
             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
             Transitions transitions,
-            EnterDesktopTaskTransitionHandler transitionHandler,
+            EnterDesktopTaskTransitionHandler enterDesktopTransitionHandler,
+            ExitDesktopTaskTransitionHandler exitDesktopTransitionHandler,
             @DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository,
             @ShellMainThread ShellExecutor mainExecutor
     ) {
         return new DesktopTasksController(context, shellInit, shellController, displayController,
                 shellTaskOrganizer, syncQueue, rootTaskDisplayAreaOrganizer, transitions,
-                transitionHandler, desktopModeTaskRepository, mainExecutor);
+                enterDesktopTransitionHandler, exitDesktopTransitionHandler,
+                desktopModeTaskRepository, mainExecutor);
     }
 
     @WMSingleton
@@ -695,6 +698,15 @@
 
     @WMSingleton
     @Provides
+    static ExitDesktopTaskTransitionHandler provideExitDesktopTaskTransitionHandler(
+            Transitions transitions,
+            Context context
+    ) {
+        return new ExitDesktopTaskTransitionHandler(transitions, context);
+    }
+
+    @WMSingleton
+    @Provides
     @DynamicOverride
     static DesktopModeTaskRepository provideDesktopModeTaskRepository() {
         return new DesktopModeTaskRepository();
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 015d5c1..fb0a91f 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
@@ -16,10 +16,13 @@
 
 package com.android.wm.shell.desktopmode;
 
+import static com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler.FINAL_FREEFORM_SCALE;
+
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.RectEvaluator;
 import android.animation.ValueAnimator;
+import android.annotation.NonNull;
 import android.app.ActivityManager;
 import android.content.Context;
 import android.content.res.Resources;
@@ -32,12 +35,12 @@
 import android.view.WindowManager;
 import android.view.WindowlessWindowManager;
 import android.view.animation.DecelerateInterpolator;
-import android.widget.ImageView;
 
 import com.android.wm.shell.R;
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
 import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.common.DisplayController;
+import com.android.wm.shell.common.DisplayLayout;
 import com.android.wm.shell.common.SyncTransactionQueue;
 
 /**
@@ -56,6 +59,9 @@
     private final SyncTransactionQueue mSyncQueue;
     private SurfaceControlViewHost mViewHost;
 
+    private View mView;
+    private boolean mIsFullscreen;
+
     public DesktopModeVisualIndicator(SyncTransactionQueue syncQueue,
             ActivityManager.RunningTaskInfo taskInfo, DisplayController displayController,
             Context context, SurfaceControl taskSurface, ShellTaskOrganizer taskOrganizer,
@@ -67,21 +73,19 @@
         mTaskSurface = taskSurface;
         mTaskOrganizer = taskOrganizer;
         mRootTdaOrganizer = taskDisplayAreaOrganizer;
+        createView();
     }
 
     /**
-     * Create and animate the indicator for the exit desktop mode transition.
+     * Create a fullscreen indicator with no animation
      */
-    public void createFullscreenIndicator() {
+    private void createView() {
         final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
         final Resources resources = mContext.getResources();
         final DisplayMetrics metrics = resources.getDisplayMetrics();
         final int screenWidth = metrics.widthPixels;
         final int screenHeight = metrics.heightPixels;
-        final int padding = mDisplayController
-                .getDisplayLayout(mTaskInfo.displayId).stableInsets().top;
-        final ImageView v = new ImageView(mContext);
-        v.setImageResource(R.drawable.desktop_windowing_transition_background);
+        mView = new View(mContext);
         final SurfaceControl.Builder builder = new SurfaceControl.Builder();
         mRootTdaOrganizer.attachToDisplayArea(mTaskInfo.displayId, builder);
         mLeash = builder
@@ -101,7 +105,7 @@
         mViewHost = new SurfaceControlViewHost(mContext,
                 mDisplayController.getDisplay(mTaskInfo.displayId), windowManager,
                 "FullscreenVisualIndicator");
-        mViewHost.setView(v, lp);
+        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);
 
@@ -109,17 +113,56 @@
             transaction.merge(t);
             t.close();
         });
-        final Rect startBounds = new Rect(padding, padding,
-                screenWidth - padding, screenHeight - padding);
-        final VisualIndicatorAnimator animator = VisualIndicatorAnimator.fullscreenIndicator(v,
-                startBounds);
+    }
+
+    /**
+     * Create fullscreen indicator and fades it in.
+     */
+    public void createFullscreenIndicator() {
+        mIsFullscreen = true;
+        mView.setBackgroundResource(R.drawable.desktop_windowing_transition_background);
+        final VisualIndicatorAnimator animator = VisualIndicatorAnimator.toFullscreenAnimator(
+                mView, mDisplayController.getDisplayLayout(mTaskInfo.displayId));
+        animator.start();
+    }
+
+    /**
+     * Create a fullscreen indicator. Animator fades it in while expanding the bounds outwards.
+     */
+    public void createFullscreenIndicatorWithAnimatedBounds() {
+        mIsFullscreen = true;
+        mView.setBackgroundResource(R.drawable.desktop_windowing_transition_background);
+        final VisualIndicatorAnimator animator = VisualIndicatorAnimator
+                .toFullscreenAnimatorWithAnimatedBounds(mView,
+                        mDisplayController.getDisplayLayout(mTaskInfo.displayId));
+        animator.start();
+    }
+
+    /**
+     * Takes existing fullscreen indicator and animates it to freeform bounds
+     */
+    public void transitionFullscreenIndicatorToFreeform() {
+        mIsFullscreen = false;
+        final VisualIndicatorAnimator animator = VisualIndicatorAnimator.toFreeformAnimator(
+                mView, mDisplayController.getDisplayLayout(mTaskInfo.displayId));
+        animator.start();
+    }
+
+    /**
+     * Takes the existing freeform indicator and animates it to fullscreen
+     */
+    public void transitionFreeformIndicatorToFullscreen() {
+        mIsFullscreen = true;
+        final VisualIndicatorAnimator animator =
+                VisualIndicatorAnimator.toFullscreenAnimatorWithAnimatedBounds(
+                mView, mDisplayController.getDisplayLayout(mTaskInfo.displayId));
         animator.start();
     }
 
     /**
      * Release the indicator and its components when it is no longer needed.
      */
-    public void releaseFullscreenIndicator() {
+    public void releaseVisualIndicator() {
         if (mViewHost == null) return;
         if (mViewHost != null) {
             mViewHost.release();
@@ -136,20 +179,28 @@
             });
         }
     }
+
+    /**
+     * Returns true if visual indicator is fullscreen
+     */
+    public boolean isFullscreen() {
+        return mIsFullscreen;
+    }
+
     /**
      * 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 SCALE_ADJUSTMENT_PERCENT = 0.015f;
+        private static final float FULLSCREEN_SCALE_ADJUSTMENT_PERCENT = 0.015f;
         private static final float INDICATOR_FINAL_OPACITY = 0.7f;
 
-        private final ImageView mView;
+        private final View mView;
         private final Rect mStartBounds;
         private final Rect mEndBounds;
         private final RectEvaluator mRectEvaluator;
 
-        private VisualIndicatorAnimator(ImageView view, Rect startBounds,
+        private VisualIndicatorAnimator(View view, Rect startBounds,
                 Rect endBounds) {
             mView = view;
             mStartBounds = new Rect(startBounds);
@@ -161,30 +212,66 @@
         /**
          * Create animator for visual indicator of fullscreen transition
          *
-         * @param view        the view for this indicator
-         * @param startBounds the starting bounds of the fullscreen indicator
+         * @param view the view for this indicator
+         * @param displayLayout information about the display the transitioning task is currently on
          */
-        public static VisualIndicatorAnimator fullscreenIndicator(ImageView view,
-                Rect startBounds) {
-            view.getDrawable().setBounds(startBounds);
-            int width = startBounds.width();
-            int height = startBounds.height();
-            Rect endBounds = new Rect((int) (startBounds.left - (SCALE_ADJUSTMENT_PERCENT * width)),
-                    (int) (startBounds.top - (SCALE_ADJUSTMENT_PERCENT * height)),
-                    (int) (startBounds.right + (SCALE_ADJUSTMENT_PERCENT * width)),
-                    (int) (startBounds.bottom + (SCALE_ADJUSTMENT_PERCENT * height)));
-            VisualIndicatorAnimator animator = new VisualIndicatorAnimator(
-                    view, startBounds, endBounds);
+        public static VisualIndicatorAnimator toFullscreenAnimator(@NonNull View view,
+                @NonNull DisplayLayout displayLayout) {
+            final Rect bounds = getMaxBounds(displayLayout);
+            final VisualIndicatorAnimator animator = new VisualIndicatorAnimator(
+                    view, bounds, bounds);
             animator.setInterpolator(new DecelerateInterpolator());
-            setupFullscreenIndicatorAnimation(animator);
+            setupIndicatorAnimation(animator);
+            return animator;
+        }
+
+
+        /**
+         * Create animator for visual indicator of fullscreen transition
+         *
+         * @param view the view for this indicator
+         * @param displayLayout information about the display the transitioning task is currently on
+         */
+        public static VisualIndicatorAnimator toFullscreenAnimatorWithAnimatedBounds(
+                @NonNull View view, @NonNull DisplayLayout displayLayout) {
+            final int padding = displayLayout.stableInsets().top;
+            Rect startBounds = new Rect(padding, padding,
+                    displayLayout.width() - padding, displayLayout.height() - padding);
+            view.getBackground().setBounds(startBounds);
+
+            final VisualIndicatorAnimator animator = new VisualIndicatorAnimator(
+                    view, startBounds, getMaxBounds(displayLayout));
+            animator.setInterpolator(new DecelerateInterpolator());
+            setupIndicatorAnimation(animator);
             return animator;
         }
 
         /**
-         * Add necessary listener for animation of fullscreen indicator
+         * Create animator for visual indicator of freeform transition
+         *
+         * @param view the view for this indicator
+         * @param displayLayout information about the display the transitioning task is currently on
          */
-        private static void setupFullscreenIndicatorAnimation(
-                VisualIndicatorAnimator animator) {
+        public static VisualIndicatorAnimator toFreeformAnimator(@NonNull View view,
+                @NonNull DisplayLayout displayLayout) {
+            final float adjustmentPercentage = 1f - FINAL_FREEFORM_SCALE;
+            final int width = displayLayout.width();
+            final int height = displayLayout.height();
+            Rect endBounds = new Rect((int) (adjustmentPercentage * width / 2),
+                    (int) (adjustmentPercentage * height / 2),
+                    (int) (displayLayout.width() - (adjustmentPercentage * width / 2)),
+                    (int) (displayLayout.height() - (adjustmentPercentage * height / 2)));
+            final VisualIndicatorAnimator animator = new VisualIndicatorAnimator(
+                    view, getMaxBounds(displayLayout), endBounds);
+            animator.setInterpolator(new DecelerateInterpolator());
+            setupIndicatorAnimation(animator);
+            return animator;
+        }
+
+        /**
+         * Add necessary listener for animation of indicator
+         */
+        private static void setupIndicatorAnimation(@NonNull VisualIndicatorAnimator animator) {
             animator.addUpdateListener(a -> {
                 if (animator.mView != null) {
                     animator.updateBounds(a.getAnimatedFraction(), animator.mView);
@@ -196,7 +283,7 @@
             animator.addListener(new AnimatorListenerAdapter() {
                 @Override
                 public void onAnimationEnd(Animator animation) {
-                    animator.mView.getDrawable().setBounds(animator.mEndBounds);
+                    animator.mView.getBackground().setBounds(animator.mEndBounds);
                 }
             });
             animator.setDuration(FULLSCREEN_INDICATOR_DURATION);
@@ -210,9 +297,12 @@
          * @param fraction fraction to use, compared against previous fraction
          * @param view     the view to update
          */
-        private void updateBounds(float fraction, ImageView view) {
+        private void updateBounds(float fraction, View view) {
+            if (mStartBounds.equals(mEndBounds)) {
+                return;
+            }
             Rect currentBounds = mRectEvaluator.evaluate(fraction, mStartBounds, mEndBounds);
-            view.getDrawable().setBounds(currentBounds);
+            view.getBackground().setBounds(currentBounds);
         }
 
         /**
@@ -223,5 +313,23 @@
         private void updateIndicatorAlpha(float fraction, View view) {
             view.setAlpha(fraction * INDICATOR_FINAL_OPACITY);
         }
+
+        /**
+         * Return the max bounds of a fullscreen indicator
+         */
+        private static Rect getMaxBounds(@NonNull DisplayLayout displayLayout) {
+            final int padding = displayLayout.stableInsets().top;
+            final int width = displayLayout.width() - 2 * padding;
+            final int height = displayLayout.height() - 2 * padding;
+            Rect endBounds = new Rect((int) (padding
+                            - (FULLSCREEN_SCALE_ADJUSTMENT_PERCENT * width)),
+                    (int) (padding
+                            - (FULLSCREEN_SCALE_ADJUSTMENT_PERCENT * height)),
+                    (int) (displayLayout.width() - padding
+                            + (FULLSCREEN_SCALE_ADJUSTMENT_PERCENT * width)),
+                    (int) (displayLayout.height() - padding
+                            + (FULLSCREEN_SCALE_ADJUSTMENT_PERCENT * height)));
+            return endBounds;
+        }
     }
 }
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 cb04a43..670b24c 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
@@ -68,7 +68,8 @@
         private val syncQueue: SyncTransactionQueue,
         private val rootTaskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer,
         private val transitions: Transitions,
-        private val animationTransitionHandler: EnterDesktopTaskTransitionHandler,
+        private val enterDesktopTaskTransitionHandler: EnterDesktopTaskTransitionHandler,
+        private val exitDesktopTaskTransitionHandler: ExitDesktopTaskTransitionHandler,
         private val desktopModeTaskRepository: DesktopModeTaskRepository,
         @ShellMainThread private val mainExecutor: ShellExecutor
 ) : RemoteCallable<DesktopTasksController>, Transitions.TransitionHandler {
@@ -121,7 +122,7 @@
     }
 
     /** Move a task to desktop */
-    fun moveToDesktop(task: ActivityManager.RunningTaskInfo) {
+    fun moveToDesktop(task: RunningTaskInfo) {
         ProtoLog.v(WM_SHELL_DESKTOP_MODE, "moveToDesktop: %d", task.taskId)
 
         val wct = WindowContainerTransaction()
@@ -149,7 +150,7 @@
         wct.setBounds(taskInfo.token, startBounds)
 
         if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            animationTransitionHandler.startTransition(
+            enterDesktopTaskTransitionHandler.startTransition(
                     Transitions.TRANSIT_ENTER_FREEFORM, wct)
         } else {
             shellTaskOrganizer.applyTransaction(wct)
@@ -167,7 +168,8 @@
         wct.setBounds(taskInfo.token, freeformBounds)
 
         if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            animationTransitionHandler.startTransition(Transitions.TRANSIT_ENTER_DESKTOP_MODE, wct)
+            enterDesktopTaskTransitionHandler.startTransition(
+                Transitions.TRANSIT_ENTER_DESKTOP_MODE, wct)
         } else {
             shellTaskOrganizer.applyTransaction(wct)
         }
@@ -179,7 +181,7 @@
     }
 
     /** Move a task to fullscreen */
-    fun moveToFullscreen(task: ActivityManager.RunningTaskInfo) {
+    fun moveToFullscreen(task: RunningTaskInfo) {
         ProtoLog.v(WM_SHELL_DESKTOP_MODE, "moveToFullscreen: %d", task.taskId)
 
         val wct = WindowContainerTransaction()
@@ -191,8 +193,20 @@
         }
     }
 
+    fun moveToFullscreenWithAnimation(task: ActivityManager.RunningTaskInfo) {
+        val wct = WindowContainerTransaction()
+        addMoveToFullscreenChanges(wct, task.token)
+
+        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
+            exitDesktopTaskTransitionHandler.startTransition(
+            Transitions.TRANSIT_EXIT_DESKTOP_MODE, wct)
+        } else {
+            shellTaskOrganizer.applyTransaction(wct)
+        }
+    }
+
     /** Move a task to the front **/
-    fun moveTaskToFront(taskInfo: ActivityManager.RunningTaskInfo) {
+    fun moveTaskToFront(taskInfo: RunningTaskInfo) {
         val wct = WindowContainerTransaction()
         wct.reorder(taskInfo.token, true)
         if (Transitions.ENABLE_SHELL_TRANSITIONS) {
@@ -259,7 +273,7 @@
         request: TransitionRequestInfo
     ): WindowContainerTransaction? {
         // Check if we should skip handling this transition
-        val task: ActivityManager.RunningTaskInfo? = request.triggerTask
+        val task: RunningTaskInfo? = request.triggerTask
         val shouldHandleRequest =
             when {
                 // Only handle open or to front transitions
@@ -368,16 +382,15 @@
             taskSurface: SurfaceControl,
             y: Float
     ) {
-        val statusBarHeight = displayController
-                .getDisplayLayout(taskInfo.displayId)?.stableInsets()?.top ?: 0
         if (taskInfo.windowingMode == WINDOWING_MODE_FREEFORM) {
+            val statusBarHeight = getStatusBarHeight(taskInfo)
             if (y <= statusBarHeight && visualIndicator == null) {
                 visualIndicator = DesktopModeVisualIndicator(syncQueue, taskInfo,
                         displayController, context, taskSurface, shellTaskOrganizer,
                         rootTaskDisplayAreaOrganizer)
-                visualIndicator?.createFullscreenIndicator()
+                visualIndicator?.createFullscreenIndicatorWithAnimatedBounds()
             } else if (y > statusBarHeight && visualIndicator != null) {
-                visualIndicator?.releaseFullscreenIndicator()
+                visualIndicator?.releaseVisualIndicator()
                 visualIndicator = null
             }
         }
@@ -393,16 +406,73 @@
             taskInfo: RunningTaskInfo,
             y: Float
     ) {
-        val statusBarHeight = displayController
-                .getDisplayLayout(taskInfo.displayId)?.stableInsets()?.top ?: 0
+        val statusBarHeight = getStatusBarHeight(taskInfo)
         if (y <= statusBarHeight && taskInfo.windowingMode == WINDOWING_MODE_FREEFORM) {
-            moveToFullscreen(taskInfo.taskId)
-            visualIndicator?.releaseFullscreenIndicator()
+            visualIndicator?.releaseVisualIndicator()
             visualIndicator = null
+            moveToFullscreenWithAnimation(taskInfo)
         }
     }
 
     /**
+     * Perform checks required on drag move. Create/release fullscreen indicator and transitions
+     * indicator to freeform or fullscreen dimensions as needed.
+     *
+     * @param taskInfo the task being dragged.
+     * @param taskSurface SurfaceControl of dragged task.
+     * @param y coordinate of dragged task. Used for checks against status bar height.
+     */
+    fun onDragPositioningMoveThroughStatusBar(
+            taskInfo: RunningTaskInfo,
+            taskSurface: SurfaceControl,
+            y: Float
+    ) {
+        if (visualIndicator == null) {
+            visualIndicator = DesktopModeVisualIndicator(syncQueue, taskInfo,
+                    displayController, context, taskSurface, shellTaskOrganizer,
+                    rootTaskDisplayAreaOrganizer)
+            visualIndicator?.createFullscreenIndicator()
+        }
+        val indicator = visualIndicator ?: return
+        if (y >= getFreeformTransitionStatusBarDragThreshold(taskInfo)) {
+            if (indicator.isFullscreen) {
+                indicator.transitionFullscreenIndicatorToFreeform()
+            }
+        } else if (!indicator.isFullscreen) {
+            indicator.transitionFreeformIndicatorToFullscreen()
+        }
+    }
+
+    /**
+     * Perform checks required when drag ends under status bar area.
+     *
+     * @param taskInfo the task being dragged.
+     * @param y height of drag, to be checked against status bar height.
+     */
+    fun onDragPositioningEndThroughStatusBar(
+            taskInfo: RunningTaskInfo,
+            freeformBounds: Rect
+    ) {
+        moveToDesktopWithAnimation(taskInfo, freeformBounds)
+        visualIndicator?.releaseVisualIndicator()
+        visualIndicator = null
+    }
+
+
+    private fun getStatusBarHeight(taskInfo: RunningTaskInfo): Int {
+        return displayController.getDisplayLayout(taskInfo.displayId)?.stableInsets()?.top ?: 0
+    }
+
+    /**
+     * Returns the threshold at which we transition a task into freeform when dragging a
+     * fullscreen task down from the status bar
+     */
+    private fun getFreeformTransitionStatusBarDragThreshold(taskInfo: RunningTaskInfo): Int {
+        return 2 * getStatusBarHeight(taskInfo)
+    }
+
+
+    /**
      * Adds a listener to find out about changes in the visibility of freeform tasks.
      *
      * @param listener the listener to add.
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
new file mode 100644
index 0000000..248a5fc
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java
@@ -0,0 +1,171 @@
+/*
+ * 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.desktopmode;
+
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.os.IBinder;
+import android.util.DisplayMetrics;
+import android.view.SurfaceControl;
+import android.view.WindowManager;
+import android.window.TransitionInfo;
+import android.window.TransitionRequestInfo;
+import android.window.WindowContainerTransaction;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.wm.shell.transition.Transitions;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Supplier;
+
+
+/**
+ * The {@link Transitions.TransitionHandler} that handles transitions for desktop mode tasks
+ * entering and exiting freeform.
+ */
+public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionHandler {
+    private static final int FULLSCREEN_ANIMATION_DURATION = 336;
+    private final Context mContext;
+    private final Transitions mTransitions;
+    private final List<IBinder> mPendingTransitionTokens = new ArrayList<>();
+
+    private Supplier<SurfaceControl.Transaction> mTransactionSupplier;
+
+    public ExitDesktopTaskTransitionHandler(
+            Transitions transitions,
+            Context context) {
+        this(transitions, SurfaceControl.Transaction::new, context);
+    }
+
+    private ExitDesktopTaskTransitionHandler(
+            Transitions transitions,
+            Supplier<SurfaceControl.Transaction> supplier,
+            Context context) {
+        mTransitions = transitions;
+        mTransactionSupplier = supplier;
+        mContext = context;
+    }
+
+    /**
+     * Starts Transition of a given type
+     * @param type Transition type
+     * @param wct WindowContainerTransaction for transition
+     */
+    public void startTransition(@WindowManager.TransitionType int type,
+            @NonNull WindowContainerTransaction wct) {
+        final IBinder token = mTransitions.startTransition(type, wct, this);
+        mPendingTransitionTokens.add(token);
+    }
+
+    @Override
+    public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
+            @NonNull SurfaceControl.Transaction startT,
+            @NonNull SurfaceControl.Transaction finishT,
+            @NonNull Transitions.TransitionFinishCallback finishCallback) {
+        boolean transitionHandled = false;
+        for (TransitionInfo.Change change : info.getChanges()) {
+            if ((change.getFlags() & TransitionInfo.FLAG_IS_WALLPAPER) != 0) {
+                continue;
+            }
+
+            final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
+            if (taskInfo == null || taskInfo.taskId == -1) {
+                continue;
+            }
+
+            if (change.getMode() == WindowManager.TRANSIT_CHANGE) {
+                transitionHandled |= startChangeTransition(
+                        transition, info.getType(), change, startT, finishCallback);
+            }
+        }
+
+        mPendingTransitionTokens.remove(transition);
+
+        return transitionHandled;
+    }
+
+    @VisibleForTesting
+    boolean startChangeTransition(
+            @NonNull IBinder transition,
+            @WindowManager.TransitionType int type,
+            @NonNull TransitionInfo.Change change,
+            @NonNull SurfaceControl.Transaction startT,
+            @NonNull Transitions.TransitionFinishCallback finishCallback) {
+        if (!mPendingTransitionTokens.contains(transition)) {
+            return false;
+        }
+        final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
+        if (type == Transitions.TRANSIT_EXIT_DESKTOP_MODE
+                && taskInfo.getWindowingMode() == WINDOWING_MODE_FULLSCREEN) {
+            // This Transition animates a task to fullscreen after being dragged to status bar
+            final Resources resources = mContext.getResources();
+            final DisplayMetrics metrics = resources.getDisplayMetrics();
+            final int screenWidth = metrics.widthPixels;
+            final int screenHeight = metrics.heightPixels;
+            final SurfaceControl sc = change.getLeash();
+            startT.setCrop(sc, null);
+            startT.apply();
+            final ValueAnimator animator = new ValueAnimator();
+            animator.setFloatValues(0f, 1f);
+            animator.setDuration(FULLSCREEN_ANIMATION_DURATION);
+            final Rect startBounds = change.getStartAbsBounds();
+            final float scaleX = (float) startBounds.width() / screenWidth;
+            final float scaleY = (float) startBounds.height() / screenHeight;
+            final SurfaceControl.Transaction t = mTransactionSupplier.get();
+            Point startPos = new Point(startBounds.left,
+                    startBounds.top);
+            animator.addUpdateListener(animation -> {
+                float fraction = animation.getAnimatedFraction();
+                float currentScaleX = scaleX + ((1 - scaleX) * fraction);
+                float currentScaleY = scaleY + ((1 - scaleY) * fraction);
+                t.setPosition(sc, startPos.x * (1 - fraction), startPos.y * (1 - fraction));
+                t.setScale(sc, currentScaleX, currentScaleY);
+                t.apply();
+            });
+            animator.addListener(new AnimatorListenerAdapter() {
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    mTransitions.getMainExecutor().execute(
+                            () -> finishCallback.onTransitionFinished(null, null));
+                }
+            });
+            animator.start();
+            return true;
+        }
+
+        return false;
+    }
+
+    @Nullable
+    @Override
+    public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
+            @NonNull TransitionRequestInfo request) {
+        return null;
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/OWNERS b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/OWNERS
index 926cfb3..deb7c6d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/OWNERS
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/OWNERS
@@ -1,2 +1,3 @@
 # WM shell sub-module desktop owners
[email protected]
 [email protected]
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/OWNERS b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/OWNERS
index 0c2d5c4..ccbb9cf 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/OWNERS
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/OWNERS
@@ -1,2 +1,3 @@
 # WM shell sub-module freeform owners
[email protected]
 [email protected]
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/kidsmode/KidsModeTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/kidsmode/KidsModeTaskOrganizer.java
index 318a49a..6d46a9c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/kidsmode/KidsModeTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/kidsmode/KidsModeTaskOrganizer.java
@@ -23,6 +23,7 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
 import static android.view.Display.DEFAULT_DISPLAY;
 
 import android.app.ActivityManager;
@@ -310,8 +311,11 @@
         // TODO(229961548): Remove ignoreOrientationRequest exception for Kids Mode once possible.
         if (mReverseDefaultRotationEnabled) {
             setOrientationRequestPolicy(/* isIgnoreOrientationRequestDisabled */ true,
-                    /* fromOrientations */ new int[]{SCREEN_ORIENTATION_REVERSE_LANDSCAPE},
-                    /* toOrientations */ new int[]{SCREEN_ORIENTATION_LANDSCAPE});
+                    /* fromOrientations */
+                    new int[]{SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_REVERSE_LANDSCAPE},
+                    /* toOrientations */
+                    new int[]{SCREEN_ORIENTATION_SENSOR_LANDSCAPE,
+                            SCREEN_ORIENTATION_SENSOR_LANDSCAPE});
         } else {
             setOrientationRequestPolicy(/* isIgnoreOrientationRequestDisabled */ true,
                     /* fromOrientations */ null, /* toOrientations */ null);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/OWNERS b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/OWNERS
index afddfab..ec09827 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/OWNERS
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/OWNERS
@@ -1,2 +1,3 @@
 # WM shell sub-module pip owner
 [email protected]
[email protected]
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
index 4c53f60..f70df83 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
@@ -188,6 +188,11 @@
         return mCurrentAnimator;
     }
 
+    /** Reset animator state to prevent it from being used after its lifetime. */
+    public void resetAnimatorState() {
+        mCurrentAnimator = null;
+    }
+
     private PipTransitionAnimator setupPipTransitionAnimator(PipTransitionAnimator animator) {
         animator.setSurfaceTransactionHelper(mSurfaceTransactionHelper);
         animator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
index 867162b..24d0b99 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
@@ -198,7 +198,7 @@
     /**
      * @return whether the given {@param aspectRatio} is valid.
      */
-    private boolean isValidPictureInPictureAspectRatio(float aspectRatio) {
+    public boolean isValidPictureInPictureAspectRatio(float aspectRatio) {
         return Float.compare(mMinAspectRatio, aspectRatio) <= 0
                 && Float.compare(aspectRatio, mMaxAspectRatio) <= 0;
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
index f2f30ea..a0bd064 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
@@ -73,6 +73,7 @@
 import android.window.TaskSnapshot;
 import android.window.WindowContainerToken;
 import android.window.WindowContainerTransaction;
+import android.window.WindowContainerTransactionCallback;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.protolog.common.ProtoLog;
@@ -142,6 +143,23 @@
     protected final ShellTaskOrganizer mTaskOrganizer;
     protected final ShellExecutor mMainExecutor;
 
+    // the runnable to execute after WindowContainerTransactions is applied to finish resizing pip
+    private Runnable mPipFinishResizeWCTRunnable;
+
+    private final WindowContainerTransactionCallback mPipFinishResizeWCTCallback =
+            new WindowContainerTransactionCallback() {
+        @Override
+        public void onTransactionReady(int id, SurfaceControl.Transaction t) {
+            t.apply();
+
+            // execute the runnable if non-null after WCT is applied to finish resizing pip
+            if (mPipFinishResizeWCTRunnable != null) {
+                mPipFinishResizeWCTRunnable.run();
+                mPipFinishResizeWCTRunnable = null;
+            }
+        }
+    };
+
     // These callbacks are called on the update thread
     private final PipAnimationController.PipAnimationCallback mPipAnimationCallback =
             new PipAnimationController.PipAnimationCallback() {
@@ -416,6 +434,26 @@
     }
 
     /**
+     * Override if the PiP should always use a fade-in animation during PiP entry.
+     *
+     * @return true if the mOneShotAnimationType should always be
+     * {@link PipAnimationController#ANIM_TYPE_ALPHA}.
+     */
+    protected boolean shouldAlwaysFadeIn() {
+        return false;
+    }
+
+    /**
+     * Whether the menu should get attached as early as possible when entering PiP.
+     *
+     * @return whether the menu should be attached before
+     * {@link PipBoundsAlgorithm#getEntryDestinationBounds()} is called.
+     */
+    protected boolean shouldAttachMenuEarly() {
+        return false;
+    }
+
+    /**
      * Callback when Launcher starts swipe-pip-to-home operation.
      * @return {@link Rect} for destination bounds.
      */
@@ -709,17 +747,26 @@
             return;
         }
 
+        if (shouldAlwaysFadeIn()) {
+            mOneShotAnimationType = ANIM_TYPE_ALPHA;
+        }
+
         if (mWaitForFixedRotation) {
             onTaskAppearedWithFixedRotation();
             return;
         }
 
+        if (shouldAttachMenuEarly()) {
+            mPipMenuController.attach(mLeash);
+        }
         final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
         Objects.requireNonNull(destinationBounds, "Missing destination bounds");
         final Rect currentBounds = mTaskInfo.configuration.windowConfiguration.getBounds();
 
         if (mOneShotAnimationType == ANIM_TYPE_BOUNDS) {
-            mPipMenuController.attach(mLeash);
+            if (!shouldAttachMenuEarly()) {
+                mPipMenuController.attach(mLeash);
+            }
             final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect(
                     info.pictureInPictureParams, currentBounds);
             scheduleAnimateResizePip(currentBounds, destinationBounds, 0 /* startingAngle */,
@@ -834,7 +881,9 @@
             @Nullable SurfaceControl.Transaction boundsChangeTransaction) {
         // PiP menu is attached late in the process here to avoid any artifacts on the leash
         // caused by addShellRoot when in gesture navigation mode.
-        mPipMenuController.attach(mLeash);
+        if (!shouldAttachMenuEarly()) {
+            mPipMenuController.attach(mLeash);
+        }
         final WindowContainerTransaction wct = new WindowContainerTransaction();
         wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED);
         wct.setBounds(mToken, destinationBounds);
@@ -1210,7 +1259,16 @@
     protected void applyNewPictureInPictureParams(@NonNull PictureInPictureParams params) {
         if (mDeferredTaskInfo != null || PipUtils.aspectRatioChanged(params.getAspectRatioFloat(),
                 mPictureInPictureParams.getAspectRatioFloat())) {
-            mPipParamsChangedForwarder.notifyAspectRatioChanged(params.getAspectRatioFloat());
+            if (mPipBoundsAlgorithm.isValidPictureInPictureAspectRatio(
+                    params.getAspectRatioFloat())) {
+                mPipParamsChangedForwarder.notifyAspectRatioChanged(params.getAspectRatioFloat());
+            } else {
+                ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                        "%s: New aspect ratio is not valid."
+                                + " hasAspectRatio=%b"
+                                + " aspectRatio=%f",
+                        TAG, params.hasSetAspectRatio(), params.getAspectRatioFloat());
+            }
         }
         if (mDeferredTaskInfo != null
                 || PipUtils.remoteActionsChanged(params.getActions(),
@@ -1249,8 +1307,23 @@
     /**
      * Animates resizing of the pinned stack given the duration and start bounds.
      * This is used when the starting bounds is not the current PiP bounds.
+     *
+     * @param pipFinishResizeWCTRunnable callback to run after window updates are complete
      */
     public void scheduleAnimateResizePip(Rect fromBounds, Rect toBounds, int duration,
+            float startingAngle, Consumer<Rect> updateBoundsCallback,
+            Runnable pipFinishResizeWCTRunnable) {
+        mPipFinishResizeWCTRunnable = pipFinishResizeWCTRunnable;
+        if (mPipFinishResizeWCTRunnable != null) {
+            ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                    "mPipFinishResizeWCTRunnable is set to be called once window updates");
+        }
+
+        scheduleAnimateResizePip(fromBounds, toBounds, duration, startingAngle,
+                updateBoundsCallback);
+    }
+
+    private void scheduleAnimateResizePip(Rect fromBounds, Rect toBounds, int duration,
             float startingAngle, Consumer<Rect> updateBoundsCallback) {
         if (mWaitForFixedRotation) {
             ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
@@ -1518,6 +1591,11 @@
             @PipAnimationController.TransitionDirection int direction,
             SurfaceControl.Transaction tx,
             WindowContainerTransaction wct) {
+        if (mLeash == null || !mLeash.isValid()) {
+            ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                    "%s: Invalid leash on prepareFinishResizeTransaction: %s", TAG, mLeash);
+            return;
+        }
         final Rect taskBounds;
         if (isInPipDirection(direction)) {
             // If we are animating from fullscreen using a bounds animation, then reset the
@@ -1555,7 +1633,7 @@
             mSplitScreenOptional.ifPresent(splitScreenController ->
                     splitScreenController.enterSplitScreen(mTaskInfo.taskId, wasPipTopLeft, wct));
         } else {
-            mTaskOrganizer.applyTransaction(wct);
+            mTaskOrganizer.applySyncTransaction(wct, mPipFinishResizeWCTCallback);
         }
     }
 
@@ -1790,6 +1868,7 @@
                         animator::clearContentOverlay);
             }
             PipAnimationController.quietCancel(animator);
+            mPipAnimationController.resetAnimatorState();
         }
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
index 49a27c5..4a76a50 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
@@ -272,6 +272,8 @@
     public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
             @NonNull TransitionRequestInfo request) {
         if (requestHasPipEnter(request)) {
+            ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                    "%s: handle PiP enter request", TAG);
             WindowContainerTransaction wct = new WindowContainerTransaction();
             augmentRequest(transition, request, wct);
             return wct;
@@ -731,6 +733,11 @@
 
         setBoundsStateForEntry(taskInfo.topActivity, taskInfo.pictureInPictureParams,
                 taskInfo.topActivityInfo);
+
+        if (mPipOrganizer.shouldAttachMenuEarly()) {
+            mPipMenuController.attach(leash);
+        }
+
         final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
         final Rect currentBounds = taskInfo.configuration.windowConfiguration.getBounds();
         int rotationDelta = deltaRotation(startRotation, endRotation);
@@ -745,7 +752,10 @@
         mSurfaceTransactionHelper
                 .crop(finishTransaction, leash, destinationBounds)
                 .round(finishTransaction, leash, true /* applyCornerRadius */);
-        mTransitions.getMainExecutor().executeDelayed(() -> mPipMenuController.attach(leash), 0);
+        if (!mPipOrganizer.shouldAttachMenuEarly()) {
+            mTransitions.getMainExecutor().executeDelayed(
+                    () -> mPipMenuController.attach(leash), 0);
+        }
 
         if (taskInfo.pictureInPictureParams != null
                 && taskInfo.pictureInPictureParams.isAutoEnterEnabled()
@@ -785,6 +795,11 @@
             tmpTransform.postRotate(rotationDelta);
             startTransaction.setMatrix(leash, tmpTransform, new float[9]);
         }
+
+        if (mPipOrganizer.shouldAlwaysFadeIn()) {
+            mOneShotAnimationType = ANIM_TYPE_ALPHA;
+        }
+
         if (mOneShotAnimationType == ANIM_TYPE_ALPHA) {
             startTransaction.setAlpha(leash, 0f);
         }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java
index fee9140..956af70 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java
@@ -580,8 +580,16 @@
                 final float snapFraction = mPipBoundsAlgorithm.getSnapFraction(
                         mLastResizeBounds, movementBounds);
                 mPipBoundsAlgorithm.applySnapFraction(mLastResizeBounds, snapFraction);
+
+                // disable the pinch resizing until the final bounds are updated
+                final boolean prevEnablePinchResize = mEnablePinchResize;
+                mEnablePinchResize = false;
+
                 mPipTaskOrganizer.scheduleAnimateResizePip(startBounds, mLastResizeBounds,
-                        PINCH_RESIZE_SNAP_DURATION, mAngle, mUpdateResizeBoundsCallback);
+                        PINCH_RESIZE_SNAP_DURATION, mAngle, mUpdateResizeBoundsCallback, () -> {
+                            // reset the pinch resizing to its default state
+                            mEnablePinchResize = prevEnablePinchResize;
+                        });
             } else {
                 mPipTaskOrganizer.scheduleFinishResizePip(mLastResizeBounds,
                         PipAnimationController.TRANSITION_DIRECTION_USER_RESIZE,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBackgroundView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBackgroundView.java
new file mode 100644
index 0000000..0221db8
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBackgroundView.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.pip.tv;
+
+import static com.android.wm.shell.pip.tv.TvPipMenuController.MODE_ALL_ACTIONS_MENU;
+import static com.android.wm.shell.pip.tv.TvPipMenuController.MODE_MOVE_MENU;
+import static com.android.wm.shell.pip.tv.TvPipMenuController.MODE_NO_MENU;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.view.View;
+import android.view.animation.Interpolator;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+
+import com.android.internal.protolog.common.ProtoLog;
+import com.android.wm.shell.R;
+import com.android.wm.shell.protolog.ShellProtoLogGroup;
+
+/**
+ * This view is part of the Tv PiP menu. It is drawn behind the PiP surface and serves as a
+ * background behind the PiP content. If the PiP content is translucent, this view is visible
+ * behind it.
+ * It is also used to draw the shadow behind the Tv PiP menu. The shadow intensity is determined
+ * by the menu mode that the Tv PiP menu is in. See {@link TvPipMenuController.TvPipMenuMode}.
+ */
+class TvPipBackgroundView extends FrameLayout {
+    private static final String TAG = "TvPipBackgroundView";
+
+    private final View mBackgroundView;
+    private final int mElevationNoMenu;
+    private final int mElevationMoveMenu;
+    private final int mElevationAllActionsMenu;
+    private final int mPipMenuFadeAnimationDuration;
+
+    private @TvPipMenuController.TvPipMenuMode int mCurrentMenuMode = MODE_NO_MENU;
+
+    TvPipBackgroundView(@NonNull Context context) {
+        super(context, null, 0, 0);
+        inflate(context, R.layout.tv_pip_menu_background, this);
+
+        mBackgroundView = findViewById(R.id.background_view);
+
+        final Resources res = mContext.getResources();
+        mElevationNoMenu = res.getDimensionPixelSize(R.dimen.pip_menu_elevation_no_menu);
+        mElevationMoveMenu = res.getDimensionPixelSize(R.dimen.pip_menu_elevation_move_menu);
+        mElevationAllActionsMenu =
+                res.getDimensionPixelSize(R.dimen.pip_menu_elevation_all_actions_menu);
+        mPipMenuFadeAnimationDuration =
+                res.getInteger(R.integer.tv_window_menu_fade_animation_duration);
+    }
+
+    void transitionToMenuMode(@TvPipMenuController.TvPipMenuMode int pipMenuMode) {
+        ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                "%s: transitionToMenuMode(), old menu mode = %s, new menu mode = %s",
+                TAG, TvPipMenuController.getMenuModeString(mCurrentMenuMode),
+                TvPipMenuController.getMenuModeString(pipMenuMode));
+
+        if (mCurrentMenuMode == pipMenuMode) return;
+
+        int elevation = mElevationNoMenu;
+        Interpolator interpolator = TvPipInterpolators.ENTER;
+        switch(pipMenuMode) {
+            case MODE_NO_MENU:
+                elevation = mElevationNoMenu;
+                interpolator = TvPipInterpolators.EXIT;
+                break;
+            case MODE_MOVE_MENU:
+                elevation = mElevationMoveMenu;
+                break;
+            case MODE_ALL_ACTIONS_MENU:
+                elevation = mElevationAllActionsMenu;
+                if (mCurrentMenuMode == MODE_MOVE_MENU) {
+                    interpolator = TvPipInterpolators.EXIT;
+                }
+                break;
+            default:
+                throw new IllegalArgumentException(
+                        "Unknown TV PiP menu mode: " + pipMenuMode);
+        }
+
+        mBackgroundView.animate()
+            .translationZ(elevation)
+            .setInterpolator(interpolator)
+            .setDuration(mPipMenuFadeAnimationDuration)
+            .start();
+
+        mCurrentMenuMode = pipMenuMode;
+    }
+
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java
index d73723c..2f74fb6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java
@@ -446,7 +446,7 @@
                     "%s: PiP has already been closed by custom close action", TAG);
             return;
         }
-        removeTask(mPinnedTaskId);
+        mPipTaskOrganizer.removePip();
         onPipDisappeared();
     }
 
@@ -673,17 +673,6 @@
         }
     }
 
-    private static void removeTask(int taskId) {
-        ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
-                "%s: removeTask(), taskId=%d", TAG, taskId);
-        try {
-            ActivityTaskManager.getService().removeTask(taskId);
-        } catch (Exception e) {
-            ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
-                    "%s: Atm.removeTask() failed, %s", TAG, e);
-        }
-    }
-
     private static String stateToName(@State int state) {
         switch (state) {
             case STATE_NO_PIP:
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipCustomAction.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipCustomAction.java
index 49d40d3..bca27a5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipCustomAction.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipCustomAction.java
@@ -86,6 +86,7 @@
         Bundle extras = new Bundle();
         extras.putCharSequence(Notification.EXTRA_PICTURE_CONTENT_DESCRIPTION,
                 mRemoteAction.getContentDescription());
+        extras.putBoolean(Notification.EXTRA_CONTAINS_CUSTOM_VIEW, true);
         builder.addExtras(extras);
 
         builder.setSemanticAction(isCloseAction()
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java
index 2c6ca1af..b18e21c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java
@@ -27,7 +27,6 @@
 import android.graphics.Insets;
 import android.graphics.Rect;
 import android.os.Handler;
-import android.view.LayoutInflater;
 import android.view.SurfaceControl;
 import android.view.View;
 import android.view.ViewRootImpl;
@@ -61,7 +60,7 @@
     private Delegate mDelegate;
     private SurfaceControl mLeash;
     private TvPipMenuView mPipMenuView;
-    private View mPipBackgroundView;
+    private TvPipBackgroundView mPipBackgroundView;
     private boolean mMenuIsFocused;
 
     @TvPipMenuMode
@@ -178,12 +177,16 @@
     }
 
     private void attachPipBackgroundView() {
-        mPipBackgroundView = LayoutInflater.from(mContext)
-                .inflate(R.layout.tv_pip_menu_background, null);
+        mPipBackgroundView = createTvPipBackgroundView();
         setUpViewSurfaceZOrder(mPipBackgroundView, -1);
         addPipMenuViewToSystemWindows(mPipBackgroundView, BACKGROUND_WINDOW_TITLE);
     }
 
+    @VisibleForTesting
+    TvPipBackgroundView createTvPipBackgroundView() {
+        return new TvPipBackgroundView(mContext);
+    }
+
     private void setUpViewSurfaceZOrder(View v, int zOrderRelativeToPip) {
         v.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
             @Override
@@ -273,15 +276,14 @@
             Rect pipBounds) {
         ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
                 "%s: resizePipMenu: %s", TAG, pipBounds.toShortString());
+
         if (pipBounds.isEmpty()) {
             return;
         }
-
-        if (!isMenuReadyToMove()) {
+        if (!isMenuAttached()) {
             return;
         }
 
-
         final SurfaceControl frontSurface = getSurfaceControl(mPipMenuView);
         final SurfaceControl backSurface = getSurfaceControl(mPipBackgroundView);
         final Rect menuBounds = calculateMenuSurfaceBounds(pipBounds);
@@ -318,7 +320,7 @@
             }
             return;
         }
-        if (!isMenuReadyToMove()) {
+        if (!isMenuAttached()) {
             return;
         }
 
@@ -341,12 +343,12 @@
         syncGroup.markSyncReady();
     }
 
-    private boolean isMenuReadyToMove() {
+    private boolean isMenuAttached() {
         final boolean ready = mPipMenuView != null && mPipMenuView.getViewRootImpl() != null
                 && mPipBackgroundView != null && mPipBackgroundView.getViewRootImpl() != null;
         if (!ready) {
             ProtoLog.v(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
-                    "%s: Not going to move PiP, either menu or its parent is not created.", TAG);
+                    "%s: the menu surfaces are not attached.", TAG);
         }
         return ready;
     }
@@ -365,6 +367,9 @@
 
     @Override
     public void updateMenuBounds(Rect pipBounds) {
+        if (!isMenuAttached()) {
+            return;
+        }
         final Rect menuBounds = calculateMenuSurfaceBounds(pipBounds);
         ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
                 "%s: updateMenuBounds: %s", TAG, menuBounds.toShortString());
@@ -415,10 +420,11 @@
     }
 
     private void updateUiOnNewMenuModeRequest(boolean resetMenu) {
-        if (mPipMenuView == null) return;
+        if (mPipMenuView == null || mPipBackgroundView == null) return;
 
         mPipMenuView.setPipGravity(mTvPipBoundsState.getTvPipGravity());
         mPipMenuView.transitionToMenuMode(mCurrentMenuMode, resetMenu);
+        mPipBackgroundView.transitionToMenuMode(mCurrentMenuMode);
         grantPipMenuFocus(mCurrentMenuMode != MODE_NO_MENU);
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java
index ccf65c2..6eb719b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java
@@ -92,7 +92,6 @@
     private @TvPipMenuController.TvPipMenuMode int mCurrentMenuMode = MODE_NO_MENU;
     private final Rect mCurrentPipBounds = new Rect();
     private int mCurrentPipGravity;
-    private boolean mSwitchingOrientation;
 
     private final AccessibilityManager mA11yManager;
     private final Handler mMainHandler;
@@ -176,17 +175,12 @@
         }
 
         if (mCurrentMenuMode == MODE_ALL_ACTIONS_MENU) {
-            mSwitchingOrientation = true;
+            // Fade out while orientation change is ongoing and fade back in once transition is
+            // finished.
             mActionButtonsRecyclerView.animate()
                     .alpha(0)
                     .setInterpolator(TvPipInterpolators.EXIT)
-                    .setDuration(mResizeAnimationDuration / 2)
-                    .withEndAction(() -> {
-                        mButtonLayoutManager.setOrientation(vertical
-                                ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);
-                        // Only make buttons visible again in onPipTransitionFinished to keep in
-                        // sync with PiP content alpha animation.
-                    });
+                    .setDuration(mResizeAnimationDuration / 2);
         } else {
             mButtonLayoutManager.setOrientation(vertical
                     ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);
@@ -208,13 +202,16 @@
             mEduTextDrawer.init();
         }
 
-        if (mSwitchingOrientation) {
+        mButtonLayoutManager.setOrientation(
+                    mCurrentPipBounds.height() > mCurrentPipBounds.width()
+                            ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);
+        if (mCurrentMenuMode == MODE_ALL_ACTIONS_MENU
+                && mActionButtonsRecyclerView.getAlpha() != 1f) {
             mActionButtonsRecyclerView.animate()
                     .alpha(1)
                     .setInterpolator(TvPipInterpolators.ENTER)
                     .setDuration(mResizeAnimationDuration / 2);
         }
-        mSwitchingOrientation = false;
     }
 
     /**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTaskOrganizer.java
index f6856f1..0940490 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTaskOrganizer.java
@@ -85,4 +85,17 @@
             mPipParamsChangedForwarder.notifySubtitleChanged(params.getSubtitle());
         }
     }
+
+    /**
+     * Override for TV since the menu bounds affect the PiP location. Additionally, we want to
+     * ensure that menu is shown immediately since it should always be visible on TV as it creates
+     * a border with rounded corners around the PiP.
+     */
+    protected boolean shouldAttachMenuEarly() {
+        return true;
+    }
+
+    protected boolean shouldAlwaysFadeIn() {
+        return true;
+    }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTransition.java
index 8ebcf63..d3253a5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTransition.java
@@ -16,60 +16,43 @@
 
 package com.android.wm.shell.pip.tv;
 
-import android.app.TaskInfo;
-import android.graphics.Rect;
-import android.os.IBinder;
-import android.view.SurfaceControl;
-import android.window.TransitionInfo;
-import android.window.TransitionRequestInfo;
-import android.window.WindowContainerTransaction;
+import android.content.Context;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 
 import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.pip.PipAnimationController;
-import com.android.wm.shell.pip.PipBoundsState;
-import com.android.wm.shell.pip.PipMenuController;
-import com.android.wm.shell.pip.PipTransitionController;
+import com.android.wm.shell.pip.PipDisplayLayoutState;
+import com.android.wm.shell.pip.PipSurfaceTransactionHelper;
+import com.android.wm.shell.pip.PipTransition;
+import com.android.wm.shell.pip.PipTransitionState;
+import com.android.wm.shell.splitscreen.SplitScreenController;
 import com.android.wm.shell.sysui.ShellInit;
 import com.android.wm.shell.transition.Transitions;
 
+import java.util.Optional;
+
 /**
  * PiP Transition for TV.
- * TODO: Implement animation once TV is using Transitions.
  */
-public class TvPipTransition extends PipTransitionController {
-    public TvPipTransition(
+public class TvPipTransition extends PipTransition {
+
+    public TvPipTransition(Context context,
             @NonNull ShellInit shellInit,
             @NonNull ShellTaskOrganizer shellTaskOrganizer,
             @NonNull Transitions transitions,
-            PipBoundsState pipBoundsState,
-            PipMenuController pipMenuController,
+            TvPipBoundsState tvPipBoundsState,
+            PipDisplayLayoutState pipDisplayLayoutState,
+            PipTransitionState pipTransitionState,
+            TvPipMenuController tvPipMenuController,
             TvPipBoundsAlgorithm tvPipBoundsAlgorithm,
-            PipAnimationController pipAnimationController) {
-        super(shellInit, shellTaskOrganizer, transitions, pipBoundsState, pipMenuController,
-                tvPipBoundsAlgorithm, pipAnimationController);
+            PipAnimationController pipAnimationController,
+            PipSurfaceTransactionHelper pipSurfaceTransactionHelper,
+            Optional<SplitScreenController> splitScreenOptional) {
+        super(context, shellInit, shellTaskOrganizer, transitions, tvPipBoundsState,
+                pipDisplayLayoutState, pipTransitionState, tvPipMenuController,
+                tvPipBoundsAlgorithm, pipAnimationController, pipSurfaceTransactionHelper,
+                splitScreenOptional);
     }
 
-    @Override
-    public void onFinishResize(TaskInfo taskInfo, Rect destinationBounds, int direction,
-            SurfaceControl.Transaction tx) {
-
-    }
-
-    @Override
-    public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
-            @NonNull SurfaceControl.Transaction startTransaction,
-            @android.annotation.NonNull SurfaceControl.Transaction finishTransaction,
-            @NonNull Transitions.TransitionFinishCallback finishCallback) {
-        return false;
-    }
-
-    @Nullable
-    @Override
-    public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
-            @NonNull TransitionRequestInfo request) {
-        return null;
-    }
 }
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 5c64177..c8d6a5e8 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
@@ -456,7 +456,10 @@
                         cancel(mWillFinishToHome);
                         return;
                     }
-                    hasChangingApp = true;
+                    // Don't consider order-only changes as changing apps.
+                    if (!TransitionUtil.isOrderOnly(change)) {
+                        hasChangingApp = true;
+                    }
                 }
             }
             if (hasChangingApp && foundRecentsClosing) {
@@ -484,13 +487,14 @@
             }
             boolean didMergeThings = false;
             if (closingTasks != null) {
-                // Cancelling a task-switch. Move the tasks back to mPausing from mOpening
+                // Potentially cancelling a task-switch. Move the tasks back to mPausing if they
+                // are in mOpening.
                 for (int i = 0; i < closingTasks.size(); ++i) {
                     final TransitionInfo.Change change = closingTasks.get(i);
                     int openingIdx = TaskState.indexOf(mOpeningTasks, change);
                     if (openingIdx < 0) {
-                        Slog.e(TAG, "Back to existing recents animation from an unrecognized "
-                                + "task: " + change.getTaskInfo().taskId);
+                        Slog.w(TAG, "Closing a task that wasn't opening, this may be split or"
+                                + " something unexpected: " + change.getTaskInfo().taskId);
                         continue;
                     }
                     mPausingTasks.add(mOpeningTasks.remove(openingIdx));
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java
index ebdaaa9..22800ad 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java
@@ -66,13 +66,11 @@
     private final Transitions mTransitions;
     private final Runnable mOnFinish;
 
-    DismissTransition mPendingDismiss = null;
+    DismissSession mPendingDismiss = null;
     TransitSession mPendingEnter = null;
-    TransitSession mPendingRecent = null;
     TransitSession mPendingResize = null;
 
     private IBinder mAnimatingTransition = null;
-    OneShotRemoteHandler mPendingRemoteHandler = null;
     private OneShotRemoteHandler mActiveRemoteHandler = null;
 
     private final Transitions.TransitionFinishCallback mRemoteFinishCB = this::onFinish;
@@ -101,27 +99,30 @@
         mFinishCallback = finishCallback;
         mAnimatingTransition = transition;
         mFinishTransaction = finishTransaction;
-        if (mPendingRemoteHandler != null) {
-            mPendingRemoteHandler.startAnimation(transition, info, startTransaction,
-                    finishTransaction, mRemoteFinishCB);
-            mActiveRemoteHandler = mPendingRemoteHandler;
-            mPendingRemoteHandler = null;
-            return;
+
+        final TransitSession pendingTransition = getPendingTransition(transition);
+        if (pendingTransition != null) {
+            if (pendingTransition.mCanceled) {
+                // The pending transition was canceled, so skip playing animation.
+                startTransaction.apply();
+                onFinish(null /* wct */, null /* wctCB */);
+                return;
+            }
+
+            if (pendingTransition.mRemoteHandler != null) {
+                pendingTransition.mRemoteHandler.startAnimation(transition, info, startTransaction,
+                        finishTransaction, mRemoteFinishCB);
+                mActiveRemoteHandler = pendingTransition.mRemoteHandler;
+                return;
+            }
         }
+
         playInternalAnimation(transition, info, startTransaction, mainRoot, sideRoot, topRoot);
     }
 
     private void playInternalAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
             @NonNull SurfaceControl.Transaction t, @NonNull WindowContainerToken mainRoot,
             @NonNull WindowContainerToken sideRoot, @NonNull WindowContainerToken topRoot) {
-        final TransitSession pendingTransition = getPendingTransition(transition);
-        if (pendingTransition != null && pendingTransition.mCanceled) {
-            // The pending transition was canceled, so skip playing animation.
-            t.apply();
-            onFinish(null /* wct */, null /* wctCB */);
-            return;
-        }
-
         // Play some place-holder fade animations
         for (int i = info.getChanges().size() - 1; i >= 0; --i) {
             final TransitionInfo.Change change = info.getChanges().get(i);
@@ -212,7 +213,7 @@
         }
     }
 
-    void applyResizeTransition(@NonNull IBinder transition, @NonNull TransitionInfo info,
+    void playResizeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
             @NonNull SurfaceControl.Transaction startTransaction,
             @NonNull SurfaceControl.Transaction finishTransaction,
             @NonNull Transitions.TransitionFinishCallback finishCallback,
@@ -260,10 +261,6 @@
         return mPendingEnter != null && mPendingEnter.mTransition == transition;
     }
 
-    boolean isPendingRecent(IBinder transition) {
-        return mPendingRecent != null && mPendingRecent.mTransition == transition;
-    }
-
     boolean isPendingDismiss(IBinder transition) {
         return mPendingDismiss != null && mPendingDismiss.mTransition == transition;
     }
@@ -276,8 +273,6 @@
     private TransitSession getPendingTransition(IBinder transition) {
         if (isPendingEnter(transition)) {
             return mPendingEnter;
-        } else if (isPendingRecent(transition)) {
-            return mPendingRecent;
         } else if (isPendingDismiss(transition)) {
             return mPendingDismiss;
         } else if (isPendingResize(transition)) {
@@ -311,14 +306,8 @@
             @Nullable RemoteTransition remoteTransition,
             @Nullable TransitionConsumedCallback consumedCallback,
             @Nullable TransitionFinishedCallback finishedCallback) {
-        mPendingEnter = new TransitSession(transition, consumedCallback, finishedCallback);
-
-        if (remoteTransition != null) {
-            // Wrapping it for ease-of-use (OneShot handles all the binder linking/death stuff)
-            mPendingRemoteHandler = new OneShotRemoteHandler(
-                    mTransitions.getMainExecutor(), remoteTransition);
-            mPendingRemoteHandler.setTransition(transition);
-        }
+        mPendingEnter = new TransitSession(
+                transition, consumedCallback, finishedCallback, remoteTransition);
 
         ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "  splitTransition "
                 + " deduced Enter split screen");
@@ -344,7 +333,7 @@
     /** Sets a transition to dismiss split. */
     void setDismissTransition(@NonNull IBinder transition, @SplitScreen.StageType int dismissTop,
             @SplitScreenController.ExitReason int reason) {
-        mPendingDismiss = new DismissTransition(transition, reason, dismissTop);
+        mPendingDismiss = new DismissSession(transition, reason, dismissTop);
 
         ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "  splitTransition "
                         + " deduced Dismiss due to %s. toTop=%s",
@@ -372,32 +361,10 @@
                 + " deduced Resize split screen");
     }
 
-    void setRecentTransition(@NonNull IBinder transition,
-            @Nullable RemoteTransition remoteTransition,
-            @Nullable TransitionFinishedCallback finishCallback) {
-        mPendingRecent = new TransitSession(transition, null /* consumedCb */, finishCallback);
-
-        if (remoteTransition != null) {
-            // Wrapping it for ease-of-use (OneShot handles all the binder linking/death stuff)
-            mPendingRemoteHandler = new OneShotRemoteHandler(
-                    mTransitions.getMainExecutor(), remoteTransition);
-            mPendingRemoteHandler.setTransition(transition);
-        }
-
-        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "  splitTransition "
-                + " deduced Enter recent panel");
-    }
-
     void mergeAnimation(IBinder transition, TransitionInfo info, SurfaceControl.Transaction t,
             IBinder mergeTarget, Transitions.TransitionFinishCallback finishCallback) {
         if (mergeTarget != mAnimatingTransition) return;
 
-        if (isPendingEnter(transition) && isPendingRecent(mergeTarget)) {
-            // Since there's an entering transition merged, recent transition no longer
-            // need to handle entering split screen after the transition finished.
-            mPendingRecent.setFinishedCallback(null);
-        }
-
         if (mActiveRemoteHandler != null) {
             mActiveRemoteHandler.mergeAnimation(transition, info, t, mergeTarget, finishCallback);
         } else {
@@ -425,19 +392,13 @@
                 // An entering transition got merged, appends the rest operations to finish entering
                 // split screen.
                 mStageCoordinator.finishEnterSplitScreen(finishT);
-                mPendingRemoteHandler = null;
             }
 
             mPendingEnter.onConsumed(aborted);
             mPendingEnter = null;
-            mPendingRemoteHandler = null;
         } else if (isPendingDismiss(transition)) {
             mPendingDismiss.onConsumed(aborted);
             mPendingDismiss = null;
-        } else if (isPendingRecent(transition)) {
-            mPendingRecent.onConsumed(aborted);
-            mPendingRecent = null;
-            mPendingRemoteHandler = null;
         } else if (isPendingResize(transition)) {
             mPendingResize.onConsumed(aborted);
             mPendingResize = null;
@@ -451,9 +412,6 @@
         if (isPendingEnter(mAnimatingTransition)) {
             mPendingEnter.onFinished(wct, mFinishTransaction);
             mPendingEnter = null;
-        } else if (isPendingRecent(mAnimatingTransition)) {
-            mPendingRecent.onFinished(wct, mFinishTransaction);
-            mPendingRecent = null;
         } else if (isPendingDismiss(mAnimatingTransition)) {
             mPendingDismiss.onFinished(wct, mFinishTransaction);
             mPendingDismiss = null;
@@ -462,7 +420,6 @@
             mPendingResize = null;
         }
 
-        mPendingRemoteHandler = null;
         mActiveRemoteHandler = null;
         mAnimatingTransition = null;
 
@@ -568,10 +525,11 @@
     }
 
     /** Session for a transition and its clean-up callback. */
-    static class TransitSession {
+    class TransitSession {
         final IBinder mTransition;
         TransitionConsumedCallback mConsumedCallback;
         TransitionFinishedCallback mFinishedCallback;
+        OneShotRemoteHandler mRemoteHandler;
 
         /** Whether the transition was canceled. */
         boolean mCanceled;
@@ -579,10 +537,24 @@
         TransitSession(IBinder transition,
                 @Nullable TransitionConsumedCallback consumedCallback,
                 @Nullable TransitionFinishedCallback finishedCallback) {
+            this(transition, consumedCallback, finishedCallback, null /* remoteTransition */);
+        }
+
+        TransitSession(IBinder transition,
+                @Nullable TransitionConsumedCallback consumedCallback,
+                @Nullable TransitionFinishedCallback finishedCallback,
+                @Nullable RemoteTransition remoteTransition) {
             mTransition = transition;
             mConsumedCallback = consumedCallback;
             mFinishedCallback = finishedCallback;
 
+            if (remoteTransition != null) {
+                // Wrapping the remote transition for ease-of-use. (OneShot handles all the binder
+                // linking/death stuff)
+                mRemoteHandler = new OneShotRemoteHandler(
+                        mTransitions.getMainExecutor(), remoteTransition);
+                mRemoteHandler.setTransition(transition);
+            }
         }
 
         /** Sets transition consumed callback. */
@@ -621,11 +593,11 @@
     }
 
     /** Bundled information of dismiss transition. */
-    static class DismissTransition extends TransitSession {
+    class DismissSession extends TransitSession {
         final int mReason;
         final @SplitScreen.StageType int mDismissTop;
 
-        DismissTransition(IBinder transition, int reason, int dismissTop) {
+        DismissSession(IBinder transition, int reason, int dismissTop) {
             super(transition, null /* consumedCallback */, null /* finishedCallback */);
             this.mReason = reason;
             this.mDismissTop = dismissTop;
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 33cbdac..dd91a37 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
@@ -2226,15 +2226,9 @@
             } else if (isOpening && inFullscreen) {
                 final int activityType = triggerTask.getActivityType();
                 if (activityType == ACTIVITY_TYPE_HOME || activityType == ACTIVITY_TYPE_RECENTS) {
-                    if (request.getRemoteTransition() != null) {
-                        // starting recents/home, so don't handle this and let it fall-through to
-                        // the remote handler.
-                        return null;
-                    }
-                    // Need to use the old stuff for non-remote animations, otherwise we don't
-                    // exit split-screen.
-                    mSplitTransitions.setRecentTransition(transition, null /* remote */,
-                            this::onRecentsInSplitAnimationFinish);
+                    // starting recents/home, so don't handle this and let it fall-through to
+                    // the remote handler.
+                    return null;
                 }
             }
         } else {
@@ -2363,8 +2357,6 @@
         if (mSplitTransitions.isPendingEnter(transition)) {
             shouldAnimate = startPendingEnterAnimation(
                     transition, info, startTransaction, finishTransaction);
-        } else if (mSplitTransitions.isPendingRecent(transition)) {
-            onRecentsInSplitAnimationStart(startTransaction);
         } else if (mSplitTransitions.isPendingDismiss(transition)) {
             shouldAnimate = startPendingDismissAnimation(
                     mSplitTransitions.mPendingDismiss, info, startTransaction, finishTransaction);
@@ -2376,7 +2368,7 @@
                 return true;
             }
         } else if (mSplitTransitions.isPendingResize(transition)) {
-            mSplitTransitions.applyResizeTransition(transition, info, startTransaction,
+            mSplitTransitions.playResizeAnimation(transition, info, startTransaction,
                     finishTransaction, finishCallback, mMainStage.mRootTaskInfo.token,
                     mSideStage.mRootTaskInfo.token, mMainStage.getSplitDecorManager(),
                     mSideStage.getSplitDecorManager());
@@ -2589,7 +2581,7 @@
     }
 
     private boolean startPendingDismissAnimation(
-            @NonNull SplitScreenTransitions.DismissTransition dismissTransition,
+            @NonNull SplitScreenTransitions.DismissSession dismissTransition,
             @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t,
             @NonNull SurfaceControl.Transaction finishT) {
         prepareDismissAnimation(dismissTransition.mDismissTop, dismissTransition.mReason, info,
@@ -2626,7 +2618,7 @@
 
     /** Call this when the recents animation during split-screen finishes. */
     public void onRecentsInSplitAnimationFinish(WindowContainerTransaction finishWct,
-            SurfaceControl.Transaction finishT) {
+            SurfaceControl.Transaction finishT, TransitionInfo info) {
         // Check if the recent transition is finished by returning to the current
         // split, so we can restore the divider bar.
         for (int i = 0; i < finishWct.getHierarchyOps().size(); ++i) {
@@ -2643,8 +2635,14 @@
             }
         }
 
+        // TODO(b/275664132): Remove dismissing split screen here to fit in back-to-split support.
         // Dismiss the split screen if it's not returning to split.
         prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, finishWct);
+        for (TransitionInfo.Change change : info.getChanges()) {
+            if (change.getTaskInfo() != null && TransitionUtil.isClosingType(change.getMode())) {
+                finishT.setCrop(change.getLeash(), null).hide(change.getLeash());
+            }
+        }
         setSplitsVisible(false);
         setDividerVisibility(false, finishT);
         logExit(EXIT_REASON_UNKNOWN);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java
index d6f4d6d..ead0bcd 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java
@@ -267,9 +267,6 @@
                 return;
             }
             sendStatusChanged();
-        } else {
-            throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo
-                    + "\n mRootTaskInfo: " + mRootTaskInfo);
         }
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskView.java
similarity index 99%
rename from libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java
rename to libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskView.java
index 7a6aec7..e4d8c32 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskView.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.wm.shell;
+package com.android.wm.shell.taskview;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewBase.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewBase.java
similarity index 98%
rename from libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewBase.java
rename to libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewBase.java
index 3d0a8fd..5fdb60d2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewBase.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewBase.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.wm.shell;
+package com.android.wm.shell.taskview;
 
 import android.app.ActivityManager;
 import android.graphics.Rect;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactory.java
similarity index 96%
rename from libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewFactory.java
rename to libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactory.java
index a29e7a0..a7e4b01 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewFactory.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.wm.shell;
+package com.android.wm.shell.taskview;
 
 import android.annotation.UiContext;
 import android.content.Context;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewFactoryController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactoryController.java
similarity index 94%
rename from libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewFactoryController.java
rename to libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactoryController.java
index 735d9bc..7eed588 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewFactoryController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactoryController.java
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 
-package com.android.wm.shell;
+package com.android.wm.shell.taskview;
 
 import android.annotation.UiContext;
 import android.content.Context;
 
+import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.SyncTransactionQueue;
 import com.android.wm.shell.common.annotations.ExternalThread;
@@ -51,6 +52,9 @@
         mTaskViewTransitions = null;
     }
 
+    /**
+     * @return the underlying {@link TaskViewFactory}.
+     */
     public TaskViewFactory asTaskViewFactory() {
         return mImpl;
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewTaskController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java
similarity index 97%
rename from libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewTaskController.java
rename to libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java
index 080b171..36c9077 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewTaskController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.wm.shell;
+package com.android.wm.shell.taskview;
 
 import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
 
@@ -35,6 +35,7 @@
 import android.window.WindowContainerToken;
 import android.window.WindowContainerTransaction;
 
+import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.common.SyncTransactionQueue;
 
 import java.io.PrintWriter;
@@ -386,8 +387,15 @@
             return;
         }
         // Sync Transactions can't operate simultaneously with shell transition collection.
-        // The transition animation (upon showing) will sync the location itself.
-        if (isUsingShellTransitions() && mTaskViewTransitions.hasPending()) return;
+        if (isUsingShellTransitions()) {
+            if (mTaskViewTransitions.hasPending()) {
+                // There is already a transition in-flight. The window bounds will be synced
+                // once it is complete.
+                return;
+            }
+            mTaskViewTransitions.setTaskBounds(this, boundsOnScreen);
+            return;
+        }
 
         WindowContainerTransaction wct = new WindowContainerTransaction();
         wct.setBounds(mTaskToken, boundsOnScreen);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTransitions.java
similarity index 95%
rename from libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewTransitions.java
rename to libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTransitions.java
index 306d619..3b1ce49 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewTransitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTransitions.java
@@ -14,8 +14,9 @@
  * limitations under the License.
  */
 
-package com.android.wm.shell;
+package com.android.wm.shell.taskview;
 
+import static android.view.WindowManager.TRANSIT_CHANGE;
 import static android.view.WindowManager.TRANSIT_OPEN;
 import static android.view.WindowManager.TRANSIT_TO_BACK;
 import static android.view.WindowManager.TRANSIT_TO_FRONT;
@@ -23,6 +24,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
+import android.graphics.Rect;
 import android.os.IBinder;
 import android.util.Slog;
 import android.view.SurfaceControl;
@@ -40,7 +42,7 @@
  * Handles Shell Transitions that involve TaskView tasks.
  */
 public class TaskViewTransitions implements Transitions.TransitionHandler {
-    private static final String TAG = "TaskViewTransitions";
+    static final String TAG = "TaskViewTransitions";
 
     private final ArrayList<TaskViewTaskController> mTaskViews = new ArrayList<>();
     private final ArrayList<PendingTransition> mPending = new ArrayList<>();
@@ -197,6 +199,13 @@
         // visibility is reported in transition.
     }
 
+    void setTaskBounds(TaskViewTaskController taskView, Rect boundsOnScreen) {
+        WindowContainerTransaction wct = new WindowContainerTransaction();
+        wct.setBounds(taskView.getTaskInfo().token, boundsOnScreen);
+        mPending.add(new PendingTransition(TRANSIT_CHANGE, wct, taskView, null /* cookie */));
+        startNextTransition();
+    }
+
     private void startNextTransition() {
         if (mPending.isEmpty()) return;
         final PendingTransition pending = mPending.get(0);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
index 586cab0..5a92f78 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
@@ -187,17 +187,18 @@
                 && isOpeningType(request.getType())
                 && request.getTriggerTask() != null
                 && request.getTriggerTask().getWindowingMode() == WINDOWING_MODE_FULLSCREEN
-                && (request.getTriggerTask().getActivityType() == ACTIVITY_TYPE_HOME
-                        || request.getTriggerTask().getActivityType() == ACTIVITY_TYPE_RECENTS)
-                && request.getRemoteTransition() != null) {
-            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Got a recents request while "
+                && request.getTriggerTask().getActivityType() == ACTIVITY_TYPE_HOME) {
+            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Got a going-home request while "
                     + "Split-Screen is active, so treat it as Mixed.");
             Pair<Transitions.TransitionHandler, WindowContainerTransaction> handler =
                     mPlayer.dispatchRequest(transition, request, this);
             if (handler == null) {
-                android.util.Log.e(Transitions.TAG, "   No handler for remote? This is unexpected"
-                        + ", there should at-least be RemoteHandler.");
-                return null;
+                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS,
+                        " Lean on the remote transition handler to fetch a proper remote via"
+                                + " TransitionFilter");
+                handler = new Pair<>(
+                        mPlayer.getRemoteTransitionHandler(),
+                        new WindowContainerTransaction());
             }
             final MixedTransition mixed = new MixedTransition(
                     MixedTransition.TYPE_RECENTS_DURING_SPLIT, transition);
@@ -234,6 +235,7 @@
     private TransitionInfo subCopy(@NonNull TransitionInfo info,
             @WindowManager.TransitionType int newType, boolean withChanges) {
         final TransitionInfo out = new TransitionInfo(newType, withChanges ? info.getFlags() : 0);
+        out.setDebugId(info.getDebugId());
         if (withChanges) {
             for (int i = 0; i < info.getChanges().size(); ++i) {
                 out.getChanges().add(info.getChanges().get(i));
@@ -515,7 +517,7 @@
             // If pair-to-pair switching, the post-recents clean-up isn't needed.
             if (mixed.mAnimType != MixedTransition.ANIM_TYPE_PAIR_TO_PAIR) {
                 wct = wct != null ? wct : new WindowContainerTransaction();
-                mSplitHandler.onRecentsInSplitAnimationFinish(wct, finishTransaction);
+                mSplitHandler.onRecentsInSplitAnimationFinish(wct, finishTransaction, info);
             }
             mSplitHandler.onTransitionAnimationComplete();
             finishCallback.onTransitionFinished(wct, wctCB);
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 63c7969..3dd10a0 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
@@ -301,8 +301,8 @@
             return true;
         }
 
-        // check if no-animation and skip animation if so.
-        if (Transitions.isAllNoAnimation(info)) {
+        // Early check if the transition doesn't warrant an animation.
+        if (Transitions.isAllNoAnimation(info) || Transitions.isAllOrderOnly(info)) {
             startTransaction.apply();
             finishTransaction.apply();
             finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java
index 485b400..4e3d220 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java
@@ -63,7 +63,7 @@
             @NonNull Transitions.TransitionFinishCallback finishCallback) {
         if (mTransition != transition) return false;
         ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Using registered One-shot remote"
-                + " transition %s for %s.", mRemote, transition);
+                + " transition %s for #%d.", mRemote, info.getDebugId());
 
         final IBinder.DeathRecipient remoteDied = () -> {
             Log.e(Transitions.TAG, "Remote transition died, finishing");
@@ -113,9 +113,6 @@
     public void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
             @NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget,
             @NonNull Transitions.TransitionFinishCallback finishCallback) {
-        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Using registered One-shot remote"
-                + " transition %s for %s.", mRemote, transition);
-
         IRemoteTransitionFinishedCallback cb = new IRemoteTransitionFinishedCallback.Stub() {
             @Override
             public void onTransitionFinished(WindowContainerTransaction wct,
@@ -154,4 +151,10 @@
                 + " for %s: %s", transition, remote);
         return new WindowContainerTransaction();
     }
+
+    @Override
+    public String toString() {
+        return "OneShotRemoteHandler:" + mRemote.getDebugName() + ":"
+                + mRemote.getRemoteTransition();
+    }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java
index 3c4e889..5b7231c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java
@@ -101,8 +101,8 @@
         }
         RemoteTransition pendingRemote = mRequestedRemotes.get(transition);
         if (pendingRemote == null) {
-            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition %s doesn't have "
-                    + "explicit remote, search filters for match for %s", transition, info);
+            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition doesn't have "
+                    + "explicit remote, search filters for match for %s", info);
             // If no explicit remote, search filters until one matches
             for (int i = mFilters.size() - 1; i >= 0; --i) {
                 ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Checking filter %s",
@@ -116,8 +116,8 @@
                 }
             }
         }
-        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Delegate animation for %s to %s",
-                transition, pendingRemote);
+        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Delegate animation for #%d to %s",
+                info.getDebugId(), pendingRemote);
 
         if (pendingRemote == null) return false;
 
@@ -184,9 +184,10 @@
     public void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
             @NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget,
             @NonNull Transitions.TransitionFinishCallback finishCallback) {
-        final IRemoteTransition remote = mRequestedRemotes.get(mergeTarget).getRemoteTransition();
-        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Attempt merge %s into %s",
-                transition, remote);
+        final RemoteTransition remoteTransition = mRequestedRemotes.get(mergeTarget);
+        final IRemoteTransition remote = remoteTransition.getRemoteTransition();
+        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "   Merge into remote: %s",
+                remoteTransition);
         if (remote == null) return;
 
         IRemoteTransitionFinishedCallback cb = new IRemoteTransitionFinishedCallback.Stub() {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/SleepHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/SleepHandler.java
index 0386ec3..d279595 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/SleepHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/SleepHandler.java
@@ -19,7 +19,6 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.os.IBinder;
-import android.util.Log;
 import android.view.SurfaceControl;
 import android.window.TransitionInfo;
 import android.window.TransitionRequestInfo;
@@ -42,9 +41,9 @@
             @NonNull SurfaceControl.Transaction startTransaction,
             @NonNull SurfaceControl.Transaction finishTransaction,
             @NonNull Transitions.TransitionFinishCallback finishCallback) {
+        mSleepTransitions.remove(transition);
         startTransaction.apply();
         finishCallback.onTransitionFinished(null, null);
-        mSleepTransitions.remove(transition);
         return true;
     }
 
@@ -59,7 +58,6 @@
     @Override
     public void onTransitionConsumed(@NonNull IBinder transition, boolean aborted,
             @Nullable SurfaceControl.Transaction finishTransaction) {
-        Log.e(Transitions.TAG, "Sleep transition was consumed. This doesn't make sense");
         mSleepTransitions.remove(transition);
     }
 }
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 beabf18..fa4de16 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
@@ -140,6 +140,9 @@
     /** Transition type to freeform in desktop mode. */
     public static final int TRANSIT_ENTER_DESKTOP_MODE = WindowManager.TRANSIT_FIRST_CUSTOM + 11;
 
+    /** Transition type to fullscreen from desktop mode. */
+    public static final int TRANSIT_EXIT_DESKTOP_MODE = WindowManager.TRANSIT_FIRST_CUSTOM + 12;
+
     private final WindowOrganizer mOrganizer;
     private final Context mContext;
     private final ShellExecutor mMainExecutor;
@@ -182,6 +185,14 @@
 
         /** Ordered list of transitions which have been merged into this one. */
         private ArrayList<ActiveTransition> mMerged;
+
+        @Override
+        public String toString() {
+            if (mInfo != null && mInfo.getDebugId() >= 0) {
+                return "(#" + mInfo.getDebugId() + ")" + mToken;
+            }
+            return mToken.toString();
+        }
     }
 
     /** Keeps track of transitions which have been started, but aren't ready yet. */
@@ -324,6 +335,10 @@
         mRemoteTransitionHandler.removeFiltered(remoteTransition);
     }
 
+    RemoteTransitionHandler getRemoteTransitionHandler() {
+        return mRemoteTransitionHandler;
+    }
+
     /** Registers an observer on the lifecycle of transitions. */
     public void registerObserver(@NonNull TransitionObserver observer) {
         mObservers.add(observer);
@@ -512,6 +527,16 @@
         return hasNoAnimation;
     }
 
+    /**
+     * Check if all changes in this transition are only ordering changes. If so, we won't animate.
+     */
+    static boolean isAllOrderOnly(TransitionInfo info) {
+        for (int i = info.getChanges().size() - 1; i >= 0; --i) {
+            if (!TransitionUtil.isOrderOnly(info.getChanges().get(i))) return false;
+        }
+        return true;
+    }
+
     @VisibleForTesting
     void onTransitionReady(@NonNull IBinder transitionToken, @NonNull TransitionInfo info,
             @NonNull SurfaceControl.Transaction t, @NonNull SurfaceControl.Transaction finishT) {
@@ -525,8 +550,8 @@
                             activeTransition -> activeTransition.mToken).toArray()));
         }
         if (activeIdx > 0) {
-            Log.e(TAG, "Transition became ready out-of-order " + transitionToken + ". Expected"
-                    + " order: " + Arrays.toString(mPendingTransitions.stream().map(
+            Log.e(TAG, "Transition became ready out-of-order " + mPendingTransitions.get(activeIdx)
+                    + ". Expected order: " + Arrays.toString(mPendingTransitions.stream().map(
                             activeTransition -> activeTransition.mToken).toArray()));
         }
         // Move from pending to ready
@@ -543,6 +568,7 @@
         if (info.getType() == TRANSIT_SLEEP) {
             if (activeIdx > 0 || !mActiveTransitions.isEmpty() || mReadyTransitions.size() > 1) {
                 // Sleep starts a process of forcing all prior transitions to finish immediately
+                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Start finish-for-sleep");
                 finishForSleep(null /* forceFinish */);
                 return;
             }
@@ -551,8 +577,8 @@
         if (info.getRootCount() == 0 && !alwaysReportToKeyguard(info)) {
             // No root-leashes implies that the transition is empty/no-op, so just do
             // housekeeping and return.
-            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "No transition roots (%s): %s",
-                    transitionToken, info);
+            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "No transition roots in %s so"
+                    + " abort", active);
             onAbort(active);
             return;
         }
@@ -581,6 +607,8 @@
                 && allOccluded)) {
             // Treat this as an abort since we are bypassing any merge logic and effectively
             // finishing immediately.
+            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS,
+                    "Non-visible anim so abort: %s", active);
             onAbort(active);
             return;
         }
@@ -648,21 +676,21 @@
             return;
         }
         ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition %s ready while"
-                + " another transition %s is still animating. Notify the animating transition"
-                + " in case they can be merged", ready.mToken, playing.mToken);
+                + " %s is still animating. Notify the animating transition"
+                + " in case they can be merged", ready, playing);
         playing.mHandler.mergeAnimation(ready.mToken, ready.mInfo, ready.mStartT,
                 playing.mToken, (wct, cb) -> onMerged(playing, ready));
     }
 
     private void onMerged(@NonNull ActiveTransition playing, @NonNull ActiveTransition merged) {
-        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition was merged %s",
-                merged.mToken);
+        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition was merged: %s into %s",
+                merged, playing);
         int readyIdx = 0;
         if (mReadyTransitions.isEmpty() || mReadyTransitions.get(0) != merged) {
-            Log.e(TAG, "Merged transition out-of-order?");
+            Log.e(TAG, "Merged transition out-of-order? " + merged);
             readyIdx = mReadyTransitions.indexOf(merged);
             if (readyIdx < 0) {
-                Log.e(TAG, "Merged a transition that is no-longer queued?");
+                Log.e(TAG, "Merged a transition that is no-longer queued? " + merged);
                 return;
             }
         }
@@ -683,6 +711,7 @@
     }
 
     private void playTransition(@NonNull ActiveTransition active) {
+        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Playing animation for %s", active);
         for (int i = 0; i < mObservers.size(); ++i) {
             mObservers.get(i).onTransitionStarting(active.mToken);
         }
@@ -784,12 +813,12 @@
         int activeIdx = mActiveTransitions.indexOf(active);
         if (activeIdx < 0) {
             Log.e(TAG, "Trying to finish a non-running transition. Either remote crashed or "
-                    + " a handler didn't properly deal with a merge. " + active.mToken,
+                    + " a handler didn't properly deal with a merge. " + active,
                     new RuntimeException());
             return;
         } else if (activeIdx != 0) {
             // Relevant right now since we only allow 1 active transition at a time.
-            Log.e(TAG, "Finishing a transition out of order. " + active.mToken);
+            Log.e(TAG, "Finishing a transition out of order. " + active);
         }
         mActiveTransitions.remove(activeIdx);
 
@@ -797,7 +826,7 @@
             mObservers.get(i).onTransitionFinished(active.mToken, active.mAborted);
         }
         ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition animation finished "
-                + "(aborted=%b), notifying core %s", active.mAborted, active.mToken);
+                + "(aborted=%b), notifying core %s", active.mAborted, active);
         if (active.mStartT != null) {
             // Applied by now, so clear immediately to remove any references. Do not set to null
             // yet, though, since nullness is used later to disambiguate malformed transitions.
@@ -913,6 +942,8 @@
     /** Start a new transition directly. */
     public IBinder startTransition(@WindowManager.TransitionType int type,
             @NonNull WindowContainerTransaction wct, @Nullable TransitionHandler handler) {
+        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Directly starting a new transition "
+                + "type=%d wct=%s handler=%s", type, wct, handler);
         final ActiveTransition active = new ActiveTransition();
         active.mHandler = handler;
         active.mToken = mOrganizer.startNewTransition(type, wct);
@@ -944,8 +975,7 @@
             return;
         }
         if (forceFinish != null && mActiveTransitions.contains(forceFinish)) {
-            Log.e(TAG, "Forcing transition to finish due to sleep timeout: "
-                    + forceFinish.mToken);
+            Log.e(TAG, "Forcing transition to finish due to sleep timeout: " + forceFinish);
             forceFinish.mAborted = true;
             // Last notify of it being consumed. Note: mHandler should never be null,
             // but check just to be safe.
@@ -956,6 +986,7 @@
             onFinish(forceFinish, null, null);
         }
         final SurfaceControl.Transaction dummyT = new SurfaceControl.Transaction();
+        final TransitionInfo dummyInfo = new TransitionInfo(TRANSIT_SLEEP, 0 /* flags */);
         while (!mActiveTransitions.isEmpty() && !mSleepHandler.mSleepTransitions.isEmpty()) {
             final ActiveTransition playing = mActiveTransitions.get(0);
             int sleepIdx = findByToken(mReadyTransitions, mSleepHandler.mSleepTransitions.get(0));
@@ -963,7 +994,9 @@
                 // Try to signal that we are sleeping by attempting to merge the sleep transition
                 // into the playing one.
                 final ActiveTransition nextSleep = mReadyTransitions.get(sleepIdx);
-                playing.mHandler.mergeAnimation(nextSleep.mToken, nextSleep.mInfo, dummyT,
+                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Attempt to merge SLEEP %s"
+                        + " into %s", nextSleep, playing);
+                playing.mHandler.mergeAnimation(nextSleep.mToken, dummyInfo, dummyT,
                         playing.mToken, (wct, cb) -> {});
             } else {
                 Log.e(TAG, "Couldn't find sleep transition in ready list: "
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/util/TransitionUtil.java b/libs/WindowManager/Shell/src/com/android/wm/shell/util/TransitionUtil.java
index 7595c96..ce10291 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/util/TransitionUtil.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/util/TransitionUtil.java
@@ -31,6 +31,7 @@
 import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY;
 import static android.window.TransitionInfo.FLAG_IS_DISPLAY;
 import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
+import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP;
 import static android.window.TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
 
 import static com.android.wm.shell.common.split.SplitScreenConstants.FLAG_IS_DIVIDER_BAR;
@@ -90,6 +91,15 @@
                 && !change.hasFlags(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY);
     }
 
+    /** Returns `true` if `change` is only re-ordering. */
+    public static boolean isOrderOnly(TransitionInfo.Change change) {
+        return change.getMode() == TRANSIT_CHANGE
+                && (change.getFlags() & FLAG_MOVED_TO_TOP) != 0
+                && change.getStartAbsBounds().equals(change.getEndAbsBounds())
+                && (change.getLastParent() == null
+                        || change.getLastParent().equals(change.getParent()));
+    }
+
     /**
      * Filter that selects leaf-tasks only. THIS IS ORDER-DEPENDENT! For it to work properly, you
      * MUST call `test` in the same order that the changes appear in the TransitionInfo.
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 f943e52..f998217 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
@@ -26,16 +26,20 @@
 import static com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler.FINAL_FREEFORM_SCALE;
 import static com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler.FREEFORM_ANIMATION_DURATION;
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
 import android.animation.ValueAnimator;
 import android.app.ActivityManager;
 import android.app.ActivityManager.RunningTaskInfo;
 import android.app.ActivityTaskManager;
 import android.content.Context;
+import android.content.res.Resources;
 import android.graphics.Rect;
 import android.hardware.input.InputManager;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Looper;
+import android.util.DisplayMetrics;
 import android.util.SparseArray;
 import android.view.Choreographer;
 import android.view.InputChannel;
@@ -75,6 +79,7 @@
 
 public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
     private static final String TAG = "DesktopModeWindowDecorViewModel";
+
     private final DesktopModeWindowDecoration.Factory mDesktopModeWindowDecorFactory;
     private final ActivityTaskManager mActivityTaskManager;
     private final ShellTaskOrganizer mTaskOrganizer;
@@ -538,12 +543,10 @@
                     mTransitionDragActive = false;
                     final int statusBarHeight = getStatusBarHeight(
                             relevantDecor.mTaskInfo.displayId);
-                    if (ev.getY() > statusBarHeight) {
+                    if (ev.getY() > 2 * statusBarHeight) {
                         if (DesktopModeStatus.isProto2Enabled()) {
                             mPauseRelayoutForTask = relevantDecor.mTaskInfo.taskId;
-                            mDesktopTasksController.ifPresent(
-                                    c -> c.moveToDesktopWithAnimation(relevantDecor.mTaskInfo,
-                                            getFreeformBounds(ev)));
+                            centerAndMoveToDesktopWithAnimation(relevantDecor, ev);
                         } else if (DesktopModeStatus.isProto1Enabled()) {
                             mDesktopModeController.ifPresent(c -> c.setDesktopModeActive(true));
                         }
@@ -565,9 +568,11 @@
                     return;
                 }
                 if (mTransitionDragActive) {
-                    final int statusBarHeight = mDisplayController
-                            .getDisplayLayout(
-                                    relevantDecor.mTaskInfo.displayId).stableInsets().top;
+                    mDesktopTasksController.ifPresent(
+                            c -> c.onDragPositioningMoveThroughStatusBar(relevantDecor.mTaskInfo,
+                            relevantDecor.mTaskSurface, ev.getY()));
+                    final int statusBarHeight = getStatusBarHeight(
+                            relevantDecor.mTaskInfo.displayId);
                     if (ev.getY() > statusBarHeight) {
                         if (!mDragToDesktopAnimationStarted) {
                             mDragToDesktopAnimationStarted = true;
@@ -596,25 +601,60 @@
         }
     }
 
-    private Rect getFreeformBounds(@NonNull MotionEvent ev) {
-        final Rect endBounds = new Rect();
-        final int finalWidth = (int) (FINAL_FREEFORM_SCALE
-                * mDragToDesktopAnimationStartBounds.width());
-        final int finalHeight = (int) (FINAL_FREEFORM_SCALE
-                * mDragToDesktopAnimationStartBounds.height());
+    /**
+     * Gets bounds of a scaled window centered relative to the screen bounds
+     * @param scale the amount to scale to relative to the Screen Bounds
+     */
+    private Rect calculateFreeformBounds(float scale) {
+        final Resources resources = mContext.getResources();
+        final DisplayMetrics metrics = resources.getDisplayMetrics();
+        final int screenWidth = metrics.widthPixels;
+        final int screenHeight = metrics.heightPixels;
 
-        endBounds.left = mDragToDesktopAnimationStartBounds.centerX() - finalWidth / 2
-                + (int) (ev.getX() - mCaptionDragStartX);
-        endBounds.right = endBounds.left + (int) (FINAL_FREEFORM_SCALE
-                * mDragToDesktopAnimationStartBounds.width());
-        endBounds.top = (int) (ev.getY()
-                - ((FINAL_FREEFORM_SCALE - DRAG_FREEFORM_SCALE)
-                * mDragToDesktopAnimationStartBounds.height() / 2));
-        endBounds.bottom = endBounds.top + finalHeight;
-
+        final float adjustmentPercentage = (1f - scale) / 2;
+        final Rect endBounds = new Rect((int) (screenWidth * adjustmentPercentage),
+                (int) (screenHeight * adjustmentPercentage),
+                (int) (screenWidth * (adjustmentPercentage + scale)),
+                (int) (screenHeight * (adjustmentPercentage + scale)));
         return endBounds;
     }
 
+    /**
+     * Animates a window to the center, grows to freeform size, and transitions to Desktop Mode.
+     * @param relevantDecor the window decor of the task to be animated
+     * @param ev the motion event that triggers the animation
+     */
+    private void centerAndMoveToDesktopWithAnimation(DesktopModeWindowDecoration relevantDecor,
+            MotionEvent ev) {
+        ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
+        animator.setDuration(FREEFORM_ANIMATION_DURATION);
+        final SurfaceControl sc = relevantDecor.mTaskSurface;
+        final Rect endBounds = calculateFreeformBounds(DRAG_FREEFORM_SCALE);
+        final Transaction t = mTransactionFactory.get();
+        final float diffX = endBounds.centerX() - ev.getX();
+        final float diffY = endBounds.top - ev.getY();
+        final float startingX = ev.getX() - DRAG_FREEFORM_SCALE
+                * mDragToDesktopAnimationStartBounds.width() / 2;
+
+        animator.addUpdateListener(animation -> {
+            final float animatorValue = (float) animation.getAnimatedValue();
+            final float x = startingX + diffX * animatorValue;
+            final float y = ev.getY() + diffY * animatorValue;
+            t.setPosition(sc, x, y);
+            t.apply();
+        });
+        animator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mDesktopTasksController.ifPresent(
+                        c -> c.onDragPositioningEndThroughStatusBar(
+                                relevantDecor.mTaskInfo,
+                                calculateFreeformBounds(FINAL_FREEFORM_SCALE)));
+            }
+        });
+        animator.start();
+    }
+
     private void startAnimation(@NonNull DesktopModeWindowDecoration focusedDecor) {
         mDragToDesktopValueAnimator = ValueAnimator.ofFloat(1f, DRAG_FREEFORM_SCALE);
         mDragToDesktopValueAnimator.setDuration(FREEFORM_ANIMATION_DURATION);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
index 6478fe7..efc90b5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
@@ -17,15 +17,20 @@
 package com.android.wm.shell.windowdecor;
 
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
+import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
 
 import android.app.ActivityManager;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.content.res.ColorStateList;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Point;
 import android.graphics.PointF;
+import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.util.Log;
 import android.view.Choreographer;
@@ -33,11 +38,13 @@
 import android.view.SurfaceControl;
 import android.view.View;
 import android.view.ViewConfiguration;
-import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.TextView;
 import android.window.WindowContainerTransaction;
 
+import com.android.launcher3.icons.IconProvider;
 import com.android.wm.shell.R;
 import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.common.DisplayController;
@@ -69,17 +76,30 @@
     private DragDetector mDragDetector;
 
     private RelayoutParams mRelayoutParams = new RelayoutParams();
-    private final int mCaptionMenuHeightId = R.dimen.freeform_decor_caption_menu_height;
-    private final int mCaptionMenuHeightWithoutWindowingControlsId =
-            R.dimen.freeform_decor_caption_menu_height_no_windowing_controls;
     private final WindowDecoration.RelayoutResult<WindowDecorLinearLayout> mResult =
             new WindowDecoration.RelayoutResult<>();
 
-    private AdditionalWindow mHandleMenu;
-    private final int mHandleMenuWidthId = R.dimen.freeform_decor_caption_menu_width;
-    private final int mHandleMenuShadowRadiusId = R.dimen.caption_menu_shadow_radius;
-    private final int mHandleMenuCornerRadiusId = R.dimen.caption_menu_corner_radius;
-    private PointF mHandleMenuPosition = new PointF();
+    private final PointF mHandleMenuAppInfoPillPosition = new PointF();
+    private final PointF mHandleMenuWindowingPillPosition = new PointF();
+    private final PointF mHandleMenuMoreActionsPillPosition = new PointF();
+
+    // Collection of additional windows that comprise the handle menu.
+    private AdditionalWindow mHandleMenuAppInfoPill;
+    private AdditionalWindow mHandleMenuWindowingPill;
+    private AdditionalWindow mHandleMenuMoreActionsPill;
+
+    private Drawable mAppIcon;
+    private CharSequence mAppName;
+
+    private int mMenuWidth;
+    private int mMarginMenuTop;
+    private int mMarginMenuStart;
+    private int mMarginMenuSpacing;
+    private int mAppInfoPillHeight;
+    private int mWindowingPillHeight;
+    private int mMoreActionsPillHeight;
+    private int mShadowRadius;
+    private int mCornerRadius;
 
     DesktopModeWindowDecoration(
             Context context,
@@ -95,6 +115,31 @@
         mHandler = handler;
         mChoreographer = choreographer;
         mSyncQueue = syncQueue;
+
+        loadAppInfo();
+        loadHandleMenuDimensions();
+    }
+
+    private void loadHandleMenuDimensions() {
+        final Resources resources = mDecorWindowContext.getResources();
+        mMenuWidth = loadDimensionPixelSize(resources,
+                R.dimen.desktop_mode_handle_menu_width);
+        mMarginMenuTop = loadDimensionPixelSize(resources,
+                R.dimen.desktop_mode_handle_menu_margin_top);
+        mMarginMenuStart = loadDimensionPixelSize(resources,
+                R.dimen.desktop_mode_handle_menu_margin_start);
+        mMarginMenuSpacing = loadDimensionPixelSize(resources,
+                R.dimen.desktop_mode_handle_menu_pill_spacing_margin);
+        mAppInfoPillHeight = loadDimensionPixelSize(resources,
+                R.dimen.desktop_mode_handle_menu_app_info_pill_height);
+        mWindowingPillHeight = loadDimensionPixelSize(resources,
+                R.dimen.desktop_mode_handle_menu_windowing_pill_height);
+        mShadowRadius = loadDimensionPixelSize(resources,
+                R.dimen.desktop_mode_handle_menu_shadow_radius);
+        mCornerRadius = loadDimensionPixelSize(resources,
+                R.dimen.desktop_mode_handle_menu_corner_radius);
+        mMoreActionsPillHeight = loadDimensionPixelSize(resources,
+                R.dimen.desktop_mode_handle_menu_more_actions_pill_height);
     }
 
     @Override
@@ -143,6 +188,22 @@
                 taskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM;
         final boolean isDragResizeable = isFreeform && taskInfo.isResizeable;
 
+        if (mHandleMenuAppInfoPill != null) {
+            updateHandleMenuPillPositions();
+            startT.setPosition(mHandleMenuAppInfoPill.mWindowSurface,
+                    mHandleMenuAppInfoPillPosition.x, mHandleMenuAppInfoPillPosition.y);
+
+            // Only show windowing buttons in proto2. Proto1 uses a system-level mode only.
+            final boolean shouldShowWindowingPill = DesktopModeStatus.isProto2Enabled();
+            if (shouldShowWindowingPill) {
+                startT.setPosition(mHandleMenuWindowingPill.mWindowSurface,
+                        mHandleMenuWindowingPillPosition.x, mHandleMenuWindowingPillPosition.y);
+            }
+
+            startT.setPosition(mHandleMenuMoreActionsPill.mWindowSurface,
+                    mHandleMenuMoreActionsPillPosition.x, mHandleMenuMoreActionsPillPosition.y);
+        }
+
         final WindowDecorLinearLayout oldRootView = mResult.mRootView;
         final SurfaceControl oldDecorationSurface = mDecorationContainerSurface;
         final WindowContainerTransaction wct = new WindowContainerTransaction();
@@ -185,7 +246,9 @@
                 mWindowDecorViewHolder = new DesktopModeAppControlsWindowDecorationViewHolder(
                         mResult.mRootView,
                         mOnCaptionTouchListener,
-                        mOnCaptionButtonClickListener
+                        mOnCaptionButtonClickListener,
+                        mAppName,
+                        mAppIcon
                 );
             } else {
                 throw new IllegalArgumentException("Unexpected layout resource id");
@@ -225,40 +288,20 @@
                 mResult.mWidth, mResult.mHeight, resize_handle, resize_corner, touchSlop);
     }
 
-    private void setupHandleMenu() {
-        final View menu = mHandleMenu.mWindowViewHost.getView();
-        final View fullscreen = menu.findViewById(R.id.fullscreen_button);
-        fullscreen.setOnClickListener(mOnCaptionButtonClickListener);
-        final View desktop = menu.findViewById(R.id.desktop_button);
-        desktop.setOnClickListener(mOnCaptionButtonClickListener);
-        final ViewGroup windowingBtns = menu.findViewById(R.id.windowing_mode_buttons);
-        windowingBtns.setVisibility(DesktopModeStatus.isProto1Enabled() ? View.GONE : View.VISIBLE);
-        final View split = menu.findViewById(R.id.split_screen_button);
-        split.setOnClickListener(mOnCaptionButtonClickListener);
-        final View close = menu.findViewById(R.id.close_button);
-        close.setOnClickListener(mOnCaptionButtonClickListener);
-        final View collapse = menu.findViewById(R.id.collapse_menu_button);
-        collapse.setOnClickListener(mOnCaptionButtonClickListener);
-        menu.setOnTouchListener(mOnCaptionTouchListener);
-
-        final ImageView appIcon = menu.findViewById(R.id.application_icon);
-        final TextView appName = menu.findViewById(R.id.application_name);
-        loadAppInfo(appName, appIcon);
-    }
-
     boolean isHandleMenuActive() {
-        return mHandleMenu != null;
+        return mHandleMenuAppInfoPill != null;
     }
 
-    private void loadAppInfo(TextView appNameTextView, ImageView appIconImageView) {
+    private void loadAppInfo() {
         String packageName = mTaskInfo.realActivity.getPackageName();
         PackageManager pm = mContext.getApplicationContext().getPackageManager();
         try {
-            // TODO(b/268363572): Use IconProvider or BaseIconCache to set drawable/name.
+            IconProvider provider = new IconProvider(mContext);
+            mAppIcon = provider.getIcon(pm.getActivityInfo(mTaskInfo.baseActivity,
+                    PackageManager.ComponentInfoFlags.of(0)));
             ApplicationInfo applicationInfo = pm.getApplicationInfo(packageName,
                     PackageManager.ApplicationInfoFlags.of(0));
-            appNameTextView.setText(pm.getApplicationLabel(applicationInfo));
-            appIconImageView.setImageDrawable(pm.getApplicationIcon(applicationInfo));
+            mAppName = pm.getApplicationLabel(applicationInfo);
         } catch (PackageManager.NameNotFoundException e) {
             Log.w(TAG, "Package not found: " + packageName, e);
         }
@@ -277,37 +320,137 @@
      */
     void createHandleMenu() {
         final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
-        final Resources resources = mDecorWindowContext.getResources();
-        final int captionWidth = mTaskInfo.getConfiguration()
-                .windowConfiguration.getBounds().width();
-        final int menuWidth = loadDimensionPixelSize(resources, mHandleMenuWidthId);
-        // The windowing controls are disabled in proto1.
-        final int menuHeight = loadDimensionPixelSize(resources, DesktopModeStatus.isProto1Enabled()
-                ? mCaptionMenuHeightWithoutWindowingControlsId : mCaptionMenuHeightId);
-        final int shadowRadius = loadDimensionPixelSize(resources, mHandleMenuShadowRadiusId);
-        final int cornerRadius = loadDimensionPixelSize(resources, mHandleMenuCornerRadiusId);
+        updateHandleMenuPillPositions();
 
-        final int x, y;
-        if (mRelayoutParams.mLayoutResId
-                == R.layout.desktop_mode_app_controls_window_decor) {
-            // Align the handle menu to the left of the caption.
-            x = mRelayoutParams.mCaptionX - mResult.mDecorContainerOffsetX;
-            y = mRelayoutParams.mCaptionY - mResult.mDecorContainerOffsetY;
-        } else {
-            // Position the handle menu at the center of the caption.
-            x = mRelayoutParams.mCaptionX + (captionWidth / 2) - (menuWidth / 2)
-                    - mResult.mDecorContainerOffsetX;
-            y = mRelayoutParams.mCaptionY - mResult.mDecorContainerOffsetY;
+        createAppInfoPill(t);
+
+        // Only show windowing buttons in proto2. Proto1 uses a system-level mode only.
+        final boolean shouldShowWindowingPill = DesktopModeStatus.isProto2Enabled();
+        if (shouldShowWindowingPill) {
+            createWindowingPill(t);
         }
-        mHandleMenuPosition.set(x, y);
-        final String namePrefix = "Caption Menu";
-        mHandleMenu = addWindow(R.layout.desktop_mode_decor_handle_menu, namePrefix, t, x, y,
-                menuWidth, menuHeight, shadowRadius, cornerRadius);
+
+        createMoreActionsPill(t);
+
         mSyncQueue.runInSync(transaction -> {
             transaction.merge(t);
             t.close();
         });
-        setupHandleMenu();
+        setupHandleMenu(shouldShowWindowingPill);
+    }
+
+    private void createAppInfoPill(SurfaceControl.Transaction t) {
+        final int x = (int) mHandleMenuAppInfoPillPosition.x;
+        final int y = (int) mHandleMenuAppInfoPillPosition.y;
+        mHandleMenuAppInfoPill = addWindow(
+                R.layout.desktop_mode_window_decor_handle_menu_app_info_pill,
+                "Menu's app info pill",
+                t, x, y, mMenuWidth, mAppInfoPillHeight, mShadowRadius, mCornerRadius);
+    }
+
+    private void createWindowingPill(SurfaceControl.Transaction t) {
+        final int x = (int) mHandleMenuWindowingPillPosition.x;
+        final int y = (int) mHandleMenuWindowingPillPosition.y;
+        mHandleMenuWindowingPill = addWindow(
+                R.layout.desktop_mode_window_decor_handle_menu_windowing_pill,
+                "Menu's windowing pill",
+                t, x, y, mMenuWidth, mWindowingPillHeight, mShadowRadius, mCornerRadius);
+    }
+
+    private void createMoreActionsPill(SurfaceControl.Transaction t) {
+        final int x = (int) mHandleMenuMoreActionsPillPosition.x;
+        final int y = (int) mHandleMenuMoreActionsPillPosition.y;
+        mHandleMenuMoreActionsPill = addWindow(
+                R.layout.desktop_mode_window_decor_handle_menu_more_actions_pill,
+                "Menu's more actions pill",
+                t, x, y, mMenuWidth, mMoreActionsPillHeight, mShadowRadius, mCornerRadius);
+    }
+
+    private void setupHandleMenu(boolean windowingPillShown) {
+        // App Info pill setup.
+        final View appInfoPillView = mHandleMenuAppInfoPill.mWindowViewHost.getView();
+        final ImageButton collapseBtn = appInfoPillView.findViewById(R.id.collapse_menu_button);
+        final ImageView appIcon = appInfoPillView.findViewById(R.id.application_icon);
+        final TextView appName = appInfoPillView.findViewById(R.id.application_name);
+        collapseBtn.setOnClickListener(mOnCaptionButtonClickListener);
+        appInfoPillView.setOnTouchListener(mOnCaptionTouchListener);
+        appIcon.setImageDrawable(mAppIcon);
+        appName.setText(mAppName);
+
+        // Windowing pill setup.
+        if (windowingPillShown) {
+            final View windowingPillView = mHandleMenuWindowingPill.mWindowViewHost.getView();
+            final ImageButton fullscreenBtn = windowingPillView.findViewById(
+                    R.id.fullscreen_button);
+            final ImageButton splitscreenBtn = windowingPillView.findViewById(
+                    R.id.split_screen_button);
+            final ImageButton floatingBtn = windowingPillView.findViewById(R.id.floating_button);
+            final ImageButton desktopBtn = windowingPillView.findViewById(R.id.desktop_button);
+            fullscreenBtn.setOnClickListener(mOnCaptionButtonClickListener);
+            splitscreenBtn.setOnClickListener(mOnCaptionButtonClickListener);
+            floatingBtn.setOnClickListener(mOnCaptionButtonClickListener);
+            desktopBtn.setOnClickListener(mOnCaptionButtonClickListener);
+            // The button corresponding to the windowing mode that the task is currently in uses a
+            // different color than the others.
+            final ColorStateList activeColorStateList = ColorStateList.valueOf(
+                    mContext.getColor(R.color.desktop_mode_caption_menu_buttons_color_active));
+            final ColorStateList inActiveColorStateList = ColorStateList.valueOf(
+                    mContext.getColor(R.color.desktop_mode_caption_menu_buttons_color_inactive));
+            fullscreenBtn.setImageTintList(
+                    mTaskInfo.getWindowingMode() == WINDOWING_MODE_FULLSCREEN
+                            ? activeColorStateList : inActiveColorStateList);
+            splitscreenBtn.setImageTintList(
+                    mTaskInfo.getWindowingMode() == WINDOWING_MODE_MULTI_WINDOW
+                            ? activeColorStateList : inActiveColorStateList);
+            floatingBtn.setImageTintList(mTaskInfo.getWindowingMode() == WINDOWING_MODE_PINNED
+                    ? activeColorStateList : inActiveColorStateList);
+            desktopBtn.setImageTintList(mTaskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM
+                    ? activeColorStateList : inActiveColorStateList);
+        }
+
+        // More Actions pill setup.
+        final View moreActionsPillView = mHandleMenuMoreActionsPill.mWindowViewHost.getView();
+        final Button closeBtn = moreActionsPillView.findViewById(R.id.close_button);
+        closeBtn.setOnClickListener(mOnCaptionButtonClickListener);
+    }
+
+    /**
+     * Updates the handle menu pills' position variables to reflect their next positions
+     */
+    private void updateHandleMenuPillPositions() {
+        final int menuX, menuY;
+        final int captionWidth = mTaskInfo.getConfiguration()
+                .windowConfiguration.getBounds().width();
+        if (mRelayoutParams.mLayoutResId
+                == R.layout.desktop_mode_app_controls_window_decor) {
+            // Align the handle menu to the left of the caption.
+            menuX = mRelayoutParams.mCaptionX - mResult.mDecorContainerOffsetX + mMarginMenuStart;
+            menuY = mRelayoutParams.mCaptionY - mResult.mDecorContainerOffsetY + mMarginMenuTop;
+        } else {
+            // Position the handle menu at the center of the caption.
+            menuX = mRelayoutParams.mCaptionX + (captionWidth / 2) - (mMenuWidth / 2)
+                    - mResult.mDecorContainerOffsetX;
+            menuY = mRelayoutParams.mCaptionY - mResult.mDecorContainerOffsetY + mMarginMenuStart;
+        }
+
+        // App Info pill setup.
+        final int appInfoPillY = menuY;
+        mHandleMenuAppInfoPillPosition.set(menuX, appInfoPillY);
+
+        // Only show windowing buttons in proto2. Proto1 uses a system-level mode only.
+        final boolean shouldShowWindowingPill = DesktopModeStatus.isProto2Enabled();
+
+        final int windowingPillY, moreActionsPillY;
+        if (shouldShowWindowingPill) {
+            windowingPillY = appInfoPillY + mAppInfoPillHeight + mMarginMenuSpacing;
+            mHandleMenuWindowingPillPosition.set(menuX, windowingPillY);
+            moreActionsPillY = windowingPillY + mWindowingPillHeight + mMarginMenuSpacing;
+            mHandleMenuMoreActionsPillPosition.set(menuX, moreActionsPillY);
+        } else {
+            // Just start after the end of the app info pill + margins.
+            moreActionsPillY = appInfoPillY + mAppInfoPillHeight + mMarginMenuSpacing;
+            mHandleMenuMoreActionsPillPosition.set(menuX, moreActionsPillY);
+        }
     }
 
     /**
@@ -315,8 +458,14 @@
      */
     void closeHandleMenu() {
         if (!isHandleMenuActive()) return;
-        mHandleMenu.releaseView();
-        mHandleMenu = null;
+        mHandleMenuAppInfoPill.releaseView();
+        mHandleMenuAppInfoPill = null;
+        if (mHandleMenuWindowingPill != null) {
+            mHandleMenuWindowingPill.releaseView();
+            mHandleMenuWindowingPill = null;
+        }
+        mHandleMenuMoreActionsPill.releaseView();
+        mHandleMenuMoreActionsPill = null;
     }
 
     @Override
@@ -335,12 +484,29 @@
 
         // When this is called before the layout is fully inflated, width will be 0.
         // Menu is not visible in this scenario, so skip the check if that is the case.
-        if (mHandleMenu.mWindowViewHost.getView().getWidth() == 0) return;
+        if (mHandleMenuAppInfoPill.mWindowViewHost.getView().getWidth() == 0) return;
 
         PointF inputPoint = offsetCaptionLocation(ev);
-        if (!pointInView(mHandleMenu.mWindowViewHost.getView(),
-                inputPoint.x - mHandleMenuPosition.x - mResult.mDecorContainerOffsetX,
-                inputPoint.y - mHandleMenuPosition.y - mResult.mDecorContainerOffsetY)) {
+        final boolean pointInAppInfoPill = pointInView(
+                mHandleMenuAppInfoPill.mWindowViewHost.getView(),
+                inputPoint.x - mHandleMenuAppInfoPillPosition.x - mResult.mDecorContainerOffsetX,
+                inputPoint.y - mHandleMenuAppInfoPillPosition.y
+                        - mResult.mDecorContainerOffsetY);
+        boolean pointInWindowingPill = false;
+        if (mHandleMenuWindowingPill != null) {
+            pointInWindowingPill = pointInView(mHandleMenuWindowingPill.mWindowViewHost.getView(),
+                    inputPoint.x - mHandleMenuWindowingPillPosition.x
+                            - mResult.mDecorContainerOffsetX,
+                    inputPoint.y - mHandleMenuWindowingPillPosition.y
+                            - mResult.mDecorContainerOffsetY);
+        }
+        final boolean pointInMoreActionsPill = pointInView(
+                mHandleMenuMoreActionsPill.mWindowViewHost.getView(),
+                inputPoint.x - mHandleMenuMoreActionsPillPosition.x
+                        - mResult.mDecorContainerOffsetX,
+                inputPoint.y - mHandleMenuMoreActionsPillPosition.y
+                        - mResult.mDecorContainerOffsetY);
+        if (!pointInAppInfoPill && !pointInWindowingPill && !pointInMoreActionsPill) {
             closeHandleMenu();
         }
     }
@@ -397,14 +563,13 @@
             final View handle = caption.findViewById(R.id.caption_handle);
             clickIfPointInView(new PointF(ev.getX(), ev.getY()), handle);
         } else {
-            final View menu = mHandleMenu.mWindowViewHost.getView();
-            final int captionWidth = mTaskInfo.getConfiguration().windowConfiguration
-                    .getBounds().width();
-            final int menuX = mRelayoutParams.mCaptionX + (captionWidth / 2)
-                    - (menu.getWidth() / 2);
-            final PointF inputPoint = new PointF(ev.getX() - menuX, ev.getY());
-            final View collapse = menu.findViewById(R.id.collapse_menu_button);
-            if (clickIfPointInView(inputPoint, collapse)) return;
+            final View appInfoPill = mHandleMenuAppInfoPill.mWindowViewHost.getView();
+            final ImageButton collapse = appInfoPill.findViewById(R.id.collapse_menu_button);
+            // Translate the input point from display coordinates to the same space as the collapse
+            // button, meaning its parent (app info pill view).
+            final PointF inputPoint = new PointF(ev.getX() - mHandleMenuAppInfoPillPosition.x,
+                    ev.getY() - mHandleMenuAppInfoPillPosition.y);
+            clickIfPointInView(inputPoint, collapse);
         }
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeAppControlsWindowDecorationViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeAppControlsWindowDecorationViewHolder.kt
index 95b5051..78cfcbd 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeAppControlsWindowDecorationViewHolder.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeAppControlsWindowDecorationViewHolder.kt
@@ -1,10 +1,9 @@
 package com.android.wm.shell.windowdecor.viewholder
 
 import android.app.ActivityManager.RunningTaskInfo
-import android.content.pm.PackageManager
 import android.content.res.ColorStateList
+import android.graphics.drawable.Drawable
 import android.graphics.drawable.GradientDrawable
-import android.util.Log
 import android.view.View
 import android.widget.ImageButton
 import android.widget.ImageView
@@ -19,7 +18,9 @@
 internal class DesktopModeAppControlsWindowDecorationViewHolder(
         rootView: View,
         onCaptionTouchListener: View.OnTouchListener,
-        onCaptionButtonClickListener: View.OnClickListener
+        onCaptionButtonClickListener: View.OnClickListener,
+        appName: CharSequence,
+        appIcon: Drawable
 ) : DesktopModeWindowDecorationViewHolder(rootView) {
 
     private val captionView: View = rootView.findViewById(R.id.desktop_mode_caption)
@@ -35,10 +36,11 @@
         captionHandle.setOnTouchListener(onCaptionTouchListener)
         openMenuButton.setOnClickListener(onCaptionButtonClickListener)
         closeWindowButton.setOnClickListener(onCaptionButtonClickListener)
+        appNameTextView.text = appName
+        appIconImageView.setImageDrawable(appIcon)
     }
 
     override fun bindData(taskInfo: RunningTaskInfo) {
-        bindAppInfo(taskInfo)
 
         val captionDrawable = captionView.background as GradientDrawable
         captionDrawable.setColor(taskInfo.taskDescription.statusBarColor)
@@ -50,20 +52,6 @@
         appNameTextView.setTextColor(getCaptionAppNameTextColor(taskInfo))
     }
 
-    private fun bindAppInfo(taskInfo: RunningTaskInfo) {
-        val packageName: String = taskInfo.realActivity.packageName
-        val pm: PackageManager = context.applicationContext.packageManager
-        try {
-            // TODO(b/268363572): Use IconProvider or BaseIconCache to set drawable/name.
-            val applicationInfo = pm.getApplicationInfo(packageName,
-                    PackageManager.ApplicationInfoFlags.of(0))
-            appNameTextView.text = pm.getApplicationLabel(applicationInfo)
-            appIconImageView.setImageDrawable(pm.getApplicationIcon(applicationInfo))
-        } catch (e: PackageManager.NameNotFoundException) {
-            Log.w(TAG, "Package not found: $packageName", e)
-        }
-    }
-
     private fun getCaptionAppNameTextColor(taskInfo: RunningTaskInfo): Int {
         return if (shouldUseLightCaptionColors(taskInfo)) {
             context.getColor(R.color.desktop_mode_caption_app_name_light)
diff --git a/libs/WindowManager/Shell/tests/OWNERS b/libs/WindowManager/Shell/tests/OWNERS
index 1c28c3d..64dfc3e 100644
--- a/libs/WindowManager/Shell/tests/OWNERS
+++ b/libs/WindowManager/Shell/tests/OWNERS
@@ -7,3 +7,4 @@
 [email protected]
 [email protected]
 [email protected]
[email protected]
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt
index ed93045..c416ad0 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt
@@ -137,7 +137,7 @@
     portraitPosTop: Boolean
 ) {
     assertLayers {
-        this.notContains(SPLIT_SCREEN_DIVIDER_COMPONENT.or(component))
+        this.notContains(SPLIT_SCREEN_DIVIDER_COMPONENT.or(component), isOptional = true)
             .then()
             .isInvisible(SPLIT_SCREEN_DIVIDER_COMPONENT.or(component))
             .then()
@@ -217,14 +217,23 @@
 ) {
     assertLayers {
         if (landscapePosLeft) {
-            this.splitAppLayerBoundsSnapToDivider(
-                component,
-                landscapePosLeft,
-                portraitPosTop,
-                scenario.endRotation
-            )
+            splitAppLayerBoundsSnapToDivider(
+                    component,
+                    landscapePosLeft,
+                    portraitPosTop,
+                    scenario.endRotation
+                )
+                .then()
+                .isInvisible(component)
+                .then()
+                .splitAppLayerBoundsSnapToDivider(
+                    component,
+                    landscapePosLeft,
+                    portraitPosTop,
+                    scenario.endRotation
+                )
         } else {
-            this.splitAppLayerBoundsSnapToDivider(
+            splitAppLayerBoundsSnapToDivider(
                     component,
                     landscapePosLeft,
                     portraitPosTop,
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/appcompat/BaseAppCompat.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/appcompat/BaseAppCompat.kt
new file mode 100644
index 0000000..d01a0ee
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/appcompat/BaseAppCompat.kt
@@ -0,0 +1,116 @@
+/*
+ * 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.flicker.appcompat
+
+import android.content.Context
+import android.system.helpers.CommandsHelper
+import android.tools.device.flicker.legacy.FlickerBuilder
+import android.tools.device.flicker.legacy.FlickerTest
+import com.android.wm.shell.flicker.BaseTest
+import com.android.server.wm.flicker.helpers.setRotation
+import com.android.server.wm.flicker.helpers.LetterboxAppHelper
+import android.tools.device.flicker.legacy.FlickerTestFactory
+import android.tools.device.flicker.legacy.IFlickerTestData
+import com.android.wm.shell.flicker.appWindowIsVisibleAtEnd
+import com.android.wm.shell.flicker.appWindowIsVisibleAtStart
+import org.junit.Assume
+import org.junit.Before
+import org.junit.runners.Parameterized
+
+abstract class BaseAppCompat(flicker: FlickerTest) : BaseTest(flicker) {
+    protected val context: Context = instrumentation.context
+    protected val letterboxApp = LetterboxAppHelper(instrumentation)
+    lateinit var cmdHelper: CommandsHelper
+    lateinit var letterboxStyle: HashMap<String, String>
+
+    /** {@inheritDoc} */
+    override val transition: FlickerBuilder.() -> Unit
+        get() = {
+            setup {
+                setStartRotation()
+                letterboxApp.launchViaIntent(wmHelper)
+                setEndRotation()
+            }
+        }
+
+    @Before
+    fun before() {
+        cmdHelper = CommandsHelper.getInstance(instrumentation)
+        Assume.assumeTrue(tapl.isTablet && isIgnoreOrientationRequest())
+    }
+
+    private fun mapLetterboxStyle(): HashMap<String, String> {
+        val res = cmdHelper.executeShellCommand("wm get-letterbox-style")
+        val lines = res.lines()
+        val map = HashMap<String, String>()
+        for (line in lines) {
+            val keyValuePair = line.split(":")
+            if (keyValuePair.size == 2) {
+                val key = keyValuePair[0].trim()
+                map[key] = keyValuePair[1].trim()
+            }
+        }
+        return map
+    }
+
+    private fun isIgnoreOrientationRequest(): Boolean {
+        val res = cmdHelper.executeShellCommand("wm get-ignore-orientation-request")
+        return res != null && res.contains("true")
+    }
+
+    fun IFlickerTestData.setStartRotation() = setRotation(flicker.scenario.startRotation)
+
+    fun IFlickerTestData.setEndRotation() = setRotation(flicker.scenario.endRotation)
+
+    /** Checks that app entering letterboxed state have rounded corners */
+    fun assertLetterboxAppAtStartHasRoundedCorners() {
+        assumeLetterboxRoundedCornersEnabled()
+        flicker.assertLayersStart { this.hasRoundedCorners(letterboxApp) }
+    }
+
+    fun assertLetterboxAppAtEndHasRoundedCorners() {
+        assumeLetterboxRoundedCornersEnabled()
+        flicker.assertLayersEnd { this.hasRoundedCorners(letterboxApp) }
+    }
+
+    /** Only run on tests with config_letterboxActivityCornersRadius != 0 in devices */
+    private fun assumeLetterboxRoundedCornersEnabled() {
+        if (!::letterboxStyle.isInitialized) {
+            letterboxStyle = mapLetterboxStyle()
+        }
+        Assume.assumeTrue(letterboxStyle.getValue("Corner radius") != "0")
+    }
+
+    fun assertLetterboxAppVisibleAtStartAndEnd() {
+        flicker.appWindowIsVisibleAtStart(letterboxApp)
+        flicker.appWindowIsVisibleAtEnd(letterboxApp)
+    }
+
+    companion object {
+        /**
+         * Creates the test configurations.
+         *
+         * See [FlickerTestFactory.rotationTests] for configuring screen orientation and
+         * navigation modes.
+         */
+        @Parameterized.Parameters(name = "{0}")
+        @JvmStatic
+        fun getParams(): Collection<FlickerTest> {
+            return FlickerTestFactory.rotationTests()
+        }
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/appcompat/OpenAppInSizeCompatModeTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/appcompat/OpenAppInSizeCompatModeTest.kt
new file mode 100644
index 0000000..c57100e
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/appcompat/OpenAppInSizeCompatModeTest.kt
@@ -0,0 +1,89 @@
+/*
+ * 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.flicker.appcompat
+
+import android.platform.test.annotations.Postsubmit
+import androidx.test.filters.RequiresDevice
+import android.tools.device.flicker.legacy.FlickerBuilder
+import android.tools.device.flicker.legacy.FlickerTest
+import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
+import android.tools.common.datatypes.component.ComponentNameMatcher
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Test launching app in size compat mode.
+ *
+ * To run this test: `atest WMShellFlickerTests:OpenAppInSizeCompatModeTest`
+ *
+ * Actions:
+ * ```
+ *     Rotate non resizable portrait only app to opposite orientation to trigger size compat mode
+ * ```
+ * Notes:
+ * ```
+ *     Some default assertions (e.g., nav bar, status bar and screen covered)
+ *     are inherited [BaseTest]
+ * ```
+ */
+
+@RequiresDevice
+@RunWith(Parameterized::class)
[email protected](FlickerParametersRunnerFactory::class)
+class OpenAppInSizeCompatModeTest(flicker: FlickerTest) : BaseAppCompat(flicker) {
+
+    /** {@inheritDoc} */
+    override val transition: FlickerBuilder.() -> Unit
+        get() = {
+            setup {
+                setStartRotation()
+                letterboxApp.launchViaIntent(wmHelper)
+            }
+            transitions { setEndRotation() }
+            teardown { letterboxApp.exit(wmHelper) }
+        }
+
+    /**
+     * Windows maybe recreated when rotated. Checks that the focus does not change or if it does,
+     * focus returns to [letterboxApp]
+     */
+    @Postsubmit
+    @Test
+    fun letterboxAppFocusedAtEnd() = flicker.assertEventLog { focusChanges(letterboxApp.`package`) }
+
+    @Postsubmit
+    @Test
+    fun letterboxedAppHasRoundedCorners() = assertLetterboxAppAtEndHasRoundedCorners()
+
+    /**
+     * Checks that the [ComponentNameMatcher.ROTATION] layer appears during the transition, doesn't
+     * flicker, and disappears before the transition is complete
+     */
+    @Postsubmit
+    @Test
+    fun rotationLayerAppearsAndVanishes() {
+        flicker.assertLayers {
+            this.isVisible(letterboxApp)
+                .then()
+                .isVisible(ComponentNameMatcher.ROTATION)
+                .then()
+                .isVisible(letterboxApp)
+                .isInvisible(ComponentNameMatcher.ROTATION)
+        }
+    }
+}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/appcompat/RestartAppInSizeCompatModeTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/appcompat/RestartAppInSizeCompatModeTest.kt
new file mode 100644
index 0000000..f111a8d
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/appcompat/RestartAppInSizeCompatModeTest.kt
@@ -0,0 +1,86 @@
+/*
+ * 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.flicker.appcompat
+
+import android.platform.test.annotations.Postsubmit
+import androidx.test.filters.RequiresDevice
+import android.tools.device.flicker.legacy.FlickerBuilder
+import android.tools.device.flicker.legacy.FlickerTest
+import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
+import android.tools.device.helpers.WindowUtils
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Test restarting app in size compat mode.
+ *
+ * To run this test: `atest WMShellFlickerTests:RestartAppInSizeCompatModeTest`
+ *
+ * Actions:
+ * ```
+ *     Rotate app to opposite orientation to trigger size compat mode
+ *     Press restart button and wait for letterboxed app to resize
+ * ```
+ * Notes:
+ * ```
+ *     Some default assertions (e.g., nav bar, status bar and screen covered)
+ *     are inherited [BaseTest]
+ * ```
+ */
+
+@RequiresDevice
+@RunWith(Parameterized::class)
[email protected](FlickerParametersRunnerFactory::class)
+class RestartAppInSizeCompatModeTest(flicker: FlickerTest) : BaseAppCompat(flicker) {
+
+    /** {@inheritDoc} */
+    override val transition: FlickerBuilder.() -> Unit
+        get() = {
+            super.transition(this)
+            transitions { letterboxApp.clickRestart(wmHelper) }
+            teardown { letterboxApp.exit(wmHelper) }
+        }
+
+    @Postsubmit
+    @Test
+    fun appVisibleAtStartAndEnd() = assertLetterboxAppVisibleAtStartAndEnd()
+
+    @Postsubmit
+    @Test
+    fun appLayerVisibilityChanges() {
+        flicker.assertLayers {
+            this.isVisible(letterboxApp)
+                .then()
+                .isInvisible(letterboxApp)
+                .then()
+                .isVisible(letterboxApp)
+        }
+    }
+
+    @Postsubmit
+    @Test
+    fun letterboxedAppHasRoundedCorners() = assertLetterboxAppAtStartHasRoundedCorners()
+
+    /** Checks that the visible region of [letterboxApp] is still within display bounds */
+    @Postsubmit
+    @Test
+    fun appWindowRemainInsideVisibleBounds() {
+        val displayBounds = WindowUtils.getDisplayBounds(flicker.scenario.endRotation)
+        flicker.assertLayersEnd { visibleRegion(letterboxApp).coversAtMost(displayBounds) }
+    }
+}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ChangeActiveActivityFromBubbleTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ChangeActiveActivityFromBubbleTest.kt
index d0bca13..2474ecf 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ChangeActiveActivityFromBubbleTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ChangeActiveActivityFromBubbleTest.kt
@@ -17,8 +17,8 @@
 package com.android.wm.shell.flicker.bubble
 
 import android.os.SystemClock
+import android.platform.test.annotations.FlakyTest
 import android.platform.test.annotations.Presubmit
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -26,8 +26,6 @@
 import androidx.test.uiautomator.By
 import androidx.test.uiautomator.UiObject2
 import androidx.test.uiautomator.Until
-import org.junit.Assume
-import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
@@ -45,13 +43,8 @@
 @RequiresDevice
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FlakyTest(bugId = 217777115)
 open class ChangeActiveActivityFromBubbleTest(flicker: FlickerTest) : BaseBubbleScreen(flicker) {
-
-    @Before
-    open fun before() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-    }
-
     /** {@inheritDoc} */
     override val transition: FlickerBuilder.() -> Unit
         get() = buildTransition {
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ChangeActiveActivityFromBubbleTestShellTransit.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ChangeActiveActivityFromBubbleTestShellTransit.kt
deleted file mode 100644
index 5e85eb8..0000000
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ChangeActiveActivityFromBubbleTestShellTransit.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.wm.shell.flicker.bubble
-
-import android.platform.test.annotations.FlakyTest
-import android.tools.device.flicker.isShellTransitionsEnabled
-import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
-import android.tools.device.flicker.legacy.FlickerTest
-import androidx.test.filters.RequiresDevice
-import org.junit.Assume
-import org.junit.Before
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-
-@RequiresDevice
-@RunWith(Parameterized::class)
[email protected](FlickerParametersRunnerFactory::class)
-@FlakyTest(bugId = 217777115)
-class ChangeActiveActivityFromBubbleTestShellTransit(flicker: FlickerTest) :
-    ChangeActiveActivityFromBubbleTest(flicker) {
-    @Before
-    override fun before() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
-    }
-}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/OpenActivityFromBubbleOnLocksreenTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/OpenActivityFromBubbleOnLocksreenTest.kt
index 416315e..18a3aa7 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/OpenActivityFromBubbleOnLocksreenTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/OpenActivityFromBubbleOnLocksreenTest.kt
@@ -18,6 +18,7 @@
 
 import android.platform.test.annotations.FlakyTest
 import android.platform.test.annotations.Postsubmit
+import android.tools.common.datatypes.component.ComponentNameMatcher
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -29,6 +30,7 @@
 import com.android.server.wm.flicker.navBarLayerIsVisibleAtEnd
 import com.android.server.wm.flicker.navBarLayerPositionAtEnd
 import org.junit.Assume
+import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
@@ -137,4 +139,23 @@
         Assume.assumeTrue(flicker.scenario.isGesturalNavigation)
         super.navBarWindowIsAlwaysVisible()
     }
+
+    /** {@inheritDoc} */
+    @Test
+    @Ignore("Not applicable to this CUJ. Taskbar is not shown on lock screen")
+    override fun taskBarLayerIsVisibleAtStartAndEnd() {}
+
+    @Test
+    @Ignore("Not applicable to this CUJ. Taskbar is not shown on lock screen")
+    override fun taskBarWindowIsAlwaysVisible() {}
+
+    /**
+     * Checks that the [ComponentNameMatcher.TASK_BAR] is visible at the end of the transition
+     */
+    @Postsubmit
+    @Test
+    fun taskBarLayerIsVisibleAtEnd() {
+        Assume.assumeTrue(flicker.scenario.isTablet)
+        flicker.assertLayersEnd { this.isVisible(ComponentNameMatcher.TASK_BAR) }
+    }
 }
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/AutoEnterPipOnGoToHomeTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/AutoEnterPipOnGoToHomeTest.kt
index 1045a5a..93ee699 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/AutoEnterPipOnGoToHomeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/AutoEnterPipOnGoToHomeTest.kt
@@ -40,6 +40,7 @@
  *     Select "Auto-enter PiP" radio button
  *     Press Home button or swipe up to go Home and put [pipApp] in pip mode
  * ```
+ *
  * Notes:
  * ```
  *     1. All assertions are inherited from [EnterPipTest]
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ClosePipBySwipingDownTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ClosePipBySwipingDownTest.kt
index 2d2588e..59918fb 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ClosePipBySwipingDownTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ClosePipBySwipingDownTest.kt
@@ -38,6 +38,7 @@
  *     Launch an app in pip mode [pipApp],
  *     Swipe the pip window to the bottom-center of the screen and wait it disappear
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ClosePipTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ClosePipTransition.kt
index 6c5a344..36c6f7c 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ClosePipTransition.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ClosePipTransition.kt
@@ -19,7 +19,6 @@
 import android.platform.test.annotations.Presubmit
 import android.tools.common.Rotation
 import android.tools.common.datatypes.component.ComponentNameMatcher.Companion.LAUNCHER
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
@@ -43,25 +42,17 @@
     @Presubmit
     @Test
     open fun pipWindowBecomesInvisible() {
-        if (isShellTransitionsEnabled) {
-            // When Shell transition is enabled, we change the windowing mode at start, but
-            // update the visibility after the transition is finished, so we can't check isNotPinned
-            // and isAppWindowInvisible in the same assertion block.
-            flicker.assertWm {
-                this.invoke("hasPipWindow") {
-                        it.isPinned(pipApp).isAppWindowVisible(pipApp).isAppWindowOnTop(pipApp)
-                    }
-                    .then()
-                    .invoke("!hasPipWindow") { it.isNotPinned(pipApp).isAppWindowNotOnTop(pipApp) }
-            }
-            flicker.assertWmEnd { isAppWindowInvisible(pipApp) }
-        } else {
-            flicker.assertWm {
-                this.invoke("hasPipWindow") { it.isPinned(pipApp).isAppWindowVisible(pipApp) }
-                    .then()
-                    .invoke("!hasPipWindow") { it.isNotPinned(pipApp).isAppWindowInvisible(pipApp) }
-            }
+        // When Shell transition is enabled, we change the windowing mode at start, but
+        // update the visibility after the transition is finished, so we can't check isNotPinned
+        // and isAppWindowInvisible in the same assertion block.
+        flicker.assertWm {
+            this.invoke("hasPipWindow") {
+                    it.isPinned(pipApp).isAppWindowVisible(pipApp).isAppWindowOnTop(pipApp)
+                }
+                .then()
+                .invoke("!hasPipWindow") { it.isNotPinned(pipApp).isAppWindowNotOnTop(pipApp) }
         }
+        flicker.assertWmEnd { isAppWindowInvisible(pipApp) }
     }
 
     /**
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ClosePipWithDismissButtonTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ClosePipWithDismissButtonTest.kt
index e540ad5..d165832 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ClosePipWithDismissButtonTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ClosePipWithDismissButtonTest.kt
@@ -38,6 +38,7 @@
  *     Click on the pip window
  *     Click on dismiss button and wait window disappear
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientation.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientation.kt
index e079d547..db18edb 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientation.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientation.kt
@@ -53,6 +53,7 @@
  *     Launch [pipApp] on a fixed landscape orientation
  *     Broadcast action [ACTION_ENTER_PIP] to enter pip mode
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTransition.kt
index e40e5ea..51f0136 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTransition.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTransition.kt
@@ -44,9 +44,7 @@
     @Presubmit
     @Test
     open fun pipAppLayerAlwaysVisible() {
-        flicker.assertLayers {
-            this.isVisible(pipApp)
-        }
+        flicker.assertLayers { this.isVisible(pipApp) }
     }
 
     /** Checks the content overlay appears then disappears during the animation */
@@ -55,11 +53,7 @@
     open fun pipOverlayLayerAppearThenDisappear() {
         val overlay = ComponentNameMatcher.PIP_CONTENT_OVERLAY
         flicker.assertLayers {
-            this.notContains(overlay)
-                .then()
-                .contains(overlay)
-                .then()
-                .notContains(overlay)
+            this.notContains(overlay).then().contains(overlay).then().notContains(overlay)
         }
     }
 
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipViaAppUiButtonTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipViaAppUiButtonTest.kt
index 1f060e9..f1925d8 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipViaAppUiButtonTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipViaAppUiButtonTest.kt
@@ -35,6 +35,7 @@
  *     Launch an app in full screen
  *     Press an "enter pip" button to put [pipApp] in pip mode
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaExpandButtonTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaExpandButtonTest.kt
index 313631c..3e0e37d 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaExpandButtonTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaExpandButtonTest.kt
@@ -16,16 +16,11 @@
 
 package com.android.wm.shell.flicker.pip
 
-import android.platform.test.annotations.FlakyTest
-import android.platform.test.annotations.Presubmit
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
 import androidx.test.filters.RequiresDevice
-import org.junit.Assume
 import org.junit.FixMethodOrder
-import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.MethodSorters
 import org.junit.runners.Parameterized
@@ -42,6 +37,7 @@
  *     Expand [pipApp] app to full screen by clicking on the pip window and
  *     then on the expand button
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
@@ -72,19 +68,4 @@
                 wmHelper.StateSyncBuilder().withWindowSurfaceDisappeared(testApp).waitForAndVerify()
             }
         }
-
-    /** {@inheritDoc} */
-    @FlakyTest(bugId = 197726610)
-    @Test
-    override fun pipLayerExpands() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        super.pipLayerExpands()
-    }
-
-    @Presubmit
-    @Test
-    fun pipLayerExpands_ShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
-        super.pipLayerExpands()
-    }
 }
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaIntentTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaIntentTest.kt
index 93ffdd8d..603f995 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaIntentTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipToAppViaIntentTest.kt
@@ -16,16 +16,11 @@
 
 package com.android.wm.shell.flicker.pip
 
-import android.platform.test.annotations.FlakyTest
-import android.platform.test.annotations.Presubmit
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
 import androidx.test.filters.RequiresDevice
-import org.junit.Assume
 import org.junit.FixMethodOrder
-import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.MethodSorters
 import org.junit.runners.Parameterized
@@ -41,6 +36,7 @@
  *     Launch another full screen mode [testApp]
  *     Expand [pipApp] app to full screen via an intent
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
@@ -71,37 +67,4 @@
                 wmHelper.StateSyncBuilder().withWindowSurfaceDisappeared(testApp).waitForAndVerify()
             }
         }
-
-    /** {@inheritDoc} */
-    @Presubmit @Test override fun entireScreenCovered() = super.entireScreenCovered()
-
-    /** {@inheritDoc} */
-    @Presubmit
-    @Test
-    override fun statusBarLayerPositionAtStartAndEnd() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        super.statusBarLayerPositionAtStartAndEnd()
-    }
-
-    @Presubmit
-    @Test
-    fun statusBarLayerRotatesScales_ShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
-        super.statusBarLayerPositionAtStartAndEnd()
-    }
-
-    /** {@inheritDoc} */
-    @FlakyTest(bugId = 197726610)
-    @Test
-    override fun pipLayerExpands() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        super.pipLayerExpands()
-    }
-
-    @Presubmit
-    @Test
-    fun pipLayerExpands_ShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
-        super.pipLayerExpands()
-    }
 }
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
index 7d5f740..6deba1b 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
@@ -40,6 +40,7 @@
  *     Launch an app in pip mode [pipApp],
  *     Expand [pipApp] app to its maximum pip size by double clicking on it
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnPinchOpenTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnPinchOpenTest.kt
index 0b73aac..d860e00 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnPinchOpenTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnPinchOpenTest.kt
@@ -36,7 +36,7 @@
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
 open class ExpandPipOnPinchOpenTest(flicker: FlickerTest) : PipTransition(flicker) {
     override val transition: FlickerBuilder.() -> Unit
-        get() = buildTransition { transitions { pipApp.pinchOpenPipWindow(wmHelper, 0.4f, 30) } }
+        get() = buildTransition { transitions { pipApp.pinchOpenPipWindow(wmHelper, 0.25f, 30) } }
 
     /** Checks that the visible region area of [pipApp] always increases during the animation. */
     @Presubmit
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownOnShelfHeightChange.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownOnShelfHeightChange.kt
index 9c00744..d8d57d2 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownOnShelfHeightChange.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownOnShelfHeightChange.kt
@@ -40,6 +40,7 @@
  *     Launch [testApp]
  *     Check if pip window moves down (visually)
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipOnImeVisibilityChangeTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipOnImeVisibilityChangeTest.kt
index c23838a..a626713 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipOnImeVisibilityChangeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipOnImeVisibilityChangeTest.kt
@@ -19,7 +19,6 @@
 import android.platform.test.annotations.Presubmit
 import android.tools.common.Rotation
 import android.tools.common.datatypes.component.ComponentNameMatcher
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -28,8 +27,6 @@
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.helpers.ImeAppHelper
 import com.android.server.wm.flicker.helpers.setRotation
-import org.junit.Assume.assumeFalse
-import org.junit.Before
 import org.junit.FixMethodOrder
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -44,11 +41,6 @@
 open class MovePipOnImeVisibilityChangeTest(flicker: FlickerTest) : PipTransition(flicker) {
     private val imeApp = ImeAppHelper(instrumentation)
 
-    @Before
-    open fun before() {
-        assumeFalse(isShellTransitionsEnabled)
-    }
-
     /** {@inheritDoc} */
     override val transition: FlickerBuilder.() -> Unit
         get() = buildTransition {
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipOnImeVisibilityChangeTestShellTransit.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipOnImeVisibilityChangeTestShellTransit.kt
deleted file mode 100644
index 6f81116..0000000
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipOnImeVisibilityChangeTestShellTransit.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.wm.shell.flicker.pip
-
-import android.platform.test.annotations.Presubmit
-import android.tools.device.flicker.isShellTransitionsEnabled
-import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
-import android.tools.device.flicker.legacy.FlickerTest
-import androidx.test.filters.RequiresDevice
-import org.junit.Assume
-import org.junit.Before
-import org.junit.FixMethodOrder
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.MethodSorters
-import org.junit.runners.Parameterized
-
-@RequiresDevice
-@RunWith(Parameterized::class)
[email protected](FlickerParametersRunnerFactory::class)
-@FixMethodOrder(MethodSorters.NAME_ASCENDING)
-class MovePipOnImeVisibilityChangeTestShellTransit(flicker: FlickerTest) :
-    MovePipOnImeVisibilityChangeTest(flicker) {
-
-    @Before
-    override fun before() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
-    }
-
-    @Presubmit
-    @Test
-    override fun statusBarLayerPositionAtStartAndEnd() = super.statusBarLayerPositionAtStartAndEnd()
-}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpOnShelfHeightChangeTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpOnShelfHeightChangeTest.kt
index c8d5624..ae3f879 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpOnShelfHeightChangeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpOnShelfHeightChangeTest.kt
@@ -40,6 +40,7 @@
  *     Press home
  *     Check if pip window moves up (visually)
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipDragTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipDragTest.kt
index 083cfd2..4e2a4e7 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipDragTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipDragTest.kt
@@ -30,9 +30,7 @@
 import org.junit.runners.MethodSorters
 import org.junit.runners.Parameterized
 
-/**
- * Test the dragging of a PIP window.
- */
+/** Test the dragging of a PIP window. */
 @RequiresDevice
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@@ -59,9 +57,7 @@
                 pipApp.exit(wmHelper)
                 tapl.setEnableRotation(false)
             }
-            transitions {
-                pipApp.dragPipWindowAwayFromEdgeWithoutRelease(wmHelper, 50)
-            }
+            transitions { pipApp.dragPipWindowAwayFromEdgeWithoutRelease(wmHelper, 50) }
         }
 
     @Postsubmit
@@ -92,4 +88,4 @@
             return FlickerTestFactory.nonRotationTests()
         }
     }
-}
\ No newline at end of file
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipDragThenSnapTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipDragThenSnapTest.kt
index 53ce393..9fe9f52 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipDragThenSnapTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipDragThenSnapTest.kt
@@ -16,10 +16,10 @@
 
 package com.android.wm.shell.flicker.pip
 
+import android.graphics.Rect
 import android.platform.test.annotations.Postsubmit
 import android.tools.common.Rotation
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
-import android.graphics.Rect
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
@@ -33,14 +33,12 @@
 import org.junit.runners.MethodSorters
 import org.junit.runners.Parameterized
 
-/**
- * Test the snapping of a PIP window via dragging, releasing, and checking its final location.
- */
+/** Test the snapping of a PIP window via dragging, releasing, and checking its final location. */
 @RequiresDevice
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
-class PipDragThenSnapTest(flicker: FlickerTest) : PipTransition(flicker){
+class PipDragThenSnapTest(flicker: FlickerTest) : PipTransition(flicker) {
     // represents the direction in which the pip window should be snapping
     private var willSnapRight: Boolean = true
 
@@ -60,8 +58,12 @@
 
                 // get the initial region bounds and cache them
                 val initRegion = pipApp.getWindowRect(wmHelper)
-                startBounds
-                        .set(initRegion.left, initRegion.top, initRegion.right, initRegion.bottom)
+                startBounds.set(
+                    initRegion.left,
+                    initRegion.top,
+                    initRegion.right,
+                    initRegion.bottom
+                )
 
                 // drag the pip window away from the edge
                 pipApp.dragPipWindowAwayFromEdge(wmHelper, 50)
@@ -108,4 +110,4 @@
             )
         }
     }
-}
\ No newline at end of file
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipPinchInTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipPinchInTest.kt
index 85b2fbc..8eb41b4 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipPinchInTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipPinchInTest.kt
@@ -16,6 +16,7 @@
 
 package com.android.wm.shell.flicker.pip
 
+import android.platform.test.annotations.FlakyTest
 import android.platform.test.annotations.Postsubmit
 import android.tools.common.Rotation
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
@@ -34,6 +35,7 @@
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@FlakyTest(bugId = 270677470)
 class PipPinchInTest(flicker: FlickerTest) : PipTransition(flicker) {
     override val transition: FlickerBuilder.() -> Unit
         get() = buildTransition { transitions { pipApp.pinchInPipWindow(wmHelper, 0.4f, 30) } }
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ShowPipAndRotateDisplay.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ShowPipAndRotateDisplay.kt
index 2cf8f61..703784d 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ShowPipAndRotateDisplay.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ShowPipAndRotateDisplay.kt
@@ -43,6 +43,7 @@
  *     Rotate the screen from [flicker.scenario.startRotation] to [flicker.scenario.endRotation]
  *     (usually, 0->90 and 90->0)
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DismissSplitScreenByGoHome.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DismissSplitScreenByGoHome.kt
index bd2ffc1..2e81b30 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DismissSplitScreenByGoHome.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DismissSplitScreenByGoHome.kt
@@ -71,7 +71,7 @@
     // TODO(b/245472831): Move back to presubmit after shell transitions landing.
     @FlakyTest(bugId = 245472831)
     @Test
-    fun secondaryAppLayerBecomesInvisible() = flicker.layerBecomesInvisible(primaryApp)
+    fun secondaryAppLayerBecomesInvisible() = flicker.layerBecomesInvisible(secondaryApp)
 
     // TODO(b/245472831): Move back to presubmit after shell transitions landing.
     @FlakyTest(bugId = 245472831)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DragDividerToResize.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DragDividerToResize.kt
index 7db5ecc..5180791 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DragDividerToResize.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DragDividerToResize.kt
@@ -19,7 +19,6 @@
 import android.platform.test.annotations.FlakyTest
 import android.platform.test.annotations.IwTest
 import android.platform.test.annotations.Presubmit
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -86,16 +85,14 @@
 
     @Presubmit
     @Test
-    fun primaryAppLayerKeepVisible() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        flicker.layerKeepVisible(primaryApp)
-    }
-
-    @FlakyTest(bugId = 263213649)
-    @Test
-    fun primaryAppLayerKeepVisible_ShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
-        flicker.layerKeepVisible(primaryApp)
+    fun primaryAppLayerVisibilityChanges() {
+        flicker.assertLayers {
+            this.isVisible(secondaryApp)
+                .then()
+                .isInvisible(secondaryApp)
+                .then()
+                .isVisible(secondaryApp)
+        }
     }
 
     @Presubmit
@@ -116,21 +113,9 @@
     @Test
     fun secondaryAppWindowKeepVisible() = flicker.appWindowKeepVisible(secondaryApp)
 
-    @Presubmit
+    @FlakyTest(bugId = 245472831)
     @Test
     fun primaryAppBoundsChanges() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        flicker.splitAppLayerBoundsChanges(
-            primaryApp,
-            landscapePosLeft = true,
-            portraitPosTop = false
-        )
-    }
-
-    @FlakyTest(bugId = 263213649)
-    @Test
-    fun primaryAppBoundsChanges_ShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
         flicker.splitAppLayerBoundsChanges(
             primaryApp,
             landscapePosLeft = true,
@@ -147,11 +132,6 @@
             portraitPosTop = true
         )
 
-    /** {@inheritDoc} */
-    @FlakyTest(bugId = 263213649)
-    @Test
-    override fun entireScreenCovered() = super.entireScreenCovered()
-
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromAllApps.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromAllApps.kt
index 5b06c9c..69da1e2 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromAllApps.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromAllApps.kt
@@ -16,11 +16,11 @@
 
 package com.android.wm.shell.flicker.splitscreen
 
+import android.platform.test.annotations.FlakyTest
 import android.platform.test.annotations.IwTest
 import android.platform.test.annotations.Postsubmit
 import android.platform.test.annotations.Presubmit
 import android.tools.common.NavBar
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -79,21 +79,24 @@
     @IwTest(focusArea = "sysui")
     @Presubmit
     @Test
-    fun cujCompleted() = flicker.splitScreenEntered(primaryApp, secondaryApp, fromOtherApp = false,
-            appExistAtStart = false)
+    fun cujCompleted() =
+        flicker.splitScreenEntered(
+            primaryApp,
+            secondaryApp,
+            fromOtherApp = false,
+            appExistAtStart = false
+        )
 
-    @Presubmit
+    @FlakyTest(bugId = 245472831)
     @Test
     fun splitScreenDividerBecomesVisible() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
         flicker.splitScreenDividerBecomesVisible()
     }
 
     // TODO(b/245472831): Back to splitScreenDividerBecomesVisible after shell transition ready.
     @Presubmit
     @Test
-    fun splitScreenDividerIsVisibleAtEnd_ShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
+    fun splitScreenDividerIsVisibleAtEnd() {
         flicker.assertLayersEnd { this.isVisible(SPLIT_SCREEN_DIVIDER_COMPONENT) }
     }
 
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromNotification.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromNotification.kt
index c840183..1773846 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromNotification.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromNotification.kt
@@ -16,11 +16,11 @@
 
 package com.android.wm.shell.flicker.splitscreen
 
+import android.platform.test.annotations.FlakyTest
 import android.platform.test.annotations.IwTest
 import android.platform.test.annotations.Postsubmit
 import android.platform.test.annotations.Presubmit
 import android.tools.common.NavBar
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -82,21 +82,19 @@
     @IwTest(focusArea = "sysui")
     @Presubmit
     @Test
-    fun cujCompleted() = flicker.splitScreenEntered(primaryApp, sendNotificationApp,
-            fromOtherApp = false)
+    fun cujCompleted() =
+        flicker.splitScreenEntered(primaryApp, sendNotificationApp, fromOtherApp = false)
 
-    @Presubmit
+    @FlakyTest(bugId = 245472831)
     @Test
     fun splitScreenDividerBecomesVisible() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
         flicker.splitScreenDividerBecomesVisible()
     }
 
     // TODO(b/245472831): Back to splitScreenDividerBecomesVisible after shell transition ready.
     @Presubmit
     @Test
-    fun splitScreenDividerIsVisibleAtEnd_ShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
+    fun splitScreenDividerIsVisibleAtEnd() {
         flicker.assertLayersEnd { this.isVisible(SPLIT_SCREEN_DIVIDER_COMPONENT) }
     }
 
@@ -105,23 +103,6 @@
     @Presubmit
     @Test
     fun secondaryAppLayerBecomesVisible() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        flicker.assertLayers {
-            this.isInvisible(sendNotificationApp)
-                .then()
-                .isVisible(sendNotificationApp)
-                .then()
-                .isInvisible(sendNotificationApp)
-                .then()
-                .isVisible(sendNotificationApp)
-        }
-    }
-
-    // TODO(b/245472831): Align to legacy transition after shell transition ready.
-    @Presubmit
-    @Test
-    fun secondaryAppLayerBecomesVisible_ShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
         flicker.layerBecomesVisible(sendNotificationApp)
     }
 
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromTaskbar.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromTaskbar.kt
index 5c99209..3bea66e 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromTaskbar.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromTaskbar.kt
@@ -16,11 +16,11 @@
 
 package com.android.wm.shell.flicker.splitscreen
 
+import android.platform.test.annotations.FlakyTest
 import android.platform.test.annotations.IwTest
 import android.platform.test.annotations.Postsubmit
 import android.platform.test.annotations.Presubmit
 import android.tools.common.NavBar
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -80,21 +80,24 @@
     @IwTest(focusArea = "sysui")
     @Presubmit
     @Test
-    fun cujCompleted() = flicker.splitScreenEntered(primaryApp, secondaryApp, fromOtherApp = false,
-            appExistAtStart = false)
+    fun cujCompleted() =
+        flicker.splitScreenEntered(
+            primaryApp,
+            secondaryApp,
+            fromOtherApp = false,
+            appExistAtStart = false
+        )
 
-    @Presubmit
+    @FlakyTest(bugId = 245472831)
     @Test
     fun splitScreenDividerBecomesVisible() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
         flicker.splitScreenDividerBecomesVisible()
     }
 
     // TODO(b/245472831): Back to splitScreenDividerBecomesVisible after shell transition ready.
     @Presubmit
     @Test
-    fun splitScreenDividerIsVisibleAtEnd_ShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
+    fun splitScreenDividerIsVisibleAtEnd() {
         flicker.assertLayersEnd { this.isVisible(SPLIT_SCREEN_DIVIDER_COMPONENT) }
     }
 
@@ -103,23 +106,6 @@
     @Presubmit
     @Test
     fun secondaryAppLayerBecomesVisible() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        flicker.assertLayers {
-            this.isInvisible(secondaryApp)
-                .then()
-                .isVisible(secondaryApp)
-                .then()
-                .isInvisible(secondaryApp)
-                .then()
-                .isVisible(secondaryApp)
-        }
-    }
-
-    // TODO(b/245472831): Align to legacy transition after shell transition ready.
-    @Presubmit
-    @Test
-    fun secondaryAppLayerBecomesVisible_ShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
         flicker.layerBecomesVisible(secondaryApp)
     }
 
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SplitScreenUtils.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SplitScreenUtils.kt
index 7901f75..62936e0 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SplitScreenUtils.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SplitScreenUtils.kt
@@ -293,7 +293,7 @@
             wmHelper.currentState.layerState.displays.firstOrNull { !it.isVirtual }?.layerStackSpace
                 ?: error("Display not found")
         val dividerBar = device.wait(Until.findObject(dividerBarSelector), TIMEOUT_MS)
-        dividerBar.drag(Point(displayBounds.width * 1 / 3, displayBounds.height * 2 / 3))
+        dividerBar.drag(Point(displayBounds.width * 1 / 3, displayBounds.height * 2 / 3), 2000)
 
         wmHelper
             .StateSyncBuilder()
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromHome.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromHome.kt
index 2855c71..9f4cb8c 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromHome.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromHome.kt
@@ -20,7 +20,6 @@
 import android.platform.test.annotations.IwTest
 import android.platform.test.annotations.Presubmit
 import android.tools.common.NavBar
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -31,7 +30,6 @@
 import com.android.wm.shell.flicker.splitAppLayerBoundsIsVisibleAtEnd
 import com.android.wm.shell.flicker.splitScreenDividerBecomesVisible
 import com.android.wm.shell.flicker.splitScreenEntered
-import org.junit.Assume
 import org.junit.FixMethodOrder
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -73,19 +71,7 @@
     @Test
     fun splitScreenDividerBecomesVisible() = flicker.splitScreenDividerBecomesVisible()
 
-    @FlakyTest
-    @Test
-    fun primaryAppLayerBecomesVisible() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        flicker.layerBecomesVisible(primaryApp)
-    }
-
-    @Presubmit
-    @Test
-    fun primaryAppLayerBecomesVisibleShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
-        flicker.layerBecomesVisible(primaryApp)
-    }
+    @Presubmit @Test fun primaryAppLayerBecomesVisible() = flicker.layerBecomesVisible(primaryApp)
 
     @Presubmit
     @Test
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromRecent.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromRecent.kt
index c29a917..a33d8ca 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromRecent.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromRecent.kt
@@ -20,7 +20,6 @@
 import android.platform.test.annotations.IwTest
 import android.platform.test.annotations.Presubmit
 import android.tools.common.NavBar
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -31,7 +30,6 @@
 import com.android.wm.shell.flicker.splitAppLayerBoundsIsVisibleAtEnd
 import com.android.wm.shell.flicker.splitScreenDividerBecomesVisible
 import com.android.wm.shell.flicker.splitScreenEntered
-import org.junit.Assume
 import org.junit.FixMethodOrder
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -73,19 +71,7 @@
     @Test
     fun splitScreenDividerBecomesVisible() = flicker.splitScreenDividerBecomesVisible()
 
-    @FlakyTest
-    @Test
-    fun primaryAppLayerBecomesVisible() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        flicker.layerBecomesVisible(primaryApp)
-    }
-
-    @Presubmit
-    @Test
-    fun primaryAppLayerBecomesVisibleShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
-        flicker.layerBecomesVisible(primaryApp)
-    }
+    @Presubmit @Test fun primaryAppLayerBecomesVisible() = flicker.layerBecomesVisible(primaryApp)
 
     @Presubmit
     @Test
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduLayoutTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduLayoutTest.java
index 0be08ba..4f71b83 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduLayoutTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduLayoutTest.java
@@ -19,7 +19,12 @@
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertNotNull;
 
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.app.TaskInfo;
 import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
 import android.view.LayoutInflater;
 import android.view.View;
 
@@ -31,6 +36,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
 /**
@@ -41,6 +47,7 @@
  */
 @RunWith(AndroidTestingRunner.class)
 @SmallTest
[email protected](setAsMainLooper = true)
 public class ReachabilityEduLayoutTest extends ShellTestCase {
 
     private ReachabilityEduLayout mLayout;
@@ -49,6 +56,12 @@
     private View mMoveLeftButton;
     private View mMoveRightButton;
 
+    @Mock
+    private CompatUIConfiguration mCompatUIConfiguration;
+
+    @Mock
+    private TaskInfo mTaskInfo;
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
@@ -69,13 +82,38 @@
     }
 
     @Test
-    public void handleVisibility_activityNotLetterboxed_buttonsAreHidden() {
-        mLayout.handleVisibility(/* isActivityLetterboxed */ false,
-                /* letterboxVerticalPosition */  -1, /* letterboxHorizontalPosition */ -1,
-                /* availableWidth */  0, /* availableHeight */ 0, /* fromDoubleTap */ false);
+    public void handleVisibility_educationNotEnabled_buttonsAreHidden() {
+        mLayout.handleVisibility(/* horizontalEnabled */ false, /* verticalEnabled */
+                false, /* letterboxVerticalPosition */
+                -1, /* letterboxHorizontalPosition */ -1, /* availableWidth */
+                0, /* availableHeight */ 0, mCompatUIConfiguration, mTaskInfo);
         assertEquals(View.INVISIBLE, mMoveUpButton.getVisibility());
         assertEquals(View.INVISIBLE, mMoveDownButton.getVisibility());
         assertEquals(View.INVISIBLE, mMoveLeftButton.getVisibility());
         assertEquals(View.INVISIBLE, mMoveRightButton.getVisibility());
     }
+
+    @Test
+    public void handleVisibility_horizontalEducationEnableduiConfigurationIsUpdated() {
+        mLayout.handleVisibility(/* horizontalEnabled */ true, /* verticalEnabled */
+                false, /* letterboxVerticalPosition */ -1, /* letterboxHorizontalPosition */
+                1, /* availableWidth */ 500, /* availableHeight */ 0, mCompatUIConfiguration,
+                mTaskInfo);
+
+        verify(mCompatUIConfiguration).setUserHasSeenHorizontalReachabilityEducation(mTaskInfo);
+        verify(mCompatUIConfiguration, never()).setUserHasSeenVerticalReachabilityEducation(
+                mTaskInfo);
+    }
+
+    @Test
+    public void handleVisibility_verticalEducationEnabled_uiConfigurationIsUpdated() {
+        mLayout.handleVisibility(/* horizontalEnabled */ false, /* verticalEnabled */
+                true, /* letterboxVerticalPosition */ 0, /* letterboxHorizontalPosition */
+                -1, /* availableWidth */ 0, /* availableHeight */ 500, mCompatUIConfiguration,
+                mTaskInfo);
+
+        verify(mCompatUIConfiguration, never())
+                .setUserHasSeenHorizontalReachabilityEducation(mTaskInfo);
+        verify(mCompatUIConfiguration).setUserHasSeenVerticalReachabilityEducation(mTaskInfo);
+    }
 }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduWindowManagerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduWindowManagerTest.java
index 359ef97..5bcc72e 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduWindowManagerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/ReachabilityEduWindowManagerTest.java
@@ -80,9 +80,8 @@
     }
 
     private ReachabilityEduWindowManager createReachabilityEduWindowManager(TaskInfo taskInfo) {
-        return new ReachabilityEduWindowManager(mContext, taskInfo,
-                mSyncTransactionQueue, mCallback, mTaskListener, mDisplayLayout,
-                mCompatUIConfiguration, mExecutor);
+        return new ReachabilityEduWindowManager(mContext, taskInfo, mSyncTransactionQueue,
+                mTaskListener, mDisplayLayout, mCompatUIConfiguration, mExecutor);
     }
 
     private static TaskInfo createTaskInfo(int userId, boolean isLetterboxDoubleTapEnabled) {
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 4ccc467..c9bd695 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
@@ -81,7 +81,8 @@
     @Mock lateinit var syncQueue: SyncTransactionQueue
     @Mock lateinit var rootTaskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer
     @Mock lateinit var transitions: Transitions
-    @Mock lateinit var transitionHandler: EnterDesktopTaskTransitionHandler
+    @Mock lateinit var exitDesktopTransitionHandler: ExitDesktopTaskTransitionHandler
+    @Mock lateinit var enterDesktopTransitionHandler: EnterDesktopTaskTransitionHandler
 
     lateinit var mockitoSession: StaticMockitoSession
     lateinit var controller: DesktopTasksController
@@ -117,7 +118,8 @@
             syncQueue,
             rootTaskDisplayAreaOrganizer,
             transitions,
-            transitionHandler,
+            enterDesktopTransitionHandler,
+            exitDesktopTransitionHandler,
             desktopModeTaskRepository,
             TestShellExecutor()
         )
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java
new file mode 100644
index 0000000..2c5a5cd
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java
@@ -0,0 +1,151 @@
+/*
+ * 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.desktopmode;
+
+
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+
+import static androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.annotation.NonNull;
+import android.app.ActivityManager;
+import android.app.WindowConfiguration;
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.IBinder;
+import android.util.DisplayMetrics;
+import android.view.SurfaceControl;
+import android.view.WindowManager;
+import android.window.IWindowContainerToken;
+import android.window.TransitionInfo;
+import android.window.WindowContainerToken;
+import android.window.WindowContainerTransaction;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.wm.shell.ShellTestCase;
+import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.transition.Transitions;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.function.Supplier;
+
+/** Tests of {@link com.android.wm.shell.desktopmode.ExitDesktopTaskTransitionHandler} */
+@SmallTest
+public class ExitDesktopTaskTransitionHandlerTest extends ShellTestCase {
+
+    @Mock
+    private Transitions mTransitions;
+    @Mock
+    IBinder mToken;
+    @Mock
+    Supplier<SurfaceControl.Transaction> mTransactionFactory;
+    @Mock
+    Context mContext;
+    @Mock
+    DisplayMetrics mDisplayMetrics;
+    @Mock
+    Resources mResources;
+    @Mock
+    SurfaceControl.Transaction mStartT;
+    @Mock
+    SurfaceControl.Transaction mFinishT;
+    @Mock
+    SurfaceControl.Transaction mAnimationT;
+    @Mock
+    Transitions.TransitionFinishCallback mTransitionFinishCallback;
+    @Mock
+    ShellExecutor mExecutor;
+
+    private ExitDesktopTaskTransitionHandler mExitDesktopTaskTransitionHandler;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        doReturn(mExecutor).when(mTransitions).getMainExecutor();
+        doReturn(mAnimationT).when(mTransactionFactory).get();
+        doReturn(mResources).when(mContext).getResources();
+        doReturn(mDisplayMetrics).when(mResources).getDisplayMetrics();
+        when(mResources.getDisplayMetrics())
+                .thenReturn(getContext().getResources().getDisplayMetrics());
+
+        mExitDesktopTaskTransitionHandler = new ExitDesktopTaskTransitionHandler(mTransitions,
+                mContext);
+    }
+
+    @Test
+    public void testTransitExitDesktopModeAnimation() throws Throwable {
+        final int transitionType = Transitions.TRANSIT_EXIT_DESKTOP_MODE;
+        final int taskId = 1;
+        WindowContainerTransaction wct = new WindowContainerTransaction();
+        doReturn(mToken).when(mTransitions)
+                .startTransition(transitionType, wct, mExitDesktopTaskTransitionHandler);
+
+        mExitDesktopTaskTransitionHandler.startTransition(transitionType, wct);
+
+        TransitionInfo.Change change =
+                createChange(WindowManager.TRANSIT_CHANGE, taskId, WINDOWING_MODE_FULLSCREEN);
+        TransitionInfo info = createTransitionInfo(Transitions.TRANSIT_EXIT_DESKTOP_MODE, change);
+        ArrayList<Exception> exceptions = new ArrayList<>();
+        runOnUiThread(() -> {
+            try {
+                assertTrue(mExitDesktopTaskTransitionHandler
+                        .startAnimation(mToken, info, mStartT, mFinishT,
+                                mTransitionFinishCallback));
+            } catch (Exception e) {
+                exceptions.add(e);
+            }
+        });
+        if (!exceptions.isEmpty()) {
+            throw exceptions.get(0);
+        }
+    }
+
+    private TransitionInfo.Change createChange(@WindowManager.TransitionType int type, int taskId,
+            @WindowConfiguration.WindowingMode int windowingMode) {
+        final ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo();
+        taskInfo.taskId = taskId;
+        taskInfo.token = new WindowContainerToken(mock(IWindowContainerToken.class));
+        taskInfo.configuration.windowConfiguration.setWindowingMode(windowingMode);
+        SurfaceControl.Builder b = new SurfaceControl.Builder()
+                .setName("test task");
+        final TransitionInfo.Change change = new TransitionInfo.Change(
+                taskInfo.token, b.build());
+        change.setMode(type);
+        change.setTaskInfo(taskInfo);
+        return change;
+    }
+
+    private static TransitionInfo createTransitionInfo(
+            @WindowManager.TransitionType int type, @NonNull TransitionInfo.Change change) {
+        TransitionInfo info = new TransitionInfo(type, 0);
+        info.addChange(change);
+        return info;
+    }
+
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java
index 5b62a94..ada3455 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java
@@ -159,7 +159,7 @@
         mPipResizeGestureHandler.onPinchResize(upEvent);
 
         verify(mPipTaskOrganizer, times(1))
-                .scheduleAnimateResizePip(any(), any(), anyInt(), anyFloat(), any());
+                .scheduleAnimateResizePip(any(), any(), anyInt(), anyFloat(), any(), any());
 
         assertTrue("The new size should be bigger than the original PiP size.",
                 mPipResizeGestureHandler.getLastResizeBounds().width()
@@ -198,7 +198,7 @@
         mPipResizeGestureHandler.onPinchResize(upEvent);
 
         verify(mPipTaskOrganizer, times(1))
-                .scheduleAnimateResizePip(any(), any(), anyInt(), anyFloat(), any());
+                .scheduleAnimateResizePip(any(), any(), anyInt(), anyFloat(), any(), any());
 
         assertTrue("The new size should be smaller than the original PiP size.",
                 mPipResizeGestureHandler.getLastResizeBounds().width()
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/tv/TvPipMenuControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/tv/TvPipMenuControllerTest.java
index 7c6037c..3a08d32 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/tv/TvPipMenuControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/tv/TvPipMenuControllerTest.java
@@ -57,6 +57,8 @@
     private TvPipActionsProvider mMockActionsProvider;
     @Mock
     private TvPipMenuView mMockTvPipMenuView;
+    @Mock
+    private TvPipBackgroundView mMockTvPipBackgroundView;
 
     private TvPipMenuController mTvPipMenuController;
 
@@ -173,6 +175,7 @@
         assertMenuIsInAllActionsMode();
         verify(mMockDelegate, times(2)).onInMoveModeChanged();
         verify(mMockTvPipMenuView).transitionToMenuMode(eq(MODE_ALL_ACTIONS_MENU), eq(false));
+        verify(mMockTvPipBackgroundView, times(2)).transitionToMenuMode(eq(MODE_ALL_ACTIONS_MENU));
     }
 
     @Test
@@ -215,6 +218,7 @@
         assertMenuIsInAllActionsMode();
         verify(mMockDelegate, times(2)).onInMoveModeChanged();
         verify(mMockTvPipMenuView).transitionToMenuMode(eq(MODE_ALL_ACTIONS_MENU), eq(false));
+        verify(mMockTvPipBackgroundView, times(2)).transitionToMenuMode(eq(MODE_ALL_ACTIONS_MENU));
 
         pressBackAndAssertMenuClosed();
     }
@@ -262,12 +266,14 @@
         assertMenuIsInMoveMode();
         verify(mMockDelegate).onInMoveModeChanged();
         verify(mMockTvPipMenuView).transitionToMenuMode(eq(MODE_MOVE_MENU), eq(false));
+        verify(mMockTvPipBackgroundView).transitionToMenuMode(eq(MODE_MOVE_MENU));
     }
 
     private void showAndAssertAllActionsMenu() {
         mTvPipMenuController.showMenu();
         assertMenuIsInAllActionsMode();
         verify(mMockTvPipMenuView).transitionToMenuMode(eq(MODE_ALL_ACTIONS_MENU), eq(true));
+        verify(mMockTvPipBackgroundView).transitionToMenuMode(eq(MODE_ALL_ACTIONS_MENU));
     }
 
     private void closeMenuAndAssertMenuClosed() {
@@ -284,6 +290,7 @@
         assertMenuIsOpen(false);
         verify(mMockDelegate).onMenuClosed();
         verify(mMockTvPipMenuView).transitionToMenuMode(eq(MODE_NO_MENU), eq(false));
+        verify(mMockTvPipBackgroundView).transitionToMenuMode(eq(MODE_NO_MENU));
     }
 
     private void assertMenuIsOpen(boolean open) {
@@ -320,5 +327,10 @@
         TvPipMenuView createTvPipMenuView() {
             return mMockTvPipMenuView;
         }
+
+        @Override
+        TvPipBackgroundView createTvPipBackgroundView() {
+            return mMockTvPipBackgroundView;
+        }
     }
 }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java
index df78d92..a9f311f 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java
@@ -181,7 +181,7 @@
 
         IBinder transition = mSplitScreenTransitions.startEnterTransition(
                 TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(),
-                new RemoteTransition(testRemote), mStageCoordinator, null, null);
+                new RemoteTransition(testRemote, "Test"), mStageCoordinator, null, null);
         mMainStage.onTaskAppeared(mMainChild, createMockSurface());
         mSideStage.onTaskAppeared(mSideChild, createMockSurface());
         boolean accepted = mStageCoordinator.startAnimation(transition, info,
@@ -278,7 +278,7 @@
         // Make sure it cleans-up if recents doesn't restore
         WindowContainerTransaction commitWCT = new WindowContainerTransaction();
         mStageCoordinator.onRecentsInSplitAnimationFinish(commitWCT,
-                mock(SurfaceControl.Transaction.class));
+                mock(SurfaceControl.Transaction.class), mock(TransitionInfo.class));
         assertFalse(mStageCoordinator.isSplitScreenVisible());
     }
 
@@ -317,7 +317,7 @@
         mMainStage.onTaskAppeared(mMainChild, mock(SurfaceControl.class));
         mSideStage.onTaskAppeared(mSideChild, mock(SurfaceControl.class));
         mStageCoordinator.onRecentsInSplitAnimationFinish(restoreWCT,
-                mock(SurfaceControl.Transaction.class));
+                mock(SurfaceControl.Transaction.class), mock(TransitionInfo.class));
         assertTrue(mStageCoordinator.isSplitScreenVisible());
     }
 
@@ -407,7 +407,8 @@
         TransitionInfo enterInfo = createEnterPairInfo();
         IBinder enterTransit = mSplitScreenTransitions.startEnterTransition(
                 TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(),
-                new RemoteTransition(new TestRemoteTransition()), mStageCoordinator, null, null);
+                new RemoteTransition(new TestRemoteTransition(), "Test"),
+                mStageCoordinator, null, null);
         mMainStage.onTaskAppeared(mMainChild, createMockSurface());
         mSideStage.onTaskAppeared(mSideChild, createMockSurface());
         mStageCoordinator.startAnimation(enterTransit, enterInfo,
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java
index 1a1bebd..784ad9b 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java
@@ -126,12 +126,6 @@
         verify(mCallbacks).onStatusChanged(eq(mRootTask.isVisible), eq(true));
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void testUnknownTaskVanished() {
-        final ActivityManager.RunningTaskInfo task = new TestRunningTaskInfoBuilder().build();
-        mStageTaskListener.onTaskVanished(task);
-    }
-
     @Test
     public void testTaskVanished() {
         // With shell transitions, the transition manages status changes, so skip this test.
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TaskViewTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/taskview/TaskViewTest.java
similarity index 99%
rename from libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TaskViewTest.java
rename to libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/taskview/TaskViewTest.java
index 62bfd17..b6d7ff3 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TaskViewTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/taskview/TaskViewTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.wm.shell;
+package com.android.wm.shell.taskview;
 
 import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
 
@@ -53,6 +53,8 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.wm.shell.ShellTaskOrganizer;
+import com.android.wm.shell.ShellTestCase;
 import com.android.wm.shell.common.HandlerExecutor;
 import com.android.wm.shell.common.SyncTransactionQueue;
 import com.android.wm.shell.common.SyncTransactionQueue.TransactionRunnable;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
index 60d6978..5cd548b 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
@@ -277,7 +277,7 @@
         IBinder transitToken = new Binder();
         transitions.requestStartTransition(transitToken,
                 new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */,
-                        new RemoteTransition(testRemote)));
+                        new RemoteTransition(testRemote, "Test")));
         verify(mOrganizer, times(1)).startTransition(eq(transitToken), any());
         TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN)
                 .addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
@@ -422,7 +422,7 @@
                 new TransitionFilter.Requirement[]{new TransitionFilter.Requirement()};
         filter.mRequirements[0].mModes = new int[]{TRANSIT_OPEN, TRANSIT_TO_FRONT};
 
-        transitions.registerRemote(filter, new RemoteTransition(testRemote));
+        transitions.registerRemote(filter, new RemoteTransition(testRemote, "Test"));
         mMainExecutor.flushAll();
 
         IBinder transitToken = new Binder();
@@ -466,11 +466,12 @@
         final int transitType = TRANSIT_FIRST_CUSTOM + 1;
 
         OneShotRemoteHandler oneShot = new OneShotRemoteHandler(mMainExecutor,
-                new RemoteTransition(testRemote));
+                new RemoteTransition(testRemote, "Test"));
         // Verify that it responds to the remote but not other things.
         IBinder transitToken = new Binder();
         assertNotNull(oneShot.handleRequest(transitToken,
-                new TransitionRequestInfo(transitType, null, new RemoteTransition(testRemote))));
+                new TransitionRequestInfo(transitType, null,
+                        new RemoteTransition(testRemote, "Test"))));
         assertNull(oneShot.handleRequest(transitToken,
                 new TransitionRequestInfo(transitType, null, null)));
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java
index c92d2f3..dfa3c10 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java
@@ -583,7 +583,7 @@
             int cornerRadius = loadDimensionPixelSize(resources, mCaptionMenuCornerRadiusId);
             String name = "Test Window";
             WindowDecoration.AdditionalWindow additionalWindow =
-                    addWindow(R.layout.desktop_mode_decor_handle_menu, name,
+                    addWindow(R.layout.desktop_mode_window_decor_handle_menu_app_info_pill, name,
                             mMockSurfaceControlAddWindowT,
                             x - mRelayoutResult.mDecorContainerOffsetX,
                             y - mRelayoutResult.mDecorContainerOffsetY,
diff --git a/libs/dream/lowlight/Android.bp b/libs/dream/lowlight/Android.bp
index 5b5b0f0..e4d2e02 100644
--- a/libs/dream/lowlight/Android.bp
+++ b/libs/dream/lowlight/Android.bp
@@ -25,6 +25,7 @@
     name: "low_light_dream_lib-sources",
     srcs: [
         "src/**/*.java",
+        "src/**/*.kt",
     ],
     path: "src",
 }
@@ -37,10 +38,15 @@
     resource_dirs: [
         "res",
     ],
+    libs: [
+        "kotlin-annotations",
+    ],
     static_libs: [
         "androidx.arch.core_core-runtime",
         "dagger2",
         "jsr330",
+        "kotlinx-coroutines-android",
+        "kotlinx-coroutines-core",
     ],
     manifest: "AndroidManifest.xml",
     plugins: ["dagger2-compiler"],
diff --git a/libs/dream/lowlight/res/values/config.xml b/libs/dream/lowlight/res/values/config.xml
index 70fe073..78fefbf 100644
--- a/libs/dream/lowlight/res/values/config.xml
+++ b/libs/dream/lowlight/res/values/config.xml
@@ -17,4 +17,7 @@
 <resources>
     <!-- The dream component used when the device is low light environment. -->
     <string translatable="false" name="config_lowLightDreamComponent"/>
+    <!-- The max number of milliseconds to wait for the low light transition before setting
+    the system dream component -->
+    <integer name="config_lowLightTransitionTimeoutMs">2000</integer>
 </resources>
diff --git a/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightDreamManager.java b/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightDreamManager.java
deleted file mode 100644
index 3125f08..0000000
--- a/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightDreamManager.java
+++ /dev/null
@@ -1,122 +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.dream.lowlight;
-
-import static com.android.dream.lowlight.dagger.LowLightDreamModule.LOW_LIGHT_DREAM_COMPONENT;
-
-import android.annotation.IntDef;
-import android.annotation.RequiresPermission;
-import android.app.DreamManager;
-import android.content.ComponentName;
-import android.util.Log;
-
-import androidx.annotation.Nullable;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-/**
- * Maintains the ambient light mode of the environment the device is in, and sets a low light dream
- * component, if present, as the system dream when the ambient light mode is low light.
- *
- * @hide
- */
-public final class LowLightDreamManager {
-    private static final String TAG = "LowLightDreamManager";
-    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
-    /**
-     * @hide
-     */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = { "AMBIENT_LIGHT_MODE_" }, value = {
-            AMBIENT_LIGHT_MODE_UNKNOWN,
-            AMBIENT_LIGHT_MODE_REGULAR,
-            AMBIENT_LIGHT_MODE_LOW_LIGHT
-    })
-    public @interface AmbientLightMode {}
-
-    /**
-     * Constant for ambient light mode being unknown.
-     * @hide
-     */
-    public static final int AMBIENT_LIGHT_MODE_UNKNOWN = 0;
-
-    /**
-     * Constant for ambient light mode being regular / bright.
-     * @hide
-     */
-    public static final int AMBIENT_LIGHT_MODE_REGULAR = 1;
-
-    /**
-     * Constant for ambient light mode being low light / dim.
-     * @hide
-     */
-    public static final int AMBIENT_LIGHT_MODE_LOW_LIGHT = 2;
-
-    private final DreamManager mDreamManager;
-    private final LowLightTransitionCoordinator mLowLightTransitionCoordinator;
-
-    @Nullable
-    private final ComponentName mLowLightDreamComponent;
-
-    private int mAmbientLightMode = AMBIENT_LIGHT_MODE_UNKNOWN;
-
-    @Inject
-    public LowLightDreamManager(
-            DreamManager dreamManager,
-            LowLightTransitionCoordinator lowLightTransitionCoordinator,
-            @Named(LOW_LIGHT_DREAM_COMPONENT) @Nullable ComponentName lowLightDreamComponent) {
-        mDreamManager = dreamManager;
-        mLowLightTransitionCoordinator = lowLightTransitionCoordinator;
-        mLowLightDreamComponent = lowLightDreamComponent;
-    }
-
-    /**
-     * Sets the current ambient light mode.
-     * @hide
-     */
-    @RequiresPermission(android.Manifest.permission.WRITE_DREAM_STATE)
-    public void setAmbientLightMode(@AmbientLightMode int ambientLightMode) {
-        if (mLowLightDreamComponent == null) {
-            if (DEBUG) {
-                Log.d(TAG, "ignore ambient light mode change because low light dream component "
-                        + "is empty");
-            }
-            return;
-        }
-
-        if (mAmbientLightMode == ambientLightMode) {
-            return;
-        }
-
-        if (DEBUG) {
-            Log.d(TAG, "ambient light mode changed from " + mAmbientLightMode + " to "
-                    + ambientLightMode);
-        }
-
-        mAmbientLightMode = ambientLightMode;
-
-        boolean shouldEnterLowLight = mAmbientLightMode == AMBIENT_LIGHT_MODE_LOW_LIGHT;
-        mLowLightTransitionCoordinator.notifyBeforeLowLightTransition(shouldEnterLowLight,
-                () -> mDreamManager.setSystemDreamComponent(
-                        shouldEnterLowLight ? mLowLightDreamComponent : null));
-    }
-}
diff --git a/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightDreamManager.kt b/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightDreamManager.kt
new file mode 100644
index 0000000..96bfb78
--- /dev/null
+++ b/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightDreamManager.kt
@@ -0,0 +1,138 @@
+/*
+ * 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.dream.lowlight
+
+import android.Manifest
+import android.annotation.IntDef
+import android.annotation.RequiresPermission
+import android.app.DreamManager
+import android.content.ComponentName
+import android.util.Log
+import com.android.dream.lowlight.dagger.LowLightDreamModule
+import com.android.dream.lowlight.dagger.qualifiers.Application
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.TimeoutCancellationException
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+import javax.inject.Named
+import kotlin.time.DurationUnit
+import kotlin.time.toDuration
+
+/**
+ * Maintains the ambient light mode of the environment the device is in, and sets a low light dream
+ * component, if present, as the system dream when the ambient light mode is low light.
+ *
+ * @hide
+ */
+class LowLightDreamManager @Inject constructor(
+    @Application private val coroutineScope: CoroutineScope,
+    private val dreamManager: DreamManager,
+    private val lowLightTransitionCoordinator: LowLightTransitionCoordinator,
+    @param:Named(LowLightDreamModule.LOW_LIGHT_DREAM_COMPONENT)
+    private val lowLightDreamComponent: ComponentName?,
+    @param:Named(LowLightDreamModule.LOW_LIGHT_TRANSITION_TIMEOUT_MS)
+    private val lowLightTransitionTimeoutMs: Long
+) {
+    /**
+     * @hide
+     */
+    @Retention(AnnotationRetention.SOURCE)
+    @IntDef(
+        prefix = ["AMBIENT_LIGHT_MODE_"],
+        value = [
+            AMBIENT_LIGHT_MODE_UNKNOWN,
+            AMBIENT_LIGHT_MODE_REGULAR,
+            AMBIENT_LIGHT_MODE_LOW_LIGHT
+        ]
+    )
+    annotation class AmbientLightMode
+
+    private var mTransitionJob: Job? = null
+    private var mAmbientLightMode = AMBIENT_LIGHT_MODE_UNKNOWN
+    private val mLowLightTransitionTimeout =
+        lowLightTransitionTimeoutMs.toDuration(DurationUnit.MILLISECONDS)
+
+    /**
+     * Sets the current ambient light mode.
+     *
+     * @hide
+     */
+    @RequiresPermission(Manifest.permission.WRITE_DREAM_STATE)
+    fun setAmbientLightMode(@AmbientLightMode ambientLightMode: Int) {
+        if (lowLightDreamComponent == null) {
+            if (DEBUG) {
+                Log.d(
+                    TAG,
+                    "ignore ambient light mode change because low light dream component is empty"
+                )
+            }
+            return
+        }
+        if (mAmbientLightMode == ambientLightMode) {
+            return
+        }
+        if (DEBUG) {
+            Log.d(
+                TAG, "ambient light mode changed from $mAmbientLightMode to $ambientLightMode"
+            )
+        }
+        mAmbientLightMode = ambientLightMode
+        val shouldEnterLowLight = mAmbientLightMode == AMBIENT_LIGHT_MODE_LOW_LIGHT
+
+        // Cancel any previous transitions
+        mTransitionJob?.cancel()
+        mTransitionJob = coroutineScope.launch {
+            try {
+                lowLightTransitionCoordinator.waitForLowLightTransitionAnimation(
+                    timeout = mLowLightTransitionTimeout,
+                    entering = shouldEnterLowLight
+                )
+            } catch (ex: TimeoutCancellationException) {
+                Log.e(TAG, "timed out while waiting for low light animation", ex)
+            }
+            dreamManager.setSystemDreamComponent(
+                if (shouldEnterLowLight) lowLightDreamComponent else null
+            )
+        }
+    }
+
+    companion object {
+        private const val TAG = "LowLightDreamManager"
+        private val DEBUG = Log.isLoggable(TAG, Log.DEBUG)
+
+        /**
+         * Constant for ambient light mode being unknown.
+         *
+         * @hide
+         */
+        const val AMBIENT_LIGHT_MODE_UNKNOWN = 0
+
+        /**
+         * Constant for ambient light mode being regular / bright.
+         *
+         * @hide
+         */
+        const val AMBIENT_LIGHT_MODE_REGULAR = 1
+
+        /**
+         * Constant for ambient light mode being low light / dim.
+         *
+         * @hide
+         */
+        const val AMBIENT_LIGHT_MODE_LOW_LIGHT = 2
+    }
+}
diff --git a/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightTransitionCoordinator.java b/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightTransitionCoordinator.java
deleted file mode 100644
index 874a2d5..0000000
--- a/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightTransitionCoordinator.java
+++ /dev/null
@@ -1,111 +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.dream.lowlight;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.annotation.Nullable;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/**
- * Helper class that allows listening and running animations before entering or exiting low light.
- */
-@Singleton
-public class LowLightTransitionCoordinator {
-    /**
-     * Listener that is notified before low light entry.
-     */
-    public interface LowLightEnterListener {
-        /**
-         * Callback that is notified before the device enters low light.
-         *
-         * @return an optional animator that will be waited upon before entering low light.
-         */
-        Animator onBeforeEnterLowLight();
-    }
-
-    /**
-     * Listener that is notified before low light exit.
-     */
-    public interface LowLightExitListener {
-        /**
-         * Callback that is notified before the device exits low light.
-         *
-         * @return an optional animator that will be waited upon before exiting low light.
-         */
-        Animator onBeforeExitLowLight();
-    }
-
-    private LowLightEnterListener mLowLightEnterListener;
-    private LowLightExitListener mLowLightExitListener;
-
-    @Inject
-    public LowLightTransitionCoordinator() {
-    }
-
-    /**
-     * Sets the listener for the low light enter event.
-     *
-     * Only one listener can be set at a time. This method will overwrite any previously set
-     * listener. Null can be used to unset the listener.
-     */
-    public void setLowLightEnterListener(@Nullable LowLightEnterListener lowLightEnterListener) {
-        mLowLightEnterListener = lowLightEnterListener;
-    }
-
-    /**
-     * Sets the listener for the low light exit event.
-     *
-     * Only one listener can be set at a time. This method will overwrite any previously set
-     * listener. Null can be used to unset the listener.
-     */
-    public void setLowLightExitListener(@Nullable LowLightExitListener lowLightExitListener) {
-        mLowLightExitListener = lowLightExitListener;
-    }
-
-    /**
-     * Notifies listeners that the device is about to enter or exit low light.
-     *
-     * @param entering true if listeners should be notified before entering low light, false if this
-     *                 is notifying before exiting.
-     * @param callback callback that will be run after listeners complete.
-     */
-    void notifyBeforeLowLightTransition(boolean entering, Runnable callback) {
-        Animator animator = null;
-
-        if (entering && mLowLightEnterListener != null) {
-            animator = mLowLightEnterListener.onBeforeEnterLowLight();
-        } else if (!entering && mLowLightExitListener != null) {
-            animator = mLowLightExitListener.onBeforeExitLowLight();
-        }
-
-        // If the listener returned an animator to indicate it was running an animation, run the
-        // callback after the animation completes, otherwise call the callback directly.
-        if (animator != null) {
-            animator.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animator animator) {
-                    callback.run();
-                }
-            });
-        } else {
-            callback.run();
-        }
-    }
-}
diff --git a/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightTransitionCoordinator.kt b/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightTransitionCoordinator.kt
new file mode 100644
index 0000000..26efb55
--- /dev/null
+++ b/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightTransitionCoordinator.kt
@@ -0,0 +1,118 @@
+/*
+ * 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.dream.lowlight
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import com.android.dream.lowlight.util.suspendCoroutineWithTimeout
+import javax.inject.Inject
+import javax.inject.Singleton
+import kotlin.coroutines.resume
+import kotlin.time.Duration
+
+/**
+ * Helper class that allows listening and running animations before entering or exiting low light.
+ */
+@Singleton
+class LowLightTransitionCoordinator @Inject constructor() {
+    /**
+     * Listener that is notified before low light entry.
+     */
+    interface LowLightEnterListener {
+        /**
+         * Callback that is notified before the device enters low light.
+         *
+         * @return an optional animator that will be waited upon before entering low light.
+         */
+        fun onBeforeEnterLowLight(): Animator?
+    }
+
+    /**
+     * Listener that is notified before low light exit.
+     */
+    interface LowLightExitListener {
+        /**
+         * Callback that is notified before the device exits low light.
+         *
+         * @return an optional animator that will be waited upon before exiting low light.
+         */
+        fun onBeforeExitLowLight(): Animator?
+    }
+
+    private var mLowLightEnterListener: LowLightEnterListener? = null
+    private var mLowLightExitListener: LowLightExitListener? = null
+
+    /**
+     * Sets the listener for the low light enter event.
+     *
+     * Only one listener can be set at a time. This method will overwrite any previously set
+     * listener. Null can be used to unset the listener.
+     */
+    fun setLowLightEnterListener(lowLightEnterListener: LowLightEnterListener?) {
+        mLowLightEnterListener = lowLightEnterListener
+    }
+
+    /**
+     * Sets the listener for the low light exit event.
+     *
+     * Only one listener can be set at a time. This method will overwrite any previously set
+     * listener. Null can be used to unset the listener.
+     */
+    fun setLowLightExitListener(lowLightExitListener: LowLightExitListener?) {
+        mLowLightExitListener = lowLightExitListener
+    }
+
+    /**
+     * Notifies listeners that the device is about to enter or exit low light, and waits for the
+     * animation to complete. If this function is cancelled, the animation is also cancelled.
+     *
+     * @param timeout the maximum duration to wait for the transition animation. If the animation
+     * does not complete within this time period, a
+     * @param entering true if listeners should be notified before entering low light, false if this
+     * is notifying before exiting.
+     */
+    suspend fun waitForLowLightTransitionAnimation(timeout: Duration, entering: Boolean) =
+        suspendCoroutineWithTimeout(timeout) { continuation ->
+            var animator: Animator? = null
+            if (entering && mLowLightEnterListener != null) {
+                animator = mLowLightEnterListener!!.onBeforeEnterLowLight()
+            } else if (!entering && mLowLightExitListener != null) {
+                animator = mLowLightExitListener!!.onBeforeExitLowLight()
+            }
+
+            if (animator == null) {
+                continuation.resume(Unit)
+                return@suspendCoroutineWithTimeout
+            }
+
+            // If the listener returned an animator to indicate it was running an animation, run the
+            // callback after the animation completes, otherwise call the callback directly.
+            val listener = object : AnimatorListenerAdapter() {
+                override fun onAnimationEnd(animator: Animator) {
+                    continuation.resume(Unit)
+                }
+
+                override fun onAnimationCancel(animation: Animator) {
+                    continuation.cancel()
+                }
+            }
+            animator.addListener(listener)
+            continuation.invokeOnCancellation {
+                animator.removeListener(listener)
+                animator.cancel()
+            }
+        }
+}
diff --git a/libs/dream/lowlight/src/com/android/dream/lowlight/dagger/LowLightDreamModule.java b/libs/dream/lowlight/src/com/android/dream/lowlight/dagger/LowLightDreamModule.java
deleted file mode 100644
index c183a04..0000000
--- a/libs/dream/lowlight/src/com/android/dream/lowlight/dagger/LowLightDreamModule.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.dream.lowlight.dagger;
-
-import android.app.DreamManager;
-import android.content.ComponentName;
-import android.content.Context;
-
-import androidx.annotation.Nullable;
-
-import com.android.dream.lowlight.R;
-
-import javax.inject.Named;
-
-import dagger.Module;
-import dagger.Provides;
-
-/**
- * Dagger module for low light dream.
- *
- * @hide
- */
-@Module
-public interface LowLightDreamModule {
-    String LOW_LIGHT_DREAM_COMPONENT = "low_light_dream_component";
-
-    /**
-     * Provides dream manager.
-     */
-    @Provides
-    static DreamManager providesDreamManager(Context context) {
-        return context.getSystemService(DreamManager.class);
-    }
-
-    /**
-     * Provides the component name of the low light dream, or null if not configured.
-     */
-    @Provides
-    @Named(LOW_LIGHT_DREAM_COMPONENT)
-    @Nullable
-    static ComponentName providesLowLightDreamComponent(Context context) {
-        final String lowLightDreamComponent = context.getResources().getString(
-                R.string.config_lowLightDreamComponent);
-        return lowLightDreamComponent.isEmpty() ? null
-                : ComponentName.unflattenFromString(lowLightDreamComponent);
-    }
-}
diff --git a/libs/dream/lowlight/src/com/android/dream/lowlight/dagger/LowLightDreamModule.kt b/libs/dream/lowlight/src/com/android/dream/lowlight/dagger/LowLightDreamModule.kt
new file mode 100644
index 0000000..dd274bd
--- /dev/null
+++ b/libs/dream/lowlight/src/com/android/dream/lowlight/dagger/LowLightDreamModule.kt
@@ -0,0 +1,82 @@
+/*
+ * 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.dream.lowlight.dagger
+
+import android.app.DreamManager
+import android.content.ComponentName
+import android.content.Context
+import com.android.dream.lowlight.R
+import com.android.dream.lowlight.dagger.qualifiers.Application
+import com.android.dream.lowlight.dagger.qualifiers.Main
+import dagger.Module
+import dagger.Provides
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import javax.inject.Named
+
+/**
+ * Dagger module for low light dream.
+ *
+ * @hide
+ */
+@Module
+object LowLightDreamModule {
+    /**
+     * Provides dream manager.
+     */
+    @Provides
+    fun providesDreamManager(context: Context): DreamManager {
+        return requireNotNull(context.getSystemService(DreamManager::class.java))
+    }
+
+    /**
+     * Provides the component name of the low light dream, or null if not configured.
+     */
+    @Provides
+    @Named(LOW_LIGHT_DREAM_COMPONENT)
+    fun providesLowLightDreamComponent(context: Context): ComponentName? {
+        val lowLightDreamComponent = context.resources.getString(
+            R.string.config_lowLightDreamComponent
+        )
+        return if (lowLightDreamComponent.isEmpty()) {
+            null
+        } else {
+            ComponentName.unflattenFromString(lowLightDreamComponent)
+        }
+    }
+
+    @Provides
+    @Named(LOW_LIGHT_TRANSITION_TIMEOUT_MS)
+    fun providesLowLightTransitionTimeout(context: Context): Long {
+        return context.resources.getInteger(R.integer.config_lowLightTransitionTimeoutMs).toLong()
+    }
+
+    @Provides
+    @Main
+    fun providesMainDispatcher(): CoroutineDispatcher {
+        return Dispatchers.Main.immediate
+    }
+
+    @Provides
+    @Application
+    fun providesApplicationScope(@Main dispatcher: CoroutineDispatcher): CoroutineScope {
+        return CoroutineScope(dispatcher)
+    }
+
+    const val LOW_LIGHT_DREAM_COMPONENT = "low_light_dream_component"
+    const val LOW_LIGHT_TRANSITION_TIMEOUT_MS = "low_light_transition_timeout"
+}
diff --git a/libs/dream/lowlight/src/com/android/dream/lowlight/dagger/qualifiers/Application.kt b/libs/dream/lowlight/src/com/android/dream/lowlight/dagger/qualifiers/Application.kt
new file mode 100644
index 0000000..541fe40
--- /dev/null
+++ b/libs/dream/lowlight/src/com/android/dream/lowlight/dagger/qualifiers/Application.kt
@@ -0,0 +1,9 @@
+package com.android.dream.lowlight.dagger.qualifiers
+
+import android.content.Context
+import javax.inject.Qualifier
+
+/**
+ * Used to qualify a context as [Context.getApplicationContext]
+ */
+@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class Application
diff --git a/libs/dream/lowlight/src/com/android/dream/lowlight/dagger/qualifiers/Main.kt b/libs/dream/lowlight/src/com/android/dream/lowlight/dagger/qualifiers/Main.kt
new file mode 100644
index 0000000..ccd0710
--- /dev/null
+++ b/libs/dream/lowlight/src/com/android/dream/lowlight/dagger/qualifiers/Main.kt
@@ -0,0 +1,8 @@
+package com.android.dream.lowlight.dagger.qualifiers
+
+import javax.inject.Qualifier
+
+/**
+ * Used to qualify code running on the main thread.
+ */
+@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class Main
diff --git a/libs/dream/lowlight/src/com/android/dream/lowlight/util/KotlinUtils.kt b/libs/dream/lowlight/src/com/android/dream/lowlight/util/KotlinUtils.kt
new file mode 100644
index 0000000..ff675cc
--- /dev/null
+++ b/libs/dream/lowlight/src/com/android/dream/lowlight/util/KotlinUtils.kt
@@ -0,0 +1,29 @@
+/*
+ * 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.dream.lowlight.util
+
+import kotlinx.coroutines.CancellableContinuation
+import kotlinx.coroutines.suspendCancellableCoroutine
+import kotlinx.coroutines.withTimeout
+import kotlin.time.Duration
+
+suspend inline fun <T> suspendCoroutineWithTimeout(
+    timeout: Duration,
+    crossinline block: (CancellableContinuation<T>) -> Unit
+) = withTimeout(timeout) {
+    suspendCancellableCoroutine(block = block)
+}
diff --git a/libs/dream/lowlight/tests/Android.bp b/libs/dream/lowlight/tests/Android.bp
index bd6f05e..2d79090 100644
--- a/libs/dream/lowlight/tests/Android.bp
+++ b/libs/dream/lowlight/tests/Android.bp
@@ -20,6 +20,7 @@
     name: "LowLightDreamTests",
     srcs: [
         "**/*.java",
+        "**/*.kt",
     ],
     static_libs: [
         "LowLightDreamLib",
@@ -28,6 +29,7 @@
         "androidx.test.ext.junit",
         "frameworks-base-testutils",
         "junit",
+        "kotlinx_coroutines_test",
         "mockito-target-extended-minus-junit4",
         "platform-test-annotations",
         "testables",
diff --git a/libs/dream/lowlight/tests/src/com.android.dream.lowlight/LowLightDreamManagerTest.java b/libs/dream/lowlight/tests/src/com.android.dream.lowlight/LowLightDreamManagerTest.java
deleted file mode 100644
index 4b95d8c..0000000
--- a/libs/dream/lowlight/tests/src/com.android.dream.lowlight/LowLightDreamManagerTest.java
+++ /dev/null
@@ -1,109 +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.dream.lowlight;
-
-import static com.android.dream.lowlight.LowLightDreamManager.AMBIENT_LIGHT_MODE_LOW_LIGHT;
-import static com.android.dream.lowlight.LowLightDreamManager.AMBIENT_LIGHT_MODE_REGULAR;
-import static com.android.dream.lowlight.LowLightDreamManager.AMBIENT_LIGHT_MODE_UNKNOWN;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.clearInvocations;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-import android.app.DreamManager;
-import android.content.ComponentName;
-import android.testing.AndroidTestingRunner;
-
-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;
-
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
-public class LowLightDreamManagerTest {
-    @Mock
-    private DreamManager mDreamManager;
-
-    @Mock
-    private LowLightTransitionCoordinator mTransitionCoordinator;
-
-    @Mock
-    private ComponentName mDreamComponent;
-
-    LowLightDreamManager mLowLightDreamManager;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        // Automatically run any provided Runnable to mTransitionCoordinator to simplify testing.
-        doAnswer(invocation -> {
-            ((Runnable) invocation.getArgument(1)).run();
-            return null;
-        }).when(mTransitionCoordinator).notifyBeforeLowLightTransition(anyBoolean(),
-                any(Runnable.class));
-
-        mLowLightDreamManager = new LowLightDreamManager(mDreamManager, mTransitionCoordinator,
-                mDreamComponent);
-    }
-
-    @Test
-    public void setAmbientLightMode_lowLight_setSystemDream() {
-        mLowLightDreamManager.setAmbientLightMode(AMBIENT_LIGHT_MODE_LOW_LIGHT);
-
-        verify(mTransitionCoordinator).notifyBeforeLowLightTransition(eq(true), any());
-        verify(mDreamManager).setSystemDreamComponent(mDreamComponent);
-    }
-
-    @Test
-    public void setAmbientLightMode_regularLight_clearSystemDream() {
-        mLowLightDreamManager.setAmbientLightMode(AMBIENT_LIGHT_MODE_REGULAR);
-
-        verify(mTransitionCoordinator).notifyBeforeLowLightTransition(eq(false), any());
-        verify(mDreamManager).setSystemDreamComponent(null);
-    }
-
-    @Test
-    public void setAmbientLightMode_defaultUnknownMode_clearSystemDream() {
-        // Set to low light first.
-        mLowLightDreamManager.setAmbientLightMode(AMBIENT_LIGHT_MODE_LOW_LIGHT);
-        clearInvocations(mDreamManager);
-
-        // Return to default unknown mode.
-        mLowLightDreamManager.setAmbientLightMode(AMBIENT_LIGHT_MODE_UNKNOWN);
-
-        verify(mDreamManager).setSystemDreamComponent(null);
-    }
-
-    @Test
-    public void setAmbientLightMode_dreamComponentNotSet_doNothing() {
-        final LowLightDreamManager lowLightDreamManager = new LowLightDreamManager(mDreamManager,
-                mTransitionCoordinator, null /*dream component*/);
-
-        lowLightDreamManager.setAmbientLightMode(AMBIENT_LIGHT_MODE_LOW_LIGHT);
-
-        verify(mDreamManager, never()).setSystemDreamComponent(any());
-    }
-}
diff --git a/libs/dream/lowlight/tests/src/com.android.dream.lowlight/LowLightDreamManagerTest.kt b/libs/dream/lowlight/tests/src/com.android.dream.lowlight/LowLightDreamManagerTest.kt
new file mode 100644
index 0000000..2a886bc
--- /dev/null
+++ b/libs/dream/lowlight/tests/src/com.android.dream.lowlight/LowLightDreamManagerTest.kt
@@ -0,0 +1,169 @@
+/*
+ * 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.dream.lowlight
+
+import android.animation.Animator
+import android.app.DreamManager
+import android.content.ComponentName
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.advanceTimeBy
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.clearInvocations
+import org.mockito.Mockito.never
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+import src.com.android.dream.lowlight.utils.any
+import src.com.android.dream.lowlight.utils.withArgCaptor
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class LowLightDreamManagerTest {
+    @Mock
+    private lateinit var mDreamManager: DreamManager
+    @Mock
+    private lateinit var mEnterAnimator: Animator
+    @Mock
+    private lateinit var mExitAnimator: Animator
+
+    private lateinit var mTransitionCoordinator: LowLightTransitionCoordinator
+    private lateinit var mLowLightDreamManager: LowLightDreamManager
+    private lateinit var testScope: TestScope
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        testScope = TestScope(StandardTestDispatcher())
+
+        mTransitionCoordinator = LowLightTransitionCoordinator()
+        mTransitionCoordinator.setLowLightEnterListener(
+            object : LowLightTransitionCoordinator.LowLightEnterListener {
+                override fun onBeforeEnterLowLight() = mEnterAnimator
+            })
+        mTransitionCoordinator.setLowLightExitListener(
+            object : LowLightTransitionCoordinator.LowLightExitListener {
+                override fun onBeforeExitLowLight() = mExitAnimator
+            })
+
+        mLowLightDreamManager = LowLightDreamManager(
+            coroutineScope = testScope,
+            dreamManager = mDreamManager,
+            lowLightTransitionCoordinator = mTransitionCoordinator,
+            lowLightDreamComponent = DREAM_COMPONENT,
+            lowLightTransitionTimeoutMs = LOW_LIGHT_TIMEOUT_MS
+        )
+    }
+
+    @Test
+    fun setAmbientLightMode_lowLight_setSystemDream() = testScope.runTest {
+        mLowLightDreamManager.setAmbientLightMode(LowLightDreamManager.AMBIENT_LIGHT_MODE_LOW_LIGHT)
+        runCurrent()
+        verify(mDreamManager, never()).setSystemDreamComponent(DREAM_COMPONENT)
+        completeEnterAnimations()
+        runCurrent()
+        verify(mDreamManager).setSystemDreamComponent(DREAM_COMPONENT)
+    }
+
+    @Test
+    fun setAmbientLightMode_regularLight_clearSystemDream() = testScope.runTest {
+        mLowLightDreamManager.setAmbientLightMode(LowLightDreamManager.AMBIENT_LIGHT_MODE_REGULAR)
+        runCurrent()
+        verify(mDreamManager, never()).setSystemDreamComponent(null)
+        completeExitAnimations()
+        runCurrent()
+        verify(mDreamManager).setSystemDreamComponent(null)
+    }
+
+    @Test
+    fun setAmbientLightMode_defaultUnknownMode_clearSystemDream() = testScope.runTest {
+        // Set to low light first.
+        mLowLightDreamManager.setAmbientLightMode(LowLightDreamManager.AMBIENT_LIGHT_MODE_LOW_LIGHT)
+        runCurrent()
+        completeEnterAnimations()
+        runCurrent()
+        verify(mDreamManager).setSystemDreamComponent(DREAM_COMPONENT)
+        clearInvocations(mDreamManager)
+
+        // Return to default unknown mode.
+        mLowLightDreamManager.setAmbientLightMode(LowLightDreamManager.AMBIENT_LIGHT_MODE_UNKNOWN)
+        runCurrent()
+        completeExitAnimations()
+        runCurrent()
+        verify(mDreamManager).setSystemDreamComponent(null)
+    }
+
+    @Test
+    fun setAmbientLightMode_dreamComponentNotSet_doNothing() = testScope.runTest {
+        val lowLightDreamManager = LowLightDreamManager(
+            coroutineScope = testScope,
+            dreamManager = mDreamManager,
+            lowLightTransitionCoordinator = mTransitionCoordinator,
+            lowLightDreamComponent = null,
+            lowLightTransitionTimeoutMs = LOW_LIGHT_TIMEOUT_MS
+        )
+        lowLightDreamManager.setAmbientLightMode(LowLightDreamManager.AMBIENT_LIGHT_MODE_LOW_LIGHT)
+        runCurrent()
+        verify(mEnterAnimator, never()).addListener(any())
+        verify(mDreamManager, never()).setSystemDreamComponent(any())
+    }
+
+    @Test
+    fun setAmbientLightMode_multipleTimesBeforeAnimationEnds_cancelsPrevious() = testScope.runTest {
+        mLowLightDreamManager.setAmbientLightMode(LowLightDreamManager.AMBIENT_LIGHT_MODE_LOW_LIGHT)
+        runCurrent()
+        // If we reset the light mode back to regular before the previous animation finishes, it
+        // should be ignored.
+        mLowLightDreamManager.setAmbientLightMode(LowLightDreamManager.AMBIENT_LIGHT_MODE_REGULAR)
+        runCurrent()
+        completeEnterAnimations()
+        completeExitAnimations()
+        runCurrent()
+        verify(mDreamManager, times(1)).setSystemDreamComponent(null)
+    }
+
+    @Test
+    fun setAmbientLightMode_animatorNeverFinishes_timesOut() = testScope.runTest {
+        mLowLightDreamManager.setAmbientLightMode(LowLightDreamManager.AMBIENT_LIGHT_MODE_LOW_LIGHT)
+        advanceTimeBy(delayTimeMillis = LOW_LIGHT_TIMEOUT_MS + 1)
+        // Animation never finishes, but we should still set the system dream
+        verify(mDreamManager).setSystemDreamComponent(DREAM_COMPONENT)
+    }
+
+    private fun completeEnterAnimations() {
+        val listener = withArgCaptor { verify(mEnterAnimator).addListener(capture()) }
+        listener.onAnimationEnd(mEnterAnimator)
+    }
+
+    private fun completeExitAnimations() {
+        val listener = withArgCaptor { verify(mExitAnimator).addListener(capture()) }
+        listener.onAnimationEnd(mExitAnimator)
+    }
+
+    companion object {
+        private val DREAM_COMPONENT = ComponentName("test_package", "test_dream")
+        private const val LOW_LIGHT_TIMEOUT_MS: Long = 1000
+    }
+}
\ No newline at end of file
diff --git a/libs/dream/lowlight/tests/src/com.android.dream.lowlight/LowLightTransitionCoordinatorTest.java b/libs/dream/lowlight/tests/src/com.android.dream.lowlight/LowLightTransitionCoordinatorTest.java
deleted file mode 100644
index 81e1e33..0000000
--- a/libs/dream/lowlight/tests/src/com.android.dream.lowlight/LowLightTransitionCoordinatorTest.java
+++ /dev/null
@@ -1,113 +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.dream.lowlight;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-import android.animation.Animator;
-import android.testing.AndroidTestingRunner;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
-public class LowLightTransitionCoordinatorTest {
-    @Mock
-    private LowLightTransitionCoordinator.LowLightEnterListener mEnterListener;
-
-    @Mock
-    private LowLightTransitionCoordinator.LowLightExitListener mExitListener;
-
-    @Mock
-    private Animator mAnimator;
-
-    @Captor
-    private ArgumentCaptor<Animator.AnimatorListener> mAnimatorListenerCaptor;
-
-    @Mock
-    private Runnable mRunnable;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    @Test
-    public void onEnterCalledOnListeners() {
-        LowLightTransitionCoordinator coordinator = new LowLightTransitionCoordinator();
-
-        coordinator.setLowLightEnterListener(mEnterListener);
-
-        coordinator.notifyBeforeLowLightTransition(true, mRunnable);
-
-        verify(mEnterListener).onBeforeEnterLowLight();
-        verify(mRunnable).run();
-    }
-
-    @Test
-    public void onExitCalledOnListeners() {
-        LowLightTransitionCoordinator coordinator = new LowLightTransitionCoordinator();
-
-        coordinator.setLowLightExitListener(mExitListener);
-
-        coordinator.notifyBeforeLowLightTransition(false, mRunnable);
-
-        verify(mExitListener).onBeforeExitLowLight();
-        verify(mRunnable).run();
-    }
-
-    @Test
-    public void listenerNotCalledAfterRemoval() {
-        LowLightTransitionCoordinator coordinator = new LowLightTransitionCoordinator();
-
-        coordinator.setLowLightEnterListener(mEnterListener);
-        coordinator.setLowLightEnterListener(null);
-
-        coordinator.notifyBeforeLowLightTransition(true, mRunnable);
-
-        verifyZeroInteractions(mEnterListener);
-        verify(mRunnable).run();
-    }
-
-    @Test
-    public void runnableCalledAfterAnimationEnds() {
-        when(mEnterListener.onBeforeEnterLowLight()).thenReturn(mAnimator);
-
-        LowLightTransitionCoordinator coordinator = new LowLightTransitionCoordinator();
-        coordinator.setLowLightEnterListener(mEnterListener);
-
-        coordinator.notifyBeforeLowLightTransition(true, mRunnable);
-
-        // Animator listener is added and the runnable is not run yet.
-        verify(mAnimator).addListener(mAnimatorListenerCaptor.capture());
-        verifyZeroInteractions(mRunnable);
-
-        // Runnable is run once the animation ends.
-        mAnimatorListenerCaptor.getValue().onAnimationEnd(null);
-        verify(mRunnable).run();
-    }
-}
diff --git a/libs/dream/lowlight/tests/src/com.android.dream.lowlight/LowLightTransitionCoordinatorTest.kt b/libs/dream/lowlight/tests/src/com.android.dream.lowlight/LowLightTransitionCoordinatorTest.kt
new file mode 100644
index 0000000..4c526a6
--- /dev/null
+++ b/libs/dream/lowlight/tests/src/com.android.dream.lowlight/LowLightTransitionCoordinatorTest.kt
@@ -0,0 +1,184 @@
+/*
+ * 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.dream.lowlight
+
+import android.animation.Animator
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.dream.lowlight.LowLightTransitionCoordinator.LowLightEnterListener
+import com.android.dream.lowlight.LowLightTransitionCoordinator.LowLightExitListener
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.advanceTimeBy
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mock
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+import src.com.android.dream.lowlight.utils.whenever
+import kotlin.time.DurationUnit
+import kotlin.time.toDuration
+
+@SmallTest
+@OptIn(ExperimentalCoroutinesApi::class)
+@RunWith(AndroidTestingRunner::class)
+class LowLightTransitionCoordinatorTest {
+    @Mock
+    private lateinit var mEnterListener: LowLightEnterListener
+
+    @Mock
+    private lateinit var mExitListener: LowLightExitListener
+
+    @Mock
+    private lateinit var mAnimator: Animator
+
+    @Captor
+    private lateinit var mAnimatorListenerCaptor: ArgumentCaptor<Animator.AnimatorListener>
+
+    private lateinit var testScope: TestScope
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        testScope = TestScope(StandardTestDispatcher())
+    }
+
+    @Test
+    fun onEnterCalledOnListeners() = testScope.runTest {
+        val coordinator = LowLightTransitionCoordinator()
+        coordinator.setLowLightEnterListener(mEnterListener)
+        val job = launch {
+            coordinator.waitForLowLightTransitionAnimation(timeout = TIMEOUT, entering = true)
+        }
+        runCurrent()
+        verify(mEnterListener).onBeforeEnterLowLight()
+        assertThat(job.isCompleted).isTrue()
+    }
+
+    @Test
+    fun onExitCalledOnListeners() = testScope.runTest {
+        val coordinator = LowLightTransitionCoordinator()
+        coordinator.setLowLightExitListener(mExitListener)
+        val job = launch {
+            coordinator.waitForLowLightTransitionAnimation(timeout = TIMEOUT, entering = false)
+        }
+        runCurrent()
+        verify(mExitListener).onBeforeExitLowLight()
+        assertThat(job.isCompleted).isTrue()
+    }
+
+    @Test
+    fun listenerNotCalledAfterRemoval() = testScope.runTest {
+        val coordinator = LowLightTransitionCoordinator()
+        coordinator.setLowLightEnterListener(mEnterListener)
+        coordinator.setLowLightEnterListener(null)
+        val job = launch {
+            coordinator.waitForLowLightTransitionAnimation(timeout = TIMEOUT, entering = true)
+        }
+        runCurrent()
+        verify(mEnterListener, never()).onBeforeEnterLowLight()
+        assertThat(job.isCompleted).isTrue()
+    }
+
+    @Test
+    fun waitsForAnimationToEnd() = testScope.runTest {
+        whenever(mEnterListener.onBeforeEnterLowLight()).thenReturn(mAnimator)
+        val coordinator = LowLightTransitionCoordinator()
+        coordinator.setLowLightEnterListener(mEnterListener)
+        val job = launch {
+            coordinator.waitForLowLightTransitionAnimation(timeout = TIMEOUT, entering = true)
+        }
+        runCurrent()
+        // Animator listener is added and the runnable is not run yet.
+        verify(mAnimator).addListener(mAnimatorListenerCaptor.capture())
+        assertThat(job.isCompleted).isFalse()
+
+        // Runnable is run once the animation ends.
+        mAnimatorListenerCaptor.value.onAnimationEnd(mAnimator)
+        runCurrent()
+        assertThat(job.isCompleted).isTrue()
+        assertThat(job.isCancelled).isFalse()
+    }
+
+    @Test
+    fun waitsForTimeoutIfAnimationNeverEnds() = testScope.runTest {
+        whenever(mEnterListener.onBeforeEnterLowLight()).thenReturn(mAnimator)
+        val coordinator = LowLightTransitionCoordinator()
+        coordinator.setLowLightEnterListener(mEnterListener)
+        val job = launch {
+            coordinator.waitForLowLightTransitionAnimation(timeout = TIMEOUT, entering = true)
+        }
+        runCurrent()
+        assertThat(job.isCancelled).isFalse()
+        advanceTimeBy(delayTimeMillis = TIMEOUT.inWholeMilliseconds + 1)
+        // If animator doesn't complete within the timeout, we should cancel ourselves.
+        assertThat(job.isCancelled).isTrue()
+    }
+
+    @Test
+    fun shouldCancelIfAnimationIsCancelled() = testScope.runTest {
+        whenever(mEnterListener.onBeforeEnterLowLight()).thenReturn(mAnimator)
+        val coordinator = LowLightTransitionCoordinator()
+        coordinator.setLowLightEnterListener(mEnterListener)
+        val job = launch {
+            coordinator.waitForLowLightTransitionAnimation(timeout = TIMEOUT, entering = true)
+        }
+        runCurrent()
+        // Animator listener is added and the runnable is not run yet.
+        verify(mAnimator).addListener(mAnimatorListenerCaptor.capture())
+        assertThat(job.isCompleted).isFalse()
+        assertThat(job.isCancelled).isFalse()
+
+        // Runnable is run once the animation ends.
+        mAnimatorListenerCaptor.value.onAnimationCancel(mAnimator)
+        runCurrent()
+        assertThat(job.isCompleted).isTrue()
+        assertThat(job.isCancelled).isTrue()
+    }
+
+    @Test
+    fun shouldCancelAnimatorWhenJobCancelled() = testScope.runTest {
+        whenever(mEnterListener.onBeforeEnterLowLight()).thenReturn(mAnimator)
+        val coordinator = LowLightTransitionCoordinator()
+        coordinator.setLowLightEnterListener(mEnterListener)
+        val job = launch {
+            coordinator.waitForLowLightTransitionAnimation(timeout = TIMEOUT, entering = true)
+        }
+        runCurrent()
+        // Animator listener is added and the runnable is not run yet.
+        verify(mAnimator).addListener(mAnimatorListenerCaptor.capture())
+        verify(mAnimator, never()).cancel()
+        assertThat(job.isCompleted).isFalse()
+
+        job.cancel()
+        // We should have removed the listener and cancelled the animator
+        verify(mAnimator).removeListener(mAnimatorListenerCaptor.value)
+        verify(mAnimator).cancel()
+    }
+
+    companion object {
+        private val TIMEOUT = 1.toDuration(DurationUnit.SECONDS)
+    }
+}
diff --git a/libs/dream/lowlight/tests/src/com/android/dream/lowlight/utils/KotlinMockitoHelpers.kt b/libs/dream/lowlight/tests/src/com/android/dream/lowlight/utils/KotlinMockitoHelpers.kt
new file mode 100644
index 0000000..e5ec26ca
--- /dev/null
+++ b/libs/dream/lowlight/tests/src/com/android/dream/lowlight/utils/KotlinMockitoHelpers.kt
@@ -0,0 +1,125 @@
+package src.com.android.dream.lowlight.utils
+
+import org.mockito.ArgumentCaptor
+import org.mockito.ArgumentMatcher
+import org.mockito.Mockito
+import org.mockito.Mockito.`when`
+import org.mockito.stubbing.OngoingStubbing
+import org.mockito.stubbing.Stubber
+
+/**
+ * Returns Mockito.eq() as nullable type to avoid java.lang.IllegalStateException when
+ * null is returned.
+ *
+ * Generic T is nullable because implicitly bounded by Any?.
+ */
+fun <T> eq(obj: T): T = Mockito.eq<T>(obj)
+
+/**
+ * Returns Mockito.any() as nullable type to avoid java.lang.IllegalStateException when
+ * null is returned.
+ *
+ * Generic T is nullable because implicitly bounded by Any?.
+ */
+fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
+inline fun <reified T> any(): T = any(T::class.java)
+
+/**
+ * Returns Mockito.argThat() as nullable type to avoid java.lang.IllegalStateException when
+ * null is returned.
+ *
+ * Generic T is nullable because implicitly bounded by Any?.
+ */
+fun <T> argThat(matcher: ArgumentMatcher<T>): T = Mockito.argThat(matcher)
+
+/**
+ * Kotlin type-inferred version of Mockito.nullable()
+ */
+inline fun <reified T> nullable(): T? = Mockito.nullable(T::class.java)
+
+/**
+ * Returns ArgumentCaptor.capture() as nullable type to avoid java.lang.IllegalStateException
+ * when null is returned.
+ *
+ * Generic T is nullable because implicitly bounded by Any?.
+ */
+fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture()
+
+/**
+ * Helper function for creating an argumentCaptor in kotlin.
+ *
+ * Generic T is nullable because implicitly bounded by Any?.
+ */
+inline fun <reified T : Any> argumentCaptor(): ArgumentCaptor<T> =
+    ArgumentCaptor.forClass(T::class.java)
+
+/**
+ * Helper function for creating new mocks, without the need to pass in a [Class] instance.
+ *
+ * Generic T is nullable because implicitly bounded by Any?.
+ *
+ * @param apply builder function to simplify stub configuration by improving type inference.
+ */
+inline fun <reified T : Any> mock(apply: T.() -> Unit = {}): T = Mockito.mock(T::class.java)
+    .apply(apply)
+
+/**
+ * Helper function for stubbing methods without the need to use backticks.
+ *
+ * @see Mockito.when
+ */
+fun <T> whenever(methodCall: T): OngoingStubbing<T> = `when`(methodCall)
+fun <T> Stubber.whenever(mock: T): T = `when`(mock)
+
+/**
+ * A kotlin implemented wrapper of [ArgumentCaptor] which prevents the following exception when
+ * kotlin tests are mocking kotlin objects and the methods take non-null parameters:
+ *
+ *     java.lang.NullPointerException: capture() must not be null
+ */
+class KotlinArgumentCaptor<T> constructor(clazz: Class<T>) {
+    private val wrapped: ArgumentCaptor<T> = ArgumentCaptor.forClass(clazz)
+    fun capture(): T = wrapped.capture()
+    val value: T
+        get() = wrapped.value
+    val allValues: List<T>
+        get() = wrapped.allValues
+}
+
+/**
+ * Helper function for creating an argumentCaptor in kotlin.
+ *
+ * Generic T is nullable because implicitly bounded by Any?.
+ */
+inline fun <reified T : Any> kotlinArgumentCaptor(): KotlinArgumentCaptor<T> =
+    KotlinArgumentCaptor(T::class.java)
+
+/**
+ * Helper function for creating and using a single-use ArgumentCaptor in kotlin.
+ *
+ *    val captor = argumentCaptor<Foo>()
+ *    verify(...).someMethod(captor.capture())
+ *    val captured = captor.value
+ *
+ * becomes:
+ *
+ *    val captured = withArgCaptor<Foo> { verify(...).someMethod(capture()) }
+ *
+ * NOTE: this uses the KotlinArgumentCaptor to avoid the NullPointerException.
+ */
+inline fun <reified T : Any> withArgCaptor(block: KotlinArgumentCaptor<T>.() -> Unit): T =
+    kotlinArgumentCaptor<T>().apply { block() }.value
+
+/**
+ * Variant of [withArgCaptor] for capturing multiple arguments.
+ *
+ *    val captor = argumentCaptor<Foo>()
+ *    verify(...).someMethod(captor.capture())
+ *    val captured: List<Foo> = captor.allValues
+ *
+ * becomes:
+ *
+ *    val capturedList = captureMany<Foo> { verify(...).someMethod(capture()) }
+ */
+inline fun <reified T : Any> captureMany(block: KotlinArgumentCaptor<T>.() -> Unit): List<T> =
+    kotlinArgumentCaptor<T>().apply{ block() }.allValues
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index 3b12972..70c36a5 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -55,6 +55,10 @@
         // GCC false-positives on this warning, and since we -Werror that's
         // a problem
         "-Wno-free-nonheap-object",
+
+        // Do not de-optimise cold code paths in AFDO.
+        // Some code paths might be infrequently executed but critical to latency.
+        "-fno-profile-sample-accurate",
     ],
 
     include_dirs: [
@@ -738,6 +742,9 @@
         "tests/unit/VectorDrawableTests.cpp",
         "tests/unit/WebViewFunctorManagerTests.cpp",
     ],
+    data: [
+        ":hwuimicro",
+    ],
 }
 
 // ------------------------
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 7a12769..8394c3c 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -50,6 +50,7 @@
 #include "Mesh.h"
 #include "NinePatchUtils.h"
 #include "VectorDrawable.h"
+#include "effects/GainmapRenderer.h"
 #include "hwui/Bitmap.h"
 #include "hwui/MinikinUtils.h"
 #include "hwui/PaintFilter.h"
@@ -589,18 +590,25 @@
 
 void SkiaCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) {
     auto image = bitmap.makeImage();
+
+    if (bitmap.hasGainmap()) {
+        Paint gainmapPaint = paint ? *paint : Paint();
+        sk_sp<SkShader> gainmapShader = uirenderer::MakeGainmapShader(
+                image, bitmap.gainmap()->bitmap->makeImage(), bitmap.gainmap()->info,
+                SkTileMode::kClamp, SkTileMode::kClamp, gainmapPaint.sampling());
+        gainmapPaint.setShader(gainmapShader);
+        return drawRect(left, top, left + bitmap.width(), top + bitmap.height(), gainmapPaint);
+    }
+
     applyLooper(paint, [&](const Paint& p) {
         mCanvas->drawImage(image, left, top, p.sampling(), &p);
     });
 }
 
 void SkiaCanvas::drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const Paint* paint) {
-    auto image = bitmap.makeImage();
     SkAutoCanvasRestore acr(mCanvas, true);
     mCanvas->concat(matrix);
-    applyLooper(paint, [&](const Paint& p) {
-        mCanvas->drawImage(image, 0, 0, p.sampling(), &p);
-    });
+    drawBitmap(bitmap, 0, 0, paint);
 }
 
 void SkiaCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop, float srcRight,
@@ -610,6 +618,16 @@
     SkRect srcRect = SkRect::MakeLTRB(srcLeft, srcTop, srcRight, srcBottom);
     SkRect dstRect = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
 
+    if (bitmap.hasGainmap()) {
+        Paint gainmapPaint = paint ? *paint : Paint();
+        sk_sp<SkShader> gainmapShader = uirenderer::MakeGainmapShader(
+                image, bitmap.gainmap()->bitmap->makeImage(), bitmap.gainmap()->info,
+                SkTileMode::kClamp, SkTileMode::kClamp, gainmapPaint.sampling());
+        gainmapShader = gainmapShader->makeWithLocalMatrix(SkMatrix::RectToRect(srcRect, dstRect));
+        gainmapPaint.setShader(gainmapShader);
+        return drawRect(dstLeft, dstTop, dstRight, dstBottom, gainmapPaint);
+    }
+
     applyLooper(paint, [&](const Paint& p) {
         mCanvas->drawImageRect(image, srcRect, dstRect, p.sampling(), &p,
                                SkCanvas::kFast_SrcRectConstraint);
diff --git a/libs/hwui/jni/android_graphics_HardwareBufferRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareBufferRenderer.cpp
index 768dfcd..706f18c 100644
--- a/libs/hwui/jni/android_graphics_HardwareBufferRenderer.cpp
+++ b/libs/hwui/jni/android_graphics_HardwareBufferRenderer.cpp
@@ -85,28 +85,20 @@
 }
 
 static SkMatrix createMatrixFromBufferTransform(SkScalar width, SkScalar height, int transform) {
-    auto matrix = SkMatrix();
     switch (transform) {
         case ANATIVEWINDOW_TRANSFORM_ROTATE_90:
-            matrix.setRotate(90);
-            matrix.postTranslate(width, 0);
-            break;
+            return SkMatrix::MakeAll(0, -1, height, 1, 0, 0, 0, 0, 1);
         case ANATIVEWINDOW_TRANSFORM_ROTATE_180:
-            matrix.setRotate(180);
-            matrix.postTranslate(width, height);
-            break;
+            return SkMatrix::MakeAll(-1, 0, width, 0, -1, height, 0, 0, 1);
         case ANATIVEWINDOW_TRANSFORM_ROTATE_270:
-            matrix.setRotate(270);
-            matrix.postTranslate(0, width);
-            break;
+            return SkMatrix::MakeAll(0, 1, 0, -1, 0, width, 0, 0, 1);
         default:
             ALOGE("Invalid transform provided. Transform should be validated from"
                   "the java side. Leveraging identity transform as a fallback");
             [[fallthrough]];
         case ANATIVEWINDOW_TRANSFORM_IDENTITY:
-            break;
+            return SkMatrix::I();
     }
-    return matrix;
 }
 
 static int android_graphics_HardwareBufferRenderer_render(JNIEnv* env, jobject, jlong renderProxy,
@@ -117,8 +109,8 @@
     auto skHeight = static_cast<SkScalar>(height);
     auto matrix = createMatrixFromBufferTransform(skWidth, skHeight, transform);
     auto colorSpace = GraphicsJNI::getNativeColorSpace(colorspacePtr);
-    proxy->setHardwareBufferRenderParams(
-            HardwareBufferRenderParams(matrix, colorSpace, createRenderCallback(env, consumer)));
+    proxy->setHardwareBufferRenderParams(HardwareBufferRenderParams(
+            width, height, matrix, colorSpace, createRenderCallback(env, consumer)));
     nsecs_t vsync = systemTime(SYSTEM_TIME_MONOTONIC);
     UiFrameInfoBuilder(proxy->frameInfo())
                 .setVsync(vsync, vsync, UiFrameInfoBuilder::INVALID_VSYNC_ID,
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
index 202a62c..cc987bc 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
@@ -69,15 +69,9 @@
 }
 
 Frame SkiaOpenGLPipeline::getFrame() {
-    if (mHardwareBuffer) {
-        AHardwareBuffer_Desc description;
-        AHardwareBuffer_describe(mHardwareBuffer, &description);
-        return Frame(description.width, description.height, 0);
-    } else {
-        LOG_ALWAYS_FATAL_IF(mEglSurface == EGL_NO_SURFACE,
-                            "drawRenderNode called on a context with no surface!");
-        return mEglManager.beginFrame(mEglSurface);
-    }
+    LOG_ALWAYS_FATAL_IF(mEglSurface == EGL_NO_SURFACE,
+                        "drawRenderNode called on a context with no surface!");
+    return mEglManager.beginFrame(mEglSurface);
 }
 
 IRenderPipeline::DrawResult SkiaOpenGLPipeline::draw(
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
index 8ea71f1..1f92968 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
@@ -28,6 +28,7 @@
 #include <SkMultiPictureDocument.h>
 #include <SkOverdrawCanvas.h>
 #include <SkOverdrawColorFilter.h>
+#include <SkPaintFilterCanvas.h>
 #include <SkPicture.h>
 #include <SkPictureRecorder.h>
 #include <SkRect.h>
@@ -36,15 +37,15 @@
 #include <SkStream.h>
 #include <SkString.h>
 #include <SkTypeface.h>
-#include "include/gpu/GpuTypes.h" // from Skia
 #include <android-base/properties.h>
+#include <gui/TraceUtils.h>
 #include <unistd.h>
 
 #include <sstream>
 
-#include <gui/TraceUtils.h>
 #include "LightingInfo.h"
 #include "VectorDrawable.h"
+#include "include/gpu/GpuTypes.h"  // from Skia
 #include "thread/CommonPool.h"
 #include "tools/SkSharingProc.h"
 #include "utils/Color.h"
@@ -449,6 +450,23 @@
     }
 }
 
+class ForceDitherCanvas : public SkPaintFilterCanvas {
+public:
+    ForceDitherCanvas(SkCanvas* canvas) : SkPaintFilterCanvas(canvas) {}
+
+protected:
+    bool onFilter(SkPaint& paint) const override {
+        paint.setDither(true);
+        return true;
+    }
+
+    void onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) override {
+        // We unroll the drawable using "this" canvas, so that draw calls contained inside will
+        // get dithering applied
+        drawable->draw(this, matrix);
+    }
+};
+
 void SkiaPipeline::renderFrame(const LayerUpdateQueue& layers, const SkRect& clip,
                                const std::vector<sp<RenderNode>>& nodes, bool opaque,
                                const Rect& contentDrawBounds, sk_sp<SkSurface> surface,
@@ -503,6 +521,12 @@
         canvas->clear(SK_ColorTRANSPARENT);
     }
 
+    std::optional<ForceDitherCanvas> forceDitherCanvas;
+    if (shouldForceDither()) {
+        forceDitherCanvas.emplace(canvas);
+        canvas = &forceDitherCanvas.value();
+    }
+
     if (1 == nodes.size()) {
         if (!nodes[0]->nothingToDraw()) {
             RenderNodeDrawable root(nodes[0].get(), canvas);
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.h b/libs/hwui/pipeline/skia/SkiaPipeline.h
index befee89..0763b06 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.h
@@ -98,6 +98,8 @@
 
     bool isCapturingSkp() const { return mCaptureMode != CaptureMode::None; }
 
+    virtual bool shouldForceDither() const { return mColorMode != ColorMode::Default; }
+
 private:
     void renderFrameImpl(const SkRect& clip,
                          const std::vector<sp<RenderNode>>& nodes, bool opaque,
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
index 99298bc..6f1b99b 100644
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
@@ -66,15 +66,8 @@
 }
 
 Frame SkiaVulkanPipeline::getFrame() {
-    if (mHardwareBuffer) {
-        AHardwareBuffer_Desc description;
-        AHardwareBuffer_describe(mHardwareBuffer, &description);
-        return Frame(description.width, description.height, 0);
-    } else {
-        LOG_ALWAYS_FATAL_IF(mVkSurface == nullptr,
-                            "getFrame() called on a context with no surface!");
-        return vulkanManager().dequeueNextBuffer(mVkSurface);
-    }
+    LOG_ALWAYS_FATAL_IF(mVkSurface == nullptr, "getFrame() called on a context with no surface!");
+    return vulkanManager().dequeueNextBuffer(mVkSurface);
 }
 
 IRenderPipeline::DrawResult SkiaVulkanPipeline::draw(
@@ -210,6 +203,11 @@
     return nullptr;
 }
 
+bool SkiaVulkanPipeline::shouldForceDither() const {
+    if (mVkSurface && mVkSurface->isBeyond8Bit()) return false;
+    return SkiaPipeline::shouldForceDither();
+}
+
 void SkiaVulkanPipeline::onContextDestroyed() {
     if (mVkSurface) {
         vulkanManager().destroySurface(mVkSurface);
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h
index d921ddb..0713e93 100644
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h
@@ -63,6 +63,8 @@
 protected:
     void onContextDestroyed() override;
 
+    bool shouldForceDither() const override;
+
 private:
     renderthread::VulkanManager& vulkanManager();
     renderthread::VulkanSurface* mVkSurface = nullptr;
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index dd781bb..6b2c995 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -528,6 +528,14 @@
     sendLoadResetHint();
 }
 
+Frame CanvasContext::getFrame() {
+    if (mHardwareBuffer != nullptr) {
+        return {mBufferParams.getLogicalWidth(), mBufferParams.getLogicalHeight(), 0};
+    } else {
+        return mRenderPipeline->getFrame();
+    }
+}
+
 void CanvasContext::draw() {
     if (auto grContext = getGrContext()) {
         if (grContext->abandoned()) {
@@ -569,7 +577,8 @@
 
     mCurrentFrameInfo->markIssueDrawCommandsStart();
 
-    Frame frame = mRenderPipeline->getFrame();
+    Frame frame = getFrame();
+
     SkRect windowDirty = computeDirtyRect(frame, &dirty);
 
     ATRACE_FORMAT("Drawing " RECT_STRING, SK_RECT_ARGS(dirty));
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index b26c018..3f25339 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -264,6 +264,8 @@
 
     FrameInfo* getFrameInfoFromLast4(uint64_t frameNumber, uint32_t surfaceControlId);
 
+    Frame getFrame();
+
     // The same type as Frame.mWidth and Frame.mHeight
     int32_t mLastFrameWidth = 0;
     int32_t mLastFrameHeight = 0;
diff --git a/libs/hwui/renderthread/HardwareBufferRenderParams.h b/libs/hwui/renderthread/HardwareBufferRenderParams.h
index 91fe3f6..8c942d0 100644
--- a/libs/hwui/renderthread/HardwareBufferRenderParams.h
+++ b/libs/hwui/renderthread/HardwareBufferRenderParams.h
@@ -36,9 +36,12 @@
 class HardwareBufferRenderParams {
 public:
     HardwareBufferRenderParams() = default;
-    HardwareBufferRenderParams(const SkMatrix& transform, const sk_sp<SkColorSpace>& colorSpace,
+    HardwareBufferRenderParams(int32_t logicalWidth, int32_t logicalHeight,
+                               const SkMatrix& transform, const sk_sp<SkColorSpace>& colorSpace,
                                RenderCallback&& callback)
-            : mTransform(transform)
+            : mLogicalWidth(logicalWidth)
+            , mLogicalHeight(logicalHeight)
+            , mTransform(transform)
             , mColorSpace(colorSpace)
             , mRenderCallback(std::move(callback)) {}
     const SkMatrix& getTransform() const { return mTransform; }
@@ -50,7 +53,12 @@
         }
     }
 
+    int32_t getLogicalWidth() { return mLogicalWidth; }
+    int32_t getLogicalHeight() { return mLogicalHeight; }
+
 private:
+    int32_t mLogicalWidth;
+    int32_t mLogicalHeight;
     SkMatrix mTransform = SkMatrix::I();
     sk_sp<SkColorSpace> mColorSpace = SkColorSpace::MakeSRGB();
     RenderCallback mRenderCallback = nullptr;
diff --git a/libs/hwui/renderthread/VulkanSurface.cpp b/libs/hwui/renderthread/VulkanSurface.cpp
index 21b6c44..ae4f057 100644
--- a/libs/hwui/renderthread/VulkanSurface.cpp
+++ b/libs/hwui/renderthread/VulkanSurface.cpp
@@ -530,6 +530,16 @@
     }
 }
 
+bool VulkanSurface::isBeyond8Bit() const {
+    switch (mWindowInfo.bufferFormat) {
+        case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
+        case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
+            return true;
+        default:
+            return false;
+    }
+}
+
 } /* namespace renderthread */
 } /* namespace uirenderer */
 } /* namespace android */
diff --git a/libs/hwui/renderthread/VulkanSurface.h b/libs/hwui/renderthread/VulkanSurface.h
index e2ddc6b..3b69b73 100644
--- a/libs/hwui/renderthread/VulkanSurface.h
+++ b/libs/hwui/renderthread/VulkanSurface.h
@@ -48,6 +48,8 @@
 
     void setColorSpace(sk_sp<SkColorSpace> colorSpace);
 
+    bool isBeyond8Bit() const;
+
 private:
     /*
      * All structs/methods in this private section are specifically for use by the VulkanManager
diff --git a/location/java/android/location/Location.java b/location/java/android/location/Location.java
index f5a9850..9be7728 100644
--- a/location/java/android/location/Location.java
+++ b/location/java/android/location/Location.java
@@ -831,7 +831,9 @@
      * will be present for any location.
      *
      * <ul>
-     * <li> satellites - the number of satellites used to derive a GNSS fix
+     * <li> satellites - the number of satellites used to derive a GNSS fix. This key was deprecated
+     * in API 34 because the information can be obtained through more accurate means, such as by
+     * referencing {@link GnssStatus#usedInFix}.
      * </ul>
      */
     public @Nullable Bundle getExtras() {
diff --git a/media/OWNERS b/media/OWNERS
index 5f50137..4a6648e 100644
--- a/media/OWNERS
+++ b/media/OWNERS
@@ -1,4 +1,5 @@
 # Bug component: 1344
[email protected]
 [email protected]
 [email protected]
 [email protected]
diff --git a/media/TEST_MAPPING b/media/TEST_MAPPING
index e8c7ad2..5ae77b5 100644
--- a/media/TEST_MAPPING
+++ b/media/TEST_MAPPING
@@ -15,16 +15,16 @@
       ]
     },
     {
-      "name": "GtsMediaTestCases",
+      "name": "WvtsDeviceTestCases",
       "options" : [
         {
           "include-annotation": "android.platform.test.annotations.Presubmit"
         },
         {
-          "include-filter": "com.google.android.media.gts.WidevineGenericOpsTests"
+          "include-filter": "com.google.android.media.wvts.WidevineGenericOpsTests"
         },
         {
-          "include-filter": "com.google.android.media.gts.WidevineH264PlaybackTests"
+          "include-filter": "com.google.android.media.wvts.WidevineH264PlaybackTests"
         }
       ],
       "file_patterns": ["(?i)drm|crypto"]
diff --git a/media/aidl/android/media/soundtrigger_middleware/IInjectGlobalEvent.aidl b/media/aidl/android/media/soundtrigger_middleware/IInjectGlobalEvent.aidl
index dcf3945..47d8426 100644
--- a/media/aidl/android/media/soundtrigger_middleware/IInjectGlobalEvent.aidl
+++ b/media/aidl/android/media/soundtrigger_middleware/IInjectGlobalEvent.aidl
@@ -25,14 +25,14 @@
 oneway interface IInjectGlobalEvent {
 
     /**
-     * Request a fake STHAL restart.
+     * Trigger a fake STHAL restart.
      * This invalidates the {@link IInjectGlobalEvent}.
      */
     void triggerRestart();
 
     /**
-     * Triggers global resource contention into the fake STHAL. Loads/startRecognition
-     * will fail with RESOURCE_CONTENTION.
+     * Set global resource contention within the fake STHAL. Loads/startRecognition
+     * will fail with {@code RESOURCE_CONTENTION} until unset.
      * @param isContended - true to enable resource contention. false to disable resource contention
      *                      and resume normal functionality.
      * @param callback - Call {@link IAcknowledgeEvent#eventReceived()} on this interface once
@@ -40,4 +40,11 @@
      */
     void setResourceContention(boolean isContended, IAcknowledgeEvent callback);
 
+    /**
+     * Trigger an
+     * {@link android.hardware.soundtrigger3.ISoundTriggerHwGlobalCallback#onResourcesAvailable}
+     * callback from the fake STHAL. This callback is used to signal to the framework that
+     * previous operations which failed may now succeed.
+     */
+    void triggerOnResourcesAvailable();
 }
diff --git a/media/aidl/android/media/soundtrigger_middleware/OWNERS b/media/aidl/android/media/soundtrigger_middleware/OWNERS
index 01b2cb9..1e41886 100644
--- a/media/aidl/android/media/soundtrigger_middleware/OWNERS
+++ b/media/aidl/android/media/soundtrigger_middleware/OWNERS
@@ -1,2 +1 @@
[email protected]
[email protected]
+include /media/java/android/media/soundtrigger/OWNERS
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index b4fbc97..b1d2e33 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -661,7 +661,10 @@
      */
     public static final int ENCODED_SURROUND_OUTPUT_MANUAL = 3;
 
-    /** @hide */
+    /**
+     * @hide
+     * This list contains all the flags that can be used in internal APIs for volume
+     * related operations */
     @IntDef(flag = true, prefix = "FLAG", value = {
             FLAG_SHOW_UI,
             FLAG_ALLOW_RINGER_MODES,
@@ -681,16 +684,64 @@
     @Retention(RetentionPolicy.SOURCE)
     public @interface Flags {}
 
-    /** @hide */
+    /**
+     * @hide
+     * This list contains all the flags that can be used in SDK-visible methods for volume
+     * related operations.
+     * See for instance {@link #adjustVolume(int, int)},
+     * {@link #adjustStreamVolume(int, int, int)},
+     * {@link #adjustSuggestedStreamVolume(int, int, int)},
+     * {@link #adjustVolumeGroupVolume(int, int, int)},
+     * {@link #setStreamVolume(int, int, int)}
+     * The list contains all volume flags, but the values commented out of the list are there for
+     * maintenance reasons (for when adding flags or changing their visibility),
+     * and to document why some are not in the list (hidden or SystemApi). */
     @IntDef(flag = true, prefix = "FLAG", value = {
             FLAG_SHOW_UI,
             FLAG_ALLOW_RINGER_MODES,
             FLAG_PLAY_SOUND,
             FLAG_REMOVE_SOUND_AND_VIBRATE,
             FLAG_VIBRATE,
+            //FLAG_FIXED_VOLUME,             removed due to @hide
+            //FLAG_BLUETOOTH_ABS_VOLUME,     removed due to @SystemApi
+            //FLAG_SHOW_SILENT_HINT,         removed due to @hide
+            //FLAG_HDMI_SYSTEM_AUDIO_VOLUME, removed due to @hide
+            //FLAG_ACTIVE_MEDIA_ONLY,        removed due to @hide
+            //FLAG_SHOW_UI_WARNINGS,         removed due to @hide
+            //FLAG_SHOW_VIBRATE_HINT,        removed due to @hide
+            //FLAG_FROM_KEY,                 removed due to @SystemApi
+            //FLAG_ABSOLUTE_VOLUME,          removed due to @hide
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface PublicVolumeFlags {}
+
+    /**
+     * @hide
+     * Like PublicVolumeFlags, but for all the flags that can be used in @SystemApi methods for
+     * volume related operations.
+     * See for instance {@link #setVolumeIndexForAttributes(AudioAttributes, int, int)},
+     * {@link #setVolumeGroupVolumeIndex(int, int, int)},
+     * {@link #setStreamVolumeForUid(int, int, int, String, int, int, int)},
+     * {@link #adjustStreamVolumeForUid(int, int, int, String, int, int, int)},
+     * {@link #adjustSuggestedStreamVolumeForUid(int, int, int, String, int, int, int)}
+     * The list contains all volume flags, but the values commented out of the list are there for
+     * maintenance reasons (for when adding flags or changing their visibility),
+     * and to document which hidden values are not in the list. */
+    @IntDef(flag = true, prefix = "FLAG", value = {
+            FLAG_SHOW_UI,
+            FLAG_ALLOW_RINGER_MODES,
+            FLAG_PLAY_SOUND,
+            FLAG_REMOVE_SOUND_AND_VIBRATE,
+            FLAG_VIBRATE,
+            //FLAG_FIXED_VOLUME,             removed due to @hide
             FLAG_BLUETOOTH_ABS_VOLUME,
-            FLAG_HDMI_SYSTEM_AUDIO_VOLUME,
+            //FLAG_SHOW_SILENT_HINT,         removed due to @hide
+            //FLAG_HDMI_SYSTEM_AUDIO_VOLUME, removed due to @hide
+            //FLAG_ACTIVE_MEDIA_ONLY,        removed due to @hide
+            //FLAG_SHOW_UI_WARNINGS,         removed due to @hide
+            //FLAG_SHOW_VIBRATE_HINT,        removed due to @hide
             FLAG_FROM_KEY,
+            //FLAG_ABSOLUTE_VOLUME,          removed due to @hide
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface SystemVolumeFlags {}
@@ -981,13 +1032,13 @@
      * @param direction The direction to adjust the volume. One of
      *            {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or
      *            {@link #ADJUST_SAME}.
-     * @param flags One or more flags.
+     * @param flags
      * @see #adjustVolume(int, int)
      * @see #setStreamVolume(int, int, int)
      * @throws SecurityException if the adjustment triggers a Do Not Disturb change
      *   and the caller is not granted notification policy access.
      */
-    public void adjustStreamVolume(int streamType, int direction, int flags) {
+    public void adjustStreamVolume(int streamType, int direction, @PublicVolumeFlags int flags) {
         final IAudioService service = getService();
         try {
             service.adjustStreamVolumeWithAttribution(streamType, direction, flags,
@@ -1014,13 +1065,13 @@
      *            {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE},
      *            {@link #ADJUST_SAME}, {@link #ADJUST_MUTE},
      *            {@link #ADJUST_UNMUTE}, or {@link #ADJUST_TOGGLE_MUTE}.
-     * @param flags One or more flags.
+     * @param flags
      * @see #adjustSuggestedStreamVolume(int, int, int)
      * @see #adjustStreamVolume(int, int, int)
      * @see #setStreamVolume(int, int, int)
      * @see #isVolumeFixed()
      */
-    public void adjustVolume(int direction, int flags) {
+    public void adjustVolume(int direction, @PublicVolumeFlags int flags) {
         MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(getContext());
         helper.sendAdjustVolumeBy(USE_DEFAULT_STREAM_TYPE, direction, flags);
     }
@@ -1043,13 +1094,14 @@
      * @param suggestedStreamType The stream type that will be used if there
      *            isn't a relevant stream. {@link #USE_DEFAULT_STREAM_TYPE} is
      *            valid here.
-     * @param flags One or more flags.
+     * @param flags
      * @see #adjustVolume(int, int)
      * @see #adjustStreamVolume(int, int, int)
      * @see #setStreamVolume(int, int, int)
      * @see #isVolumeFixed()
      */
-    public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags) {
+    public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType,
+            @PublicVolumeFlags int flags) {
         MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(getContext());
         helper.sendAdjustVolumeBy(suggestedStreamType, direction, flags);
     }
@@ -1334,14 +1386,14 @@
      * @param streamType The stream whose volume index should be set.
      * @param index The volume index to set. See
      *            {@link #getStreamMaxVolume(int)} for the largest valid value.
-     * @param flags One or more flags.
+     * @param flags
      * @see #getStreamMaxVolume(int)
      * @see #getStreamVolume(int)
      * @see #isVolumeFixed()
      * @throws SecurityException if the volume change triggers a Do Not Disturb change
      *   and the caller is not granted notification policy access.
      */
-    public void setStreamVolume(int streamType, int index, int flags) {
+    public void setStreamVolume(int streamType, int index, @PublicVolumeFlags int flags) {
         final IAudioService service = getService();
         try {
             service.setStreamVolumeWithAttribution(streamType, index, flags,
@@ -1357,7 +1409,7 @@
      * @param index The volume index to set. See
      *          {@link #getMaxVolumeIndexForAttributes(AudioAttributes)} for the largest valid value
      *          {@link #getMinVolumeIndexForAttributes(AudioAttributes)} for the lowest valid value.
-     * @param flags One or more flags.
+     * @param flags
      * @see #getMaxVolumeIndexForAttributes(AudioAttributes)
      * @see #getMinVolumeIndexForAttributes(AudioAttributes)
      * @see #isVolumeFixed()
@@ -1365,7 +1417,8 @@
      */
     @SystemApi
     @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
-    public void setVolumeIndexForAttributes(@NonNull AudioAttributes attr, int index, int flags) {
+    public void setVolumeIndexForAttributes(@NonNull AudioAttributes attr, int index,
+            @SystemVolumeFlags int flags) {
         Preconditions.checkNotNull(attr, "attr must not be null");
         final IAudioService service = getService();
         int groupId = getVolumeGroupIdForAttributes(attr);
@@ -1451,7 +1504,7 @@
      * @param index The volume index to set. See
      *          {@link #getVolumeGroupMaxVolumeIndex(id)} for the largest valid value
      *          {@link #getVolumeGroupMinVolumeIndex(id)} for the lowest valid value.
-     * @param flags One or more flags.
+     * @param flags
      * @hide
      */
     @SystemApi
@@ -1552,11 +1605,11 @@
      * @param direction The direction to adjust the volume. One of
      *            {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or
      *            {@link #ADJUST_SAME}.
-     * @param flags One or more flags.
+     * @param flags
      * @throws SecurityException if the adjustment triggers a Do Not Disturb change and the caller
      * is not granted notification policy access.
      */
-    public void adjustVolumeGroupVolume(int groupId, int direction, @SystemVolumeFlags int flags) {
+    public void adjustVolumeGroupVolume(int groupId, int direction, @PublicVolumeFlags int flags) {
         IAudioService service = getService();
         try {
             service.adjustVolumeGroupVolume(groupId, direction, flags,
@@ -8234,7 +8287,7 @@
      *         {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE},
      *         {@link #ADJUST_SAME}, {@link #ADJUST_MUTE},
      *         {@link #ADJUST_UNMUTE}, or {@link #ADJUST_TOGGLE_MUTE}.
-     * @param flags One or more flags.
+     * @param flags
      * @param packageName the package name of client application
      * @param uid the uid of client application
      * @param pid the pid of client application
@@ -8247,7 +8300,8 @@
      * @hide
      */
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
-    public void adjustSuggestedStreamVolumeForUid(int suggestedStreamType, int direction, int flags,
+    public void adjustSuggestedStreamVolumeForUid(int suggestedStreamType, int direction,
+            @SystemVolumeFlags int flags,
             @NonNull String packageName, int uid, int pid, int targetSdkVersion) {
         try {
             getService().adjustSuggestedStreamVolumeForUid(suggestedStreamType, direction, flags,
@@ -8277,7 +8331,7 @@
      * @param direction The direction to adjust the volume. One of
      *         {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or
      *         {@link #ADJUST_SAME}.
-     * @param flags One or more flags.
+     * @param flags
      * @param packageName the package name of client application
      * @param uid the uid of client application
      * @param pid the pid of client application
@@ -8290,7 +8344,8 @@
      * @hide
      */
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
-    public void adjustStreamVolumeForUid(int streamType, int direction, int flags,
+    public void adjustStreamVolumeForUid(int streamType, int direction,
+            @SystemVolumeFlags int flags,
             @NonNull String packageName, int uid, int pid, int targetSdkVersion) {
         try {
             getService().adjustStreamVolumeForUid(streamType, direction, flags, packageName, uid,
@@ -8314,7 +8369,7 @@
      * @param streamType The stream whose volume index should be set.
      * @param index The volume index to set. See
      *         {@link #getStreamMaxVolume(int)} for the largest valid value.
-     * @param flags One or more flags.
+     * @param flags
      * @param packageName the package name of client application
      * @param uid the uid of client application
      * @param pid the pid of client application
@@ -8328,7 +8383,8 @@
      * @hide
      */
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
-    public void setStreamVolumeForUid(int streamType, int index, int flags,
+    public void setStreamVolumeForUid(int streamType, int index,
+            @SystemVolumeFlags int flags,
             @NonNull String packageName, int uid, int pid, int targetSdkVersion) {
         try {
             getService().setStreamVolumeForUid(streamType, index, flags, packageName, uid, pid,
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 293d3d2..e73cf87 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -70,7 +70,7 @@
         throw new UnsupportedOperationException("Trying to instantiate AudioSystem");
     }
 
-    /* These values must be kept in sync with system/audio.h */
+    /* These values must be kept in sync with system/media/audio/include/system/audio-hal-enums.h */
     /*
      * If these are modified, please also update Settings.System.VOLUME_SETTINGS
      * and attrs.xml and AudioManager.java.
@@ -961,7 +961,8 @@
      */
 
     //
-    // audio device definitions: must be kept in sync with values in system/core/audio.h
+    // audio device definitions: must be kept in sync with values
+    // in system/media/audio/include/system/audio-hal-enums.h
     //
     /** @hide */
     public static final int DEVICE_NONE = 0x0;
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index f9d4efe..fe5afc5 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -268,7 +268,7 @@
     boolean isVolumeControlUsingVolumeGroups();
 
     @EnforcePermission("MODIFY_AUDIO_SETTINGS_PRIVILEGED")
-    oneway void registerStreamAliasingDispatcher(IStreamAliasingDispatcher isad, boolean register);
+    void registerStreamAliasingDispatcher(IStreamAliasingDispatcher isad, boolean register);
 
     @EnforcePermission("MODIFY_AUDIO_SETTINGS_PRIVILEGED")
     void setNotifAliasRingForTest(boolean alias);
diff --git a/media/java/android/media/projection/IMediaProjection.aidl b/media/java/android/media/projection/IMediaProjection.aidl
index 2bdd5c8..e3829e6 100644
--- a/media/java/android/media/projection/IMediaProjection.aidl
+++ b/media/java/android/media/projection/IMediaProjection.aidl
@@ -23,22 +23,54 @@
 interface IMediaProjection {
     void start(IMediaProjectionCallback callback);
     void stop();
+
     boolean canProjectAudio();
     boolean canProjectVideo();
     boolean canProjectSecureVideo();
+
+    @JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest"
+            + ".permission.MANAGE_MEDIA_PROJECTION)")
     int applyVirtualDisplayFlags(int flags);
+
     void registerCallback(IMediaProjectionCallback callback);
+
     void unregisterCallback(IMediaProjectionCallback callback);
 
     /**
      * Returns the {@link android.os.IBinder} identifying the task to record, or {@code null} if
      * there is none.
      */
+    @JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest"
+            + ".permission.MANAGE_MEDIA_PROJECTION)")
     IBinder getLaunchCookie();
 
     /**
      * Updates the {@link android.os.IBinder} identifying the task to record, or {@code null} if
      * there is none.
      */
+    @JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest"
+            + ".permission.MANAGE_MEDIA_PROJECTION)")
     void setLaunchCookie(in IBinder launchCookie);
+
+    /**
+     * Returns {@code true} if this token is still valid. A token is valid as long as the token
+     * hasn't timed out before it was used, and the token is only used once.
+     *
+     * <p>If the {@link IMediaProjection} is not valid, then either throws an exception if the
+     * target SDK is at least {@code U}, or returns {@code false} for target SDK below {@code U}.
+     *
+     * @throws IllegalStateException If the caller's target SDK is at least {@code U} and the
+     * projection is not valid.
+     */
+    @JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest"
+            + ".permission.MANAGE_MEDIA_PROJECTION)")
+    boolean isValid();
+
+    /**
+     * Sets that {@link MediaProjection#createVirtualDisplay} has been invoked with this token (it
+     * should only be called once).
+     */
+    @JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest"
+            + ".permission.MANAGE_MEDIA_PROJECTION)")
+    void notifyVirtualDisplayCreated(int displayId);
 }
diff --git a/media/java/android/media/projection/IMediaProjectionManager.aidl b/media/java/android/media/projection/IMediaProjectionManager.aidl
index c259f9a..835e4c3 100644
--- a/media/java/android/media/projection/IMediaProjectionManager.aidl
+++ b/media/java/android/media/projection/IMediaProjectionManager.aidl
@@ -28,13 +28,38 @@
     @UnsupportedAppUsage
     boolean hasProjectionPermission(int uid, String packageName);
 
+    /**
+     * Returns a new {@link IMediaProjection} instance associated with the given package.
+     */
     @JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest"
             + ".permission.MANAGE_MEDIA_PROJECTION)")
     IMediaProjection createProjection(int uid, String packageName, int type,
             boolean permanentGrant);
 
+    /**
+     * Returns {@code true} if the given {@link IMediaProjection} corresponds to the current
+     * projection, or {@code false} otherwise.
+     */
+    @JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest"
+            + ".permission.MANAGE_MEDIA_PROJECTION)")
     boolean isCurrentProjection(IMediaProjection projection);
 
+    /**
+     * Reshows the permisison dialog for the user to review consent they've already granted in
+     * the given projection instance.
+     *
+     * <p>Preconditions:
+     * <ul>
+     *   <li>{@link IMediaProjection#isValid} returned false, rather than throwing an exception</li>
+     *   <li>Given projection instance is the current projection instance.</li>
+     * <ul>
+     *
+     * <p>Returns immediately but waits to start recording until user has reviewed their consent.
+     */
+    @JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest"
+            + ".permission.MANAGE_MEDIA_PROJECTION)")
+    void requestConsentForInvalidProjection(IMediaProjection projection);
+
     @JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest"
             + ".permission.MANAGE_MEDIA_PROJECTION)")
     MediaProjectionInfo getActiveProjectionInfo();
@@ -60,13 +85,18 @@
     void removeCallback(IMediaProjectionWatcherCallback callback);
 
     /**
-     * Updates the content recording session. If a different session is already in progress, then
-     * the pre-existing session is stopped, and the new incoming session takes over. Only updates
-     * the session if the given projection is valid.
+     * Returns {@code true} if it successfully updates the content recording session. Returns
+     * {@code false} otherwise, and stops the current projection.
+     *
+     * <p>If a different session is already in progress, then the pre-existing session is stopped,
+     * and the new incoming session takes over. Only updates the session if the given projection is
+     * valid.
      *
      * @param incomingSession the nullable incoming content recording session
      * @param projection      the non-null projection the session describes
      */
-    void setContentRecordingSession(in ContentRecordingSession incomingSession,
+  @JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest"
+            + ".permission.MANAGE_MEDIA_PROJECTION)")
+    boolean setContentRecordingSession(in ContentRecordingSession incomingSession,
             in IMediaProjection projection);
 }
diff --git a/media/java/android/media/projection/MediaProjection.java b/media/java/android/media/projection/MediaProjection.java
index e040bf4..f1cffb6 100644
--- a/media/java/android/media/projection/MediaProjection.java
+++ b/media/java/android/media/projection/MediaProjection.java
@@ -164,12 +164,21 @@
      * @param handler  The {@link android.os.Handler} on which the callback should be invoked, or
      *                 null if the callback should be invoked on the calling thread's main
      *                 {@link android.os.Looper}.
-     * @throws IllegalStateException If the target SDK is
-     *                               {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE U} and
-     *                               up and no {@link Callback}
-     *                               is registered. If the target SDK is less than
+     * @throws IllegalStateException In the following scenarios, if the target SDK is {@link
+     *                               android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE U} and up:
+     *                               <ol>
+     *                                 <li>If no {@link Callback} is registered.</li>
+     *                                 <li>If {@link MediaProjectionManager#getMediaProjection}
+     *                                 was invoked more than once to get this
+     *                                 {@code MediaProjection} instance.
+     *                                 <li>If this instance has already taken a recording through
+     *                                 {@code #createVirtualDisplay}.
+     *                               </ol>
+     *                               However, if the target SDK is less than
      *                               {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE U}, no
-     *                               exception is thrown.
+     *                               exception is thrown. In case 1, recording begins even without
+     *                               the callback. In case 2 & 3, recording doesn't begin
+     *                               until the user re-grants consent in the dialog.
      * @throws SecurityException If attempting to create a new virtual display associated with this
      *                           MediaProjection instance after it has been stopped by invoking
      *                           {@link #stop()}.
@@ -216,8 +225,13 @@
         // Pass in the current session details, so they are guaranteed to only be set in
         // WindowManagerService AFTER a VirtualDisplay is constructed (assuming there are no
         // errors during set-up).
+        // Do not introduce a separate aidl call here to prevent a race
+        // condition between setting up the VirtualDisplay and checking token validity.
         virtualDisplayConfig.setWindowManagerMirroringEnabled(true);
         // Do not declare a display id to mirror; default to the default display.
+        // DisplayManagerService will ask MediaProjectionManagerService to check if the app
+        // is re-using consent. Always return the projection instance to keep this call
+        // non-blocking; no content is sent to the app until the user re-grants consent.
         final VirtualDisplay virtualDisplay = mDisplayManager.createVirtualDisplay(this,
                 virtualDisplayConfig.build(), callback, handler);
         if (virtualDisplay == null) {
@@ -339,6 +353,7 @@
     private final class MediaProjectionCallback extends IMediaProjectionCallback.Stub {
         @Override
         public void onStop() {
+            Slog.v(TAG, "Dispatch stop to " + mCallbacks.size() + " callbacks.");
             for (CallbackRecord cbr : mCallbacks.values()) {
                 cbr.onStop();
             }
diff --git a/media/java/android/media/projection/MediaProjectionManager.java b/media/java/android/media/projection/MediaProjectionManager.java
index 30fccf4..5703c42 100644
--- a/media/java/android/media/projection/MediaProjectionManager.java
+++ b/media/java/android/media/projection/MediaProjectionManager.java
@@ -231,6 +231,8 @@
         if (projection == null) {
             return null;
         }
+        // Don't do anything here if app is re-using the token; we check how often
+        // IMediaProjection#start is invoked. Fail to the app when they start recording.
         return new MediaProjection(mContext, IMediaProjection.Stub.asInterface(projection));
     }
 
diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java
index 37050df..62c4a51 100644
--- a/media/java/android/media/session/MediaController.java
+++ b/media/java/android/media/session/MediaController.java
@@ -29,6 +29,7 @@
 import android.media.AudioManager;
 import android.media.MediaMetadata;
 import android.media.Rating;
+import android.media.RoutingSessionInfo;
 import android.media.VolumeProvider;
 import android.media.VolumeProvider.ControlType;
 import android.media.session.MediaSession.QueueItem;
@@ -1001,8 +1002,11 @@
          * @param maxVolume The max volume. Should be equal or greater than zero.
          * @param currentVolume The current volume. Should be in the interval [0, maxVolume].
          * @param audioAttrs The audio attributes for this playback. Should not be null.
-         * @param volumeControlId The volume control ID. This is used for matching
-         *                        {@link RoutingSessionInfo} and {@link MediaSession}.
+         * @param volumeControlId The {@link RoutingSessionInfo#getId() routing session id} of the
+         *     {@link RoutingSessionInfo} associated with this controller, or null if not
+         *     applicable. This id allows mapping this controller to a routing session which, when
+         *     applicable, provides information about the remote device, and support for volume
+         *     adjustment.
          * @hide
          */
         @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index 031c3ff..0d9bd65 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -1169,7 +1169,7 @@
          * @param flags flags containing extra action or information regarding the volume change
          */
         void onVolumeChanged(@NonNull MediaSession.Token sessionToken,
-                @AudioManager.Flags int flags);
+                @AudioManager.SystemVolumeFlags int flags);
 
         /**
          * Called when the default remote session is changed where the default remote session
diff --git a/media/java/android/media/soundtrigger/OWNERS b/media/java/android/media/soundtrigger/OWNERS
index 01b2cb9..85f7a4d 100644
--- a/media/java/android/media/soundtrigger/OWNERS
+++ b/media/java/android/media/soundtrigger/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 48436
 [email protected]
 [email protected]
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 9a4aa33..dea7f03 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -43,6 +43,8 @@
 
 #include <android_runtime/android_hardware_HardwareBuffer.h>
 
+#include <android-base/stringprintf.h>
+
 #include <binder/MemoryDealer.h>
 
 #include <cutils/compiler.h>
@@ -1276,7 +1278,8 @@
                     ALOGE("Could not create MediaCodec.BufferInfo.");
                     env->ExceptionClear();
                 }
-                jniThrowException(env, "java/lang/IllegalStateException", NULL);
+                jniThrowException(env, "java/lang/IllegalStateException",
+                                  "Fatal error: could not create MediaCodec.BufferInfo object");
                 return;
             }
 
@@ -1309,7 +1312,8 @@
                     ALOGE("Could not create CodecException object.");
                     env->ExceptionClear();
                 }
-                jniThrowException(env, "java/lang/IllegalStateException", NULL);
+                jniThrowException(env, "java/lang/IllegalStateException",
+                                  "Fatal error: could not create CodecException object");
                 return;
             }
 
@@ -1322,7 +1326,9 @@
             CHECK(msg->findMessage("format", &format));
 
             if (OK != ConvertMessageToMap(env, format, &obj)) {
-                jniThrowException(env, "java/lang/IllegalStateException", NULL);
+                jniThrowException(env, "java/lang/IllegalStateException",
+                                  "Fatal error: failed to convert format "
+                                  "from native to Java object");
                 return;
             }
 
@@ -1353,7 +1359,8 @@
 
     status_t err = ConvertMessageToMap(env, data, &obj);
     if (err != OK) {
-        jniThrowException(env, "java/lang/IllegalStateException", NULL);
+        jniThrowException(env, "java/lang/IllegalStateException",
+                          "Fatal error: failed to convert format from native to Java object");
         return;
     }
 
@@ -1374,7 +1381,8 @@
 
     status_t err = ConvertMessageToMap(env, data, &obj);
     if (err != OK) {
-        jniThrowException(env, "java/lang/IllegalStateException", NULL);
+        jniThrowException(env, "java/lang/IllegalStateException",
+                          "Fatal error: failed to convert format from native to Java object");
         return;
     }
 
@@ -1385,6 +1393,18 @@
     env->DeleteLocalRef(obj);
 }
 
+std::string JMediaCodec::getExceptionMessage(const char *msg = nullptr) const {
+    if (mCodec == nullptr) {
+        return msg ?: "";
+    }
+    std::string prefix = "";
+    if (msg && msg[0] != '\0') {
+        prefix.append(msg);
+        prefix.append("\n");
+    }
+    return prefix + mCodec->getErrorLog().extract();
+}
+
 void JMediaCodec::onMessageReceived(const sp<AMessage> &msg) {
     switch (msg->what()) {
         case kWhatCallbackNotify:
@@ -1471,9 +1491,17 @@
     env->Throw(exception);
 }
 
+static std::string GetExceptionMessage(const sp<JMediaCodec> &codec, const char *msg) {
+    if (codec == NULL) {
+        return msg ?: "codec is released already";
+    }
+    return codec->getExceptionMessage(msg);
+}
+
 static jint throwExceptionAsNecessary(
         JNIEnv *env, status_t err, int32_t actionCode = ACTION_CODE_FATAL,
-        const char *msg = NULL, const sp<ICrypto>& crypto = NULL) {
+        const char *msg = NULL, const sp<ICrypto>& crypto = NULL,
+        const sp<JMediaCodec> &codec = NULL) {
     switch (err) {
         case OK:
             return 0;
@@ -1488,23 +1516,38 @@
             return DEQUEUE_INFO_OUTPUT_BUFFERS_CHANGED;
 
         case INVALID_OPERATION:
-            jniThrowException(env, "java/lang/IllegalStateException", msg);
+            jniThrowException(
+                    env, "java/lang/IllegalStateException",
+                    GetExceptionMessage(codec, msg).c_str());
             return 0;
 
         case BAD_VALUE:
-            jniThrowException(env, "java/lang/IllegalArgumentException", msg);
+            jniThrowException(
+                    env, "java/lang/IllegalArgumentException",
+                    GetExceptionMessage(codec, msg).c_str());
             return 0;
 
         default:
             if (isCryptoError(err)) {
-                throwCryptoException(env, err, msg, crypto);
+                throwCryptoException(
+                        env, err,
+                        GetExceptionMessage(codec, msg).c_str(),
+                        crypto);
                 return 0;
             }
-            throwCodecException(env, err, actionCode, msg);
+            throwCodecException(
+                    env, err, actionCode,
+                    GetExceptionMessage(codec, msg).c_str());
             return 0;
     }
 }
 
+static jint throwExceptionAsNecessary(
+        JNIEnv *env, status_t err, const sp<JMediaCodec> &codec,
+        int32_t actionCode = ACTION_CODE_FATAL) {
+    return throwExceptionAsNecessary(env, err, actionCode, NULL, NULL, codec);
+}
+
 static void android_media_MediaCodec_native_enableOnFirstTunnelFrameReadyListener(
         JNIEnv *env,
         jobject thiz,
@@ -1512,13 +1555,13 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     status_t err = codec->enableOnFirstTunnelFrameReadyListener(enabled);
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 }
 
 static void android_media_MediaCodec_native_enableOnFrameRenderedListener(
@@ -1528,13 +1571,13 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     status_t err = codec->enableOnFrameRenderedListener(enabled);
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 }
 
 static void android_media_MediaCodec_native_setCallback(
@@ -1544,13 +1587,13 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     status_t err = codec->setCallback(cb);
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 }
 
 static void android_media_MediaCodec_native_configure(
@@ -1564,7 +1607,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
@@ -1602,7 +1645,7 @@
 
     err = codec->configure(format, bufferProducer, crypto, descrambler, flags);
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 }
 
 static void android_media_MediaCodec_native_setSurface(
@@ -1612,7 +1655,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
@@ -1631,7 +1674,7 @@
     }
 
     status_t err = codec->setSurface(bufferProducer);
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 }
 
 sp<PersistentSurface> android_media_MediaCodec_getPersistentInputSurface(
@@ -1735,7 +1778,7 @@
 
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
@@ -1749,7 +1792,7 @@
     }
     status_t err = codec->setInputSurface(persistentSurface);
     if (err != NO_ERROR) {
-        throwExceptionAsNecessary(env, err);
+        throwExceptionAsNecessary(env, err, codec);
     }
 }
 
@@ -1759,7 +1802,7 @@
 
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return NULL;
     }
 
@@ -1767,7 +1810,7 @@
     sp<IGraphicBufferProducer> bufferProducer;
     status_t err = codec->createInputSurface(&bufferProducer);
     if (err != NO_ERROR) {
-        throwExceptionAsNecessary(env, err);
+        throwExceptionAsNecessary(env, err, codec);
         return NULL;
     }
 
@@ -1782,13 +1825,13 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     status_t err = codec->start();
 
-    throwExceptionAsNecessary(env, err, ACTION_CODE_FATAL, "start failed");
+    throwExceptionAsNecessary(env, err, codec);
 }
 
 static void android_media_MediaCodec_stop(JNIEnv *env, jobject thiz) {
@@ -1797,13 +1840,13 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     status_t err = codec->stop();
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 }
 
 static void android_media_MediaCodec_reset(JNIEnv *env, jobject thiz) {
@@ -1812,7 +1855,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
@@ -1825,7 +1868,7 @@
         // trigger an IllegalStateException.
         err = UNKNOWN_ERROR;
     }
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 }
 
 static void android_media_MediaCodec_flush(JNIEnv *env, jobject thiz) {
@@ -1834,13 +1877,13 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     status_t err = codec->flush();
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 }
 
 static void android_media_MediaCodec_queueInputBuffer(
@@ -1856,7 +1899,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
@@ -1866,7 +1909,8 @@
             index, offset, size, timestampUs, flags, &errorDetailMsg);
 
     throwExceptionAsNecessary(
-            env, err, ACTION_CODE_FATAL, errorDetailMsg.empty() ? NULL : errorDetailMsg.c_str());
+            env, err, ACTION_CODE_FATAL,
+            codec->getExceptionMessage(errorDetailMsg.c_str()).c_str());
 }
 
 struct NativeCryptoInfo {
@@ -1890,7 +1934,9 @@
         } else if (jmode == gCryptoModes.AesCbc) {
             mMode = CryptoPlugin::kMode_AES_CBC;
         }  else {
-            throwExceptionAsNecessary(env, INVALID_OPERATION);
+            throwExceptionAsNecessary(
+                    env, INVALID_OPERATION, ACTION_CODE_FATAL,
+                    base::StringPrintf("unrecognized crypto mode: %d", jmode).c_str());
             return;
         }
 
@@ -2026,7 +2072,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
@@ -2056,7 +2102,9 @@
     } else if (jmode == gCryptoModes.AesCbc) {
         mode = CryptoPlugin::kMode_AES_CBC;
     }  else {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(
+                env, INVALID_OPERATION, ACTION_CODE_FATAL,
+                base::StringPrintf("Unrecognized crypto mode: %d", jmode).c_str());
         return;
     }
 
@@ -2175,8 +2223,8 @@
     subSamples = NULL;
 
     throwExceptionAsNecessary(
-            env, err, ACTION_CODE_FATAL, errorDetailMsg.empty() ? NULL : errorDetailMsg.c_str(),
-            codec->getCrypto());
+            env, err, ACTION_CODE_FATAL,
+            codec->getExceptionMessage(errorDetailMsg.c_str()).c_str(), codec->getCrypto());
 }
 
 static jobject android_media_MediaCodec_mapHardwareBuffer(JNIEnv *env, jclass, jobject bufferObj) {
@@ -2518,14 +2566,16 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == nullptr || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     sp<AMessage> tunings;
     status_t err = ConvertKeyValueListsToAMessage(env, keys, values, &tunings);
     if (err != OK) {
-        throwExceptionAsNecessary(env, err);
+        throwExceptionAsNecessary(
+                env, err, ACTION_CODE_FATAL,
+                "error occurred while converting tunings from Java to native");
         return;
     }
 
@@ -2545,15 +2595,23 @@
         }
         env->MonitorExit(lock.get());
     } else {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(
+                env, INVALID_OPERATION, ACTION_CODE_FATAL,
+                "Failed to grab lock for a LinearBlock object");
         return;
     }
 
     AString errorDetailMsg;
     if (codec->hasCryptoOrDescrambler()) {
         if (!memory) {
+            // It means there was an unexpected failure in extractMemoryFromContext above
             ALOGI("queueLinearBlock: no ashmem memory for encrypted content");
-            throwExceptionAsNecessary(env, BAD_VALUE);
+            throwExceptionAsNecessary(
+                    env, BAD_VALUE, ACTION_CODE_FATAL,
+                    "Unexpected error: the input buffer is not compatible with "
+                    "the secure codec, and a fallback logic failed.\n"
+                    "Suggestion: please try including the secure codec when calling "
+                    "MediaCodec.LinearBlock#obtain method to obtain a compatible buffer.");
             return;
         }
         auto cryptoInfo =
@@ -2577,14 +2635,22 @@
         ALOGI_IF(err != OK, "queueEncryptedLinearBlock returned err = %d", err);
     } else {
         if (!buffer) {
+            // It means there was an unexpected failure in extractBufferFromContext above
             ALOGI("queueLinearBlock: no C2Buffer found");
-            throwExceptionAsNecessary(env, BAD_VALUE);
+            throwExceptionAsNecessary(
+                    env, BAD_VALUE, ACTION_CODE_FATAL,
+                    "Unexpected error: the input buffer is not compatible with "
+                    "the non-secure codec, and a fallback logic failed.\n"
+                    "Suggestion: please do not include the secure codec when calling "
+                    "MediaCodec.LinearBlock#obtain method to obtain a compatible buffer.");
             return;
         }
         err = codec->queueBuffer(
                 index, buffer, presentationTimeUs, flags, tunings, &errorDetailMsg);
     }
-    throwExceptionAsNecessary(env, err, ACTION_CODE_FATAL, errorDetailMsg.c_str());
+    throwExceptionAsNecessary(
+            env, err, ACTION_CODE_FATAL,
+            codec->getExceptionMessage(errorDetailMsg.c_str()).c_str());
 }
 
 static void android_media_MediaCodec_native_queueHardwareBuffer(
@@ -2595,14 +2661,16 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     sp<AMessage> tunings;
     status_t err = ConvertKeyValueListsToAMessage(env, keys, values, &tunings);
     if (err != OK) {
-        throwExceptionAsNecessary(env, err);
+        throwExceptionAsNecessary(
+                env, err, ACTION_CODE_FATAL,
+                "error occurred while converting tunings from Java to native");
         return;
     }
 
@@ -2627,7 +2695,9 @@
         ALOGW("Failed to wrap AHardwareBuffer into C2GraphicAllocation");
         native_handle_close(handle);
         native_handle_delete(handle);
-        throwExceptionAsNecessary(env, BAD_VALUE);
+        throwExceptionAsNecessary(
+                env, BAD_VALUE, ACTION_CODE_FATAL,
+                "HardwareBuffer not recognized");
         return;
     }
     std::shared_ptr<C2GraphicBlock> block = _C2BlockFactory::CreateGraphicBlock(alloc);
@@ -2636,7 +2706,9 @@
     AString errorDetailMsg;
     err = codec->queueBuffer(
             index, buffer, presentationTimeUs, flags, tunings, &errorDetailMsg);
-    throwExceptionAsNecessary(env, err, ACTION_CODE_FATAL, errorDetailMsg.c_str());
+    throwExceptionAsNecessary(
+            env, err, ACTION_CODE_FATAL,
+            codec->getExceptionMessage(errorDetailMsg.c_str()).c_str());
 }
 
 static void android_media_MediaCodec_native_getOutputFrame(
@@ -2646,13 +2718,13 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     status_t err = codec->getOutputFrame(env, frame, index);
     if (err != OK) {
-        throwExceptionAsNecessary(env, err);
+        throwExceptionAsNecessary(env, err, codec);
     }
 }
 
@@ -2663,7 +2735,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return -1;
     }
 
@@ -2674,7 +2746,7 @@
         return (jint) index;
     }
 
-    return throwExceptionAsNecessary(env, err);
+    return throwExceptionAsNecessary(env, err, codec);
 }
 
 static jint android_media_MediaCodec_dequeueOutputBuffer(
@@ -2684,7 +2756,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return 0;
     }
 
@@ -2696,7 +2768,7 @@
         return (jint) index;
     }
 
-    return throwExceptionAsNecessary(env, err);
+    return throwExceptionAsNecessary(env, err, codec);
 }
 
 static void android_media_MediaCodec_releaseOutputBuffer(
@@ -2707,13 +2779,13 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     status_t err = codec->releaseOutputBuffer(index, render, updatePTS, timestampNs);
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 }
 
 static void android_media_MediaCodec_signalEndOfInputStream(JNIEnv* env,
@@ -2722,13 +2794,13 @@
 
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     status_t err = codec->signalEndOfInputStream();
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 }
 
 static jobject android_media_MediaCodec_getFormatNative(
@@ -2738,7 +2810,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return NULL;
     }
 
@@ -2749,7 +2821,7 @@
         return format;
     }
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 
     return NULL;
 }
@@ -2761,7 +2833,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return NULL;
     }
 
@@ -2772,7 +2844,7 @@
         return format;
     }
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 
     return NULL;
 }
@@ -2784,7 +2856,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return NULL;
     }
 
@@ -2797,7 +2869,7 @@
 
     // if we're out of memory, an exception was already thrown
     if (err != NO_MEMORY) {
-        throwExceptionAsNecessary(env, err);
+        throwExceptionAsNecessary(env, err, codec);
     }
 
     return NULL;
@@ -2810,7 +2882,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return NULL;
     }
 
@@ -2823,7 +2895,7 @@
 
     // if we're out of memory, an exception was already thrown
     if (err != NO_MEMORY) {
-        throwExceptionAsNecessary(env, err);
+        throwExceptionAsNecessary(env, err, codec);
     }
 
     return NULL;
@@ -2836,7 +2908,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return NULL;
     }
 
@@ -2849,7 +2921,7 @@
 
     // if we're out of memory, an exception was already thrown
     if (err != NO_MEMORY) {
-        throwExceptionAsNecessary(env, err);
+        throwExceptionAsNecessary(env, err, codec);
     }
 
     return NULL;
@@ -2862,7 +2934,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return NULL;
     }
 
@@ -2873,7 +2945,7 @@
         return name;
     }
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 
     return NULL;
 }
@@ -2885,7 +2957,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return NULL;
     }
 
@@ -2896,7 +2968,7 @@
         return codecInfoObj;
     }
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 
     return NULL;
 }
@@ -2908,7 +2980,8 @@
 
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
     if (codec == NULL || codec->initCheck() != OK) {
-        jniThrowException(env, "java/lang/IllegalStateException", NULL);
+        jniThrowException(env, "java/lang/IllegalStateException",
+                          GetExceptionMessage(codec, NULL).c_str());
         return 0;
     }
 
@@ -2937,7 +3010,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
@@ -2948,7 +3021,7 @@
         err = codec->setParameters(params);
     }
 
-    throwExceptionAsNecessary(env, err);
+    throwExceptionAsNecessary(env, err, codec);
 }
 
 static void android_media_MediaCodec_setVideoScalingMode(
@@ -2956,13 +3029,14 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     if (mode != NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW
             && mode != NATIVE_WINDOW_SCALING_MODE_SCALE_CROP) {
-        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+        jniThrowException(env, "java/lang/IllegalArgumentException",
+                          String8::format("Unrecognized mode: %d", mode));
         return;
     }
 
@@ -2974,7 +3048,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
@@ -2986,14 +3060,14 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return NULL;
     }
 
     jobject ret = NULL;
     status_t status = codec->querySupportedVendorParameters(env, &ret);
     if (status != OK) {
-        throwExceptionAsNecessary(env, status);
+        throwExceptionAsNecessary(env, status, codec);
     }
 
     return ret;
@@ -3004,7 +3078,7 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return NULL;
     }
 
@@ -3021,13 +3095,13 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     status_t status = codec->subscribeToVendorParameters(env, names);
     if (status != OK) {
-        throwExceptionAsNecessary(env, status);
+        throwExceptionAsNecessary(env, status, codec);
     }
     return;
 }
@@ -3037,13 +3111,13 @@
     sp<JMediaCodec> codec = getMediaCodec(env, thiz);
 
     if (codec == NULL || codec->initCheck() != OK) {
-        throwExceptionAsNecessary(env, INVALID_OPERATION);
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
         return;
     }
 
     status_t status = codec->unsubscribeFromVendorParameters(env, names);
     if (status != OK) {
-        throwExceptionAsNecessary(env, status);
+        throwExceptionAsNecessary(env, status, codec);
     }
     return;
 }
@@ -3440,11 +3514,15 @@
         if (!context->mReadonlyMapping) {
             const C2BufferData data = buffer->data();
             if (data.type() != C2BufferData::LINEAR) {
-                throwExceptionAsNecessary(env, INVALID_OPERATION);
+                throwExceptionAsNecessary(
+                        env, INVALID_OPERATION, ACTION_CODE_FATAL,
+                        "Underlying buffer is not a linear buffer");
                 return nullptr;
             }
             if (data.linearBlocks().size() != 1u) {
-                throwExceptionAsNecessary(env, INVALID_OPERATION);
+                throwExceptionAsNecessary(
+                        env, INVALID_OPERATION, ACTION_CODE_FATAL,
+                        "Underlying buffer contains more than one block");
                 return nullptr;
             }
             C2ConstLinearBlock block = data.linearBlocks().front();
@@ -3492,7 +3570,9 @@
                 false,  // readOnly
                 true /* clearBuffer */);
     }
-    throwExceptionAsNecessary(env, INVALID_OPERATION);
+    throwExceptionAsNecessary(
+            env, INVALID_OPERATION, ACTION_CODE_FATAL,
+            "Underlying buffer is empty");
     return nullptr;
 }
 
@@ -3515,7 +3595,9 @@
         }
         const char *cstr = env->GetStringUTFChars(jstr, nullptr);
         if (cstr == nullptr) {
-            throwExceptionAsNecessary(env, BAD_VALUE);
+            throwExceptionAsNecessary(
+                    env, BAD_VALUE, ACTION_CODE_FATAL,
+                    "Error converting Java string to native");
             return;
         }
         names->emplace_back(cstr);
@@ -3567,6 +3649,7 @@
     }
     status_t err = MediaCodec::CanFetchLinearBlock(names, &isCompatible);
     if (err != OK) {
+        // TODO: CodecErrorLog
         throwExceptionAsNecessary(env, err);
     }
     return isCompatible;
diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h
index 616c31b..fbaf64f 100644
--- a/media/jni/android_media_MediaCodec.h
+++ b/media/jni/android_media_MediaCodec.h
@@ -176,6 +176,8 @@
 
     const sp<ICrypto> &getCrypto() { return mCrypto; }
 
+    std::string getExceptionMessage(const char *msg) const;
+
 protected:
     virtual ~JMediaCodec();
 
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java
index 2b7bcbe..cc7a7d5 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java
@@ -161,7 +161,8 @@
                             ICameraService.USE_CALLING_UID,
                             ICameraService.USE_CALLING_PID,
                             getContext().getApplicationInfo().targetSdkVersion,
-                            /*overrideToPortrait*/false);
+                            /*overrideToPortrait*/false,
+                            /*forceSlowJpegMode*/false);
             assertNotNull(String.format("Camera %s was null", cameraId), cameraUser);
 
             Log.v(TAG, String.format("Camera %s connected", cameraId));
diff --git a/media/tests/projection/src/android/media/projection/FakeIMediaProjection.java b/media/tests/projection/src/android/media/projection/FakeIMediaProjection.java
index 3cfc0fe..4952e01 100644
--- a/media/tests/projection/src/android/media/projection/FakeIMediaProjection.java
+++ b/media/tests/projection/src/android/media/projection/FakeIMediaProjection.java
@@ -62,12 +62,10 @@
 
     @Override
     public void registerCallback(IMediaProjectionCallback callback) throws RemoteException {
-
     }
 
     @Override
     public void unregisterCallback(IMediaProjectionCallback callback) throws RemoteException {
-
     }
 
     @Override
@@ -79,4 +77,14 @@
     public void setLaunchCookie(IBinder launchCookie) throws RemoteException {
         mLaunchCookie = launchCookie;
     }
+
+    @Override
+    public boolean isValid() throws RemoteException {
+        return true;
+    }
+
+
+    @Override
+    public void notifyVirtualDisplayCreated(int displayId) throws RemoteException {
+    }
 }
diff --git a/native/android/tests/activitymanager/nativeTests/Android.bp b/native/android/tests/activitymanager/nativeTests/Android.bp
index 528ac12..ebd7533 100644
--- a/native/android/tests/activitymanager/nativeTests/Android.bp
+++ b/native/android/tests/activitymanager/nativeTests/Android.bp
@@ -45,4 +45,7 @@
     required: [
         "UidImportanceHelperApp",
     ],
+    data: [
+        ":UidImportanceHelperApp",
+    ],
 }
diff --git a/packages/CarrierDefaultApp/res/values-ar/strings.xml b/packages/CarrierDefaultApp/res/values-ar/strings.xml
index e8fa546..fe746f2 100644
--- a/packages/CarrierDefaultApp/res/values-ar/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ar/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Carrier Communications"</string>
     <string name="android_system_label" msgid="2797790869522345065">"مُشغل شبكة الجوال"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"نفدت بيانات الجوّال"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"تم إيقاف بيانات الجوال"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"على سبيل المثال، قد لا تنتمي صفحة تسجيل الدخول إلى المؤسسة المعروضة."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"المتابعة على أي حال عبر المتصفح"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"تطبيق تعزيز الأداء"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"خيارات شبكة الجيل الخامس من مشغِّل شبكة الجوّال"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"‏يمكنك زيارة موقع %s الإلكتروني للاطّلاع على خيارات حول تجربة الاستخدام داخل التطبيق."</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"لاحقًا"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"إدارة"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"شراء تطبيق تعزيز الأداء"</string>
diff --git a/packages/CarrierDefaultApp/res/values-be/strings.xml b/packages/CarrierDefaultApp/res/values-be/strings.xml
index cd0974e..7ad11fb 100644
--- a/packages/CarrierDefaultApp/res/values-be/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-be/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Аператар сувязі"</string>
     <string name="android_system_label" msgid="2797790869522345065">"Аператар мабільнай сувязі"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Мабільныя даныя скончыліся"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"Перадача мабільных даных была дэактывавана"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"Напрыклад, старонка ўваходу можа не належаць указанай арганізацыі."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"Усё роўна працягнуць праз браўзер"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Павышэнне прадукцыйнасці"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"Сувязь 5G ад аператара"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"Каб паглядзець даступныя варыянты, наведайце вэб-сайт аператара \"%s\""</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Не цяпер"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Кіраваць"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"Аплаціце павышэнне прадукцыйнасці."</string>
diff --git a/packages/CarrierDefaultApp/res/values-cs/strings.xml b/packages/CarrierDefaultApp/res/values-cs/strings.xml
index 8ede78a..5fe8afb 100644
--- a/packages/CarrierDefaultApp/res/values-cs/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-cs/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Komunikace s operátorem"</string>
     <string name="android_system_label" msgid="2797790869522345065">"Mobilní operátor"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Mobilní data byla vyčerpána"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"Mobilní data byla deaktivována"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"Přihlašovací stránka například nemusí patřit zobrazované organizaci."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"Přesto pokračovat prostřednictvím prohlížeče"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Zvýšení výkonu"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"Možnosti 5G od vašeho operátora"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"Navštivte web operátora %s a podívejte se na možnosti pro vaši aplikaci"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Teď ne"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Spravovat"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"Kupte si zvýšení výkonu."</string>
diff --git a/packages/CarrierDefaultApp/res/values-da/strings.xml b/packages/CarrierDefaultApp/res/values-da/strings.xml
index 57f8b1a..4a36695 100644
--- a/packages/CarrierDefaultApp/res/values-da/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-da/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Kommunikation fra mobilselskab"</string>
     <string name="android_system_label" msgid="2797790869522345065">"Mobilselskab"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Der er ikke mere mobildata"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"Mobildata er blevet deaktiveret"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"Det er f.eks. ikke sikkert, at loginsiden tilhører den anførte organisation."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"Fortsæt alligevel via browseren"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Ydeevneboost"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G-valgmuligheder fra dit mobilselskab"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"Gå til websitet for %s for at se valgmuligheder for din appoplevelse"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ikke nu"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Administrer"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"Køb et ydeevneboost."</string>
diff --git a/packages/CarrierDefaultApp/res/values-fi/strings.xml b/packages/CarrierDefaultApp/res/values-fi/strings.xml
index fc51611..d5a2424 100644
--- a/packages/CarrierDefaultApp/res/values-fi/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-fi/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Operaattoriviestintä"</string>
     <string name="android_system_label" msgid="2797790869522345065">"Mobiilioperaattori"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Mobiilidata on loppunut."</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"Mobiilidata poistettu käytöstä"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"Kirjautumissivu ei välttämättä kuulu näytetylle organisaatiolle."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"Jatka selaimen kautta"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Suorituskykyboosti"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"Operaattorin 5G-vaihtoehdot"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"Vieraile verkkosivustolla (%s) nähdäksesi sovelluskokemuksen vaihtoehdot"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ei nyt"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Muuta"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"Osta suorituskykyboosti."</string>
diff --git a/packages/CarrierDefaultApp/res/values-fr-rCA/strings.xml b/packages/CarrierDefaultApp/res/values-fr-rCA/strings.xml
index 42dca42..54dae62 100644
--- a/packages/CarrierDefaultApp/res/values-fr-rCA/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-fr-rCA/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Communications du fournisseur de services"</string>
     <string name="android_system_label" msgid="2797790869522345065">"Fournisseur de services"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Vous avez épuisé votre forfait de données cellulaires"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"Les données cellulaires ont été désactivées pour votre compte"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"Par exemple, la page de connexion pourrait ne pas appartenir à l\'organisation représentée."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"Continuer quand même dans un navigateur"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Optimiseur de performances"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"Options 5G de votre fournisseur de services"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"Consultez le site Web de %s pour voir les options concernant votre expérience de l\'application"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Plus tard"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Gérer"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"Achetez un optimiseur de performances."</string>
diff --git a/packages/CarrierDefaultApp/res/values-gl/strings.xml b/packages/CarrierDefaultApp/res/values-gl/strings.xml
index ad2fdce..6d3c85e 100644
--- a/packages/CarrierDefaultApp/res/values-gl/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-gl/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Comunicacións do operador"</string>
     <string name="android_system_label" msgid="2797790869522345065">"Operador móbil"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Esgotáronse os datos móbiles"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"Desactiváronse os datos móbiles"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"Por exemplo, é posible que a páxina de inicio de sesión non pertenza á organización que se mostra."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"Continuar igualmente co navegador"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Mellora de rendemento"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opcións de 5G do teu operador"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"Vai ao sitio web de %s para ver as opcións relacionadas coa túa experiencia na aplicación"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Agora non"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Xestionar"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"Comprar unha mellora de rendemento."</string>
diff --git a/packages/CarrierDefaultApp/res/values-hy/strings.xml b/packages/CarrierDefaultApp/res/values-hy/strings.xml
index bca95a30..8cc0fc6 100644
--- a/packages/CarrierDefaultApp/res/values-hy/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-hy/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Carrier Communications"</string>
     <string name="android_system_label" msgid="2797790869522345065">"Բջջային օպերատոր"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Բջջային ինտերնետի սահմանաչափը սպառվել է"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"Ձեր բջջային ինտերնետն ապակտիվացված է"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"Օրինակ՝ մուտքի էջը կարող է ցուցադրված կազմակերպության էջը չլինել:"</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"Շարունակել դիտարկիչի միջոցով"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Արտադրողականության բարձրացում"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G ցանցով տարբերակներ՝ կապի օպերատորից"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"Այցելեք %s-ի կայք՝ տեսնելու, թե ինչպես կարելի է բարձրացնել ձեր հավելվածի արդյունավետությունը"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ոչ հիմա"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Կառավարել"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"Բարձրացրեք ցանցի արտադրողականությունը վճարի դիմաց։"</string>
diff --git a/packages/CarrierDefaultApp/res/values-it/strings.xml b/packages/CarrierDefaultApp/res/values-it/strings.xml
index f608ae9..82a5cab 100644
--- a/packages/CarrierDefaultApp/res/values-it/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-it/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Comunicazioni con l\'operatore"</string>
     <string name="android_system_label" msgid="2797790869522345065">"Operatore di telefonia mobile"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Dati mobili esauriti"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"I dati mobili sono stati disattivati"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"Ad esempio, la pagina di accesso potrebbe non appartenere all\'organizzazione indicata."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"Continua comunque dal browser"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Aumento di prestazioni"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"Opzioni 5G del tuo operatore"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"Visita il sito web di %s per vedere le opzioni di esperienza dell\'app"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Non ora"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Gestisci"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"Acquista un aumento di prestazioni."</string>
diff --git a/packages/CarrierDefaultApp/res/values-ja/strings.xml b/packages/CarrierDefaultApp/res/values-ja/strings.xml
index 1fcbd7e..2bcdaac 100644
--- a/packages/CarrierDefaultApp/res/values-ja/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ja/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Carrier Communications"</string>
     <string name="android_system_label" msgid="2797790869522345065">"携帯通信会社"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"モバイルデータの残量がありません"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"モバイルデータが無効になっています"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"たとえば、ログインページが表示されている組織に属していない可能性があります。"</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"ブラウザから続行"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"パフォーマンス ブースト"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"ご利用の携帯通信会社の 5G オプション"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"アプリのパフォーマンスを向上させるためのオプションを確認するには、%s のウェブサイトにアクセスしてください"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"後で"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"管理"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"パフォーマンス ブーストを購入してください。"</string>
diff --git a/packages/CarrierDefaultApp/res/values-mk/strings.xml b/packages/CarrierDefaultApp/res/values-mk/strings.xml
index 4965d56..ade6886 100644
--- a/packages/CarrierDefaultApp/res/values-mk/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-mk/strings.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2809080280462257271">"Комуникации со давателот на услугата"</string>
+    <string name="app_name" msgid="2809080280462257271">"Известувања од операторот"</string>
     <string name="android_system_label" msgid="2797790869522345065">"Мобилен оператор"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Мобилниот интернет е искористен"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"Мобилниот интернет ви е деактивиран"</string>
diff --git a/packages/CarrierDefaultApp/res/values-nb/strings.xml b/packages/CarrierDefaultApp/res/values-nb/strings.xml
index e001e44e..c50b4d3 100644
--- a/packages/CarrierDefaultApp/res/values-nb/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-nb/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Operatørkommunikasjon"</string>
     <string name="android_system_label" msgid="2797790869522345065">"Mobiloperatør"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Du er tom for mobildata"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"Mobildata er deaktivert"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"Det er for eksempel mulig at påloggingssiden ikke tilhører organisasjonen som vises."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"Fortsett likevel via nettleseren"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Bedre ytelse"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"5G-alternativer fra operatøren"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"Gå til nettstedet til %s for å se alternativer for opplevelsen i appen"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Ikke nå"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Administrer"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"Kjøp bedre ytelse."</string>
diff --git a/packages/CarrierDefaultApp/res/values-pa/strings.xml b/packages/CarrierDefaultApp/res/values-pa/strings.xml
index c9fd0e8..3cc81d4 100644
--- a/packages/CarrierDefaultApp/res/values-pa/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-pa/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"ਕੈਰੀਅਰ ਸੰਚਾਰ"</string>
     <string name="android_system_label" msgid="2797790869522345065">"ਮੋਬਾਈਲ ਕੈਰੀਅਰ"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"ਮੋਬਾਈਲ ਡਾਟਾ ਖਤਮ ਹੋ ਗਿਆ ਹੈ"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"ਤੁਹਾਡਾ ਮੋਬਾਈਲ ਡਾਟਾ ਅਕਿਰਿਆਸ਼ੀਲ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"ਉਦਾਹਰਣ ਵੱਜੋਂ, ਲੌਗ-ਇਨ ਪੰਨਾ ਦਿਖਾਈ ਗਈ ਸੰਸਥਾ ਨਾਲ ਸੰਬੰਧਿਤ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।"</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"ਬ੍ਰਾਊਜ਼ਰ ਰਾਹੀਂ ਫਿਰ ਵੀ ਜਾਰੀ ਰੱਖੋ"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"ਕਾਰਗੁਜ਼ਾਰੀ ਬੂਸਟ"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਤੋਂ 5G ਵਿਕਲਪ"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"ਆਪਣੇ ਐਪ ਅਨੁਭਵ ਲਈ ਵਿਕਲਪ ਦੇਖਣ ਵਾਸਤੇ %s ਦੀ ਵੈੱਬਸਾਈਟ \'ਤੇ ਜਾਓ"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"ਹੁਣੇ ਨਹੀਂ"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"ਕਾਰਗੁਜ਼ਾਰੀ ਬੂਸਟ ਖਰੀਦੋ।"</string>
diff --git a/packages/CarrierDefaultApp/res/values-si/strings.xml b/packages/CarrierDefaultApp/res/values-si/strings.xml
index 6a8ce71..cdf270e 100644
--- a/packages/CarrierDefaultApp/res/values-si/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-si/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"වාහක සන්නිවේදනය"</string>
     <string name="android_system_label" msgid="2797790869522345065">"ජංගම වාහකය"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"ජංගම දත්ත අවසන් වී ඇත"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"ඔබගේ ජංගම දත්ත අක්‍රිය කර ඇත"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"උදාහරණයක් ලෙස, පුරනය වන පිටුව පෙන්වා ඇති සංවිධානයට අයිති නැති විය හැක."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"කෙසේ වුවත් බ්‍රවුසරය හරහා ඉදිරියට යන්න"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"කාර්ය සාධනය ඉහළ නැංවීම"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"ඔබේ වාහකයෙන් 5G විකල්ප"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"ඔබේ යෙදුම් අත්දැකීම සඳහා විකල්ප බැලීමට %sගේ වෙබ් අඩවියට පිවිසෙන්න"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"දැන් නොවේ"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"කළමනාකරණය කරන්න"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"කාර්ය සාධනය ඉහළ නැංවීමක් මිල දී ගන්න."</string>
diff --git a/packages/CarrierDefaultApp/res/values-ta/strings.xml b/packages/CarrierDefaultApp/res/values-ta/strings.xml
index 4916854..48d6ff3 100644
--- a/packages/CarrierDefaultApp/res/values-ta/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ta/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Carrier Communications"</string>
     <string name="android_system_label" msgid="2797790869522345065">"தொலைத்தொடர்பு நிறுவனம்"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"மொபைல் டேட்டா தீர்ந்துவிட்டது"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"மொபைல் டேட்டா முடக்கப்பட்டது"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"எடுத்துக்காட்டாக, உள்நுழைவுப் பக்கமானது காட்டப்படும் அமைப்பிற்குச் சொந்தமானதாக இல்லாமல் இருக்கலாம்."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"பரவாயில்லை, உலாவி வழியாகத் தொடர்க"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"பெர்ஃபார்மென்ஸ் பூஸ்ட்"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"உங்கள் மொபைல் நெட்வொர்க் நிறுவனம் வழங்கும் 5G விருப்பத்தேர்வுகள்"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"உங்கள் ஆப்ஸ் அனுபவத்திற்கான விருப்பத்தேர்வுகளைப் பார்க்க %s இணையதளத்திற்குச் செல்லுங்கள்"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"இப்போது வேண்டாம்"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"நிர்வகியுங்கள்"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"ஒரு பெர்ஃபார்மென்ஸ் பூஸ்ட்டைப் பர்ச்சேஸ் செய்யுங்கள்."</string>
diff --git a/packages/CarrierDefaultApp/res/values-te/strings.xml b/packages/CarrierDefaultApp/res/values-te/strings.xml
index 5f86828..db1de44 100644
--- a/packages/CarrierDefaultApp/res/values-te/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-te/strings.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="2809080280462257271">"క్యారియర్ కమ్యూనికేషన్‌లు"</string>
+    <string name="app_name" msgid="2809080280462257271">"క్యారియర్ కమ్యూనికేషన్స్"</string>
     <string name="android_system_label" msgid="2797790869522345065">"మొబైల్ క్యారియర్"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"మొబైల్ డేటాను పూర్తిగా ఉపయోగించారు"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"మీ మొబైల్ డేటా నిష్క్రియం చేయబడింది"</string>
diff --git a/packages/CarrierDefaultApp/res/values-tr/strings.xml b/packages/CarrierDefaultApp/res/values-tr/strings.xml
index e58d679..49b0f72 100644
--- a/packages/CarrierDefaultApp/res/values-tr/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-tr/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Operatör İletişimleri"</string>
     <string name="android_system_label" msgid="2797790869522345065">"Mobil Operatör"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Mobil veri kotanız tükendi"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"Mobil veriniz devre dışı bırakıldı"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"Örneğin, giriş sayfası, gösterilen kuruluşa ait olmayabilir."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"Yine de tarayıcıyla devam et"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Performans artışı"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"Operatörünüzün 5G seçenekleri"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"Uygulama deneyiminizle ilgili seçenekleri görmek için %s web sitesini ziyaret edin"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Şimdi değil"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Yönet"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"Performans artışı satın alın."</string>
diff --git a/packages/CarrierDefaultApp/res/values-uk/strings.xml b/packages/CarrierDefaultApp/res/values-uk/strings.xml
index deac7bb..ecd1182 100644
--- a/packages/CarrierDefaultApp/res/values-uk/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-uk/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"Сповіщення оператора"</string>
     <string name="android_system_label" msgid="2797790869522345065">"Оператор мобільного зв’язку"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Мобільний трафік вичерпано"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"Мобільний трафік дезактивовано"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"Наприклад, сторінка входу може не належати вказаній організації."</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"Усе одно продовжити у веб-переглядачі"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"Підвищення продуктивності"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"Варіанти 5G від вашого оператора"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"Перейдіть на веб-сайт %s, щоб переглянути варіанти взаємодії з додатком"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"Не зараз"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"Керувати"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"Придбайте підвищення продуктивності."</string>
diff --git a/packages/CarrierDefaultApp/res/values-zh-rHK/strings.xml b/packages/CarrierDefaultApp/res/values-zh-rHK/strings.xml
index ce51495..e8a679c 100644
--- a/packages/CarrierDefaultApp/res/values-zh-rHK/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-zh-rHK/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"流動網絡供應商最新消息"</string>
     <string name="android_system_label" msgid="2797790869522345065">"流動網絡供應商"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"流動數據量已用盡"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"您的流動數據已停用"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"例如,登入頁面可能並不屬於所顯示的機構。"</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"仍要透過瀏覽器繼續操作"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"效能提升服務"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"流動網絡供應商提供的 5G 選項"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"瀏覽「%s」網站即可查看應用程式體驗選項"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"暫時不要"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"管理"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"購買效能提升服務。"</string>
diff --git a/packages/CarrierDefaultApp/res/values-zh-rTW/strings.xml b/packages/CarrierDefaultApp/res/values-zh-rTW/strings.xml
index db3e4db0..6108247 100644
--- a/packages/CarrierDefaultApp/res/values-zh-rTW/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-zh-rTW/strings.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_name (2809080280462257271) -->
-    <skip />
+    <string name="app_name" msgid="2809080280462257271">"電信業者最新消息"</string>
     <string name="android_system_label" msgid="2797790869522345065">"電信業者"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"行動數據已用盡"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"你的行動數據已停用"</string>
@@ -16,10 +15,8 @@
     <string name="ssl_error_example" msgid="6188711843183058764">"例如,登入網頁中顯示的機構可能並非該網頁實際隸屬的機構。"</string>
     <string name="ssl_error_continue" msgid="1138548463994095584">"仍要透過瀏覽器繼續操作"</string>
     <string name="performance_boost_notification_channel" msgid="3475440855635538592">"效能提升方案"</string>
-    <!-- no translation found for performance_boost_notification_title (3126203390685781861) -->
-    <skip />
-    <!-- no translation found for performance_boost_notification_detail (216569851036236346) -->
-    <skip />
+    <string name="performance_boost_notification_title" msgid="3126203390685781861">"你的電信業者推出的 5G 方案"</string>
+    <string name="performance_boost_notification_detail" msgid="216569851036236346">"造訪「%s」網站,瞭解如要享有優質應用程式體驗,可選用哪些方案"</string>
     <string name="performance_boost_notification_button_not_now" msgid="6459755324243683785">"暫時不要"</string>
     <string name="performance_boost_notification_button_manage" msgid="4976836444046497973">"管理"</string>
     <string name="slice_purchase_app_label" msgid="7170191659233241166">"購買效能提升方案。"</string>
diff --git a/packages/CompanionDeviceManager/res/values-af/strings.xml b/packages/CompanionDeviceManager/res/values-af/strings.xml
index bbc6005..b897f7f 100644
--- a/packages/CompanionDeviceManager/res/values-af/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-af/strings.xml
@@ -17,15 +17,19 @@
 <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">"Metgeseltoestel-bestuurder"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Gee &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toegang tot &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"horlosie"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Kies \'n <xliff:g id="PROFILE_NAME">%1$s</xliff:g> om deur &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; bestuur te word"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Hierdie app is nodig om jou <xliff:g id="DEVICE_NAME">%1$s</xliff:g> te bestuur. <xliff:g id="APP_NAME">%2$s</xliff:g> sal toegelaat word om inligting te sinkroniseer, soos die naam van iemand wat bel, interaksie met jou kennisgewings te hê, en sal toegang tot jou Foon-, SMS-, Kontakte-, Mikrofoon-, en Toestelle in die Omtrek-toestemmings hê."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Hierdie app is nodig om jou <xliff:g id="DEVICE_NAME">%1$s</xliff:g> te bestuur. <xliff:g id="APP_NAME">%2$s</xliff:g> sal toegelaat word om inligting te sinkroniseer, soos die naam van iemand wat bel, en toegang tot hierdie toestemmings:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Laat &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toe om &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; te bestuur?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"bril"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Hierdie app is nodig om <xliff:g id="DEVICE_NAME">%1$s</xliff:g> te bestuur. <xliff:g id="APP_NAME">%2$s</xliff:g> sal toegelaat word om interaksie met jou kennisgewings te hê en sal toegang tot jou Foon-, SMS-, Kontakte-, Mikrofoon-, en Toestelle in die Omtrek-toestemmings hê."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Hierdie app sal toegang tot hierdie toestemmings op jou foon hê:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Gee &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toegang tot hierdie inligting op jou foon"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Oorkruistoestel-dienste"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> versoek tans namens jou <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> toestemming om programme tussen jou toestelle te stroom"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Laat &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; toe om hierdie handeling uit te voer?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> versoek tans namens jou <xliff:g id="DEVICE_NAME">%2$s</xliff:g> toestemming om apps en ander stelselkenmerke na toestelle in die omtrek te stroom"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"toestel"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Hierdie app sal inligting kan sinkroniseer, soos die naam van iemand wat bel, tussen jou foon en <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Hierdie app sal inligting kan sinkroniseer, soos die naam van iemand wat bel, tussen jou foon en die gekose toestel."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Laat toe"</string>
     <string name="consent_no" msgid="2640796915611404382">"Moenie toelaat nie"</string>
     <string name="consent_back" msgid="2560683030046918882">"Terug"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Stroom jou foon se apps"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Stroom apps en ander stelselkenmerke van jou foon af"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-am/strings.xml b/packages/CompanionDeviceManager/res/values-am/strings.xml
index 2880fd5..23a6cb0 100644
--- a/packages/CompanionDeviceManager/res/values-am/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-am/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ሰዓት"</string>
     <string name="chooser_title" msgid="2262294130493605839">"በ&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; የሚተዳደር <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ይምረጡ"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"የእርስዎን <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ለማስተዳደር መተግበሪያው ያስፈልጋል። <xliff:g id="APP_NAME">%2$s</xliff:g> እንደ የሚደውል ሰው ስም፣ ከማሳወቂያዎችዎ ጋር መስተጋብር እንዲፈጥር እና የእርስዎን ስልክ፣ ኤስኤምኤስ፣ ዕውቅያዎች፣ የቀን መቁጠሪያ፣ የጥሪ ምዝግብ ማስታወሻዎች እና በአቅራቢያ ያሉ መሣሪያዎችን መድረስ ያሉ መረጃዎችን እንዲያሰምር ይፈቀድለታል።"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"የእርስዎን <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ለማስተዳደር መተግበሪያው ያስፈልጋል። <xliff:g id="APP_NAME">%2$s</xliff:g> እንደ የሚደውል ሰው ስም እና እነዚህን ፈቃዶች መድረስ ያሉ መረጃዎችን እንዲያሰምር ይፈቀድለታል፦"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"መነጽሮች"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"ይህ መተግበሪያ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ን ለማስተዳደር ያስፈልጋል። <xliff:g id="APP_NAME">%2$s</xliff:g> ከማሳወቂያዎችዎ ጋር መስተጋብር እንዲፈጥር እና የእርስዎን ስልክ፣ ኤስኤምኤስ፣ ዕውቂያዎች፣ ማይክሮፎን እና በአቅራቢያ ያሉ መሣሪያዎች ፈቃዶችን እንዲደርስ ይፈቀድለታል።"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"ይህ መተግበሪያ በስልክዎ ላይ እነዚህን ፈቃዶች ለመድረስ ፈቃድ ይሰጠዋል፦"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ይህን መረጃ ከስልክዎ እንዲደርስበት ይፍቀዱለት"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"መሣሪያ ተሻጋሪ አገልግሎቶች"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> በእርስዎ መሣሪያዎች መካከል መተግበሪያዎችን በዥረት ለመልቀቅ የእርስዎን <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ወክሎ ፈቃድ እየጠየቀ ነው"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ይህን እርምጃ እንዲወስድ ፈቃድ ይሰጠው?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> የእርስዎን <xliff:g id="DEVICE_NAME">%2$s</xliff:g> በመወከል በአቅራቢያ ላሉ መሣሪያዎች መተግበሪያዎች እና ሌሎች የስርዓት ባህሪያትን በዥረት ለመልቀቅ ፈቃድ እየጠየቀ ነው"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"መሣሪያ"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"ይህ መተግበሪያ እንደ የሚደውል ሰው ስም ያለ መረጃን በስልክዎ እና <xliff:g id="DEVICE_NAME">%1$s</xliff:g> መካከል ማስመር ይችላል።"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"ይህ መተግበሪያ እንደ የሚደውል ሰው ስም ያለ መረጃን በስልክዎ እና በተመረጠው መሣሪያ መካከል ማስመር ይችላል።"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"ፍቀድ"</string>
     <string name="consent_no" msgid="2640796915611404382">"አትፍቀድ"</string>
     <string name="consent_back" msgid="2560683030046918882">"ተመለስ"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"የስልክዎን መተግበሪያዎች በዥረት ይልቀቁ"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"ከስልክዎ ሆነው መተግበሪያዎች እና ሌሎች የስርዓት ባህሪያትን በዥረት ይልቀቁ"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ar/strings.xml b/packages/CompanionDeviceManager/res/values-ar/strings.xml
index e015940..728767e 100644
--- a/packages/CompanionDeviceManager/res/values-ar/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ar/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"‏السماح لتطبيق &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"الساعة"</string>
     <string name="chooser_title" msgid="2262294130493605839">"‏اختَر <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ليديرها تطبيق &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"يجب توفّر التطبيق لإدارة \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\". سيتم السماح لتطبيق \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" بمزامنة المعلومات، مثلاً اسم المتصل، والتفاعل مع الإشعارات والوصول إلى هاتفك، والرسائل القصيرة، وجهات الاتصال، والتقويم، وسجلات المكالمات وأذونات الأجهزة المجاورة."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"يجب توفّر التطبيق لإدارة \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\". سيتم السماح لتطبيق \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" بمزامنة المعلومات، مثلاً اسم المتصل، والوصول إلى الأذونات التالية:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"النظارة"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"يجب توفّر هذا التطبيق لإدارة \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\". سيتم السماح لتطبيق \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" بالتفاعل مع الإشعارات والوصول إلى أذونات الهاتف والرسائل القصيرة وجهات الاتصال والميكروفون والأجهزة المجاورة."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"سيتم السماح لهذا التطبيق بالوصول إلى الأذونات التالية على هاتفك:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"‏السماح لتطبيق &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; بالوصول إلى هذه المعلومات من هاتفك"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"الخدمات التي تعمل بين الأجهزة"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"يطلب تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> الحصول على إذن نيابةً عن <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> لمشاركة التطبيقات بين أجهزتك."</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"‏هل تريد السماح للتطبيق &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; باتّخاذ هذا الإجراء؟"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"يطلب \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" لبثّ التطبيقات وميزات النظام الأخرى إلى أجهزتك المجاورة."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"جهاز"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"سيتمكن هذا التطبيق من مزامنة المعلومات، مثلاً اسم المتصل، بين هاتفك و\"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"سيتمكن هذا التطبيق من مزامنة المعلومات، مثلاً اسم المتصل، بين هاتفك والجهاز المحدد."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"السماح"</string>
     <string name="consent_no" msgid="2640796915611404382">"عدم السماح"</string>
     <string name="consent_back" msgid="2560683030046918882">"رجوع"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"بث تطبيقات هاتفك"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"بثّ التطبيقات وميزات النظام الأخرى من هاتفك"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-as/strings.xml b/packages/CompanionDeviceManager/res/values-as/strings.xml
index 81f384f..b651bda 100644
--- a/packages/CompanionDeviceManager/res/values-as/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-as/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ঘড়ী"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;এ পৰিচালনা কৰিব লগা এটা <xliff:g id="PROFILE_NAME">%1$s</xliff:g> বাছনি কৰক"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"আপোনাৰ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> পৰিচালনা কৰিবলৈ এপ্‌টোৰ আৱশ্যক। <xliff:g id="APP_NAME">%2$s</xliff:g>ক কল কৰোঁতাৰ নামৰ দৰে তথ্য ছিংক কৰিবলৈ, আপোনাৰ জাননীৰ সৈতে ভাব-বিনিময় কৰিবলৈ আৰু আপোনাৰ ফ’ন, এছএমএছ, সম্পৰ্ক, কেলেণ্ডাৰ, কল লগ আৰু নিকটৱৰ্তী ডিভাইচৰ অনুমতিসমূহ এক্সেছ কৰিবলৈ দিয়া হ’ব।"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"আপোনাৰ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> পৰিচালনা কৰিবলৈ এপ্‌টোৰ আৱশ্যক। <xliff:g id="APP_NAME">%2$s</xliff:g>ক কল কৰোঁতাৰ নামৰ দৰে তথ্য ছিংক কৰিবলৈ আৰু এই অনুমতিসমূহ এক্সেছ কৰিবলৈ অনুমতি দিয়া হ’ব:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"চছ্‌মা"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> পৰিচালনা কৰিবলৈ এই এপ্‌টোৰ আৱশ্যক। <xliff:g id="APP_NAME">%2$s</xliff:g>ক আপোনাৰ অনুমতিসমূহৰ সৈতে ভাব-বিনিময় কৰিবলৈ আৰু আপোনাৰ ফ’ন, এছএমএছ, সম্পৰ্ক, মাইক্ৰ’ফ’ন আৰু নিকটৱৰ্তী ডিভাইচৰ অনুমতিসমূহ এক্সেছ কৰিবলৈ দিয়া হ’ব।"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"এই এপ্‌টোক আপোনাৰ ফ’নত এই অনুমতিসমূহ এক্সেছ কৰিবলৈ অনুমতি দিয়া হ’ব:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ক আপোনাৰ ফ’নৰ পৰা এই তথ্যখিনি এক্সেছ কৰাৰ অনুমতি দিয়ক"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ক্ৰছ-ডিভাইচ সেৱাসমূহ"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>ৰ হৈ আপোনাৰ ডিভাইচসমূহৰ মাজত এপ্‌ ষ্ট্ৰীম কৰাৰ বাবে অনুৰোধ জনাইছে"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;ক এই কাৰ্যটো সম্পাদন কৰিবলৈ দিবনে?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DEVICE_NAME">%2$s</xliff:g>ৰ হৈ নিকটৱৰ্তী ডিভাইচত এপ্‌ আৰু ছিষ্টেমৰ অন্য সুবিধাসমূহ ষ্ট্ৰীম কৰাৰ অনুমতি দিবলৈ অনুৰোধ জনাইছে"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইচ"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"এই এপ্‌টোৱে আপোনাৰ ফ’ন আৰু <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ মাজত তথ্য ছিংক কৰিব পাৰিব, যেনে, কল কৰোঁতাৰ নাম।"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"এই এপ্‌টোৱে আপোনাৰ ফ’ন আৰু বাছনি কৰা ডিভাইচটোৰ মাজত তথ্য ছিংক কৰিব পাৰিব, যেনে, কল কৰোঁতাৰ নাম।"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"অনুমতি দিয়ক"</string>
     <string name="consent_no" msgid="2640796915611404382">"অনুমতি নিদিব"</string>
     <string name="consent_back" msgid="2560683030046918882">"উভতি যাওক"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"আপোনাৰ ফ’নৰ এপ্ ষ্ট্ৰীম কৰক"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"আপোনাৰ ফ’নৰ পৰা এপ্‌ আৰু ছিষ্টেমৰ অন্য সুবিধাসমূহ ষ্ট্ৰীম কৰক"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-az/strings.xml b/packages/CompanionDeviceManager/res/values-az/strings.xml
index 007bbc5..1052c9e 100644
--- a/packages/CompanionDeviceManager/res/values-az/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-az/strings.xml
@@ -17,15 +17,19 @@
 <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">"Kompanyon Cihaz Meneceri"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tətbiqinə &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; cihazına daxil olmaq icazəsi verin"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"izləyin"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; tərəfindən idarə ediləcək <xliff:g id="PROFILE_NAME">%1$s</xliff:g> seçin"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Tətbiq <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazını idarə etmək üçün lazımdır. <xliff:g id="APP_NAME">%2$s</xliff:g> tətbiqinə zəng edənin adı kimi məlumatları sinxronlaşdırmaq, bildirişlərlə qarşılıqlı əlaqəyə girmək, habelə Telefon, SMS, Kontaktlar, Təqvim, Zəng qeydləri və Yaxınlıqdakı cihazlar üzrə icazələrə daxil olmaq imkanı veriləcək."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Tətbiq <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazını idarə etmək üçün lazımdır. <xliff:g id="APP_NAME">%2$s</xliff:g> tətbiqinə zəng edənin adı kimi məlumatları sinxronlaşdırmaq və bu icazələrə daxil olmaq imkanı veriləcək:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tətbiqinə &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; cihazını idarə etmək icazəsi verilsin?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"eynək"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Bu tətbiq <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazını idarə etmək üçün lazımdır. <xliff:g id="APP_NAME">%2$s</xliff:g> bildirişlərə, Telefon, SMS, Kontaktlar, Mikrofon və Yaxınlıqdakı cihazlar icazələrinə giriş əldə edəcək."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Tətbiq telefonda bu icazələrə daxil ola biləcək:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tətbiqinə telefonunuzdan bu məlumata giriş icazəsi verin"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cihazlararası xidmətlər"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqi <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> adından cihazlarınız arasında tətbiqləri yayımlamaq üçün icazə istəyir"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; cihazına bu əməliyyatı yerinə yetirmək icazəsi verilsin?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%2$s</xliff:g> adından tətbiq və digər sistem funksiyalarını yaxınlıqdakı cihazlara yayımlamaq icazəsi sitəyir"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"cihaz"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Bu tətbiq telefon və <xliff:g id="DEVICE_NAME">%1$s</xliff:g> arasında zəng edənin adı kimi məlumatları sinxronlaşdıra biləcək."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Bu tətbiq telefon və seçilmiş cihaz arasında zəng edənin adı kimi məlumatları sinxronlaşdıra biləcək."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"İcazə verin"</string>
     <string name="consent_no" msgid="2640796915611404382">"İcazə verməyin"</string>
     <string name="consent_back" msgid="2560683030046918882">"Geriyə"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Telefonunuzun tətbiqlərini yayımlayın"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Telefondan tətbiq və digər sistem funksiyalarını yayımlayın"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
index fea0d07..2569a83 100644
--- a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
@@ -17,15 +17,19 @@
 <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">"Menadžer pridruženog uređaja"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Dozvolite da &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"sat"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Odaberite <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kojim će upravljati aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Aplikacija je potrebna za upravljanje uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> će dobiti dozvolu za sinhronizovanje informacija, poput osobe koja upućuje poziv, za interakciju sa obaveštenjima i pristup dozvolama za telefon, SMS, kontakte, kalendar, evidencije poziva i uređaje u blizini."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Aplikacija je potrebna za upravljanje uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> će dobiti dozvolu za sinhronizaciju informacija, poput osobe koja upućuje poziv, kao za pristup sledećim dozvolama:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"naočare"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Ova aplikacija je potrebna za upravljanje uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> će dobiti dozvolu za interakciju sa obaveštenjima i pristup dozvolama za telefon, SMS, kontakte, mikrofon i uređaje u blizini."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Ovoj aplikaciji će biti dozvoljeno da pristupa ovim dozvolama na telefonu:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Dozvolite da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pristupa ovim informacijama sa telefona"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Usluge na više uređaja"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> zahteva dozvolu u ime uređaja <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> za strimovanje aplikacija između uređaja"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Želite li da dozvolite da &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; obavi ovu radnju?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahteva dozvolu u ime uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> da strimuje aplikacije i druge sistemske funkcije na uređaje u blizini"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Ova aplikacija će moći da sinhronizuje podatke, poput imena osobe koja upućuje poziv, između telefona i uređaja <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Ova aplikacija će moći da sinhronizuje podatke, poput imena osobe koja upućuje poziv, između telefona i odabranog uređaja."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Dozvoli"</string>
     <string name="consent_no" msgid="2640796915611404382">"Ne dozvoli"</string>
     <string name="consent_back" msgid="2560683030046918882">"Nazad"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Strimujte aplikacije na telefonu"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Strimujte aplikacije i druge sistemske funkcije sa telefona"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-be/strings.xml b/packages/CompanionDeviceManager/res/values-be/strings.xml
index 9bf51d5..5cee5c3 100644
--- a/packages/CompanionDeviceManager/res/values-be/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-be/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Дазвольце праграме &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"гадзіннік"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Выберыце прыладу (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>), якой будзе кіраваць праграма &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Гэта праграма неабходная для кіравання прыладай \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\". <xliff:g id="APP_NAME">%2$s</xliff:g> зможа сінхранізаваць інфармацыю (напрыклад, імя таго, хто звоніць), узаемадзейнічаць з вашымі апавяшчэннямі, а таксама атрымае доступ да тэлефона, SMS, кантактаў, календара, журналаў выклікаў і прылад паблізу."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Гэта праграма неабходная для кіравання прыладай \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\". <xliff:g id="APP_NAME">%2$s</xliff:g> зможа сінхранізаваць інфармацыю (напрыклад, імя таго, хто звоніць) і атрымае наступныя дазволы:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"акуляры"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Гэта праграма неабходная для кіравання прыладай \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\". <xliff:g id="APP_NAME">%2$s</xliff:g> зможа ўзаемадзейнічаць з вашымі апавяшчэннямі і атрымае доступ да тэлефона, SMS, кантактаў, мікрафона і прылад паблізу."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Гэта праграма будзе мець на вашым тэлефоне наступныя дазволы:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Дазвольце праграме &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; мець доступ да гэтай інфармацыі з вашага тэлефона"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Сэрвісы для некалькіх прылад"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае дазвол ад імя вашай прылады \"<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>\" на трансляцыю праграм паміж вашымі прыладамі"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Дазволіць прыладзе &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; выканаць гэта дзеянне?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае дазвол ад імя вашай прылады \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" на перадачу плынню змесціва праграм і іншых функцый сістэмы на прылады паблізу"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"прылада"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Гэта праграма зможа сінхранізаваць інфармацыю (напрыклад, імя таго, хто звоніць) паміж тэлефонам і прыладай \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Гэта праграма зможа сінхранізаваць інфармацыю (напрыклад, імя таго, хто звоніць) паміж тэлефонам і выбранай прыладай."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Дазволіць"</string>
     <string name="consent_no" msgid="2640796915611404382">"Не дазваляць"</string>
     <string name="consent_back" msgid="2560683030046918882">"Назад"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Трансляцыя змесціва праграм з вашага тэлефона"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Перадача плынню змесціва праграм і іншых функцый сістэмы з вашага тэлефона"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-bg/strings.xml b/packages/CompanionDeviceManager/res/values-bg/strings.xml
index bd2e63b..34a88ed 100644
--- a/packages/CompanionDeviceManager/res/values-bg/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bg/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Разрешаване на &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"часовник"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Изберете устройство (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>), което да се управлява от &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Това приложение е необходимо за управление на <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> ще получи право да синхронизира различна информация, като например името на обаждащия се, да взаимодейства с известията ви и достъп до разрешенията за телефона, SMS съобщенията, контактите, календара, списъците с обажданията и устройствата в близост."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Това приложение е необходимо за управление на <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> ще получи право да синхронизира различна информация, като например името на обаждащия се, и достъп до следните разрешения:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"очилата"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Това приложение е необходимо за управление на <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Приложението <xliff:g id="APP_NAME">%2$s</xliff:g> ще получи право да взаимодейства с известията ви, както и достъп до разрешенията за телефона, SMS съобщенията, контактите, микрофона и устройствата в близост."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Това приложение ще има достъп до следните разрешения за телефона ви:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Разрешете на &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да осъществява достъп до тази информация от телефона ви"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Услуги за различни устройства"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ иска разрешение от името на <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> да предава поточно приложения между устройствата ви"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Разрешавате ли на &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; да предприема това действие?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> иска разрешение от името на <xliff:g id="DEVICE_NAME">%2$s</xliff:g> да предава поточно приложения и други системни функции към устройства в близост"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Това приложение ще може да синхронизира различна информация, като например името на обаждащия се, между телефона ви и <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Това приложение ще може да синхронизира различна информация, като например името на обаждащия се, между телефона ви и избраното устройство."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Разрешаване"</string>
     <string name="consent_no" msgid="2640796915611404382">"Забраняване"</string>
     <string name="consent_back" msgid="2560683030046918882">"Назад"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Поточно предаване на приложенията на телефона ви"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Поточно предаване на приложения и други системни функции от телефона ви"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-bn/strings.xml b/packages/CompanionDeviceManager/res/values-bn/strings.xml
index c6d364f..0fc220b 100644
--- a/packages/CompanionDeviceManager/res/values-bn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bn/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"আপনার &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ঘড়ি"</string>
     <string name="chooser_title" msgid="2262294130493605839">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> বেছে নিন যেটি &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ম্যানেজ করবে"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"আপনার <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ম্যানেজ করার জন্য অ্যাপটি প্রয়োজন। <xliff:g id="APP_NAME">%2$s</xliff:g>-কে কলারের নামের মতো তথ্য সিঙ্ক করার অনুমতি দেওয়া হবে, এছাড়াও আপনার বিজ্ঞপ্তির সাথে ইন্টার‌্যাক্ট করা এবং আপনার ফোন, এসএমএস, পরিচিতি তালিকা, ক্যালেন্ডার, কল লগ এবং আশেপাশের ডিভাইস ব্যবহার করার অনুমতি অ্যাক্সেস করতে দেওয়া হবে।"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"আপনার <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ম্যানেজ করার জন্য অ্যাপটি প্রয়োজন। <xliff:g id="APP_NAME">%2$s</xliff:g>-কে কলারের নামের মতো তথ্য় সিঙ্ক করতে এবং এইসব অনুমতি অ্যাক্সেস করতে দেওয়া হবে:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"চশমা"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ম্যানেজ করতে এই অ্যাপ দরকার। <xliff:g id="APP_NAME">%2$s</xliff:g>-কে আপনার বিজ্ঞপ্তির সাথে ইন্টার‌্যাক্ট করার এবং ফোন, এসএমএস, পরিচিতি, মাইক্রোফোন ও আশেপাশের ডিভাইসের অনুমতি অ্যাক্সেস করতে দেওয়া হবে।"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"আপনার ফোনের এইসব অনুমতি এই অ্যাপ অ্যাক্সেস করতে পারবে:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"আপনার ফোন থেকে &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; অ্যাপকে এই তথ্য অ্যাক্সেস করার অনুমতি দিন"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ক্রস-ডিভাইস পরিষেবা"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"আপনার ডিভাইসগুলির মধ্যে অ্যাপ স্ট্রিম করার জন্য <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-এর হয়ে অনুমতি চাইছে"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;কে এই অ্যাকশন করতে দেবেন?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"আশেপাশের ডিভাইসে অ্যাপ ও অন্যান্য সিস্টেম ফিচার স্ট্রিম করার জন্য আপনার <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-এর হয়ে <xliff:g id="APP_NAME">%1$s</xliff:g> অনুমতি চেয়ে অনুরোধ করছে"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইস"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"এই অ্যাপ আপনার ফোন এবং <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ডিভাইসের মধ্যে তথ্য সিঙ্ক করতে পারবে, যেমন কলারের নাম।"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"এই অ্যাপ আপনার ফোন এবং বেছে নেওয়া ডিভাইসের মধ্যে তথ্য সিঙ্ক করতে পারবে, যেমন কলারের নাম।"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"অনুমতি দিন"</string>
     <string name="consent_no" msgid="2640796915611404382">"অনুমতি দেবেন না"</string>
     <string name="consent_back" msgid="2560683030046918882">"ফিরুন"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"আপনার ফোনের অ্যাপ স্ট্রিম করুন"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"আপনার ফোন থেকে অ্যাপ ও অন্যান্য সিস্টেম ফিচার স্ট্রিম করে"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-bs/strings.xml b/packages/CompanionDeviceManager/res/values-bs/strings.xml
index ec3be16..869e3c6 100644
--- a/packages/CompanionDeviceManager/res/values-bs/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bs/strings.xml
@@ -17,15 +17,19 @@
 <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">"Prateći upravitelj uređaja"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Dozvolite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da pristupa uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"sat"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Odaberite uređaj \"<xliff:g id="PROFILE_NAME">%1$s</xliff:g>\" kojim će upravljati aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Aplikacija je potrebna za upravljanje uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Aplikaciji <xliff:g id="APP_NAME">%2$s</xliff:g> će biti dozvoljeni sinhroniziranje informacija, kao što je ime osobe koja upućuje poziv, interakcija s obavještenjima i pristup odobrenjima za Telefon, SMS-ove, Kontakte, Kalendar, Zapisnike poziva i Uređaje u blizini."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Aplikacija je potrebna za upravljanje uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Aplikaciji <xliff:g id="APP_NAME">%2$s</xliff:g> će biti dozvoljeni sinhroniziranje informacija, kao što je ime osobe koja upućuje poziv, i pristup ovim odobrenjima:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Dozvoliti aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da upravlja uređajem &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"naočale"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Ova aplikacija je potrebna za upravljanje uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Aplikaciji <xliff:g id="APP_NAME">%2$s</xliff:g> će biti dozvoljena interakcija s obavještenjima i pristup odobrenjima za Telefon, SMS, Kontakte, Mikrofon i Uređaje u blizini."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Aplikaciji će biti dozvoljen pristup ovim odobrenjima na telefonu:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Dozvolite da aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pristupa ovim informacijama s telefona"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Usluga na više uređaja"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> u ime uređaja <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> zahtijeva odobrenje da prenosi aplikacije između vaših uređaja"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Dozvoliti uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; da poduzme ovu radnju?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> u ime uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> traži odobrenje da prenosi aplikacije i druge funkcije sistema na uređajima u blizini"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Ova aplikacija će moći sinhronizirati informacije, kao što je ime osobe koja upućuje poziv, između vašeg telefona i uređaja <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Ova aplikacija će moći sinhronizirati informacije, kao što je ime osobe koja upućuje poziv, između vašeg telefona i odabranog uređaja."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Dozvoli"</string>
     <string name="consent_no" msgid="2640796915611404382">"Nemoj dozvoliti"</string>
     <string name="consent_back" msgid="2560683030046918882">"Nazad"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Prenosite aplikacije s telefona"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Prijenos aplikacija i drugih funkcija sistema s vašeg telefona"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ca/strings.xml b/packages/CompanionDeviceManager/res/values-ca/strings.xml
index 01c5869..4e89780 100644
--- a/packages/CompanionDeviceManager/res/values-ca/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ca/strings.xml
@@ -17,15 +17,19 @@
 <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">"Gestor de dispositius complementaris"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Permet que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; accedeixi a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"rellotge"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Tria un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> perquè el gestioni &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"L\'aplicació és necessària per gestionar el dispositiu (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>). <xliff:g id="APP_NAME">%2$s</xliff:g> tindrà permís per sincronitzar informació, com ara el nom d\'algú que truca, per interaccionar amb les teves notificacions i accedir al telèfon, als SMS, als contactes, al calendari, als registres de trucades i als dispositius propers."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"L\'aplicació és necessària per gestionar el dispositiu (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>). <xliff:g id="APP_NAME">%2$s</xliff:g> tindrà permís per sincronitzar informació, com ara el nom d\'algú que truca, i accedir a aquests permisos:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Permet que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; gestioni &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"ulleres"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Aquesta aplicació es necessita per gestionar el dispositiu (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>). <xliff:g id="APP_NAME">%2$s</xliff:g> tindrà permís per interaccionar amb les teves notificacions i accedir al telèfon, als SMS, als contactes, al micròfon i als dispositius propers."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Aquesta aplicació podrà accedir a aquests permisos del telèfon:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Permet que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; accedeixi a aquesta informació del telèfon"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Serveis multidispositiu"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> demana permís en nom del teu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> per reproduir en continu aplicacions entre els dispositius"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vols permetre que &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; dugui a terme aquesta acció?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> sol·licita permís en nom del teu dispositiu (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) per reproduir en continu aplicacions i altres funcions del sistema en dispositius propers"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositiu"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Aquesta aplicació podrà sincronitzar informació, com ara el nom d\'algú que truca, entre el teu telèfon i el teu dispositiu (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Aquesta aplicació podrà sincronitzar informació, com ara el nom d\'algú que truca, entre el teu telèfon i el dispositiu triat."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Permet"</string>
     <string name="consent_no" msgid="2640796915611404382">"No permetis"</string>
     <string name="consent_back" msgid="2560683030046918882">"Enrere"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Reprodueix en continu aplicacions del telèfon"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Reprodueix en continu aplicacions i altres funcions del sistema des del telèfon"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-cs/strings.xml b/packages/CompanionDeviceManager/res/values-cs/strings.xml
index 09c96a7..0e6bf0e 100644
--- a/packages/CompanionDeviceManager/res/values-cs/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-cs/strings.xml
@@ -17,15 +17,19 @@
 <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">"Správce doprovodných zařízení"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Povolit aplikaci &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; přístup k zařízení &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"hodinky"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Vyberte zařízení <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, které chcete spravovat pomocí aplikace &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Aplikace je nutná ke správě zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> bude moci synchronizovat údaje, jako je jméno volajícího, interagovat s vašimi oznámeními a získat přístup k vašim oprávněním k telefonu, SMS, kontaktům, kalendáři, seznamům hovorů a zařízením v okolí."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Aplikace je nutná ke správě zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> bude moci synchronizovat údaje, jako je jméno volajícího, a získat přístup k těmto oprávněním:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Povolit aplikaci &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; spravovat zařízení &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"brýle"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Tato aplikace je nutná ke správě zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> bude moci interagovat s vašimi oznámeními a získat přístup k vašim oprávněním k telefonu, SMS, kontaktům, mikrofonu a zařízením v okolí."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Tato aplikace bude mít ve vašem telefonu povolený přístup k těmto oprávněním:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Povolte aplikaci &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; přístup k těmto informacím z vašeho telefonu"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Služby pro více zařízení"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> požaduje za vaše zařízení <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> oprávnění ke streamování aplikací mezi zařízeními"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Povolit zařízení &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; podniknout tuto akci?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> žádá jménem vašeho zařízení <xliff:g id="DEVICE_NAME">%2$s</xliff:g> o oprávnění streamovat aplikace a další systémové funkce do zařízení v okolí"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"zařízení"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Tato aplikace bude moci synchronizovat údaje, jako je jméno volajícího, mezi vaším telefonem a zařízením <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Tato aplikace bude moci synchronizovat údaje, jako je jméno volajícího, mezi vaším telefonem a vybraným zařízením."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Povolit"</string>
     <string name="consent_no" msgid="2640796915611404382">"Nepovolovat"</string>
     <string name="consent_back" msgid="2560683030046918882">"Zpět"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Streamujte aplikace v telefonu"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Streamování aplikací a dalších systémových funkcí z telefonu"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-da/strings.xml b/packages/CompanionDeviceManager/res/values-da/strings.xml
index 17ed586..b78deee 100644
--- a/packages/CompanionDeviceManager/res/values-da/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-da/strings.xml
@@ -17,15 +17,19 @@
 <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">"Medfølgende enhedsadministrator"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Tillad, at &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; får adgang til &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ur"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Vælg det <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, som skal administreres af &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Du skal bruge denne app for at administrere <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> får tilladelse til at interagere med dine notifikationer og synkronisere oplysninger som f.eks. navnet på en person, der ringer, og appen får adgang til dine tilladelser for Opkald, Sms, Kalender, Opkaldshistorik og Enheder i nærheden."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Du skal bruge denne app for at administrere <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> får tilladelse til at synkronisere oplysninger som f.eks. navnet på en person, der ringer, og appen får adgang til følgende tilladelser:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"briller"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Du skal bruge denne app for at administrere <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> får tilladelse til at interagere med dine notifikationer og tilgå tilladelserne Telefon, Sms, Kontakter, Mikrofon og Enheder i nærheden."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Denne app får tilladelse til at tilgå disse tilladelser på din telefon:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Giv &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; adgang til disse oplysninger fra din telefon"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Tjenester, som kan tilsluttes en anden enhed"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder om tilladelse på vegne af din <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> til at streame apps mellem dine enheder"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vil du tillade, at &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; foretager denne handling?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder om tilladelse på vegne af din <xliff:g id="DEVICE_NAME">%2$s</xliff:g> til at streame apps og andre systemfunktioner til enheder i nærheden"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"enhed"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Denne app vil kunne synkronisere oplysninger som f.eks. navnet på en person, der ringer, mellem din telefon og <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Denne app vil kunne synkronisere oplysninger som f.eks. navnet på en person, der ringer, mellem din telefon og den valgte enhed."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Tillad"</string>
     <string name="consent_no" msgid="2640796915611404382">"Tillad ikke"</string>
     <string name="consent_back" msgid="2560683030046918882">"Tilbage"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Stream din telefons apps"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Stream apps og andre systemfunktioner fra din telefon"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-de/strings.xml b/packages/CompanionDeviceManager/res/values-de/strings.xml
index bfb750e..1d20a4d 100644
--- a/packages/CompanionDeviceManager/res/values-de/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-de/strings.xml
@@ -17,15 +17,19 @@
 <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">"Begleitgerät-Manager"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; erlauben, auf dein Gerät (&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;) zuzugreifen"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"Smartwatch"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Gerät „<xliff:g id="PROFILE_NAME">%1$s</xliff:g>“ auswählen, das von &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; verwaltet werden soll"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Die App wird zur Verwaltung deines Geräts (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) benötigt. <xliff:g id="APP_NAME">%2$s</xliff:g> darf dann Daten wie den Namen eines Anrufers synchronisieren, mit deinen Benachrichtigungen interagieren und auf die Berechtigungen „Telefon“, „SMS“, „Kontakte“, „Kalender“, „Anruflisten“ und „Geräte in der Nähe“ zugreifen."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Die App wird zur Verwaltung deines Geräts (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) benötigt. <xliff:g id="APP_NAME">%2$s</xliff:g> darf dann Daten wie den Namen eines Anrufers synchronisieren und auf folgende Berechtigungen zugreifen:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"Glass-Geräte"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Diese App wird zur Verwaltung deines Geräts (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) benötigt. <xliff:g id="APP_NAME">%2$s</xliff:g> darf mit deinen Benachrichtigungen interagieren und auf die Berechtigungen „Telefon“, „SMS“, „Kontakte“, „Mikrofon“ und „Geräte in der Nähe“ zugreifen."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Diese App darf auf die folgenden Berechtigungen auf deinem Smartphone zugreifen:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; Zugriff auf diese Informationen von deinem Smartphone gewähren"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Geräteübergreifende Dienste"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> bittet für dein <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> um die Berechtigung zum Streamen von Apps zwischen deinen Geräten"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Darf das Gerät &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; diese Aktion ausführen?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> bittet für dein Gerät (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) um die Berechtigung, Apps und andere Systemfunktionen auf Geräte in der Nähe zu streamen"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"Gerät"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Diese App kann dann Daten wie den Namen eines Anrufers zwischen deinem Smartphone und deinem Gerät (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) synchronisieren."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Diese App kann dann Daten wie den Namen eines Anrufers zwischen deinem Smartphone und dem ausgewählten Gerät synchronisieren."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Zulassen"</string>
     <string name="consent_no" msgid="2640796915611404382">"Nicht zulassen"</string>
     <string name="consent_back" msgid="2560683030046918882">"Zurück"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Smartphone-Apps streamen"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Apps und andere Systemfunktionen von deinem Smartphone streamen"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-el/strings.xml b/packages/CompanionDeviceManager/res/values-el/strings.xml
index d0b4609..8cb6e63 100644
--- a/packages/CompanionDeviceManager/res/values-el/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-el/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Επιτρέψτε στην εφαρμογή &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ρολόι"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Επιλέξτε ένα προφίλ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> για διαχείριση από την εφαρμογή &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Η εφαρμογή είναι απαραίτητη για τη διαχείριση της συσκευής <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Η εφαρμογή <xliff:g id="APP_NAME">%2$s</xliff:g> θα μπορεί να συγχρονίζει πληροφορίες, όπως το όνομα ενός ατόμου που σας καλεί, να αλληλεπιδρά με τις ειδοποιήσεις σας και να αποκτά πρόσβαση στις άδειες Τηλέφωνο, SMS, Επαφές, Ημερολόγιο, Αρχεία καταγρ. κλήσ. και Συσκευές σε κοντινή απόσταση."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Η εφαρμογή είναι απαραίτητη για τη διαχείριση της συσκευής <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Η εφαρμογή <xliff:g id="APP_NAME">%2$s</xliff:g> θα μπορεί να συγχρονίζει πληροφορίες, όπως το όνομα ενός ατόμου που σας καλεί, και να αποκτά πρόσβαση σε αυτές τις άδειες:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"γυαλιά"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Αυτή η εφαρμογή είναι απαραίτητη για τη διαχείριση της συσκευής <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Θα επιτρέπεται στην εφαρμογή <xliff:g id="APP_NAME">%2$s</xliff:g> να αλληλεπιδρά με τις ειδοποιήσεις σας και να αποκτά πρόσβαση στις άδειες για το Τηλέφωνο, τα SMS, τις Επαφές, το Μικρόφωνο και τις Συσκευές σε κοντινή απόσταση."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Αυτή η εφαρμογή θα μπορεί να έχει πρόσβαση σε αυτές τις άδειες στο τηλέφωνό σας:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Να επιτρέπεται στο &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; η πρόσβαση σε αυτές τις πληροφορίες από το τηλέφωνό σας."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Υπηρεσίες πολλών συσκευών"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά εκ μέρους της συσκευής σας <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> άδεια για ροή εφαρμογών μεταξύ των συσκευών σας"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Να επιτρέπεται στη συσκευή &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; να εκτελεί αυτήν την ενέργεια;"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά άδεια εκ μέρους της συσκευής σας <xliff:g id="DEVICE_NAME">%2$s</xliff:g> για ροή εφαρμογών και άλλων λειτουργιών του συστήματος σε συσκευές σε κοντινή απόσταση"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"συσκευή"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Αυτή η εφαρμογή θα μπορεί να συγχρονίζει πληροφορίες μεταξύ του τηλεφώνου και της συσκευής <xliff:g id="DEVICE_NAME">%1$s</xliff:g>, όπως το όνομα ενός ατόμου που σας καλεί."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Αυτή η εφαρμογή θα μπορεί να συγχρονίζει πληροφορίες μεταξύ του τηλεφώνου και της επιλεγμένης συσκευής σας, όπως το όνομα ενός ατόμου που σας καλεί."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Να επιτρέπεται"</string>
     <string name="consent_no" msgid="2640796915611404382">"Να μην επιτρέπεται"</string>
     <string name="consent_back" msgid="2560683030046918882">"Πίσω"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Μεταδώστε σε ροή τις εφαρμογές του τηλεφώνου σας"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Ροή εφαρμογών και άλλων λειτουργιών του συστήματος από το τηλέφωνό σας"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
index e4215c6..ff1394d 100644
--- a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"watch"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"The app is needed to manage your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to sync info, like the name of someone calling, interact with your notifications and access your Phone, SMS, Contacts, Calendar, Call logs and Nearby devices permissions."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"The app is needed to manage your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to sync info, like the name of someone calling, and access these permissions:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to manage &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"glasses"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"This app is needed to manage <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to interact with your notifications and access your phone, SMS, contacts, microphone and Nearby devices permissions."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"This app will be allowed to access these permissions on your phone:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> to stream apps between your devices"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; to take this action?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features to nearby devices"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"This app will be able to sync info, like the name of someone calling, between your phone and <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Allow"</string>
     <string name="consent_no" msgid="2640796915611404382">"Don\'t allow"</string>
     <string name="consent_back" msgid="2560683030046918882">"Back"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Stream your phone’s apps"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Stream apps and other system features from your phone"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml
index 873c602..21255751 100644
--- a/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml
@@ -17,15 +17,18 @@
 <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="8024993972587946678">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"watch"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"The app is needed to manage your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to sync info, like the name of someone calling, interact with your notifications and access your Phone, SMS, Contacts, Calendar, Call logs and Nearby devices permissions."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"The app is needed to manage your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to sync info, like the name of someone calling, and access these permissions:"</string>
+    <string name="summary_watch" msgid="898569637110705523">"This app is needed to manage your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to sync info, like the name of someone calling, interact with your notifications and access your Phone, SMS, Contacts, Calendar, Call logs and Nearby devices permissions."</string>
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to manage &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"glasses"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"This app is needed to manage <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to interact with your notifications and access your Phone, SMS, Contacts, Microphone and Nearby devices permissions."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"This app will be allowed to access these permissions on your phone:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> to stream apps between your devices"</string>
@@ -38,10 +41,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; to take this action?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features to nearby devices"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"This app will be able to sync info, like the name of someone calling, between your phone and <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device."</string>
+    <string name="summary_generic_single_device" msgid="4181180669689590417">"This app will be able to sync info, like the name of someone calling, between your phone and <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="summary_generic" msgid="1761976003668044801">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Allow"</string>
-    <string name="consent_no" msgid="2640796915611404382">"Don’t allow"</string>
+    <string name="consent_no" msgid="2640796915611404382">"Don\'t allow"</string>
     <string name="consent_back" msgid="2560683030046918882">"Back"</string>
     <string name="permission_sync_confirmation_title" msgid="4409622174437248702">"Give apps on &lt;strong&gt;<xliff:g id="COMPANION_DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; the same permissions as on &lt;strong&gt;<xliff:g id="PRIMARY_DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="permission_sync_summary" msgid="765497944331294275">"This may include &lt;strong&gt;Microphone&lt;/strong&gt;, &lt;strong&gt;Camera&lt;/strong&gt;, and &lt;strong&gt;Location access&lt;/strong&gt;, and other sensitive permissions on &lt;strong&gt;<xliff:g id="COMPANION_DEVICE_NAME_0">%1$s</xliff:g>&lt;/strong&gt;. &lt;br/&gt;&lt;br/&gt;You can change these permissions any time in your Settings on &lt;strong&gt;<xliff:g id="COMPANION_DEVICE_NAME_1">%1$s</xliff:g>&lt;/strong&gt;."</string>
@@ -69,4 +72,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Stream your phone’s apps"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Stream apps and other system features from your phone"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
index e4215c6..ff1394d 100644
--- a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"watch"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"The app is needed to manage your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to sync info, like the name of someone calling, interact with your notifications and access your Phone, SMS, Contacts, Calendar, Call logs and Nearby devices permissions."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"The app is needed to manage your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to sync info, like the name of someone calling, and access these permissions:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to manage &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"glasses"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"This app is needed to manage <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to interact with your notifications and access your phone, SMS, contacts, microphone and Nearby devices permissions."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"This app will be allowed to access these permissions on your phone:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> to stream apps between your devices"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; to take this action?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features to nearby devices"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"This app will be able to sync info, like the name of someone calling, between your phone and <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Allow"</string>
     <string name="consent_no" msgid="2640796915611404382">"Don\'t allow"</string>
     <string name="consent_back" msgid="2560683030046918882">"Back"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Stream your phone’s apps"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Stream apps and other system features from your phone"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
index e4215c6..ff1394d 100644
--- a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"watch"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"The app is needed to manage your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to sync info, like the name of someone calling, interact with your notifications and access your Phone, SMS, Contacts, Calendar, Call logs and Nearby devices permissions."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"The app is needed to manage your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to sync info, like the name of someone calling, and access these permissions:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to manage &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"glasses"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"This app is needed to manage <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> will be allowed to interact with your notifications and access your phone, SMS, contacts, microphone and Nearby devices permissions."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"This app will be allowed to access these permissions on your phone:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> to stream apps between your devices"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; to take this action?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features to nearby devices"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"This app will be able to sync info, like the name of someone calling, between your phone and <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Allow"</string>
     <string name="consent_no" msgid="2640796915611404382">"Don\'t allow"</string>
     <string name="consent_back" msgid="2560683030046918882">"Back"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Stream your phone’s apps"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Stream apps and other system features from your phone"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml b/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml
index 0d12e98..b012b6f 100644
--- a/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml
@@ -17,15 +17,18 @@
 <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="8024993972587946678">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‏‏‎‎Allow &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to access &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt;‎‏‎‎‏‎"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎watch‎‏‎‎‏‎"</string>
     <string name="chooser_title" msgid="2262294130493605839">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎Choose a ‎‏‎‎‏‏‎<xliff:g id="PROFILE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ to be managed by &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt;‎‏‎‎‏‎"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‎‏‎‎‏‏‎‎‏‎‏‎‎‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‏‏‎The app is needed to manage your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎. ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ will be allowed to sync info, like the name of someone calling, interact with your notifications and access your Phone, SMS, Contacts, Calendar, Call logs and Nearby devices permissions.‎‏‎‎‏‎"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‎The app is needed to manage your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎. ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ will be allowed to sync info, like the name of someone calling, and access these permissions:‎‏‎‎‏‎"</string>
+    <string name="summary_watch" msgid="898569637110705523">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‏‎‎‏‏‎This app is needed to manage your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎. ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ will be allowed to sync info, like the name of someone calling, interact with your notifications and access your Phone, SMS, Contacts, Calendar, Call logs and Nearby devices permissions.‎‏‎‎‏‎"</string>
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‎‏‎‏‎Allow &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to manage &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt;?‎‏‎‎‏‎"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‎‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‎‏‏‏‏‎‏‏‏‏‎‎glasses‎‏‎‎‏‎"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‏‎‎‎‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎This app is needed to manage ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎. ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ will be allowed to interact with your notifications and access your Phone, SMS, Contacts, Microphone and Nearby devices permissions.‎‏‎‎‏‎"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‏‎‎‎‎‎‎‏‏‎‎‏‎‏‏‏‎‎‎‎‎‏‏‎‏‏‎‏‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎This app will be allowed to access these permissions on your phone:‎‏‎‎‏‎"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‏‎‏‎‏‏‎‏‎‎‎‎‏‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎Allow &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to access this information from your phone‎‏‎‎‏‎"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‏‎‎‎‎‏‎‏‎‏‎‎‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎Cross-device services‎‏‎‎‏‎"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‏‎‏‎‏‎‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‏‎‎‎‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is requesting permission on behalf of your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>‎‏‎‎‏‏‏‎ to stream apps between your devices‎‏‎‎‏‎"</string>
@@ -38,8 +41,8 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‏‎‎‎‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‎‎‏‎‎Allow &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to take this action?‎‏‎‎‏‎"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‏‎‎‏‎‏‎‏‎‎‏‎‎‏‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is requesting permission on behalf of your ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ to stream apps and other system features to nearby devices‎‏‎‎‏‎"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‎device‎‏‎‎‏‎"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‏‎‎‏‏‎‎‏‎‏‏‎‎‎‎‏‏‎‎‎‏‎‏‏‏‎‎‏‏‏‎This app will be able to sync info, like the name of someone calling, between your phone and ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‏‎‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‎‎‎‎‏‎‎‏‏‎‎‏‏‎‏‎‏‎‎This app will be able to sync info, like the name of someone calling, between your phone and the chosen device.‎‏‎‎‏‎"</string>
+    <string name="summary_generic_single_device" msgid="4181180669689590417">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‏‎‎‏‎‎‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‏‎This app will be able to sync info, like the name of someone calling, between your phone and ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="summary_generic" msgid="1761976003668044801">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎This app will be able to sync info, like the name of someone calling, between your phone and the chosen device‎‏‎‎‏‎"</string>
     <string name="consent_yes" msgid="8344487259618762872">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‎‏‎‎‏‎‏‏‏‏‎‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎Allow‎‏‎‎‏‎"</string>
     <string name="consent_no" msgid="2640796915611404382">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‏‏‎‎Don’t allow‎‏‎‎‏‎"</string>
     <string name="consent_back" msgid="2560683030046918882">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‏‎‎‎‏‎‏‎‎‎‏‎‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‎Back‎‏‎‎‏‎"</string>
@@ -69,4 +72,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‏‎‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‏‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‎‎‎Stream your phone’s apps‎‏‎‎‏‎"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎Stream apps and other system features from your phone‎‏‎‎‏‎"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
index 97b68ed..578af1d 100644
--- a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
@@ -17,15 +17,19 @@
 <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">"Administrador de dispositivo complementario"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Permite que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"reloj"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Elige un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para que la app &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; lo administre"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Esta app es necesaria para administrar tu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> podrá sincronizar información, como el nombre de la persona que llama, interactuar con tus notificaciones y acceder a los permisos de Teléfono, SMS, Contactos, Calendario, Llamadas y Dispositivos cercanos."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Esta app es necesaria para administrar tu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> podrá sincronizar información, como el nombre de la persona que llama, y acceder a los siguientes permisos:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Permite que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; administre &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"Gafas"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Esta app es necesaria para administrar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> podrá interactuar con tus notificaciones y acceder a los permisos de Teléfono, SMS, Contactos, Micrófono y Dispositivos cercanos."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Esta app podrá acceder a los siguientes permisos en tu teléfono:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Permite que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información de tu teléfono"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servicios multidispositivo"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicita tu permiso en nombre de <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> para transmitir apps entre dispositivos"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"¿Permites que &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; realice esta acción?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nombre de tu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para transmitir apps y otras funciones del sistema a dispositivos cercanos"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Esta app podrá sincronizar información, como el nombre de la persona que llama, entre el teléfono y <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Esta app podrá sincronizar información, como el nombre de la persona que llama, entre el teléfono y el dispositivo elegido."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
     <string name="consent_no" msgid="2640796915611404382">"No permitir"</string>
     <string name="consent_back" msgid="2560683030046918882">"Atrás"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Transmitir las apps de tu teléfono"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Transmite apps y otras funciones del sistema desde tu teléfono"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-es/strings.xml b/packages/CompanionDeviceManager/res/values-es/strings.xml
index 5ecf79e..19c556f 100644
--- a/packages/CompanionDeviceManager/res/values-es/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-es/strings.xml
@@ -17,15 +17,19 @@
 <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">"Gestor de dispositivos complementario"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"reloj"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Elige un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para gestionarlo con &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Se necesita la aplicación para gestionar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> podrá sincronizar información (por ejemplo, el nombre de la persona que te llama), interactuar con tus notificaciones y acceder a tus permisos de teléfono, SMS, contactos, calendario, registros de llamadas y dispositivos cercanos."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Se necesita la aplicación para gestionar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> podrá sincronizar información (por ejemplo, el nombre de la persona que te llama) y acceder a los permisos siguientes:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"¿Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; gestione &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"gafas"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Se necesita esta aplicación para gestionar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> podrá interactuar con tus notificaciones y acceder a tus permisos de teléfono, SMS, contactos, micrófono y dispositivos cercanos."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Esta aplicación podrá acceder a los siguientes permisos de tu teléfono:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información de tu teléfono"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servicios multidispositivo"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pidiendo permiso en nombre de tu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> para emitir aplicaciones en otros dispositivos tuyos"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"¿Permitir que &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; realice esta acción?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pidiendo permiso en nombre de tu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para emitir aplicaciones y otras funciones del sistema en dispositivos cercanos"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Esta aplicación podrá sincronizar información (por ejemplo, el nombre de la persona que te llama) entre tu teléfono y <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"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>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
     <string name="consent_no" msgid="2640796915611404382">"No permitir"</string>
     <string name="consent_back" msgid="2560683030046918882">"Atrás"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Muestra en streaming las aplicaciones de tu teléfono"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Emite aplicaciones y otras funciones del sistema desde tu teléfono"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-et/strings.xml b/packages/CompanionDeviceManager/res/values-et/strings.xml
index f0e565f2..bbd3ae4 100644
--- a/packages/CompanionDeviceManager/res/values-et/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-et/strings.xml
@@ -17,15 +17,19 @@
 <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">"Kaasseadme haldur"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Andke 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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"käekell"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Valige <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, mida haldab rakendus &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Seda rakendust on vaja teie seadme <xliff:g id="DEVICE_NAME">%1$s</xliff:g> haldamiseks. Rakendusel <xliff:g id="APP_NAME">%2$s</xliff:g> lubatakse sünkroonida teavet, näiteks helistaja nime, kasutada teie märguandeid ning pääseda juurde teie telefoni, SMS-ide, kontaktide, kalendri, kõnelogide ja läheduses olevate seadmete lubadele."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Seda rakendust on vaja teie seadme <xliff:g id="DEVICE_NAME">%1$s</xliff:g> haldamiseks. <xliff:g id="APP_NAME">%2$s</xliff:g> lubatakse sünkroonida teavet, näiteks helistaja nime, ja pääseda juurde järgmistele lubadele."</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"prillid"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Seda rakendust on vaja seadme <xliff:g id="DEVICE_NAME">%1$s</xliff:g> haldamiseks. Rakendusel <xliff:g id="APP_NAME">%2$s</xliff:g> lubatakse kasutada teie märguandeid ning pääseda juurde teie telefoni, SMS-ide, kontaktide, mikrofoni ja läheduses olevate seadmete lubadele."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Sellele rakendusele antakse luba neile juurdepääsudele teie telefonis:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Lubage rakendusel &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pääseda teie telefonis juurde sellele teabele"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Seadmeülesed teenused"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> nimel luba teie seadmete vahel rakendusi voogesitada"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Kas lubada seadmel &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; teha seda toimingut?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nimel luba voogesitada rakendusi ja muid süsteemi funktsioone läheduses olevatesse seadmetesse"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"seade"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"See rakendus saab sünkroonida teavet, näiteks helistaja nime, teie telefoni ja seadme <xliff:g id="DEVICE_NAME">%1$s</xliff:g> vahel."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"See rakendus saab sünkroonida teavet, näiteks helistaja nime, teie telefoni ja valitud seadme vahel."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Luba"</string>
     <string name="consent_no" msgid="2640796915611404382">"Ära luba"</string>
     <string name="consent_back" msgid="2560683030046918882">"Tagasi"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Telefoni rakenduste voogesitamine"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Rakenduste ja muude süsteemi funktsioonide voogesitamine teie telefonist"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-eu/strings.xml b/packages/CompanionDeviceManager/res/values-eu/strings.xml
index caebdda..1185b2d 100644
--- a/packages/CompanionDeviceManager/res/values-eu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-eu/strings.xml
@@ -17,15 +17,19 @@
 <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">"Gailu osagarriaren kudeatzailea"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Eman &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; erabiltzeko baimena &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"erlojua"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Aukeratu &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; aplikazioak kudeatu beharreko <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> kudeatzeko behar da aplikazioa. Informazioa sinkronizatzeko (esate baterako, deitzaileen izenak), jakinarazpenekin interakzioan aritzeko, eta telefonoa, SMSak, kontaktuak, egutegia, deien erregistroa eta inguruko gailuak erabiltzeko baimena izango du <xliff:g id="APP_NAME">%2$s</xliff:g> aplikazioak."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> kudeatzeko behar da aplikazioa. Informazioa sinkronizatzeko (esate baterako, deitzaileen izenak) eta ekintza hauek gauzatzeko baimena izango du <xliff:g id="APP_NAME">%2$s</xliff:g> aplikazioak:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; kudeatzeko baimena eman nahi diozu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"betaurrekoak"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> gailua kudeatzeko behar da aplikazioa. Jakinarazpenekin interakzioan aritzeko, eta telefonoa, SMSak, kontaktuak, mikrofonoa eta inguruko gailuak erabiltzeko baimena izango du <xliff:g id="APP_NAME">%2$s</xliff:g> aplikazioak."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Telefonoko baimen hauek erabiltzeko baimena izango du aplikazioak:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Eman informazioa telefonotik hartzeko baimena &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Gailu baterako baino gehiagotarako zerbitzuak"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Gailu batetik bestera aplikazioak igortzeko baimena eskatzen ari da <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> gailuaren izenean"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Ekintza hau gauzatzeko baimena eman nahi diozu &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikazioak eta sistemaren beste eginbide batzuk inguruko gailuetara igortzeko baimena eskatzen ari da <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME">%2$s</xliff:g> gailuaren izenean"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"gailua"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Telefonoaren eta <xliff:g id="DEVICE_NAME">%1$s</xliff:g> gailuaren artean informazioa sinkronizatzeko gai izango da aplikazioa (esate baterako, deitzaileen izenak)."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Telefonoaren eta hautatutako gailuaren artean informazioa sinkronizatzeko gai izango da aplikazioa (esate baterako, deitzaileen izenak)."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Eman baimena"</string>
     <string name="consent_no" msgid="2640796915611404382">"Ez eman baimenik"</string>
     <string name="consent_back" msgid="2560683030046918882">"Atzera"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Igorri zuzenean telefonoko aplikazioak"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Igorri aplikazioak eta sistemaren beste eginbide batzuk telefonotik"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-fa/strings.xml b/packages/CompanionDeviceManager/res/values-fa/strings.xml
index 031b9d9..d77c5c9 100644
--- a/packages/CompanionDeviceManager/res/values-fa/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fa/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"‏اجازه دادن به &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ساعت"</string>
     <string name="chooser_title" msgid="2262294130493605839">"‏انتخاب <xliff:g id="PROFILE_NAME">%1$s</xliff:g> برای مدیریت کردن با &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>‏&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"این برنامه برای مدیریت <xliff:g id="DEVICE_NAME">%1$s</xliff:g> شما لازم است. به <xliff:g id="APP_NAME">%2$s</xliff:g> اجازه داده می‌شود اطلاعاتی مثل نام شخصی که تماس می‌گیرد را همگام‌سازی کند، با اعلان‌های شما تعامل داشته باشد، و به اجازه‌های «تلفن»، «پیامک»، «مخاطبین»، «تقویم»، «گزارش‌های تماس»، و «دستگاه‌های اطراف» دسترسی داشته باشد."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"این برنامه برای مدیریت <xliff:g id="DEVICE_NAME">%1$s</xliff:g> شما لازم است. به <xliff:g id="APP_NAME">%2$s</xliff:g> اجازه داده می‌شود اطلاعاتی مثل نام شخصی که تماس می‌گیرد را همگام‌سازی کند و به این اجازه‌ها دسترسی داشته باشد:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"عینک"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"این برنامه برای مدیریت <xliff:g id="DEVICE_NAME">%1$s</xliff:g> لازم است. به <xliff:g id="APP_NAME">%2$s</xliff:g> اجازه داده می‌شود با اعلان‌های شما تعامل داشته باشد و به اجازه‌های «تلفن»، «پیامک»، «مخاطبین»، «میکروفون»، و «دستگاه‌های اطراف» دسترسی داشته باشد."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"این برنامه مجاز می‌شود به اجازه‌های زیر در تلفن شما دسترسی داشته باشد:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"‏اجازه دادن به &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; برای دسترسی به اطلاعات تلفن"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"سرویس‌های بین‌دستگاهی"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> اجازه می‌خواهد ازطرف <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> برنامه‌ها را بین دستگاه‌های شما جاری‌سازی کند"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"‏به &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; اجازه داده شود این اقدام را انجام دهد؟"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ازطرف <xliff:g id="DEVICE_NAME">%2$s</xliff:g> اجازه می‌خواهد تا برنامه‌ها و دیگر ویژگی‌های سیستم را در دستگاه‌های اطراف جاری‌سازی کند."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"دستگاه"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"این برنامه مجاز می‌شود اطلاعتی مثل نام شخصی که تماس می‌گیرد را بین تلفن شما و <xliff:g id="DEVICE_NAME">%1$s</xliff:g> همگام‌سازی کند."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"این برنامه مجاز می‌شود اطلاعتی مثل نام شخصی که تماس می‌گیرد را بین تلفن شما و دستگاه انتخاب‌شده همگام‌سازی کند."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"اجازه دادن"</string>
     <string name="consent_no" msgid="2640796915611404382">"اجازه ندادن"</string>
     <string name="consent_back" msgid="2560683030046918882">"برگشتن"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"جاری‌سازی برنامه‌های تلفن"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"برنامه‌ها و دیگر ویژگی‌های سیستم را از تلفن شما جاری‌سازی می‌کند"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-fi/strings.xml b/packages/CompanionDeviceManager/res/values-fi/strings.xml
index 990b818..c679f86 100644
--- a/packages/CompanionDeviceManager/res/values-fi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fi/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Salli, että &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"kello"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Valitse <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, jota &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; hallinnoi"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> edellyttää ylläpitoon tätä sovellusta. <xliff:g id="APP_NAME">%2$s</xliff:g> saa luvan synkronoida tietoja (esimerkiksi soittajan nimen), hallinnoida ilmoituksiasi sekä pääsyn puhelimeen, tekstiviesteihin, yhteystietoihin, kalenteriin, puhelulokeihin ja lähellä olevat laitteet ‑lupiin."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> edellyttää ylläpitoon tätä sovellusta. <xliff:g id="APP_NAME">%2$s</xliff:g> saa luvan synkronoida tietoja (esimerkiksi soittajan nimen) ja pääsyn näihin lupiin:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Salli, että &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; saa ylläpitää laitetta: &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"lasit"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> edellyttää ylläpitoon tätä sovellusta. <xliff:g id="APP_NAME">%2$s</xliff:g> saa luvan hallinnoida ilmoituksiasi sekä pääsyn puhelimeen, tekstiviesteihin, yhteystietoihin, mikrofoniin ja lähellä olevat laitteet ‑lupiin."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Tämä sovellus saa käyttää näitä lupia puhelimella:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Salli, että &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; saa pääsyn näihin puhelimesi tietoihin"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Laitteidenväliset palvelut"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> pyytää laitteesi (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) puolesta lupaa striimata sovelluksia laitteidesi välillä"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Sallitko, että &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; voi suorittaa tämän toiminnon?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> pyytää laitteesi (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) puolesta lupaa striimata sovelluksia ja muita järjestelmän ominaisuuksia lähellä oleviin laitteisiin."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"laite"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Sovellus voi synkronoida tietoja (esimerkiksi soittajan nimen) puhelimesi ja laitteen (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) välillä."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Sovellus voi synkronoida tietoja (esimerkiksi soittajan nimen) puhelimesi ja valitun laitteen välillä."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Salli"</string>
     <string name="consent_no" msgid="2640796915611404382">"Älä salli"</string>
     <string name="consent_back" msgid="2560683030046918882">"Takaisin"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Striimaa puhelimen sovelluksia"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Striimaa sovelluksia ja muita järjestelmän ominaisuuksia puhelimesta"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
index 38f01cd..f88864d 100644
--- a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
@@ -17,15 +17,19 @@
 <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">"Gestionnaire d\'appareil compagnon"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Autoriser &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"montre"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Choisissez un(e) <xliff:g id="PROFILE_NAME">%1$s</xliff:g> qui sera géré(e) par &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"L\'application est nécessaire pour gérer votre <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> aura l\'autorisation de synchroniser des informations, comme le nom de l\'appelant, d\'interagir avec vos notifications et d\'accéder à vos autorisations pour le téléphone, les messages texte, les contacts, l\'agenda, les journaux d\'appels et les appareils à proximité."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"L\'application est nécessaire pour gérer votre <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> aura l\'autorisation de synchroniser des informations, comme le nom de l\'appelant, et d\'accéder à ces autorisations :"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"lunettes"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Cette application est nécessaire pour gérer <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> sera autorisée à interagir avec vos notifications et à accéder à vos autorisations pour le téléphone, les messages texte, les contacts, le microphone et les appareils à proximité."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Cette application pourra accéder aux autorisations suivantes sur votre téléphone :"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Autorisez &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à accéder à ces informations à partir de votre téléphone"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Services multiappareils"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> pour diffuser des applications entre vos appareils"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Autoriser &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; à effectuer cette action?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation, au nom de votre <xliff:g id="DEVICE_NAME">%2$s</xliff:g>, de diffuser des applications et d\'autres fonctionnalités du système sur des appareils à proximité"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Cette application pourra synchroniser des informations, comme le nom de l\'appelant, entre votre téléphone et <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Cette application pourra synchroniser des informations, comme le nom de l\'appelant, entre votre téléphone et l\'appareil sélectionné."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Autoriser"</string>
     <string name="consent_no" msgid="2640796915611404382">"Ne pas autoriser"</string>
     <string name="consent_back" msgid="2560683030046918882">"Retour"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Diffusez les applications de votre téléphone"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Diffusez des applications et d\'autres fonctionnalités du système à partir de votre téléphone"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-fr/strings.xml b/packages/CompanionDeviceManager/res/values-fr/strings.xml
index dbae1ab..94d00af 100644
--- a/packages/CompanionDeviceManager/res/values-fr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fr/strings.xml
@@ -17,15 +17,19 @@
 <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">"Gestionnaire d\'appareils associés"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Autoriser &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"montre"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Sélectionnez le/la <xliff:g id="PROFILE_NAME">%1$s</xliff:g> qui sera géré(e) par &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Cette appli est nécessaire pour gérer votre <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> aura l\'autorisation de synchroniser des informations (comme le nom de la personne à l\'origine d\'un appel entrant), d\'interagir avec vos notifications et d\'accéder aux autorisations du téléphone, des SMS, des contacts, de l\'agenda, des journaux d\'appels et des appareils à proximité."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Cette appli est nécessaire pour gérer votre <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> aura l\'autorisation de synchroniser vos informations, comme le nom de la personne à l\'origine d\'un appel entrant, et d\'accéder à ces autorisations :"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"lunettes"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Cette appli est nécessaire pour gérer <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> aura l\'autorisation d\'interagir avec vos notifications et d\'accéder aux autorisations du téléphone, des SMS, des contacts, du micro et des appareils à proximité."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Cette appli sera autorisée à accéder à ces autorisations sur votre téléphone :"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à accéder à ces informations depuis votre téléphone"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Services inter-appareils"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> pour caster des applis d\'un appareil à l\'autre"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Autoriser &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; à effectuer cette action ?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DEVICE_NAME">%2$s</xliff:g> de diffuser des applis et d\'autres fonctionnalités système en streaming sur des appareils à proximité"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Cette appli pourra synchroniser des informations entre votre téléphone et <xliff:g id="DEVICE_NAME">%1$s</xliff:g>, comme le nom de la personne à l\'origine d\'un appel entrant."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Cette appli pourra synchroniser des informations entre votre téléphone et l\'appareil choisi, comme le nom de la personne à l\'origine d\'un appel entrant."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Autoriser"</string>
     <string name="consent_no" msgid="2640796915611404382">"Ne pas autoriser"</string>
     <string name="consent_back" msgid="2560683030046918882">"Retour"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Diffuser en streaming les applis de votre téléphone"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Diffusez des applis et d\'autres fonctionnalités système en streaming depuis votre téléphone"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-gl/strings.xml b/packages/CompanionDeviceManager/res/values-gl/strings.xml
index 4f78073..f9b1475 100644
--- a/packages/CompanionDeviceManager/res/values-gl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-gl/strings.xml
@@ -17,15 +17,19 @@
 <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">"Xestor de dispositivos complementarios"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda ao dispositivo (&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;)"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"reloxo"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Escolle un dispositivo (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>) para que o xestione a aplicación &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"A aplicación é necesaria para xestionar o teu dispositivo (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>). <xliff:g id="APP_NAME">%2$s</xliff:g> poderá sincronizar información (por exemplo, o nome de quen chama), interactuar coas túas notificacións e acceder aos permisos do teu teléfono, das SMS, dos contactos, do calendario, dos rexistros de chamadas e dos dispositivos próximos."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"A aplicación é necesaria para xestionar o teu dispositivo (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>). <xliff:g id="APP_NAME">%2$s</xliff:g> poderá sincronizar información (por exemplo, o nome de quen chama) e acceder a estes permisos:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Queres permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; xestione o dispositivo (&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;)?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"lentes"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Esta aplicación é necesaria para xestionar o dispositivo (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>). <xliff:g id="APP_NAME">%2$s</xliff:g> poderá interactuar coas túas notificacións e acceder aos permisos do teu teléfono, das SMS, dos contactos, do micrófono e dos dispositivos próximos."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Esta aplicación poderá acceder aos seguintes permisos do teléfono:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Permitir que a aplicación &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información desde o teu teléfono"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servizos multidispositivo"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nome do teu dispositivo (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>) para emitir contido de aplicacións entre os teus aparellos"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Queres permitir que &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; leve a cabo esta acción?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nome do teu dispositivo (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) para emitir o contido das aplicacións e doutras funcións do sistema en dispositivos próximos"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Esta aplicación poderá sincronizar información (por exemplo, o nome de quen chama) entre o teléfono e o dispositivo (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Esta aplicación poderá sincronizar información (por exemplo, o nome de quen chama) entre o teléfono e o dispositivo escollido."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
     <string name="consent_no" msgid="2640796915611404382">"Non permitir"</string>
     <string name="consent_back" msgid="2560683030046918882">"Atrás"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Emite as aplicacións do teu teléfono"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Emite o contido das aplicacións e doutras funcións do sistema desde o teléfono"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-gu/strings.xml b/packages/CompanionDeviceManager/res/values-gu/strings.xml
index f4f496f..dd32e5d 100644
--- a/packages/CompanionDeviceManager/res/values-gu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-gu/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"સ્માર્ટવૉચ"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; દ્વારા મેનેજ કરવા માટે કોઈ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> પસંદ કરો"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"તમારા <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ને મેનેજ કરવા માટે ઍપ જરૂરી છે. <xliff:g id="APP_NAME">%2$s</xliff:g>ને કૉલ કરનાર વ્યક્તિનું નામ જેવી માહિતી સિંક કરવાની, તમારા નોટિફિકેશન સાથે ક્રિયાપ્રતિક્રિયા કરવાની અને તમારો ફોન, SMS, સંપર્કો, Calendar, કૉલ લૉગ તથા નજીકના ડિવાઇસની પરવાનગીઓ ઍક્સેસ કરવાની મંજૂરી આપવામાં આવશે."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"તમારા <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ને મેનેજ કરવા માટે ઍપ જરૂરી છે. <xliff:g id="APP_NAME">%2$s</xliff:g>ને કૉલ કરનાર વ્યક્તિનું નામ જેવી માહિતી સિંક કરવાની અને આ પરવાનગીઓ ઍક્સેસ કરવાની મંજૂરી આપવામાં આવશે:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"ચશ્માં"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ને મેનેજ કરવા માટે આ ઍપ જરૂરી છે. <xliff:g id="APP_NAME">%2$s</xliff:g>ને તમારા નોટિફિકેશન સાથે ક્રિયાપ્રતિક્રિયા કરવાની અને તમારો ફોન, SMS, સંપર્કો, માઇક્રોફોન તથા નજીકના ડિવાઇસની પરવાનગીઓ ઍક્સેસ કરવાની મંજૂરી આપવામાં આવશે."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"આ ઍપને તમારા ફોન પર આ પરવાનગીઓ ઍક્સેસ કરવાની મંજૂરી મળશે:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"તમારા ફોનમાંથી આ માહિતી ઍક્સેસ કરવા માટે, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ને મંજૂરી આપો"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ક્રોસ-ડિવાઇસ સેવાઓ"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> તમારા <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> વતી તમારા ડિવાઇસ વચ્ચે ઍપ સ્ટ્રીમ કરવાની પરવાનગીની વિનંતી કરી રહી છે"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;ને આ પગલું ભરવાની મંજૂરી આપીએ?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> નજીકના ડિવાઇસ પર ઍપ અને સિસ્ટમની અન્ય સુવિધાઓ સ્ટ્રીમ કરવા તમારા <xliff:g id="DEVICE_NAME">%2$s</xliff:g> વતી પરવાનગીની વિનંતી કરી રહી છે"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ડિવાઇસ"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"આ ઍપ તમારા ફોન અને <xliff:g id="DEVICE_NAME">%1$s</xliff:g> વચ્ચે, કૉલ કરનાર કોઈ વ્યક્તિનું નામ જેવી માહિતી સિંક કરી શકશે."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"આ ઍપ તમારા ફોન અને પસંદ કરેલા ડિવાઇસ વચ્ચે, કૉલ કરનાર કોઈ વ્યક્તિનું નામ જેવી માહિતી સિંક કરી શકશે."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"મંજૂરી આપો"</string>
     <string name="consent_no" msgid="2640796915611404382">"મંજૂરી આપશો નહીં"</string>
     <string name="consent_back" msgid="2560683030046918882">"પાછળ"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"તમારા ફોનની ઍપ સ્ટ્રીમ કરો"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"તમારા ફોન પરથી ઍપ અને સિસ્ટમની અન્ય સુવિધાઓ સ્ટ્રીમ કરો"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-hi/strings.xml b/packages/CompanionDeviceManager/res/values-hi/strings.xml
index 2b1def0..e5ee703 100644
--- a/packages/CompanionDeviceManager/res/values-hi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hi/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"स्मार्टवॉच"</string>
     <string name="chooser_title" msgid="2262294130493605839">"कोई <xliff:g id="PROFILE_NAME">%1$s</xliff:g> चुनें, ताकि उसे &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; की मदद से मैनेज किया जा सके"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"यह ऐप्लिकेशन, <xliff:g id="DEVICE_NAME">%1$s</xliff:g> को मैनेज करने के लिए ज़रूरी है. <xliff:g id="APP_NAME">%2$s</xliff:g> को डिवाइस की जानकारी सिंक करने की अनुमति होगी. जैसे, कॉल करने वाले व्यक्ति का नाम. इसे आपकी सूचनाओं पर कार्रवाई करने के साथ-साथ आपके फ़ोन, एसएमएस, संपर्कों, कैलेंडर, कॉल लॉग, और आस-पास मौजूद डिवाइसों को ऐक्सेस करने की अनुमति भी होगी."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"यह ऐप्लिकेशन, <xliff:g id="DEVICE_NAME">%1$s</xliff:g> को मैनेज करने के लिए ज़रूरी है. <xliff:g id="APP_NAME">%2$s</xliff:g> को डिवाइस की जानकारी सिंक करने की अनुमति होगी. जैसे, कॉल करने वाले व्यक्ति का नाम. ऐप्लिकेशन इन अनुमतियों का भी इस्तेमाल कर पाएगा:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"चश्मा"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"यह ऐप्लिकेशन, <xliff:g id="DEVICE_NAME">%1$s</xliff:g> को मैनेज करने के लिए ज़रूरी है. <xliff:g id="APP_NAME">%2$s</xliff:g> को डिवाइस की सूचनाओं पर कार्रवाई करने की अनुमति होगी. इसे आपके फ़ोन, मैसेज, संपर्कों, माइक्रोफ़ोन, और आस-पास मौजूद डिवाइसों को ऐक्सेस करने की अनुमति भी होगी."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"इस ऐप्लिकेशन को आपके फ़ोन पर ये अनुमतियां ऐक्सेस करने की अनुमति होगी:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; को अपने फ़ोन से यह जानकारी ऐक्सेस करने की अनुमति दें"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"क्रॉस-डिवाइस से जुड़ी सेवाएं"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> आपके <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> की ओर से, आपके डिवाइसों के बीच ऐप्लिकेशन को स्ट्रीम करने की अनुमति मांग रहा है"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"क्या &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; को यह कार्रवाई करने की अनुमति देनी है?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> आपके <xliff:g id="DEVICE_NAME">%2$s</xliff:g> की ओर से, ऐप्लिकेशन और दूसरे सिस्टम की सुविधाओं को आस-पास मौजूद डिवाइसों पर स्ट्रीम करने की अनुमति मांग रहा है"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"डिवाइस"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"यह ऐप्लिकेशन, आपके फ़ोन और <xliff:g id="DEVICE_NAME">%1$s</xliff:g> के बीच जानकारी सिंक कर सकता है. जैसे, कॉल करने वाले व्यक्ति का नाम."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"यह ऐप्लिकेशन, आपके फ़ोन और चुने हुए डिवाइस के बीच जानकारी सिंक कर सकता है. जैसे, कॉल करने वाले व्यक्ति का नाम."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"अनुमति दें"</string>
     <string name="consent_no" msgid="2640796915611404382">"अनुमति न दें"</string>
     <string name="consent_back" msgid="2560683030046918882">"वापस जाएं"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"अपने फ़ोन पर मौजूद ऐप्लिकेशन स्ट्रीम करें"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"अपने फ़ोन से ऐप्लिकेशन और दूसरे सिस्टम की सुविधाओं को स्ट्रीम करें"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-hr/strings.xml b/packages/CompanionDeviceManager/res/values-hr/strings.xml
index 77c7f94..559dfd5 100644
--- a/packages/CompanionDeviceManager/res/values-hr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hr/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Dopustite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da pristupa uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"satom"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Odaberite <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kojim će upravljati aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Aplikacija je potrebna za upravljanje vašim uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Aplikacija <xliff:g id="APP_NAME">%2$s</xliff:g> moći će sinkronizirati podatke, primjerice ime pozivatelja, stupati u interakciju s vašim obavijestima i pristupati vašim dopuštenjima za telefon, SMS-ove, kontakte, kalendar, zapisnike poziva i uređaje u blizini."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Aplikacija je potrebna za upravljanje vašim uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Aplikacija <xliff:g id="APP_NAME">%2$s</xliff:g> moći će sinkronizirati podatke, primjerice ime pozivatelja i pristupati sljedećim dopuštenjima:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Dopustiti aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da upravlja uređajem &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"naočale"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Ta je aplikacija potrebna za upravljanje uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Aplikacija <xliff:g id="APP_NAME">%2$s</xliff:g> moći će stupati u interakciju s vašim obavijestima i pristupati vašim dopuštenjima za telefon, SMS-ove, kontakte, mikrofon i uređaje u blizini."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Aplikacija će moći pristupati ovim dopuštenjima na telefonu:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Omogućite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da pristupa informacijama s vašeg telefona"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Usluge na različitim uređajima"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahtijeva dopuštenje u ime vašeg uređaja <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> za emitiranje aplikacija između vaših uređaja"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Dopustiti &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; da izvede tu radnju?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahtijeva dopuštenje u ime vašeg uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> za emitiranje aplikacija i drugih značajki sustava na uređajima u blizini"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Ta će aplikacija moći sinkronizirati podatke između vašeg telefona i uređaja <xliff:g id="DEVICE_NAME">%1$s</xliff:g>, primjerice ime pozivatelja."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Ta će aplikacija moći sinkronizirati podatke između vašeg telefona i odabranog uređaja, primjerice ime pozivatelja."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Dopusti"</string>
     <string name="consent_no" msgid="2640796915611404382">"Nemoj dopustiti"</string>
     <string name="consent_back" msgid="2560683030046918882">"Natrag"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Streaming aplikacija vašeg telefona"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Emitiranje aplikacija i drugih značajki sustava s vašeg telefona"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-hu/strings.xml b/packages/CompanionDeviceManager/res/values-hu/strings.xml
index f1b5520..bc317ee 100644
--- a/packages/CompanionDeviceManager/res/values-hu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hu/strings.xml
@@ -17,15 +17,19 @@
 <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">"Társeszközök kezelője"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"A(z) &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; hozzáférésének engedélyezése a(z) &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; eszközhöz"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"óra"</string>
     <string name="chooser_title" msgid="2262294130493605839">"A(z) &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; alkalmazással kezelni kívánt <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kiválasztása"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Az alkalmazásra szükség van a következő eszköz kezeléséhez: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. A(z) <xliff:g id="APP_NAME">%2$s</xliff:g> képes lesz szinkronizálni információkat (például a hívó fél nevét), műveleteket végezhet majd az értesítésekkel, és hozzáférhet majd a Telefon, az SMS, a Névjegyek, a Naptár, a Hívásnaplók és a Közeli eszközök engedélyekhez."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Az alkalmazásra szükség van a következő eszköz kezeléséhez: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. A(z) <xliff:g id="APP_NAME">%2$s</xliff:g> 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:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"szemüveg"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Erre az alkalmazásra szükség van a következő eszköz kezeléséhez: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. A(z) <xliff:g id="APP_NAME">%2$s</xliff:g> műveleteket végezhet majd az értesítésekkel, és hozzáférhet majd a Telefon, az SMS, a Névjegyek, a Mikrofon és a Közeli eszközök engedélyekhez."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Az alkalmazás hozzáférhet majd a következő engedélyekhez a telefonon:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Engedélyezi a(z) „<xliff:g id="APP_NAME">%1$s</xliff:g>” alkalmazás számára az információhoz való hozzáférést a telefonról"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Többeszközös szolgáltatások"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> engedélyt kér a(z) <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> nevében az alkalmazások eszközök közötti streameléséhez"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Engedélyezi a(z) &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; számára ennek a műveletnek a végrehajtását?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> engedélyt kér a(z) <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nevében az alkalmazások és más rendszerfunkciók közeli eszközökre történő streamelésére"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"eszköz"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Ez az alkalmazás képes lesz szinkronizálni az olyan információkat a telefon és a(z) <xliff:g id="DEVICE_NAME">%1$s</xliff:g> eszköz között, mint például a hívó fél neve."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Ez az alkalmazás képes lesz szinkronizálni az olyan információkat a telefon és a kiválasztott eszköz között, mint például a hívó fél neve."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Engedélyezés"</string>
     <string name="consent_no" msgid="2640796915611404382">"Tiltás"</string>
     <string name="consent_back" msgid="2560683030046918882">"Vissza"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"A telefon alkalmazásainak streamelése"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Alkalmazások és más rendszerfunkciók streamelése a telefonról"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-hy/strings.xml b/packages/CompanionDeviceManager/res/values-hy/strings.xml
index e45ccaf..bc7bfc7 100644
--- a/packages/CompanionDeviceManager/res/values-hy/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hy/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Թույլատրեք &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ժամացույց"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Ընտրեք <xliff:g id="PROFILE_NAME">%1$s</xliff:g>ը, որը պետք է կառավարվի &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; հավելվածի կողմից"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Հավելվածն անհրաժեշտ է ձեր <xliff:g id="DEVICE_NAME">%1$s</xliff:g> սարքը կառավարելու համար։ <xliff:g id="APP_NAME">%2$s</xliff:g> հավելվածը կկարողանա համաժամացնել տվյալները, օր․՝ զանգողի անունը, փոխազդել ձեր ծանուցումների հետ և կստանա «Հեռախոս», «SMS», «Կոնտակտներ», «Օրացույց», «Կանչերի ցուցակ» և «Մոտակա սարքեր» թույլտվությունները։"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Հավելվածն անհրաժեշտ է ձեր <xliff:g id="DEVICE_NAME">%1$s</xliff:g> սարքը կառավարելու համար։ <xliff:g id="APP_NAME">%2$s</xliff:g> հավելվածը կկարողանա համաժամացնել տվյալները, օր․՝ զանգողի անունը, և կստանա հետևյալ թույլտվությունները․"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"ակնոց"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Այս հավելվածն անհրաժեշտ է <xliff:g id="DEVICE_NAME">%1$s</xliff:g> սարքը կառավարելու համար։ <xliff:g id="APP_NAME">%2$s</xliff:g> հավելվածը կկարողանա փոխազդել ձեր ծանուցումների հետ և կստանա «Հեռախոս», «SMS», «Կոնտակտներ», «Խոսափող» և «Մոտակա սարքեր» թույլտվությունները։"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Այս հեռախոսին հասանելի կլինեն հետևյալ թույլտվությունները ձեր հեռախոսում․"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Թույլատրեք &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածին օգտագործել այս տեղեկությունները ձեր հեռախոսից"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Միջսարքային ծառայություններ"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը ձեր <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> սարքի անունից թույլտվություն է խնդրում՝ ձեր սարքերի միջև հավելվածներ հեռարձակելու համար"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Թույլատրե՞լ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածին կատարել այս գործողությունը"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը ձեր <xliff:g id="DEVICE_NAME">%2$s</xliff:g> սարքի անունից թույլտվություն է խնդրում՝ մոտակա սարքերին հավելվածներ և համակարգի այլ գործառույթներ հեռարձակելու համար"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"սարք"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Այս հավելվածը կկարողանա համաժամացնել ձեր հեռախոսի և <xliff:g id="DEVICE_NAME">%1$s</xliff:g> սարքի տվյալները, օր․՝ զանգողի անունը։"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Այս հավելվածը կկարողանա համաժամացնել ձեր հեռախոսի և ընտրված սարքի տվյալները, օր․՝ զանգողի անունը։"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Թույլատրել"</string>
     <string name="consent_no" msgid="2640796915611404382">"Չթույլատրել"</string>
     <string name="consent_back" msgid="2560683030046918882">"Հետ"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Հեռարձակել հեռախոսի հավելվածները"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Հեռարձակել հավելվածներ և համակարգի այլ գործառույթներ հեռախոսում"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-in/strings.xml b/packages/CompanionDeviceManager/res/values-in/strings.xml
index db2f1ef..8ece9de 100644
--- a/packages/CompanionDeviceManager/res/values-in/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-in/strings.xml
@@ -17,15 +17,19 @@
 <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">"Pengelola Perangkat Pendamping"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Izinkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; mengakses &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"smartwatch"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Pilih <xliff:g id="PROFILE_NAME">%1$s</xliff:g> untuk dikelola oleh &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Aplikasi diperlukan untuk mengelola <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> akan diizinkan menyinkronkan informasi, seperti nama pemanggil, berinteraksi dengan notifikasi, dan mengakses izin Telepon, SMS, Kontak, Kalender, Log panggilan, dan Perangkat di sekitar."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Aplikasi diperlukan untuk mengelola <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> akan diizinkan menyinkronkan informasi, seperti nama pemanggil, dan mengakses izin berikut:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Izinkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; mengelola &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"glasses"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Aplikasi ini diperlukan untuk mengelola <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> akan diizinkan berinteraksi dengan notifikasi dan mengakses izin Ponsel, SMS, Kontak, Mikrofon, dan Perangkat di sekitar."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Aplikasi ini akan diizinkan untuk mengakses izin ini di ponsel Anda:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Izinkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk mengakses informasi ini dari ponsel Anda"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Layanan lintas perangkat"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta izin atas nama <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> untuk menstreaming aplikasi di antara perangkat Anda"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Izinkan &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; melakukan tindakan ini?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta izin atas nama <xliff:g id="DEVICE_NAME">%2$s</xliff:g> untuk menstreaming aplikasi dan fitur sistem lainnya ke perangkat di sekitar"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"perangkat"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Aplikasi ini akan dapat menyinkronkan info, seperti nama penelepon, antara ponsel dan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Aplikasi ini akan dapat menyinkronkan info, seperti nama penelepon, antara ponsel dan perangkat yang dipilih."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Izinkan"</string>
     <string name="consent_no" msgid="2640796915611404382">"Jangan izinkan"</string>
     <string name="consent_back" msgid="2560683030046918882">"Kembali"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Streaming aplikasi ponsel"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Menstreaming aplikasi dan fitur sistem lainnya dari ponsel Anda"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-is/strings.xml b/packages/CompanionDeviceManager/res/values-is/strings.xml
index a906cbc..49b06f0 100644
--- a/packages/CompanionDeviceManager/res/values-is/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-is/strings.xml
@@ -17,15 +17,19 @@
 <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">"Stjórnun fylgdartækja"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Veita &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aðgang að &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"úr"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Velja <xliff:g id="PROFILE_NAME">%1$s</xliff:g> sem &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; á að stjórna"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Forritið er nauðsynlegt til að stjórna <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> fær heimild til að samstilla upplýsingar, t.d. nafn þess sem hringir, og bregðast við tilkynningum og fær aðgang að heimildum fyrir síma, SMS, tengiliði, dagatal, símtalaskrár og nálæg tæki."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Forritið er nauðsynlegt til að stjórna <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> fær heimild til að samstilla upplýsingar, t.d. nafn þess sem hringir, og fær aðgang að eftirfarandi heimildum:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Leyfa &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; að stjórna &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"gleraugu"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Þetta forrit er nauðsynlegt til að stjórna <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> fær heimild til að bregðast við tilkynningum og fær aðgang að heimildum fyrir síma, SMS, tengiliði, hljóðnema og nálæg tæki."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Þetta forrit fær aðgang að eftirfarandi heimildum í símanum þínum:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Veita &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aðgang að þessum upplýsingum úr símanum þínum"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Þjónustur á milli tækja"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> sendir beiðni um heimild til straumspilunar forrita á milli tækjanna þinna fyrir hönd <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Leyfa &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; að framkvæma þessa aðgerð?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> biður um heimild fyrir <xliff:g id="DEVICE_NAME">%2$s</xliff:g> til að streyma forritum og öðrum kerfiseiginleikum í nálægum tækjum"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"tæki"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Þetta forrit mun geta samstillt upplýsingar, t.d. nafn þess sem hringir, á milli símans og <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Þetta forrit mun geta samstillt upplýsingar, t.d. nafn þess sem hringir, á milli símans og valins tækis."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Leyfa"</string>
     <string name="consent_no" msgid="2640796915611404382">"Ekki leyfa"</string>
     <string name="consent_back" msgid="2560683030046918882">"Til baka"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Streymdu forritum símans"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Streymdu forritum og öðrum kerfiseiginleikum úr símanum"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-it/strings.xml b/packages/CompanionDeviceManager/res/values-it/strings.xml
index 7c90775..0dc78ba 100644
--- a/packages/CompanionDeviceManager/res/values-it/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-it/strings.xml
@@ -17,15 +17,19 @@
 <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">"Gestione dispositivi companion"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Consenti all\'app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; di accedere a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"orologio"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Scegli un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> da gestire con &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Questa app è necessaria per gestire <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> potrà sincronizzare informazioni, ad esempio il nome di un chiamante, interagire con le tue notifiche e accedere alle autorizzazioni Telefono, SMS, Contatti, Calendario, Registri chiamate e Dispositivi nelle vicinanze."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Questa app è necessaria per gestire <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> potrà sincronizzare informazioni, ad esempio il nome di un chiamante, e accedere alle seguenti autorizzazioni:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"occhiali"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Questa app è necessaria per gestire <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> potrà interagire con le tue notifiche e accedere alle autorizzazioni Telefono, SMS, Contatti, Microfono e Dispositivi nelle vicinanze."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"L\'app potrà accedere alle seguenti autorizzazioni sul telefono:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Consenti a &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; di accedere a queste informazioni dal tuo telefono"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servizi cross-device"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede per conto del tuo <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> l\'autorizzazione a trasmettere app in streaming tra i dispositivi"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vuoi consentire a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; di compiere questa azione?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede per conto di <xliff:g id="DEVICE_NAME">%2$s</xliff:g> l\'autorizzazione a trasmettere in streaming app e altre funzionalità di sistema ai dispositivi nelle vicinanze"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Questa app potrà sincronizzare informazioni, ad esempio il nome di un chiamante, tra il telefono e <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Questa app potrà sincronizzare informazioni, ad esempio il nome di un chiamante, tra il telefono e il dispositivo scelto."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Consenti"</string>
     <string name="consent_no" msgid="2640796915611404382">"Non consentire"</string>
     <string name="consent_back" msgid="2560683030046918882">"Indietro"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Trasmetti in streaming le app del tuo telefono"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Consente di trasmettere in streaming app e altre funzionalità di sistema dal telefono"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-iw/strings.xml b/packages/CompanionDeviceManager/res/values-iw/strings.xml
index 28a8877..8ef04eb 100644
--- a/packages/CompanionDeviceManager/res/values-iw/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-iw/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"‏אישור לאפליקציה ‎&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"שעון"</string>
     <string name="chooser_title" msgid="2262294130493605839">"‏בחירת <xliff:g id="PROFILE_NAME">%1$s</xliff:g> לניהול באמצעות &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"‏האפליקציה הזו נחוצה כדי לנהל את <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. האפליקציה <xliff:g id="APP_NAME">%2$s</xliff:g> תוכל לסנכרן מידע, כמו השם של מישהו שמתקשר, לבצע פעולות בהתראות ולקבל הרשאות גישה לטלפון, ל-SMS לאנשי הקשר, למיקרופון ולמכשירים בקרבת מקום."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"האפליקציה הזו נחוצה כדי לנהל את <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. האפליקציה <xliff:g id="APP_NAME">%2$s</xliff:g> תוכל לסנכרן מידע, כמו השם של מישהו שמתקשר, ולקיים אינטראקציה עם ההרשאות הבאות:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"משקפיים"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"‏האפליקציה הזו נחוצה כדי לנהל את <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. האפליקציה <xliff:g id="APP_NAME">%2$s</xliff:g> תוכל לבצע פעולות בהתראות ותקבל הרשאות גישה לטלפון, ל-SMS לאנשי הקשר, למיקרופון ולמכשירים בקרבת מקום."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"האפליקציה הזו תוכל לגשת להרשאות הבאות בטלפון שלך:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"‏מתן אישור לאפליקציה &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; לגשת למידע הזה מהטלפון שלך"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"שירותים למספר מכשירים"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת הרשאה עבור מכשיר <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> כדי לשדר אפליקציות בין המכשירים שלך"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"‏לתת הרשאה למכשיר &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; לבצע את הפעולה הזו?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת הרשאה עבור <xliff:g id="DEVICE_NAME">%2$s</xliff:g> כדי להעביר אפליקציות ותכונות מערכת אחרות בסטרימינג למכשירים בקרבת מקום"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"מכשיר"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"האפליקציה הזו תוכל לסנכרן מידע, כמו השם של מישהו שמתקשר, מהטלפון שלך ל-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"האפליקציה הזו תוכל לסנכרן מידע, כמו השם של מישהו שמתקשר, מהטלפון שלך למכשיר שבחרת."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"יש אישור"</string>
     <string name="consent_no" msgid="2640796915611404382">"אין אישור"</string>
     <string name="consent_back" msgid="2560683030046918882">"חזרה"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"שידור אפליקציות מהטלפון"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"העברה של אפליקציות ותכונות מערכת אחרות בסטרימינג מהטלפון"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ja/strings.xml b/packages/CompanionDeviceManager/res/values-ja/strings.xml
index 964b63f..862ec94 100644
--- a/packages/CompanionDeviceManager/res/values-ja/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ja/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ウォッチ"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; の管理対象となる<xliff:g id="PROFILE_NAME">%1$s</xliff:g>の選択"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"このアプリは <xliff:g id="DEVICE_NAME">%1$s</xliff:g> の管理に必要です。<xliff:g id="APP_NAME">%2$s</xliff:g> は通話相手の名前などの情報を同期したり、デバイスの通知を使用したり、電話、SMS、連絡先、カレンダー、通話履歴、付近のデバイスの権限にアクセスしたりできるようになります。"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"このアプリは <xliff:g id="DEVICE_NAME">%1$s</xliff:g> の管理に必要です。<xliff:g id="APP_NAME">%2$s</xliff:g> は通話相手の名前などの情報を同期したり、次の権限にアクセスしたりできるようになります。"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"眼鏡"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"このアプリは <xliff:g id="DEVICE_NAME">%1$s</xliff:g> の管理に必要です。<xliff:g id="APP_NAME">%2$s</xliff:g> はデバイスの通知を使用したり、電話、SMS、連絡先、マイク、付近のデバイスの権限にアクセスしたりできるようになります。"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"このアプリは、スマートフォンの以下の権限へのアクセスが可能になります:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"スマートフォンのこの情報へのアクセスを &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; に許可"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"クロスデバイス サービス"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> が <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> に代わってデバイス間でアプリをストリーミングする権限をリクエストしています"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; にこの操作の実行を許可しますか?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> が <xliff:g id="DEVICE_NAME">%2$s</xliff:g> に代わって、アプリやその他のシステム機能を付近のデバイスにストリーミングする権限をリクエストしています"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"デバイス"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"このアプリは、あなたのスマートフォンと <xliff:g id="DEVICE_NAME">%1$s</xliff:g> との間で、通話相手の名前などの情報を同期できるようになります。"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"このアプリは、あなたのスマートフォンと選択したデバイスとの間で、通話相手の名前などの情報を同期できるようになります。"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"許可"</string>
     <string name="consent_no" msgid="2640796915611404382">"許可しない"</string>
     <string name="consent_back" msgid="2560683030046918882">"戻る"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"スマートフォンのアプリをストリーミングします"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"アプリやその他のシステム機能をスマートフォンからストリーミングする"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ka/strings.xml b/packages/CompanionDeviceManager/res/values-ka/strings.xml
index 930ef90..f80515b 100644
--- a/packages/CompanionDeviceManager/res/values-ka/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ka/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"დაუშვით &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"საათი"</string>
     <string name="chooser_title" msgid="2262294130493605839">"აირჩიეთ <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, რომელიც უნდა მართოს &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;-მა"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"ეს აპი საჭიროა თქვენი <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ის სამართავად. <xliff:g id="APP_NAME">%2$s</xliff:g>-ს ექნება უფლება, მოახდინოს ისეთი ინფორმაციის სინქრონიზაცია, როგორიც იმ ადამიანის სახელია, რომელიც რეკავს, მოახდინოს ინტერაქცია თქვენს შეტყობინებებთან და ჰქონდეს წვდომა თქვენს ტელეფონზე, SMS-ებზე, კონტაქტებზე, კალენდარზე, ზარების ჟურნალებზე და ახლომახლო მოწყობილობების ნებართვებზე."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"ეს აპი საჭიროა თქვენი <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ის სამართავად. <xliff:g id="APP_NAME">%2$s</xliff:g>-ს ექნება უფლება, მოახდინოს ისეთი ინფორმციის სინქრონიზაცია, როგორიც იმ ადამიანის სახელია, რომელიც რეკავს, და ჰქონდეს წვდომა შემდეგ ნებართვებზე:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"სათვალე"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"ეს აპი საჭიროა თქვენი <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ის სამართავად. <xliff:g id="APP_NAME">%2$s</xliff:g> შეძლებს თქვენს შეტყობინებებთან ინტერაქციას და თქვენს ტელეფონზე, SMS-ებზე, კონტაქტებზე, მიკროფონსა და ახლომახლო მოწყობილობების ნებართვებზე წვდომას."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"ამ აპისთვის ნებადართული იქნება მოცემულ ნებართვებზე წვდომა თქვენს ტელეფონში:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"ნება დართეთ, რომ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; აპს ჰქონდეს ამ ინფორმაციაზე წვდომა თქვენი ტელეფონიდან"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"მოწყობილობათშორისი სერვისები"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს უფლებას თქვენი <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-ის სახელით, რომ მოწყობილობებს შორის აპების სტრიმინგი შეძლოს"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"გსურთ ნება მისცეთ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ს&lt;/strong&gt; ამ მოქმედების შესასრულებლად?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს თქვენი <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-ის სახელით აპების და სისტემის სხვა ფუნქციების ახლომახლო მოწყობილობებზე სტრიმინგის ნებართვას"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"მოწყობილობა"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"ეს აპი შეძლებს, მოახდინოს ისეთი ინფორმაციის სინქრონიზაცია, როგორიც იმ ადამიანის სახელია, რომელიც რეკავს, თქვენს ტელეფონსა და <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ს შორის."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"ეს აპი შეძლებს, მოახდინოს ისეთი ინფორმაციის სინქრონიზაცია, როგორიც იმ ადამიანის სახელია, რომელიც რეკავს, თქვენს ტელეფონსა და არჩეულ მოწყობილობას შორის."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"დაშვება"</string>
     <string name="consent_no" msgid="2640796915611404382">"არ დაიშვას"</string>
     <string name="consent_back" msgid="2560683030046918882">"უკან"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"თქვენი ტელეფონის აპების სტრიმინგი"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"აწარმოეთ აპების და სისტემის სხვა ფუნქციების სტრიმინგი თქვენი ტელეფონიდან"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-kk/strings.xml b/packages/CompanionDeviceManager/res/values-kk/strings.xml
index 21b9ff8..67d1ab8 100644
--- a/packages/CompanionDeviceManager/res/values-kk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-kk/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"сағат"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; арқылы басқарылатын <xliff:g id="PROFILE_NAME">%1$s</xliff:g> құрылғысын таңдаңыз"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Қолданба <xliff:g id="DEVICE_NAME">%1$s</xliff:g> құрылғысын басқару үшін қажет. <xliff:g id="APP_NAME">%2$s</xliff:g> қолданбасына қоңырау шалушының аты сияқты деректі синхрондау, хабарландыруларды оқу, телефон, SMS, контактілер, күнтізбе, қоңырау журналдары қолданбаларын және маңайдағы құрылғыларды пайдалану рұқсаттары беріледі."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Қолданба <xliff:g id="DEVICE_NAME">%1$s</xliff:g> құрылғысын басқару үшін қажет. <xliff:g id="APP_NAME">%2$s</xliff:g> қолданбасына деректі (мысалы, қоңырау шалушының аты) синхрондауға және мына рұқсаттарды пайдалануға рұқсат беріледі:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"көзілдірік"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Бұл қолданба <xliff:g id="DEVICE_NAME">%1$s</xliff:g> құрылғысын басқару үшін қажет. <xliff:g id="APP_NAME">%2$s</xliff:g> қолданбасына хабарландыруларды оқуға, телефонды, хабарларды, контактілерді, микрофон мен маңайдағы құрылғыларды пайдалануға рұқсат беріледі."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Бұл қолданба телефоныңыздағы мына рұқсаттарды пайдалана алады:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына телефоныңыздағы осы ақпаратты пайдалануға рұқсат беріңіз."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Аралық құрылғы қызметтері"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> атынан құрылғылар арасында қолданбалар трансляциялау үшін рұқсат сұрайды."</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; құрылғысына бұл әрекетті орындауға рұқсат беру керек пе?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DEVICE_NAME">%2$s</xliff:g> атынан қолданбалар мен басқа да жүйе функцияларын маңайдағы құрылғыларға трансляциялау рұқсатын сұрап тұр."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"құрылғы"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Бұл қолданба телефон мен <xliff:g id="DEVICE_NAME">%1$s</xliff:g> құрылғысы арасында деректі (мысалы, қоңырау шалушының атын) синхрондайды."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Бұл қолданба телефон мен таңдалған құрылғы арасында деректі (мысалы, қоңырау шалушының атын) синхрондайды."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Рұқсат беру"</string>
     <string name="consent_no" msgid="2640796915611404382">"Рұқсат бермеу"</string>
     <string name="consent_back" msgid="2560683030046918882">"Артқа"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Телефон қолданбаларын трансляциялайды."</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Қолданбалар мен басқа да жүйе функцияларын телефоннан трансляциялау"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-km/strings.xml b/packages/CompanionDeviceManager/res/values-km/strings.xml
index 5048616..83cea12 100644
--- a/packages/CompanionDeviceManager/res/values-km/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-km/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"អនុញ្ញាតឱ្យ &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"នាឡិកា"</string>
     <string name="chooser_title" msgid="2262294130493605839">"ជ្រើសរើស <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ដើម្បីឱ្យស្ថិតក្រោម​ការគ្រប់គ្រងរបស់ &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"ត្រូវការកម្មវិធីនេះ ដើម្បីគ្រប់គ្រង <xliff:g id="DEVICE_NAME">%1$s</xliff:g> របស់អ្នក។ <xliff:g id="APP_NAME">%2$s</xliff:g> នឹងត្រូវបានអនុញ្ញាតឱ្យ​ធ្វើសមកាលកម្មព័ត៌មានដូចជា ឈ្មោះមនុស្សដែលហៅទូរសព្ទ ធ្វើអន្តរកម្មជាមួយ​ការជូនដំណឹងរបស់អ្នក និងចូលប្រើការអនុញ្ញាតទូរសព្ទ, SMS, ទំនាក់ទំនង, ប្រតិទិន, កំណត់ហេតុហៅទូរសព្ទ និងឧបករណ៍នៅជិតរបស់អ្នក។"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"ត្រូវការកម្មវិធីនេះ ដើម្បីគ្រប់គ្រង <xliff:g id="DEVICE_NAME">%1$s</xliff:g> របស់អ្នក។ <xliff:g id="APP_NAME">%2$s</xliff:g> នឹងត្រូវបានអនុញ្ញាតឱ្យ​ធ្វើសមកាលកម្មព័ត៌មានដូចជា ឈ្មោះមនុស្សដែលហៅទូរសព្ទ និងចូលប្រើការអនុញ្ញាតទាំងនេះ៖"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"វ៉ែនតា"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"ត្រូវការកម្មវិធីនេះ ដើម្បីគ្រប់គ្រង <xliff:g id="DEVICE_NAME">%1$s</xliff:g>។ <xliff:g id="APP_NAME">%2$s</xliff:g> នឹងត្រូវបានអនុញ្ញាតឱ្យ​ធ្វើអន្តរកម្មជាមួយ​ការជូនដំណឹងរបស់អ្នក និងចូលប្រើការអនុញ្ញាត​របស់ទូរសព្ទ, SMS, ទំនាក់ទំនង, មីក្រូហ្វូន និងឧបករណ៍នៅជិត​របស់អ្នក។"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"កម្មវិធីនេះ​នឹងត្រូវបានអនុញ្ញាតឱ្យ​ចូលប្រើការកំណត់ទាំងនេះ​នៅលើទូរសព្ទ​របស់អ្នក៖"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ចូលប្រើព័ត៌មាននេះពីទូរសព្ទរបស់អ្នក"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"សេវាកម្មឆ្លងកាត់ឧបករណ៍"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំការអនុញ្ញាតជំនួសឱ្យ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> របស់អ្នក ដើម្បីបញ្ចាំងកម្មវិធីរវាងឧបករណ៍របស់អ្នក"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ធ្វើសកម្មភាពនេះឬ?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំ​ការអនុញ្ញាតជំនួសឱ្យ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> របស់អ្នក ដើម្បីចាក់ផ្សាយកម្មវិធី និងមុខងារប្រព័ន្ធផ្សេងទៀត​ទៅកាន់​ឧបករណ៍នៅជិត"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ឧបករណ៍"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"កម្មវិធីនឹងអាច​ធ្វើសមកាលកម្មព័ត៌មាន​ដូចជា ឈ្មោះមនុស្សដែលហៅទូរសព្ទ​រវាងទូរសព្ទ និង <xliff:g id="DEVICE_NAME">%1$s</xliff:g> របស់អ្នក។"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"កម្មវិធីនេះនឹងអាច​ធ្វើសមកាលកម្មព័ត៌មាន​ដូចជា ឈ្មោះមនុស្សដែលហៅទូរសព្ទ​រវាងឧបករណ៍ដែលបានជ្រើសរើស និងទូរសព្ទរបស់អ្នក។"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"អនុញ្ញាត"</string>
     <string name="consent_no" msgid="2640796915611404382">"មិនអនុញ្ញាត"</string>
     <string name="consent_back" msgid="2560683030046918882">"ថយក្រោយ"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"ផ្សាយកម្មវិធីរបស់ទូរសព្ទអ្នក"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"ចាក់ផ្សាយ​កម្មវិធី និងមុខងារប្រព័ន្ធ​ផ្សេងទៀត​ពីទូរសព្ទ​របស់អ្នក"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-kn/strings.xml b/packages/CompanionDeviceManager/res/values-kn/strings.xml
index e7f9f7d..91131a7 100644
--- a/packages/CompanionDeviceManager/res/values-kn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-kn/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ವೀಕ್ಷಿಸಿ"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ಮೂಲಕ ನಿರ್ವಹಿಸಬೇಕಾದ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"ನಿಮ್ಮ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಅನ್ನು ನಿರ್ವಹಿಸಲು ಆ್ಯಪ್‌ನ ಅಗತ್ಯವಿದೆ. ಕರೆ ಮಾಡುವವರ ಹೆಸರು, ನಿಮ್ಮ ಅಧಿಸೂಚನೆಗಳೊಂದಿಗೆ ಸಂವಹನ ನಡೆಸಲು ಮತ್ತು ಫೋನ್, SMS, ಸಂಪರ್ಕಗಳು, ಕ್ಯಾಲೆಂಡರ್, ಕರೆ ಲಾಗ್‌ಗಳು ಮತ್ತು ಸಮೀಪದಲ್ಲಿರುವ ಸಾಧನಗಳ ದೃಢೀಕರಣಗಳಂತಹ ಮಾಹಿತಿಯನ್ನು ಸಿಂಕ್ ಮಾಡಲು <xliff:g id="APP_NAME">%2$s</xliff:g> ಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"ನಿಮ್ಮ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಅನ್ನು ನಿರ್ವಹಿಸಲು ಆ್ಯಪ್‌ನ ಅಗತ್ಯವಿದೆ. ಕರೆ ಮಾಡುವವರ ಹೆಸರಿನಂತಹ ಮಾಹಿತಿಯನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಮತ್ತು ಈ ಅನುಮತಿಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="APP_NAME">%2$s</xliff:g> ಗೆ ಅನುಮತಿಸಲಾಗುತ್ತದೆ:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;? ನಿರ್ವಹಿಸಲು &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"ಗ್ಲಾಸ್‌ಗಳು"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಅನ್ನು ನಿರ್ವಹಿಸಲು ಈ ಆ್ಯಪ್‌ನ ಅಗತ್ಯವಿದೆ. <xliff:g id="APP_NAME">%2$s</xliff:g> ನಿಮ್ಮ ಅಧಿಸೂಚನೆಗಳೊಂದಿಗೆ ಸಂವಹನ ನಡೆಸಲು ಮತ್ತು ನಿಮ್ಮ ಫೋನ್, SMS, ಸಂಪರ್ಕಗಳು, ಮೈಕ್ರೊಫೋನ್ ಮತ್ತು ಸಮೀಪದಲ್ಲಿರುವ ಸಾಧನಗಳ ಅನುಮತಿಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಅನುಮತಿಸಲಾಗುತ್ತದೆ."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಈ ಅನುಮತಿಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಲಾಗುತ್ತದೆ:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"ನಿಮ್ಮ ಫೋನ್ ಮೂಲಕ ಈ ಮಾಹಿತಿಯನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ಕ್ರಾಸ್-ಡಿವೈಸ್ ಸೇವೆಗಳು"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"ನಿಮ್ಮ ಸಾಧನಗಳ ನಡುವೆ ಆ್ಯಪ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ನಿಮ್ಮ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ನ ಪರವಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಿಕೊಳ್ಳುತ್ತಿದೆ"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ಈ ಆ್ಯಕ್ಷನ್ ಅನ್ನು ತೆಗೆದುಕೊಳ್ಳಲು &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ಅನುಮತಿಸಬೇಕೇ?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"ಸಮೀಪದಲ್ಲಿರುವ ಸಾಧನಗಳಿಗೆ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಇತರ ಸಿಸ್ಟಂ ಫೀಚರ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ನಿಮ್ಮ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ರ ಪರವಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸುತ್ತಿದೆ"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ಸಾಧನ"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"ಈ ಆ್ಯಪ್, ಮೊಬೈಲ್ ಫೋನ್ ಮತ್ತು <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಸಾಧನದ ನಡುವೆ ಕರೆ ಮಾಡುವವರ ಹೆಸರಿನಂತಹ ಮಾಹಿತಿಯನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"ಈ ಆ್ಯಪ್, ಮೊಬೈಲ್ ಫೋನ್ ಮತ್ತು ಆಯ್ಕೆಮಾಡಿದ ಸಾಧನದ ನಡುವೆ ಕರೆ ಮಾಡುವವರ ಹೆಸರಿನಂತಹ ಮಾಹಿತಿಯನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"ಅನುಮತಿಸಿ"</string>
     <string name="consent_no" msgid="2640796915611404382">"ಅನುಮತಿಸಬೇಡಿ"</string>
     <string name="consent_back" msgid="2560683030046918882">"ಹಿಂದೆ"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"ನಿಮ್ಮ ಫೋನ್‍ನ ಆ್ಯಪ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಿ"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"ನಿಮ್ಮ ಫೋನ್‌ನಿಂದ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಇತರ ಸಿಸ್ಟಂ ಫೀಚರ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಿ"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ko/strings.xml b/packages/CompanionDeviceManager/res/values-ko/strings.xml
index 67ca4a0..5b9c429 100644
--- a/packages/CompanionDeviceManager/res/values-ko/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ko/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"시계"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;에서 관리할 <xliff:g id="PROFILE_NAME">%1$s</xliff:g>을(를) 선택"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"이 앱은 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 기기를 관리하는 데 필요합니다. <xliff:g id="APP_NAME">%2$s</xliff:g>에서 전화를 건 사람 이름과 같은 정보를 동기화하며 알림과 상호작용하고 내 전화, SMS, 연락처, Calendar, 통화 기록, 근처 기기에 액세스할 수 있게 됩니다."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"이 앱은 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 기기를 관리하는 데 필요합니다. <xliff:g id="APP_NAME">%2$s</xliff:g>에서 전화를 건 사람 이름과 같은 정보를 동기화하며 이러한 권한에 액세스할 수 있게 됩니다."</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"안경"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"이 앱은 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 기기를 관리하는 데 필요합니다. <xliff:g id="APP_NAME">%2$s</xliff:g>에서 알림과 상호작용하고 내 전화, SMS, 연락처, 마이크, 근처 기기에 대한 권한을 갖게 됩니다."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"앱이 내 휴대전화에서 이러한 권한에 액세스할 수 있게 됩니다."</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;이 휴대전화의 이 정보에 액세스하도록 허용합니다."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"교차 기기 서비스"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> 대신 기기 간에 앱을 스트리밍할 수 있는 권한을 요청하고 있습니다."</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; 기기가 이 작업을 수행하도록 허용하시겠습니까?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DEVICE_NAME">%2$s</xliff:g> 대신 근처 기기로 앱 및 기타 시스템 기능을 스트리밍할 권한을 요청하고 있습니다."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"기기"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"이 앱이 전화를 건 사람 이름과 같은 정보를 휴대전화와 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 간에 동기화할 수 있습니다."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"이 앱이 전화를 건 사람 이름과 같은 정보를 휴대전화와 선택한 기기 간에 동기화할 수 있습니다."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"허용"</string>
     <string name="consent_no" msgid="2640796915611404382">"허용 안함"</string>
     <string name="consent_back" msgid="2560683030046918882">"뒤로"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"휴대전화의 앱을 스트리밍합니다."</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"내 휴대전화의 앱 및 기타 시스템 기능 스트리밍"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ky/strings.xml b/packages/CompanionDeviceManager/res/values-ky/strings.xml
index acbc031..2f99577 100644
--- a/packages/CompanionDeviceManager/res/values-ky/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ky/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"саат"</string>
     <string name="chooser_title" msgid="2262294130493605839">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; тарабынан башкарылсын"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Бул колдонмо <xliff:g id="DEVICE_NAME">%1$s</xliff:g> түзмөгүңүздү тескөө үчүн керек. <xliff:g id="APP_NAME">%2$s</xliff:g> маалыматты шайкештирип, мисалы, билдирмелериңизди көрүп, телефонуңуз, SMS билдирүүлөр, байланыштар, жылнаама, чалуулар тизмеси жана жакын жердеги түзмөктөргө болгон уруксаттарды пайдалана алат."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Бул колдонмо <xliff:g id="DEVICE_NAME">%1$s</xliff:g> түзмөгүңүздү тескөө үчүн керек. <xliff:g id="APP_NAME">%2$s</xliff:g> маалыматты шайкештире алат, мисалы, чалып жаткан кишинин атын шайкештирет жана анын төмөнкү уруксаттары болот:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"көз айнектер"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Бул колдонмо <xliff:g id="DEVICE_NAME">%1$s</xliff:g> түзмөгүн башкаруу үчүн керек. <xliff:g id="APP_NAME">%2$s</xliff:g> билдирмелериңизди көрүп, телефонуңуз, SMS билдирүүлөр, Байланыштар, Микрофон жана Жакын жердеги түзмөктөргө болгон уруксаттарды пайдалана алат."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Бул колдонмого телефонуңузда төмөнкүлөрдү аткарууга уруксат берилет:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; колдонмосуна телефонуңуздагы ушул маалыматты көрүүгө уруксат бериңиз"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Түзмөктөр аралык кызматтар"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> түзмөгүңүздүн атынан түзмөктөрүңүздүн ортосунда колдонмолорду өткөрүүгө уруксат сурап жатат"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; түзмөгүнө бул аракетти аткарууга уруксат бересизби?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%2$s</xliff:g> түзмөгүңүздүн атынан жакын жердеги түзмөктөрдө колдонмолорду жана тутумдун башка функцияларын алып ойнотууга уруксат сурап жатат"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"түзмөк"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Бул колдонмо маалыматты шайкештире алат, мисалы, чалып жаткан кишинин атын телефон жана <xliff:g id="DEVICE_NAME">%1$s</xliff:g> түзмөгү менен шайкештирет."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Бул колдонмо маалыматты шайкештире алат, мисалы, чалып жаткан кишинин атын телефон жана тандалган түзмөк менен шайкештирет."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Ооба"</string>
     <string name="consent_no" msgid="2640796915611404382">"Уруксат берилбесин"</string>
     <string name="consent_back" msgid="2560683030046918882">"Артка"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Телефондогу колдонмолорду алып ойнотуу"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Телефонуңуздагы колдонмолорду жана тутумдун башка функцияларын алып ойнотуу"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-lo/strings.xml b/packages/CompanionDeviceManager/res/values-lo/strings.xml
index 9b48836..53995be2 100644
--- a/packages/CompanionDeviceManager/res/values-lo/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lo/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"ອະນຸຍາດ &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ໂມງ"</string>
     <string name="chooser_title" msgid="2262294130493605839">"ເລືອກ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ເພື່ອໃຫ້ຖືກຈັດການໂດຍ &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"ຕ້ອງໃຊ້ແອັບດັ່ງກ່າວເພື່ອຈັດການ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ຂອງທ່ານ. <xliff:g id="APP_NAME">%2$s</xliff:g> ຈະໄດ້ຮັບອະນຸຍາດໃຫ້ຊິງ​ຂໍ້​ມູນ​ເຊັ່ນ: ຊື່​ຂອງ​ບາງ​ຄົນ​ທີ່​ກຳ​ລັງ​ໂທ, ໂຕ້​ຕອບ​ກັບການແຈ້ງເຕືອນຂອງທ່ານ ແລະ ເຂົ້າເຖິງການ​ອະ​ນຸ​ຍາດໂທລະສັບ, SMS, ລາຍຊື່ຜູ້ຕິດຕໍ່, ປະ​ຕິ​ທິນ, ບັນ​ທຶກ​ການ​ໂທ ແລະ ອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງຂອງທ່ານ."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"ຕ້ອງໃຊ້ແອັບດັ່ງກ່າວເພື່ອຈັດການ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ຂອງທ່ານ. <xliff:g id="APP_NAME">%2$s</xliff:g> ຈະໄດ້ຮັບອະນຸຍາດໃຫ້ຊິງ​ຂໍ້​ມູນ​ເຊັ່ນ: ຊື່​ຂອງ​ບາງ​ຄົນ​ທີ່​ກຳ​ລັງ​ໂທ ແລະ ເຂົ້າ​ເຖິງ​ການ​ອະ​ນຸ​ຍາດ​ເຫຼົ່າ​ນີ້:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"ແວ່ນຕາ"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"ຕ້ອງໃຊ້ແອັບນີ້ເພື່ອຈັດການ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> ຈະໄດ້ຮັບອະນຸຍາດໃຫ້ໂຕ້ຕອບກັບການແຈ້ງເຕືອນຂອງທ່ານ ແລະ ການອະນຸຍາດສິດເຂົ້າເຖິງໂທລະສັບ, SMS, ລາຍຊື່ຜູ້ຕິດຕໍ່, ໄມໂຄຣໂຟນ ແລະ ອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງຂອງທ່ານ."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"ແອັບນີ້ຈະຖືກອະນຸຍາດໃຫ້ເຂົ້າເຖິງການອະນຸຍາດເຫຼົ່ານີ້ຢູ່ໃນໂທລະສັບຂອງທ່ານ:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"ອະນຸຍາດ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ໃຫ້ເຂົ້າເຖິງຂໍ້ມູນນີ້ຈາກໂທລະສັບຂອງທ່ານໄດ້"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ບໍລິການຂ້າມອຸປະກອນ"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມຂອງ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ເພື່ອສະຕຣີມແອັບລະຫວ່າງອຸປະກອນຂອງທ່ານ"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ອະນຸຍາດ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ເພື່ອດຳເນີນຄຳສັ່ງນີ້ບໍ?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກໍາລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ຂອງທ່ານເພື່ອສະຕຣີມແອັບ ແລະ ຄຸນສົມບັດລະບົບອື່ນໆໄປຫາອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງ"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ອຸປະກອນ"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"ແອັບ​ນີ້​ຈະ​ສາ​ມາດ​ຊິງ​ຂໍ້​ມູນ​ເຊັ່ນ: ຊື່​ຂອງ​ບາງ​ຄົນ​ທີ່​ກຳ​ລັງ​ໂທ​ຢູ່​ລະ​ຫວ່າງ​ໂທ​ລະ​ສັບ​ຂອງ​ທ່ານ ແລະ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ໄດ້."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"ແອັບ​ນີ້​ຈະ​ສາ​ມາດ​ຊິງ​ຂໍ້​ມູນ​ເຊັ່ນ: ຊື່​ຂອງ​ບາງ​ຄົນ​ທີ່​ກຳ​ລັງ​ໂທ​ຢູ່​ລະ​ຫວ່າງ​ໂທ​ລະ​ສັບ​ຂອງ​ທ່ານ ແລະ ອຸ​ປະ​ກອນ​ທີ່​ເລືອກ​ໄດ້."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"ອະນຸຍາດ"</string>
     <string name="consent_no" msgid="2640796915611404382">"ບໍ່ອະນຸຍາດ"</string>
     <string name="consent_back" msgid="2560683030046918882">"ກັບຄືນ"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"ສະຕຣີມແອັບຂອງໂທລະສັບທ່ານ"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"ສະຕຣີມແອັບ ແລະ ຄຸນສົມບັດລະບົບອື່ນໆຈາກໂທລະສັບຂອງທ່ານ"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-lt/strings.xml b/packages/CompanionDeviceManager/res/values-lt/strings.xml
index 4b4deec..56cfcb8 100644
--- a/packages/CompanionDeviceManager/res/values-lt/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lt/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Leisti &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pasiekti &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"laikrodį"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Jūsų <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, kurį valdys &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; (pasirinkite)"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Programa reikalinga norint tvarkyti jūsų įrenginį „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“. Programai „<xliff:g id="APP_NAME">%2$s</xliff:g>“ bus leidžiama sinchronizuoti tam tikrą informaciją, pvz., skambinančio asmens vardą, sąveikauti su jūsų pranešimais ir pasiekti jūsų leidimus „Telefonas“, „SMS“, „Kontaktai“, „Kalendorius“, „Skambučių žurnalai“ ir „Įrenginiai netoliese“."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Programa reikalinga norint tvarkyti jūsų įrenginį „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“. Programai „<xliff:g id="APP_NAME">%2$s</xliff:g>“ bus leidžiama sinchronizuoti tam tikrą informaciją, pvz., skambinančio asmens vardą, ir pasiekti toliau nurodytus leidimus."</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"akiniai"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Ši programa reikalinga norint tvarkyti įrenginį „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“. Programai „<xliff:g id="APP_NAME">%2$s</xliff:g>“ bus leidžiama sąveikauti su jūsų pranešimais ir pasiekti jūsų leidimus „Telefonas“, „SMS“, „Kontaktai“, „Mikrofonas“ ir „Įrenginiai netoliese“."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Šiai programai bus leidžiama pasiekti toliau nurodytus leidimus jūsų telefone."</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Leisti &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pasiekti šią informaciją iš jūsų telefono"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Pasl. keliuose įrenginiuose"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ prašo leidimo jūsų „<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>“ vardu, kad galėtų srautu perduoti programas iš vieno įrenginio į kitą"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Leisti &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; atlikti šį veiksmą?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ prašo leidimo jūsų „<xliff:g id="DEVICE_NAME">%2$s</xliff:g>“ vardu, kad galėtų srautu perduoti programas ir kitas sistemos funkcijas įrenginiams netoliese"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"įrenginys"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Ši programa galės sinchronizuoti tam tikrą informaciją, pvz., skambinančio asmens vardą, su jūsų telefonu ir įrenginiu „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Ši programa galės sinchronizuoti tam tikrą informaciją, pvz., skambinančio asmens vardą, su jūsų telefonu ir pasirinktu įrenginiu."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Leisti"</string>
     <string name="consent_no" msgid="2640796915611404382">"Neleisti"</string>
     <string name="consent_back" msgid="2560683030046918882">"Atgal"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Telefono programų perdavimas srautu"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Srautu perduokite programas ir kitas sistemos funkcijas iš telefono"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-lv/strings.xml b/packages/CompanionDeviceManager/res/values-lv/strings.xml
index 76ca97e..b6dcd2d 100644
--- a/packages/CompanionDeviceManager/res/values-lv/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lv/strings.xml
@@ -17,15 +17,19 @@
 <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">"Palīgierīču pārzinis"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Atļauja 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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"pulkstenis"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Profila (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>) izvēle, ko pārvaldīt lietotnē &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Šī lietotne ir nepieciešama jūsu ierīces (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) pārvaldībai. <xliff:g id="APP_NAME">%2$s</xliff:g> drīkstēs sinhronizēt informāciju, piemēram, zvanītāja vārdu, mijiedarboties ar jūsu paziņojumiem un piekļūt atļaujām Tālrunis, Īsziņas, Kontaktpersonas, Kalendārs, Zvanu žurnāli un Tuvumā esošas ierīces."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Šī lietotne ir nepieciešama jūsu ierīces (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) pārvaldībai. <xliff:g id="APP_NAME">%2$s</xliff:g> drīkstēs sinhronizēt informāciju, piemēram, zvanītāja vārdu, un piekļūt šīm atļaujām:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"brilles"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Šī lietotne ir nepieciešama šādas ierīces pārvaldībai: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> drīkstēs mijiedarboties ar jūsu paziņojumiem un piekļūt atļaujām Tālrunis, Īsziņas, Kontaktpersonas, Mikrofons un Tuvumā esošas ierīces."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Šai lietotnei tiks sniegta piekļuve šādām atļaujām jūsu tālrunī:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Atļaut lietotnei &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; piekļūt šai informācijai no jūsu tālruņa"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Vairāku ierīču pakalpojumi"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa atļauju straumēt lietotnes starp jūsu ierīcēm šīs ierīces vārdā: <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vai atļaut ierīcei &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; veikt šo darbību?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa atļauju tuvumā esošās ierīcēs straumēt lietotnes un citas sistēmas funkcijas šīs ierīces vārdā: <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ierīce"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Šī lietotne varēs sinhronizēt informāciju, piemēram, zvanītāja vārdu, starp jūsu tālruni un šo ierīci: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Šī lietotne varēs sinhronizēt informāciju, piemēram, zvanītāja vārdu, starp jūsu tālruni un izvēlēto ierīci."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Atļaut"</string>
     <string name="consent_no" msgid="2640796915611404382">"Neatļaut"</string>
     <string name="consent_back" msgid="2560683030046918882">"Atpakaļ"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Straumēt jūsu tālruņa lietotnes"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"No sava tālruņa straumējiet lietotnes un citas sistēmas funkcijas"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-mk/strings.xml b/packages/CompanionDeviceManager/res/values-mk/strings.xml
index 1df8093..8b4c9e1 100644
--- a/packages/CompanionDeviceManager/res/values-mk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mk/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Дозволете &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"часовник"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Изберете <xliff:g id="PROFILE_NAME">%1$s</xliff:g> со којшто ќе управува &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Апликацијата е потребна за управување со вашиот <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> ќе може да ги синхронизира податоците како што се имињата на јавувачите, да остварува интеракција со известувањата и да пристапува до дозволите за „Телефон“, SMS, „Контакти“, „Календар“, „Евиденција на повици“ и „Уреди во близина“."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Апликацијата е потребна за управување со вашиот <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> ќе има дозвола да ги синхронизира податоците како што се имињата на јавувачите и да пристапува до следниве дозволи:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"очила"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Апликацијава е потребна за управување со <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> ќе може да остварува интеракција со известувањата и да пристапува до дозволите за „Телефон“, SMS, „Контакти“, „Микрофон“ и „Уреди во близина“."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Апликацијава ќе може да пристапува до овие дозволи на телефонот:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Овозможете &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да пристапува до овие податоци на телефонот"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Повеќенаменски услуги"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара дозвола во име на вашиот <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> за да стримува апликации помеѓу вашите уреди"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Ќе дозволите &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; да го преземе ова дејство?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара дозвола во име на вашиот <xliff:g id="DEVICE_NAME">%2$s</xliff:g> за да стримува апликации и други системски карактеристики на уредите во близина"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"уред"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Оваа апликација ќе може да ги синхронизира податоците како што се имињата на јавувачите помеѓу вашиот телефон и <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Оваа апликација ќе може да ги синхронизира податоците како што се имињата на јавувачите помеѓу вашиот телефон и избраниот уред."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Дозволи"</string>
     <string name="consent_no" msgid="2640796915611404382">"Не дозволувај"</string>
     <string name="consent_back" msgid="2560683030046918882">"Назад"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Стримувајте ги апликациите на телефонот"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Апликации за стриминг и други системски карактеристики од вашиот телефон"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ml/strings.xml b/packages/CompanionDeviceManager/res/values-ml/strings.xml
index 99219e2..f86897c 100644
--- a/packages/CompanionDeviceManager/res/values-ml/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ml/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"വാച്ച്"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ഉപയോഗിച്ച് മാനേജ് ചെയ്യുന്നതിന് ഒരു <xliff:g id="PROFILE_NAME">%1$s</xliff:g> തിരഞ്ഞെടുക്കുക"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"നിങ്ങളുടെ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> മാനേജ് ചെയ്യാൻ ആപ്പ് ആവശ്യമാണ്. വിളിക്കുന്നയാളുടെ പേര് പോലുള്ള വിവരങ്ങൾ സമന്വയിപ്പിക്കുന്നതിനും നിങ്ങളുടെ അറിയിപ്പുകളുമായി സംവദിക്കാനും നിങ്ങളുടെ ഫോൺ, SMS, Contacts, Calendar, കോൾ ചരിത്രം, സമീപമുള്ള ഉപകരണങ്ങളുടെ അനുമതികൾ എന്നിവ ആക്‌സസ് ചെയ്യാനും <xliff:g id="APP_NAME">%2$s</xliff:g> ആപ്പിനെ അനുവദിക്കും."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"നിങ്ങളുടെ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> മാനേജ് ചെയ്യാൻ ആപ്പ് ആവശ്യമാണ്. വിളിക്കുന്നയാളുടെ പേര് പോലുള്ള വിവരങ്ങൾ സമന്വയിപ്പിക്കുന്നതിനും ഈ അനുമതികൾ ആക്സസ് ചെയ്യുന്നതിനും <xliff:g id="APP_NAME">%2$s</xliff:g> എന്നതിനെ അനുവദിക്കും:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;? മാനേജ് ചെയ്യാൻ, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; എന്നതിനെ അനുവദിക്കുക"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"ഗ്ലാസുകൾ"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> മാനേജ് ചെയ്യാൻ ഈ ആപ്പ് ആവശ്യമാണ്. നിങ്ങളുടെ അറിയിപ്പുകളുമായി ഇടപഴകാനും ഫോൺ, SMS, കോൺടാക്റ്റുകൾ, മൈക്രോഫോൺ, സമീപമുള്ള ഉപകരണങ്ങളുടെ അനുമതികൾ എന്നിവ ആക്‌സസ് ചെയ്യാനും <xliff:g id="APP_NAME">%2$s</xliff:g> എന്നതിനെ അനുവദിക്കും."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"നിങ്ങളുടെ ഫോണിൽ ഇനിപ്പറയുന്ന അനുമതികൾ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കും:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"നിങ്ങളുടെ ഫോണിൽ നിന്ന് ഈ വിവരങ്ങൾ ആക്‌സസ് ചെയ്യാൻ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ക്രോസ്-ഉപകരണ സേവനങ്ങൾ"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"നിങ്ങളുടെ ഉപകരണങ്ങളിൽ ഒന്നിൽ നിന്ന് അടുത്തതിലേക്ക് ആപ്പുകൾ സ്ട്രീം ചെയ്യാൻ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ഉപകരണത്തിന് വേണ്ടി <xliff:g id="APP_NAME">%1$s</xliff:g> അനുമതി അഭ്യർത്ഥിക്കുന്നു"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ഈ പ്രവർത്തനം നടത്താൻ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; എന്നതിനെ അനുവദിക്കണോ?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"സമീപമുള്ള ഉപകരണങ്ങളിൽ ആപ്പുകളും മറ്റ് സിസ്റ്റം ഫീച്ചറുകളും സ്ട്രീം ചെയ്യാൻ നിങ്ങളുടെ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> എന്നതിന് വേണ്ടി <xliff:g id="APP_NAME">%1$s</xliff:g> അനുമതി അഭ്യർത്ഥിക്കുന്നു"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ഉപകരണം"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"വിളിക്കുന്നയാളുടെ പേര് പോലുള്ള വിവരങ്ങൾ നിങ്ങളുടെ ഫോണിനും <xliff:g id="DEVICE_NAME">%1$s</xliff:g> എന്നതിനും ഇടയിൽ സമന്വയിപ്പിക്കുന്നതിന് ഈ ആപ്പിന് കഴിയും."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"വിളിക്കുന്നയാളുടെ പേര് പോലുള്ള വിവരങ്ങൾ നിങ്ങളുടെ ഫോണിനും തിരഞ്ഞെടുത്ത ഉപകരണത്തിനും ഇടയിൽ സമന്വയിപ്പിക്കുന്നതിന് ഈ ആപ്പിന് കഴിയും."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"അനുവദിക്കുക"</string>
     <string name="consent_no" msgid="2640796915611404382">"അനുവദിക്കരുത്"</string>
     <string name="consent_back" msgid="2560683030046918882">"മടങ്ങുക"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"നിങ്ങളുടെ ഫോണിലെ ആപ്പുകൾ സ്‌ട്രീം ചെയ്യുക"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"നിങ്ങളുടെ ഫോണിൽ നിന്ന് ആപ്പുകളും മറ്റ് സിസ്റ്റം ഫീച്ചറുകളും സ്ട്രീം ചെയ്യാം"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-mn/strings.xml b/packages/CompanionDeviceManager/res/values-mn/strings.xml
index e4d658f..1d29cde 100644
--- a/packages/CompanionDeviceManager/res/values-mn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mn/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"цаг"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;-н удирдах<xliff:g id="PROFILE_NAME">%1$s</xliff:g>-г сонгоно уу"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Энэ апп таны <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-г удирдахад шаардлагатай. <xliff:g id="APP_NAME">%2$s</xliff:g>-д залгаж буй хүний нэр зэрэг мэдээллийг синк хийх, таны мэдэгдэлтэй харилцан үйлдэл хийх, Утас, SMS, Харилцагчид, Календарь, Дуудлагын жагсаалт болон Ойролцоох төхөөрөмжүүдийн зөвшөөрөлд хандахыг зөвшөөрнө."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Энэ апп таны <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-г удирдахад шаардлагатай. <xliff:g id="APP_NAME">%2$s</xliff:g>-д залгаж буй хүний нэр зэрэг мэдээллийг синк хийх болон эдгээр зөвшөөрөлд хандахыг зөвшөөрнө:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"нүдний шил"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Энэ апп <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-г удирдахад шаардлагатай. <xliff:g id="APP_NAME">%2$s</xliff:g>-д таны мэдэгдэлтэй харилцан үйлдэл хийх, Утас, SMS, Харилцагчид, Микрофон болон Ойролцоох төхөөрөмжүүдийн зөвшөөрөлд хандахыг зөвшөөрнө."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Энэ апп таны утасны эдгээр зөвшөөрөлд хандах эрхтэй байх болно:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-д таны утаснаас энэ мэдээлэлд хандахыг зөвшөөрнө үү"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Төхөөрөмж хоорондын үйлчилгээ"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Таны төхөөрөмжүүд хооронд апп дамжуулахын тулд <xliff:g id="APP_NAME">%1$s</xliff:g> таны <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>-н өмнөөс зөвшөөрөл хүсэж байна"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;-д энэ үйлдлийг хийхийг зөвшөөрөх үү?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> таны <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-н өмнөөс аппууд болон системийн бусад онцлогийг ойролцоох төхөөрөмжүүд рүү дамжуулах зөвшөөрөл хүсэж байна"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"төхөөрөмж"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Энэ апп залгаж буй хүний нэр зэрэг мэдээллийг таны утас болон <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-н хооронд синк хийх боломжтой болно."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Энэ апп залгаж буй хүний нэр зэрэг мэдээллийг таны утас болон сонгосон төхөөрөмжийн хооронд синк хийх боломжтой болно."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Зөвшөөрөх"</string>
     <string name="consent_no" msgid="2640796915611404382">"Бүү зөвшөөр"</string>
     <string name="consent_back" msgid="2560683030046918882">"Буцах"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Утасныхаа аппуудыг дамжуулаарай"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Утаснаасаа аппууд болон системийн бусад онцлогийг дамжуулаарай"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-mr/strings.xml b/packages/CompanionDeviceManager/res/values-mr/strings.xml
index c7edf74..9c082a4 100644
--- a/packages/CompanionDeviceManager/res/values-mr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mr/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"वॉच"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; द्वारे व्यवस्थापित करण्यासाठी <xliff:g id="PROFILE_NAME">%1$s</xliff:g> निवडा"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"तुमचे <xliff:g id="DEVICE_NAME">%1$s</xliff:g> व्यवस्थापित करण्यासाठी हे ॲप आवश्यक आहे. <xliff:g id="APP_NAME">%2$s</xliff:g> ला कॉल करत असलेल्या एखाद्या व्यक्तीचे नाव यासारखी माहिती सिंक करण्याची, तुमच्या सूचनांसोबत संवाद साधण्याची आणि तुमचा फोन, एसएमएस, संपर्क, कॅलेंडर, कॉल लॉग व जवळपासच्या डिव्हाइसच्या परवानग्या अ‍ॅक्सेस करण्याची अनुमती मिळेल."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"तुमचे <xliff:g id="DEVICE_NAME">%1$s</xliff:g> व्यवस्थापित करण्यासाठी हे ॲप आवश्यक आहे. <xliff:g id="APP_NAME">%2$s</xliff:g> ला कॉल करत असलेल्या एखाद्या व्यक्तीचे नाव यासारखी माहिती सिंक करण्याची आणि पुढील परवानग्या अ‍ॅक्सेस करण्याची अनुमती मिळेल:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"Glasses"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> व्यवस्थापित करण्यासाठी हे ॲप आवश्यक आहे. <xliff:g id="APP_NAME">%2$s</xliff:g> ला तुमच्या सूचनांसोबत संवाद साधण्याची आणि तुमचा फोन, एसएमएस, संपर्क, मायक्रोफोन व जवळपासच्या डिव्हाइसच्या परवानग्या अ‍ॅक्सेस करण्याची अनुमती मिळेल."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"या अ‍ॅपला तुमच्या फोनवर या परवानग्या अ‍ॅक्सेस करण्याची अनुमती दिली जाईल:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ला ही माहिती तुमच्या फोनवरून अ‍ॅक्सेस करण्यासाठी अनुमती द्या"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"क्रॉस-डिव्हाइस सेवा"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"तुमच्या डिव्हाइसदरम्यान ॲप्स स्ट्रीम करण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> हे तुमच्या <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> च्या वतीने परवानगीची विनंती करत आहे"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ला ही कृती करण्याची अनुमती द्यायची आहे का?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे जवळपासच्या डिव्हाइसवर अ‍ॅप्स आणि इतर सिस्टीम वैशिष्‍ट्ये स्ट्रीम करण्यासाठी तुमच्या <xliff:g id="DEVICE_NAME">%2$s</xliff:g> च्या वतीने परवानगीची विनंती करा"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"डिव्हाइस"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"हे ॲप तुमचा फोन आणि <xliff:g id="DEVICE_NAME">%1$s</xliff:g> दरम्यान कॉल करत असलेल्‍या एखाद्या व्यक्तीचे नाव यासारखी माहिती सिंक करू शकेल."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"हे ॲप तुमचा फोन आणि निवडलेल्या डिव्‍हाइसदरम्यान कॉल करत असलेल्‍या एखाद्या व्यक्तीचे नाव यासारखी माहिती सिंक करू शकेल."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"अनुमती द्या"</string>
     <string name="consent_no" msgid="2640796915611404382">"अनुमती देऊ नका"</string>
     <string name="consent_back" msgid="2560683030046918882">"मागे जा"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"तुमच्या फोनवरील ॲप्स स्ट्रीम करा"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"तुमच्या फोनवरून अ‍ॅप्स आणि इतर सिस्टीम वैशिष्‍ट्ये स्ट्रीम करा"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ms/strings.xml b/packages/CompanionDeviceManager/res/values-ms/strings.xml
index 7589417..69f3c85 100644
--- a/packages/CompanionDeviceManager/res/values-ms/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ms/strings.xml
@@ -17,15 +17,19 @@
 <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">"Pengurus Peranti Rakan"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Benarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk mengakses &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"jam tangan"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Pilih <xliff:g id="PROFILE_NAME">%1$s</xliff:g> untuk diurus oleh &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Apl ini diperlukan untuk mengurus <xliff:g id="DEVICE_NAME">%1$s</xliff:g> anda. <xliff:g id="APP_NAME">%2$s</xliff:g> akan dibenarkan untuk menyegerakkan maklumat seperti nama individu yang memanggil, berinteraksi dengan pemberitahuan anda dan mengakses kebenaran Telefon, SMS, Kenalan, Kalendar, Log panggilan dan Peranti berdekatan anda."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Apl ini diperlukan untuk mengurus <xliff:g id="DEVICE_NAME">%1$s</xliff:g> anda. <xliff:g id="APP_NAME">%2$s</xliff:g> akan dibenarkan untuk menyegerakkan maklumat seperti nama individu yang memanggil dan mengakses kebenaran ini:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Benarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; mengurus &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"cermin mata"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Apl ini diperlukan untuk mengurus <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> akan dibenarkan untuk berinteraksi dengan pemberitahuan anda dan mengakses kebenaran Telefon, SMS, Kenalan, Mikrofon dan Peranti berdekatan anda."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Apl ini akan dibenarkan untuk mengakses kebenaran yang berikut pada telefon anda:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Benarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; mengakses maklumat ini daripada telefon anda"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Perkhidmatan silang peranti"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang meminta kebenaran bagi pihak <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> anda untuk menstrim apl antara peranti anda"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Benarkan &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; mengambil tindakan ini?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang meminta kebenaran bagi pihak <xliff:g id="DEVICE_NAME">%2$s</xliff:g> anda untuk menstrim apl dan ciri sistem yang lain pada peranti berdekatan"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"peranti"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Apl ini akan dapat menyegerakkan maklumat seperti nama individu yang memanggil, antara telefon anda dengan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Apl ini akan dapat menyegerakkan maklumat seperti nama individu yang memanggil, antara telefon anda dengan peranti yang dipilih."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Benarkan"</string>
     <string name="consent_no" msgid="2640796915611404382">"Jangan benarkan"</string>
     <string name="consent_back" msgid="2560683030046918882">"Kembali"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Strim apl telefon anda"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Strim apl dan ciri sistem yang lain daripada telefon anda"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-my/strings.xml b/packages/CompanionDeviceManager/res/values-my/strings.xml
index 91ac47a..ebd63574 100644
--- a/packages/CompanionDeviceManager/res/values-my/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-my/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"နာရီ"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; က စီမံခန့်ခွဲရန် <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ကို ရွေးချယ်ပါ"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"သင်၏ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ကို စီမံခန့်ခွဲရန် ဤအက်ပ်လိုအပ်သည်။ ခေါ်ဆိုသူ၏အမည်ကဲ့သို့ အချက်အလက်ကို စင့်ခ်လုပ်ရန်၊ သင်၏ဖုန်း၊ SMS စာတိုစနစ်၊ အဆက်အသွယ်များ၊ ပြက္ခဒိန်၊ ခေါ်ဆိုမှတ်တမ်းနှင့် အနီးတစ်ဝိုက်ရှိ စက်များဆိုင်ရာ ခွင့်ပြုချက်များသုံးရန်၊ အကြောင်းကြားချက်များနှင့် ပြန်လှန်တုံ့ပြန်ရန် <xliff:g id="APP_NAME">%2$s</xliff:g> ကို ခွင့်ပြုမည်။"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"သင်၏ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ကို စီမံခန့်ခွဲရန် ဤအက်ပ်လိုအပ်သည်။ ခေါ်ဆိုသူ၏အမည်ကဲ့သို့ အချက်အလက်ကို စင့်ခ်လုပ်ရန်နှင့် ဤခွင့်ပြုချက်များသုံးရန် <xliff:g id="APP_NAME">%2$s</xliff:g> ကို ခွင့်ပြုမည်-"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ကို &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; အား စီမံခွင့်ပြုမလား။"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"မျက်မှန်"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ကို စီမံခန့်ခွဲရန် ဤအက်ပ်လိုအပ်သည်။ သင်၏ဖုန်း၊ SMS စာတိုစနစ်၊ အဆက်အသွယ်များ၊ မိုက်ခရိုဖုန်းနှင့် အနီးတစ်ဝိုက်ရှိ စက်များဆိုင်ရာ ခွင့်ပြုချက်များသုံးရန်၊ အကြောင်းကြားချက်များနှင့် ပြန်လှန်တုံ့ပြန်ရန် <xliff:g id="APP_NAME">%2$s</xliff:g> ကို ခွင့်ပြုမည်။"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"ဤအက်ပ်သည် သင့်ဖုန်းတွင် ဤခွင့်ပြုချက်များကို သုံးခွင့်ရပါမည်-"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ကို သင့်ဖုန်းမှ ဤအချက်အလက် သုံးခွင့်ပြုမည်"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"စက်များကြားသုံး ဝန်ဆောင်မှုများ"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင်၏စက်များအကြား အက်ပ်များတိုက်ရိုက်လွှင့်ရန် <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ကိုယ်စား ခွင့်ပြုချက်တောင်းနေသည်"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ကို ဤသို့လုပ်ဆောင်ခွင့်ပြုမလား။"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် အနီးတစ်ဝိုက်ရှိ အက်ပ်များနှင့် အခြားစနစ်အင်္ဂါရပ်များကို တိုက်ရိုက်ဖွင့်ရန် သင့် <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ကိုယ်စား ခွင့်ပြုချက်တောင်းနေသည်"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"စက်"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"ဤအက်ပ်သည် သင့်ဖုန်းနှင့် <xliff:g id="DEVICE_NAME">%1$s</xliff:g> အကြား ခေါ်ဆိုသူ၏အမည်ကဲ့သို့ အချက်အလက်ကို စင့်ခ်လုပ်နိုင်ပါမည်။"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"ဤအက်ပ်သည် သင့်ဖုန်းနှင့် ရွေးထားသောစက်အကြား ခေါ်ဆိုသူ၏အမည်ကဲ့သို့ အချက်အလက်ကို စင့်ခ်လုပ်နိုင်ပါမည်။"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"ခွင့်ပြုရန်"</string>
     <string name="consent_no" msgid="2640796915611404382">"ခွင့်မပြုပါ"</string>
     <string name="consent_back" msgid="2560683030046918882">"နောက်သို့"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"သင့်ဖုန်းရှိအက်ပ်များကို တိုက်ရိုက်ဖွင့်နိုင်သည်"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"သင့်ဖုန်းမှ အက်ပ်များနှင့် အခြားစနစ်အင်္ဂါရပ်များကို တိုက်ရိုက်ဖွင့်သည်"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-nb/strings.xml b/packages/CompanionDeviceManager/res/values-nb/strings.xml
index 60be245..4801c8c 100644
--- a/packages/CompanionDeviceManager/res/values-nb/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-nb/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Tillat at &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; bruker &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"klokke"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Velg <xliff:g id="PROFILE_NAME">%1$s</xliff:g> som skal administreres av &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Appen kreves for å administrere <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> får tillatelse til å synkronisere informasjon som navnet til noen som ringer, og samhandle med varslene dine, og får tilgang til tillatelsene for telefon, SMS, kontakter, kalender, samtalelogger og enheter i nærheten."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Appen kreves for å administrere <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> får tillatelse til å synkronisere informasjon som navnet til noen som ringer, og kan bruke disse tillatelsene:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"briller"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Denne appen kreves for å administrere <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> får tilgang til varslene dine og får tillatelsene for telefon, SMS, kontakter, mikrofon og enheter i nærheten."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Denne appen får disse tillatelsene på telefonen din:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Gi &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tilgang til denne informasjonen fra telefonen din"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Tjenester på flere enheter"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> ber om tillatelse til å strømme apper mellom enhetene dine, på vegne av <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vil du la &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; gjøre dette?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ber om tillatelse på vegne av <xliff:g id="DEVICE_NAME">%2$s</xliff:g> til å strømme apper og andre systemfunksjoner til enheter i nærheten"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"enhet"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Denne appen kan synkronisere informasjon som navnet til noen som ringer, mellom telefonen og <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Denne appen kan synkronisere informasjon som navnet til noen som ringer, mellom telefonen og den valgte enheten."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Tillat"</string>
     <string name="consent_no" msgid="2640796915611404382">"Ikke tillat"</string>
     <string name="consent_back" msgid="2560683030046918882">"Tilbake"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Strøm appene på telefonen"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Strøm apper og andre systemfunksjoner fra telefonen"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ne/strings.xml b/packages/CompanionDeviceManager/res/values-ne/strings.xml
index 6e51cd0..71b7695 100644
--- a/packages/CompanionDeviceManager/res/values-ne/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ne/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"घडी"</string>
     <string name="chooser_title" msgid="2262294130493605839">"आफूले &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; प्रयोग गरी व्यवस्थापन गर्न चाहेको <xliff:g id="PROFILE_NAME">%1$s</xliff:g> चयन गर्नुहोस्"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"तपाईंको <xliff:g id="DEVICE_NAME">%1$s</xliff:g> व्यवस्थापन गर्न यो एप चाहिन्छ। <xliff:g id="APP_NAME">%2$s</xliff:g> लाई कल गर्ने व्यक्तिको नाम जस्ता जानकारी सिंक गर्ने, तपाईंका सूचना हेर्ने र फोन, SMS, कन्ट्याक्ट, पात्रो, कल लग तथा नजिकैका डिभाइससम्बन्धी अनुमतिहरू हेर्ने तथा प्रयोग गर्ने अनुमति दिइने छ।"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"तपाईंको <xliff:g id="DEVICE_NAME">%1$s</xliff:g> व्यवस्थापन गर्न यो एप चाहिन्छ। <xliff:g id="APP_NAME">%2$s</xliff:g> लाई कल गर्ने व्यक्तिको नाम जस्ता जानकारी सिंक गर्ने र यी अनुमतिहरू हेर्ने तथा प्रयोग गर्ने अनुमति दिइने छ:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"चस्मा"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> व्यवस्थापन गर्न यो एप चाहिन्छ। <xliff:g id="APP_NAME">%2$s</xliff:g> लाई तपाईंका सूचना हेर्ने र फोन, SMS, कन्ट्याक्ट, माइक्रोफोन तथा नजिकैका डिभाइससम्बन्धी अनुमतिहरू हेर्ने तथा प्रयोग गर्ने अनुमति दिइने छ।"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"तपाईंको फोनमा यो एपलाई निम्न अनुमति दिइने छ:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई तपाईंको फोनमा भएको यो जानकारी हेर्ने तथा प्रयोग गर्ने अनुमति दिनुहोस्"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"क्रस-डिभाइस सेवाहरू"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइस <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> को तर्फबाट तपाईंका कुनै एउटा डिभाइसबाट अर्को डिभाइसमा एप स्ट्रिम गर्ने अनुमति माग्दै छ"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई यो कार्य गर्ने अनुमति दिने हो?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइस <xliff:g id="DEVICE_NAME">%2$s</xliff:g> को तर्फबाट नजिकैका डिभाइसहरूमा एप र सिस्टमका अन्य सुविधाहरू स्ट्रिम गर्ने अनुमति माग्दै छ"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"यन्त्र"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"यो एपले तपाईंको फोन र तपाईंले छनौट गर्ने <xliff:g id="DEVICE_NAME">%1$s</xliff:g> का बिचमा कल गर्ने व्यक्तिको नाम जस्ता जानकारी सिंक गर्न सक्ने छ।"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"यो एपले तपाईंको फोन र तपाईंले छनौट गर्ने डिभाइसका बिचमा कल गर्ने व्यक्तिको नाम जस्ता जानकारी सिंक गर्न सक्ने छ।"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"अनुमति दिनुहोस्"</string>
     <string name="consent_no" msgid="2640796915611404382">"अनुमति नदिनुहोस्"</string>
     <string name="consent_back" msgid="2560683030046918882">"पछाडि"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"आफ्नो फोनका एपहरू प्रयोग गर्नुहोस्"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"आफ्नो फोनबाट एप र सिस्टमका अन्य सुविधाहरू स्ट्रिम गर्नुहोस्"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-nl/strings.xml b/packages/CompanionDeviceManager/res/values-nl/strings.xml
index 628379b..d953a95 100644
--- a/packages/CompanionDeviceManager/res/values-nl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-nl/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toegang geven tot &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"smartwatch"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Een <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kiezen om te beheren met &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"De app is nodig om je <xliff:g id="DEVICE_NAME">%1$s</xliff:g> te beheren. <xliff:g id="APP_NAME">%2$s</xliff:g> mag informatie (zoals de naam van iemand die belt) synchroniseren, interactie hebben met je meldingen en krijgt toegang tot de rechten Telefoon, Sms, Contacten, Agenda, Gesprekslijsten en Apparaten in de buurt."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"De app is nodig om je <xliff:g id="DEVICE_NAME">%1$s</xliff:g> te beheren. <xliff:g id="APP_NAME">%2$s</xliff:g> mag informatie (zoals de naam van iemand die belt) synchroniseren en krijgt toegang tot deze rechten:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toestaan &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; te beheren?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"brillen"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Deze app is nodig om <xliff:g id="DEVICE_NAME">%1$s</xliff:g> te beheren. <xliff:g id="APP_NAME">%2$s</xliff:g> mag interactie hebben met je meldingen en krijgt toegang tot de rechten Telefoon, Sms, Contacten, Microfoon en Apparaten in de buurt."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Deze app krijgt toegang tot deze rechten op je telefoon:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toegang geven tot deze informatie op je telefoon"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device-services"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens jouw <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> toestemming om apps te streamen tussen je apparaten"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Toestaan dat &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; deze actie uitvoert?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens je <xliff:g id="DEVICE_NAME">%2$s</xliff:g> toestemming om apps en andere systeemfuncties naar apparaten in de buurt te streamen"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"apparaat"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Deze app kan informatie, zoals de naam van iemand die belt, synchroniseren tussen je telefoon en <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Deze app kan informatie (zoals de naam van iemand die belt) synchroniseren tussen je telefoon en het gekozen apparaat."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Toestaan"</string>
     <string name="consent_no" msgid="2640796915611404382">"Niet toestaan"</string>
     <string name="consent_back" msgid="2560683030046918882">"Terug"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Stream de apps van je telefoon"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Apps en andere systeemfuncties streamen vanaf je telefoon"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-or/strings.xml b/packages/CompanionDeviceManager/res/values-or/strings.xml
index ba61866..f9a5c30 100644
--- a/packages/CompanionDeviceManager/res/values-or/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-or/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ୱାଚ୍"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ଦ୍ୱାରା ପରିଚାଳିତ ହେବା ପାଇଁ ଏକ <xliff:g id="PROFILE_NAME">%1$s</xliff:g>କୁ ବାଛନ୍ତୁ"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"ଆପଣଙ୍କ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>କୁ ପରିଚାଳନା କରିବା ପାଇଁ ଆପ ଆବଶ୍ୟକ। କଲ କରୁଥିବା ଯେ କୌଣସି ବ୍ୟକ୍ତିଙ୍କ ନାମ ପରି ସୂଚନା ସିଙ୍କ କରିବା, ଆପଣଙ୍କ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ସହ ଇଣ୍ଟରାକ୍ଟ କରିବା ଏବଂ ଆପଣଙ୍କର ଫୋନ, SMS, କଣ୍ଟାକ୍ଟ, କେଲେଣ୍ଡର, କଲ ଲଗ ଓ ଆଖପାଖର ଡିଭାଇସ ଅନୁମତିଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%2$s</xliff:g>କୁ ଅନୁମତି ଦିଆଯିବ।"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"ଆପଣଙ୍କ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>କୁ ପରିଚାଳନା କରିବା ପାଇଁ ଆପ ଆବଶ୍ୟକ। କଲ କରୁଥିବା ଯେ କୌଣସି ବ୍ୟକ୍ତିଙ୍କ ନାମ ପରି ସୂଚନା ସିଙ୍କ କରିବା ଏବଂ ଏହି ଅନୁମତିଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%2$s</xliff:g>କୁ ଅନୁମତି ଦିଆଯିବ:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;କୁ ପରିଚାଳନା କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦେବେ?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"ଚଷମା"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>କୁ ପରିଚାଳନା କରିବା ପାଇଁ ଏହି ଆପ ଆବଶ୍ୟକ। ଆପଣଙ୍କ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ସହ ଇଣ୍ଟରାକ୍ଟ କରିବା ଏବଂ ଆପଣଙ୍କର ଫୋନ, SMS, କଣ୍ଟାକ୍ଟ, ମାଇକ୍ରୋଫୋନ ଓ ଆଖପାଖର ଡିଭାଇସ ଅନୁମତିଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%2$s</xliff:g>କୁ ଅନୁମତି ଦିଆଯିବ।"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"ଆପଣଙ୍କ ଫୋନରେ ଏହି ଅନୁମତିଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଆଯିବ:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"ଆପଣଙ୍କ ଫୋନରୁ ଏହି ସୂଚନାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"କ୍ରସ-ଡିଭାଇସ ସେବାଗୁଡ଼ିକ"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"ଆପଣଙ୍କ ଡିଭାଇସଗୁଡ଼ିକ ମଧ୍ୟରେ ଆପ୍ସକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କର <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ତରଫରୁ ଅନୁମତି ପାଇଁ ଅନୁରୋଧ କରୁଛି"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ଏହି ପଦକ୍ଷେପ ନେବା ପାଇଁ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦେବେ?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"ଆଖପାଖର ଡିଭାଇସଗୁଡ଼ିକରେ ଆପ୍ସ ଏବଂ ଅନ୍ୟ ସିଷ୍ଟମ ଫିଚରଗୁଡ଼ିକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ତରଫରୁ ଅନୁମତି ପାଇଁ ଅନୁରୋଧ କରୁଛି"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ଡିଭାଇସ୍"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"ଆପଣଙ୍କ ଫୋନ ଏବଂ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ମଧ୍ୟରେ, କଲ କରୁଥିବା ଯେ କୌଣସି ବ୍ୟକ୍ତିଙ୍କ ନାମ ପରି ସୂଚନା ସିଙ୍କ କରିବାକୁ ଏହି ଆପ ସକ୍ଷମ ହେବ।"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"ଆପଣଙ୍କ ଫୋନ ଏବଂ ବଛାଯାଇଥିବା ଡିଭାଇସ ମଧ୍ୟରେ, କଲ କରୁଥିବା ଯେ କୌଣସି ବ୍ୟକ୍ତିଙ୍କ ନାମ ପରି ସୂଚନା ସିଙ୍କ କରିବାକୁ ଏହି ଆପ ସକ୍ଷମ ହେବ।"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"ଅନୁମତି ଦିଅନ୍ତୁ"</string>
     <string name="consent_no" msgid="2640796915611404382">"ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ"</string>
     <string name="consent_back" msgid="2560683030046918882">"ପଛକୁ ଫେରନ୍ତୁ"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"ଆପଣଙ୍କ ଫୋନର ଆପ୍ସକୁ ଷ୍ଟ୍ରିମ କରନ୍ତୁ"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"ଆପଣଙ୍କ ଫୋନରୁ ଆପ୍ସ ଏବଂ ଅନ୍ୟ ସିଷ୍ଟମ ଫିଚରଗୁଡ଼ିକୁ ଷ୍ଟ୍ରିମ କରନ୍ତୁ"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-pa/strings.xml b/packages/CompanionDeviceManager/res/values-pa/strings.xml
index 7dd03c2..b6b8b29 100644
--- a/packages/CompanionDeviceManager/res/values-pa/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pa/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ਸਮਾਰਟ-ਵਾਚ"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤੇ ਜਾਣ ਲਈ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ਚੁਣੋ"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"ਇਹ ਐਪ ਤੁਹਾਡੇ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ ਲੋੜੀਂਦੀ ਹੈ। <xliff:g id="APP_NAME">%2$s</xliff:g> ਨੂੰ ਕਾਲਰ ਦੇ ਨਾਮ ਵਰਗੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਿੰਕ ਕਰਨ, ਤੁਹਾਡੀਆਂ ਸੂਚਨਾਵਾਂ ਨਾਲ ਅੰਤਰਕਿਰਿਆ ਕਰਨ ਅਤੇ ਤੁਹਾਡੇ ਫ਼ੋਨ, SMS, ਸੰਪਰਕਾਂ, ਕੈਲੰਡਰ, ਕਾਲ ਲੌਗਾਂ ਅਤੇ ਨਜ਼ਦੀਕੀ ਡੀਵਾਈਸਾਂ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਹੋਵੇਗੀ।"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"ਇਹ ਐਪ ਤੁਹਾਡੇ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ ਲੋੜੀਂਦੀ ਹੈ। <xliff:g id="APP_NAME">%2$s</xliff:g> ਨੂੰ ਕਾਲਰ ਦੇ ਨਾਮ ਵਰਗੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਿੰਕ ਕਰਨ ਅਤੇ ਇਨ੍ਹਾਂ ਇਜਾਜ਼ਤਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਹੋਵੇਗੀ:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"ਐਨਕਾਂ"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"ਇਹ ਐਪ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ ਲੋੜੀਂਦੀ ਹੈ। <xliff:g id="APP_NAME">%2$s</xliff:g> ਨੂੰ ਤੁਹਾਡੀਆਂ ਸੂਚਨਾਵਾਂ ਨਾਲ ਅੰਤਰਕਿਰਿਆ ਕਰਨ ਅਤੇ ਤੁਹਾਡੇ ਫ਼ੋਨ, SMS, ਸੰਪਰਕਾਂ, ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਅਤੇ ਨਜ਼ਦੀਕੀ ਡੀਵਾਈਸਾਂ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਹੋਵੇਗੀ।"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"ਇਸ ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਇਨ੍ਹਾਂ ਇਜਾਜ਼ਤਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਹੋਵੇਗੀ:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਤੋਂ ਇਸ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ਕ੍ਰਾਸ-ਡੀਵਾਈਸ ਸੇਵਾਵਾਂ"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ਦੀ ਤਰਫ਼ੋਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸਾਂ ਵਿਚਕਾਰ ਐਪਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮੰਗ ਰਹੀ ਹੈ"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ਕੀ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਇਹ ਕਾਰਵਾਈ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ਦੀ ਤਰਫ਼ੋਂ ਨਜ਼ਦੀਕੀ ਡੀਵਾਈਸਾਂ \'ਤੇ ਐਪਾਂ ਅਤੇ ਹੋਰ ਸਿਸਟਮ ਸੰਬੰਧੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮੰਗ ਰਹੀ ਹੈ"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ਡੀਵਾਈਸ"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਫ਼ੋਨ ਅਤੇ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਵਿਚਕਾਰ ਕਾਲਰ ਦੇ ਨਾਮ ਵਰਗੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਿੰਕ ਕਰ ਸਕੇਗੀ।"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਫ਼ੋਨ ਅਤੇ ਚੁਣੇ ਗਏ ਡੀਵਾਈਸ ਵਿਚਕਾਰ ਕਾਲਰ ਦੇ ਨਾਮ ਵਰਗੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਿੰਕ ਕਰ ਸਕੇਗੀ।"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"ਆਗਿਆ ਦਿਓ"</string>
     <string name="consent_no" msgid="2640796915611404382">"ਆਗਿਆ ਨਾ ਦਿਓ"</string>
     <string name="consent_back" msgid="2560683030046918882">"ਪਿੱਛੇ"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"ਆਪਣੇ ਫ਼ੋਨ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰੋ"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"ਆਪਣੇ ਫ਼ੋਨ ਤੋਂ ਐਪਾਂ ਅਤੇ ਹੋਰ ਸਿਸਟਮ ਸੰਬੰਧੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰੋ"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-pl/strings.xml b/packages/CompanionDeviceManager/res/values-pl/strings.xml
index 776f4b8..dafdb63 100644
--- a/packages/CompanionDeviceManager/res/values-pl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pl/strings.xml
@@ -17,15 +17,19 @@
 <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">"Menedżer urządzeń towarzyszących"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Zezwól 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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"zegarek"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Wybierz profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, którym ma zarządzać aplikacja &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Ta aplikacja jest niezbędna do zarządzania urządzeniem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Aplikacja <xliff:g id="APP_NAME">%2$s</xliff:g> będzie mogła synchronizować informacje takie jak nazwa osoby dzwoniącej, korzystać z powiadomień oraz uprawnień dotyczących Telefonu, SMS-ów, Kontaktów, Kalendarza, rejestrów połączeń i Urządzeń w pobliżu."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Ta aplikacja jest niezbędna do zarządzania urządzeniem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Aplikacja <xliff:g id="APP_NAME">%2$s</xliff:g> będzie mogła synchronizować informacje takie jak nazwa osoby dzwoniącej i korzystać z tych uprawnień:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Zezwolić na dostęp aplikacji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; do urządzenia &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"Okulary"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Ta aplikacja jest niezbędna do zarządzania urządzeniem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Aplikacja <xliff:g id="APP_NAME">%2$s</xliff:g> będzie mogła wchodzić w interakcję z powiadomieniami i korzystać z uprawnień dotyczących telefonu, SMS-ów, kontaktów, mikrofonu oraz urządzeń w pobliżu."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Aplikacja będzie miała dostęp do tych uprawnień na Twoim telefonie:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Zezwól urządzeniu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na dostęp do tych informacji na Twoim telefonie"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Usługi na innym urządzeniu"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> prosi w imieniu urządzenia <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> o uprawnienia dotyczące strumieniowego odtwarzania treści z aplikacji na innym urządzeniu"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Zezwolić urządzeniu &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; na wykonanie tego działania?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> prosi w imieniu urządzenia <xliff:g id="DEVICE_NAME">%2$s</xliff:g> o uprawnienia do strumieniowego odtwarzania treści i innych funkcji systemowych na urządzeniach w pobliżu"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"urządzenie"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Ta aplikacja może synchronizować informacje takie jak nazwa osoby dzwoniącej między Twoim telefonem i urządzeniem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Ta aplikacja może synchronizować informacje takie jak nazwa osoby dzwoniącej między Twoim telefonem i wybranym urządzeniem."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Zezwól"</string>
     <string name="consent_no" msgid="2640796915611404382">"Nie zezwalaj"</string>
     <string name="consent_back" msgid="2560683030046918882">"Wstecz"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Odtwarzaj strumieniowo aplikacje z telefonu"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Aplikacje do odtwarzania strumieniowego i inne funkcje systemowe na Twoim telefonie"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
index 7b9cc8c..2214567 100644
--- a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
@@ -17,15 +17,19 @@
 <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">"Gerenciador de dispositivos complementar"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"relógio"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Escolha um <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para ser gerenciado pelo app &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"O app <xliff:g id="APP_NAME">%2$s</xliff:g> é necessário para gerenciar o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Ele poderá sincronizar informações, como o nome de quem está ligando, interagir com suas notificações e acessar as permissões de telefone, SMS, contatos, agenda, registro de chamadas e dispositivos por perto."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"O app <xliff:g id="APP_NAME">%2$s</xliff:g> é necessário para gerenciar seu dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Ele poderá sincronizar informações, como o nome de quem está ligando, e acessar estas permissões:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; gerencie o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"óculos"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"O app <xliff:g id="APP_NAME">%2$s</xliff:g> é necessário para gerenciar o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Ele poderá interagir com suas notificações e acessar suas permissões de telefone, SMS, contatos, microfone e dispositivos por perto."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Esse app poderá acessar estas permissões no smartphone:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acesse estas informações do smartphone"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Serviços entre dispositivos"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> para fazer streaming de apps entre seus dispositivos"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Permitir que o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; realize essa ação?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para fazer streaming de apps e de outros recursos do sistema para dispositivos por perto"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"O app poderá sincronizar informações, como o nome de quem está ligando, entre seu smartphone e o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"O app poderá sincronizar informações, como o nome de quem está ligando, entre seu smartphone e o dispositivo escolhido."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
     <string name="consent_no" msgid="2640796915611404382">"Não permitir"</string>
     <string name="consent_back" msgid="2560683030046918882">"Voltar"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Fazer transmissão dos apps no seu smartphone"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Faça streaming de apps e outros recursos do sistema pelo smartphone"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
index 89fcdfe..738fe4a 100644
--- a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
@@ -17,15 +17,19 @@
 <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">"Gestor de dispositivos associados"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Permita que a app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aceda ao dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"relógio"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Escolha um <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para ser gerido pela app &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"A app é necessária para gerir o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. A app <xliff:g id="APP_NAME">%2$s</xliff:g> vai poder sincronizar informações, como o nome do autor de uma chamada, interagir com as suas notificações e aceder às autorizações do Telefone, SMS, Contactos, Calendário, Registos de chamadas e Dispositivos próximos."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"A app é necessária para gerir o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. A app <xliff:g id="APP_NAME">%2$s</xliff:g> vai poder sincronizar informações, como o nome do autor de uma chamada, e aceder às seguintes autorizações:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Permita que a app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; faça a gestão do dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"óculos"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Esta app é necessária para gerir o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. A app <xliff:g id="APP_NAME">%2$s</xliff:g> vai poder interagir com as suas notificações e aceder às autorizações do Telemóvel, SMS, Contactos, Microfone e Dispositivos próximos."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Esta app fica autorizada a aceder a estas autorizações no seu telemóvel:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Permita que a app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aceda a estas informações do seu telemóvel"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Serviços entre dispositivos"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir autorização em nome do seu dispositivo <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> para fazer stream de apps entre os seus dispositivos"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Permitir que o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; realize esta ação?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir autorização em nome do dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para fazer stream de apps e outras funcionalidades do sistema para dispositivos próximos"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Esta app vai poder sincronizar informações, como o nome do autor de uma chamada, entre o telemóvel e o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Esta app vai poder sincronizar informações, como o nome do autor de uma chamada, entre o telemóvel e o dispositivo escolhido."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
     <string name="consent_no" msgid="2640796915611404382">"Não permitir"</string>
     <string name="consent_back" msgid="2560683030046918882">"Voltar"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Faça stream das apps do telemóvel"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Faça stream de apps e outras funcionalidades do sistema a partir do telemóvel"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-pt/strings.xml b/packages/CompanionDeviceManager/res/values-pt/strings.xml
index 7b9cc8c..2214567 100644
--- a/packages/CompanionDeviceManager/res/values-pt/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt/strings.xml
@@ -17,15 +17,19 @@
 <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">"Gerenciador de dispositivos complementar"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"relógio"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Escolha um <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para ser gerenciado pelo app &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"O app <xliff:g id="APP_NAME">%2$s</xliff:g> é necessário para gerenciar o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Ele poderá sincronizar informações, como o nome de quem está ligando, interagir com suas notificações e acessar as permissões de telefone, SMS, contatos, agenda, registro de chamadas e dispositivos por perto."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"O app <xliff:g id="APP_NAME">%2$s</xliff:g> é necessário para gerenciar seu dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Ele poderá sincronizar informações, como o nome de quem está ligando, e acessar estas permissões:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; gerencie o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"óculos"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"O app <xliff:g id="APP_NAME">%2$s</xliff:g> é necessário para gerenciar o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Ele poderá interagir com suas notificações e acessar suas permissões de telefone, SMS, contatos, microfone e dispositivos por perto."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Esse app poderá acessar estas permissões no smartphone:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acesse estas informações do smartphone"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Serviços entre dispositivos"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> para fazer streaming de apps entre seus dispositivos"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Permitir que o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; realize essa ação?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para fazer streaming de apps e de outros recursos do sistema para dispositivos por perto"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"O app poderá sincronizar informações, como o nome de quem está ligando, entre seu smartphone e o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"O app poderá sincronizar informações, como o nome de quem está ligando, entre seu smartphone e o dispositivo escolhido."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
     <string name="consent_no" msgid="2640796915611404382">"Não permitir"</string>
     <string name="consent_back" msgid="2560683030046918882">"Voltar"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Fazer transmissão dos apps no seu smartphone"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Faça streaming de apps e outros recursos do sistema pelo smartphone"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ro/strings.xml b/packages/CompanionDeviceManager/res/values-ro/strings.xml
index 63e9d7c..cf42753 100644
--- a/packages/CompanionDeviceManager/res/values-ro/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ro/strings.xml
@@ -17,15 +17,19 @@
 <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">"Manager de dispozitiv Companion"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Permite ca &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; să acceseze dispozitivul &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ceas"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Alege un profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g> pe care să îl gestioneze &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Aplicația este necesară pentru a gestiona <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> va putea să sincronizeze informații, cum ar fi numele unui apelant, să interacționeze cu notificările tale și să îți acceseze permisiunile pentru Telefon, SMS, Agendă, Calendar, Jurnale de apeluri și Dispozitive din apropiere."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Aplicația este necesară pentru a gestiona <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> va putea să sincronizeze informații, cum ar fi numele unui apelant, și să acceseze următoarele permisiuni:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Permiți ca &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; să gestioneze &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"ochelari"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Această aplicație este necesară pentru a gestiona <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> va putea să interacționeze cu notificările tale și să-ți acceseze permisiunile pentru Telefon, SMS, Agendă, Microfon și Dispozitive din apropiere."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Aplicația va putea să acceseze următoarele permisiuni pe telefon:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Permite ca &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; să acceseze aceste informații de pe telefon"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servicii pe mai multe dispozitive"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită permisiunea pentru <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> de a reda în stream aplicații între dispozitivele tale"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Permiți ca &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; să realizeze această acțiune?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită permisiunea pentru <xliff:g id="DEVICE_NAME">%2$s</xliff:g> de a reda în stream conținut din aplicații și alte funcții de sistem pe dispozitivele din apropiere"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"dispozitiv"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Aplicația va putea să sincronizeze informații, cum ar fi numele unui apelant, între telefonul tău și <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Aplicația va putea să sincronizeze informații, cum ar fi numele unui apelant, între telefonul tău și dispozitivul ales."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Permite"</string>
     <string name="consent_no" msgid="2640796915611404382">"Nu permite"</string>
     <string name="consent_back" msgid="2560683030046918882">"Înapoi"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Să redea în stream aplicațiile telefonului"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Redă în stream conținut din aplicații și alte funcții de sistem de pe telefon"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ru/strings.xml b/packages/CompanionDeviceManager/res/values-ru/strings.xml
index b1699c3..6b1172d 100644
--- a/packages/CompanionDeviceManager/res/values-ru/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ru/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Разрешите приложению &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"часы"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Выберите устройство (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>), которым будет управлять приложение &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Это приложение необходимо для управления устройством \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\". Приложение \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" сможет синхронизировать данные, например журнала звонков, а также получит доступ к уведомлениям и разрешения \"Телефон\", \"SMS\", \"Контакты\", \"Микрофон\" и \"Устройства поблизости\"."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Это приложение необходимо для управления устройством \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\". Приложение \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" сможет синхронизировать данные, например журнала звонков, и получит следующие разрешения:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"Очки"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Это приложение необходимо для управления устройством \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\". Приложение \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" сможет взаимодействовать с уведомлениями, а также получит разрешения \"Телефон\", SMS, \"Контакты\", \"Микрофон\" и \"Устройства поблизости\"."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Это приложение получит следующие разрешения на телефоне:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Разрешите приложению &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; получать эту информацию с вашего телефона"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Сервисы стриминга приложений"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запрашивает разрешение от имени вашего устройства <xliff:g id="DEVICE_TYPE">%2$s</xliff:g>, чтобы транслировать приложения между вашими устройствами."</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Разрешить приложению &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; выполнять это действие?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" от имени вашего устройства \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" запрашивает разрешение транслировать приложения и системные функции на устройства поблизости."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Приложение сможет синхронизировать информацию между телефоном и устройством \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\", например данные из журнала звонков."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Приложение сможет синхронизировать информацию между телефоном и выбранным устройством, например данные из журнала звонков."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Разрешить"</string>
     <string name="consent_no" msgid="2640796915611404382">"Запретить"</string>
     <string name="consent_back" msgid="2560683030046918882">"Назад"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Трансляция приложений с телефона."</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Трансляция приложений и системных функций с телефона"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-si/strings.xml b/packages/CompanionDeviceManager/res/values-si/strings.xml
index af68659..b86b0c4 100644
--- a/packages/CompanionDeviceManager/res/values-si/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-si/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ඔරලෝසුව"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; මගින් කළමනාකරණය කරනු ලැබීමට <xliff:g id="PROFILE_NAME">%1$s</xliff:g>ක් තෝරන්න"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"ඔබේ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> කළමනාකරණය කිරීමට මෙම යෙදුම අවශ්‍යයි. <xliff:g id="APP_NAME">%2$s</xliff:g> හට අමතන කෙනෙකුගේ නම වැනි, තතු සමමුහුර්ත කිරීමට, ඔබේ දැනුම්දීම් සමග අන්තර්ක්‍රියා කිරීමට සහ ඔබේ දුරකථනය, SMS, සම්බන්ධතා, දින දර්ශනය, ඇමතුම් ලොග සහ අවට උපාංග අවසර වෙත ප්‍රවේශ වීමට ඉඩ දෙනු ඇත."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"ඔබේ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> කළමනාකරණය කිරීමට මෙම යෙදුම අවශ්‍යයි. <xliff:g id="APP_NAME">%2$s</xliff:g> හට අමතන කෙනෙකුගේ නම වැනි, තතු සමමුහුර්ත කිරීමට සහ මෙම අවසරවලට ප්‍රවේශ වීමට ඉඩ දෙනු ඇත:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"කණ්ණාඩි"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> කළමනා කිරීමට මෙම යෙදුම අවශ්‍යයි. <xliff:g id="APP_NAME">%2$s</xliff:g> හට ඔබේ දැනුම්දීම් සමග අන්තර්ක්‍රියා කිරීමට සහ ඔබේ දුරකථනය, කෙටි පණිවුඩය, සම්බන්ධතා, මයික්‍රොෆෝනය සහ අවට උපාංග අවසර වෙත ප්‍රවේශ වීමට ඉඩ දෙයි."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"මෙම යෙදුමට ඔබේ දුරකථනයේ මෙම අවසර වෙත ප්‍රවේශ වීමට ඉඩ ලැබේ:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; හට ඔබගේ දුරකථනයෙන් මෙම තොරතුරුවලට ප්‍රවේශ වීමට ඉඩ දෙන්න"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"හරස්-උපාංග සේවා"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> ඔබගේ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> වෙනුවෙන් ඔබගේ උපාංග අතර යෙදුම් ප්‍රවාහ කිරීමට අවසරය ඉල්ලමින් සිටියි"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"මෙම ක්‍රියාව කිරීමට &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; හට ඉඩ දෙන්න ද?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ඔබේ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> වෙනුවෙන් යෙදුම් සහ අනෙකුත් පද්ධති විශේෂාංග අවට උපාංග වෙත ප්‍රවාහ කිරීමට අවසර ඉල්ලයි"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"උපාංගය"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"මෙම යෙදුමට ඔබේ දුරකථනය සහ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> අතර, අමතන කෙනෙකුගේ නම වැනි, තතු සමමුහුර්ත කිරීමට හැකි වනු ඇත."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"මෙම යෙදුමට ඔබේ දුරකථනය සහ තෝරා ගත් උපාංගය අතර, අමතන කෙනෙකුගේ නම වැනි, තතු සමමුහුර්ත කිරීමට හැකි වනු ඇත."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"ඉඩ දෙන්න"</string>
     <string name="consent_no" msgid="2640796915611404382">"ඉඩ නොදෙන්න"</string>
     <string name="consent_back" msgid="2560683030046918882">"ආපසු"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"ඔබේ දුරකථනයේ යෙදුම් ප්‍රවාහ කරන්න"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"ඔබේ දුරකථනයෙන් යෙදුම් සහ අනෙකුත් පද්ධති විශේෂාංග ප්‍රවාහ කරන්න"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-sk/strings.xml b/packages/CompanionDeviceManager/res/values-sk/strings.xml
index d10da15..77cfe8d 100644
--- a/packages/CompanionDeviceManager/res/values-sk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sk/strings.xml
@@ -17,15 +17,19 @@
 <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">"Správca sprievodných zariadení"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Povoľte aplikácii &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; prístup k zariadeniu &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"hodinky"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Vyberte profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, ktorý bude spravovať aplikácia &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Daná aplikácia sa vyžaduje na správu zariadenia <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> bude môcť synchronizovať informácie, napríklad meno volajúceho, interagovať s vašimi upozorneniami a získavať prístup k povoleniam telefónu, SMS, kontaktov, kalendára, zoznamu hovorov a zariadení v okolí."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Daná aplikácia sa vyžaduje na správu zariadenia <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> bude môcť synchronizovať informácie, napríklad meno volajúceho, a získavať prístup k týmto povoleniam:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Chcete povoliť aplikácii &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; spravovať zariadenie &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"okuliare"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Táto aplikácia sa vyžaduje na správu zariadenia <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> bude môcť interagovať s vašimi upozorneniami a získa prístup k povoleniam pre telefón, SMS, kontakty, mikrofón a zariadenia v okolí."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Táto aplikácia bude mať vo vašom telefóne prístup k týmto povoleniam:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Povoľte aplikácii &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; prístup k týmto informáciám z vášho telefónu"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Služby pre viacero zariadení"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje povolenie na streamovanie aplikácií medzi vašimi zariadeniami v mene tohto zariadenia (<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>)"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Chcete povoliť zariadeniu &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; vykonať túto akciu?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje pre zariadenie <xliff:g id="DEVICE_NAME">%2$s</xliff:g> povolenie streamovať aplikácie a ďalšie systémové funkcie do zariadení v okolí"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"zariadenie"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Táto aplikácia bude môcť synchronizovať informácie, napríklad meno volajúceho, medzi telefónom a zariadením <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Táto aplikácia bude môcť synchronizovať informácie, napríklad meno volajúceho, medzi telefónom a vybraným zariadením."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Povoliť"</string>
     <string name="consent_no" msgid="2640796915611404382">"Nepovoliť"</string>
     <string name="consent_back" msgid="2560683030046918882">"Späť"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Streamovať aplikácie telefónu"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Steaming aplikácii a ďalších systémov funkcií zo zariadenia"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-sl/strings.xml b/packages/CompanionDeviceManager/res/values-sl/strings.xml
index ee330dd..976289a 100644
--- a/packages/CompanionDeviceManager/res/values-sl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sl/strings.xml
@@ -17,15 +17,19 @@
 <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">"Upravitelj spremljevalnih naprav"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dovolite dostop do naprave &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ura"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Izbira naprave »<xliff:g id="PROFILE_NAME">%1$s</xliff:g>«, ki jo bo upravljala aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Ta aplikacija je potrebna za upravljanje naprave »<xliff:g id="DEVICE_NAME">%1$s</xliff:g>«. Aplikaciji <xliff:g id="APP_NAME">%2$s</xliff:g> bodo omogočene sinhronizacija podatkov, na primer imena klicatelja, interakcija z obvestili in uporaba dovoljenj Telefon, SMS, Stiki, Koledar, Dnevniki klicev in Naprave v bližini."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Ta aplikacija je potrebna za upravljanje naprave »<xliff:g id="DEVICE_NAME">%1$s</xliff:g>«. Aplikaciji <xliff:g id="APP_NAME">%2$s</xliff:g> bosta omogočena sinhronizacija podatkov, na primer imena klicatelja, in dostop do teh dovoljenj:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"očala"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Ta aplikacija je potrebna za upravljanje naprave »<xliff:g id="DEVICE_NAME">%1$s</xliff:g>«. Aplikaciji <xliff:g id="APP_NAME">%2$s</xliff:g> bosta omogočeni interakcija z obvestili in uporaba dovoljenj Telefon, SMS, Stiki, Mikrofon in Naprave v bližini."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Ta aplikacija bo lahko dostopala do teh dovoljenj v telefonu:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Dovolite, da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dostopa do teh podatkov v vašem telefonu"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Storitve za zunanje naprave"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave »<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>« zahteva dovoljenje za pretočno predvajanje aplikacij v vaših napravah."</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Ali napravi &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; dovolite izvedbo tega dejanja?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave »<xliff:g id="DEVICE_NAME">%2$s</xliff:g>« zahteva dovoljenje za pretočno predvajanje aplikacij in drugih sistemskih funkcij v napravah v bližini."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"naprava"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Ta aplikacija bo lahko sinhronizirala podatke, na primer ime klicatelja, v telefonu in napravi »<xliff:g id="DEVICE_NAME">%1$s</xliff:g>«."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Ta aplikacija bo lahko sinhronizirala podatke, na primer ime klicatelja, v telefonu in izbrani napravi."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Dovoli"</string>
     <string name="consent_no" msgid="2640796915611404382">"Ne dovoli"</string>
     <string name="consent_back" msgid="2560683030046918882">"Nazaj"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Pretočno predvajanje aplikacij telefona"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Pretočno predvajanje aplikacij in drugih sistemskih funkcij iz telefona"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-sq/strings.xml b/packages/CompanionDeviceManager/res/values-sq/strings.xml
index afff09d..97fdcbb 100644
--- a/packages/CompanionDeviceManager/res/values-sq/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sq/strings.xml
@@ -17,15 +17,19 @@
 <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">"Menaxheri i pajisjes shoqëruese"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Lejo që &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; të ketë qasje te &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"ora inteligjente"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Zgjidh \"<xliff:g id="PROFILE_NAME">%1$s</xliff:g>\" që do të menaxhohet nga &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Aplikacioni nevojitet për të menaxhuar profilin tënd të <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> do të lejohet të sinkronizojë informacione, si p.sh. emri i dikujt që po telefonon, të ndërveprojë me njoftimet e tua dhe të ketë qasje te lejet e \"Telefonit\", \"SMS-ve\", \"Kontakteve\", \"Kalendarit\", \"Evidencave të telefonatave\" dhe \"Pajisjeve në afërsi\"."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Aplikacioni nevojitet për të menaxhuar profilin tënd të <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> do të lejohet të sinkronizojë informacione, si p.sh. emri i dikujt që po telefonon dhe të ketë qasje te këto leje:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Të lejohet që &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; të menaxhojë &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"syzet"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Ky aplikacion nevojitet për të menaxhuar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> do të lejohet të ndërveprojë me njoftimet e tua dhe të ketë qasje te lejet e \"Telefonit\", \"SMS-ve\", \"Kontakteve\", \"Mikrofonit\" dhe të \"Pajisjeve në afërsi\"."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Ky aplikacion do të lejohet të ketë qasje te këto leje në telefonin tënd:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Lejo që &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; të ketë qasje në këtë informacion nga telefoni yt"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Shërbimet mes pajisjeve"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon leje në emër të <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> për të transmetuar aplikacione ndërmjet pajisjeve të tua"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Të lejohet që &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; të ndërmarrë këtë veprim?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon leje në emër të (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) tënde për të transmetuar aplikacione dhe veçori të tjera të sistemit te pajisjet në afërsi"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"pajisja"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Ky aplikacion do të mund të sinkronizojë informacione, si p.sh emri i dikujt që po telefonon, mes telefonit tënd dhe <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Ky aplikacion do të mund të sinkronizojë informacione, si p.sh emri i dikujt që po telefonon, mes telefonit tënd dhe pajisjes së zgjedhur."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Lejo"</string>
     <string name="consent_no" msgid="2640796915611404382">"Mos lejo"</string>
     <string name="consent_back" msgid="2560683030046918882">"Pas"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Transmeto aplikacionet e telefonit tënd"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Transmeto aplikacionet dhe veçoritë e tjera të sistemit nga telefoni yt"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-sr/strings.xml b/packages/CompanionDeviceManager/res/values-sr/strings.xml
index 2c02500..b205061 100644
--- a/packages/CompanionDeviceManager/res/values-sr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sr/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Дозволите да &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"сат"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Одаберите <xliff:g id="PROFILE_NAME">%1$s</xliff:g> којим ће управљати апликација &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Апликација је потребна за управљање уређајем <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> ће добити дозволу за синхронизовање информација, попут особе која упућује позив, за интеракцију са обавештењима и приступ дозволама за телефон, SMS, контакте, календар, евиденције позива и уређаје у близини."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Апликација је потребна за управљање уређајем <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> ће добити дозволу за синхронизацију информација, попут особе која упућује позив, као за приступ следећим дозволама:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"наочаре"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Ова апликација је потребна за управљање уређајем <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> ће добити дозволу за интеракцију са обавештењима и приступ дозволама за телефон, SMS, контакте, микрофон и уређаје у близини."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Овој апликацији ће бити дозвољено да приступа овим дозволама на телефону:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Дозволите да &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; приступа овим информацијама са телефона"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Услуге на више уређаја"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> захтева дозволу у име уређаја <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> за стримовање апликација између уређаја"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Желите ли да дозволите да &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; обави ову радњу?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> захтева дозволу у име уређаја <xliff:g id="DEVICE_NAME">%2$s</xliff:g> да стримује апликације и друге системске функције на уређаје у близини"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"уређај"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Ова апликација ће моћи да синхронизује податке, попут имена особе која упућује позив, између телефона и уређаја <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Ова апликација ће моћи да синхронизује податке, попут имена особе која упућује позив, између телефона и одабраног уређаја."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Дозволи"</string>
     <string name="consent_no" msgid="2640796915611404382">"Не дозволи"</string>
     <string name="consent_back" msgid="2560683030046918882">"Назад"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Стримујте апликације на телефону"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Стримујте апликације и друге системске функције са телефона"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-sv/strings.xml b/packages/CompanionDeviceManager/res/values-sv/strings.xml
index afdec60..45089f0 100644
--- a/packages/CompanionDeviceManager/res/values-sv/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sv/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Tillåt att &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"klocka"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Välj en <xliff:g id="PROFILE_NAME">%1$s</xliff:g> för hantering av &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Appen behövs för att hantera <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> får tillåtelse att synkronisera information, till exempel namnet på någon som ringer, interagera med dina aviseringar och får åtkomst till behörigheterna Telefon, Sms, Kontakter, Kalender, Samtalsloggar och Enheter i närheten."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Appen behövs för att hantera <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> får tillåtelse att synkronisera information, till exempel namnet på någon som ringer, och får åtkomst till följande behörigheter:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"glasögon"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Appen behövs för att hantera <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> får tillåtelse att interagera med dina aviseringar och får åtkomst till behörigheterna Telefon, Sms, Kontakter, Mikrofon och Enheter i närheten."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Appen får tillåtelse att använda dessa behörigheter på din telefon:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Ge &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; åtkomstbehörighet till denna information på telefonen"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Tjänster för flera enheter"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet att låta <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> streama appar mellan enheter"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vill du tillåta att &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; utför denna åtgärd?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet att streama appar och andra systemfunktioner till enheter i närheten för din <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"enhet"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Den här appen kommer att kunna synkronisera information mellan telefonen och <xliff:g id="DEVICE_NAME">%1$s</xliff:g>, till exempel namnet på någon som ringer."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Den här appen kommer att kunna synkronisera information mellan telefonen och den valda enheten, till exempel namnet på någon som ringer."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Tillåt"</string>
     <string name="consent_no" msgid="2640796915611404382">"Tillåt inte"</string>
     <string name="consent_back" msgid="2560683030046918882">"Tillbaka"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Streama telefonens appar"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Streama appar och andra systemfunktioner från din telefon"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-sw/strings.xml b/packages/CompanionDeviceManager/res/values-sw/strings.xml
index 3cbcc6a..a12f3c2 100644
--- a/packages/CompanionDeviceManager/res/values-sw/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sw/strings.xml
@@ -17,15 +17,19 @@
 <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">"Kidhibiti cha Vifaa Visaidizi"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Ruhusu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ifikie &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"saa"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Chagua <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ili idhibitiwe na &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Programu hii inahitajika ili udhibiti <xliff:g id="DEVICE_NAME">%1$s</xliff:g> yako. <xliff:g id="APP_NAME">%2$s</xliff:g> itaruhusiwa kusawazisha maelezo, kama vile jina la mtu anayepiga simu, kutumia arifa zako na ruhusa zako za Simu, SMS, Anwani, Maikrofoni na vifaa vilivyo Karibu."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Programu hii inahitajika ili udhibiti <xliff:g id="DEVICE_NAME">%1$s</xliff:g> yako. <xliff:g id="APP_NAME">%2$s</xliff:g> itaruhusiwa kusawazisha maelezo, kama vile jina la mtu anayepiga simu na kufikia ruhusa hizi:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Ungependa kuruhusu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; idhibiti &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"miwani"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Programu hii inahitajika ili udhibiti <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> itaruhusiwa kutumia arifa zako na kufikia ruhusa zako za Simu, SMS, Anwani, Maikrofoni na Vifaa vilivyo Karibu."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Programu hii itaruhusiwa kufikia ruhusa hizi kwenye simu yako:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Ruhusu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ifikie maelezo haya kutoka kwenye simu yako"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Huduma za kifaa kilichounganishwa kwingine"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa kwa niaba ya <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> yako ili itiririshe programu kati ya vifaa vyako"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Ungependa kuruhusu &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; itekeleze kitendo hiki?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa kwa niaba ya <xliff:g id="DEVICE_NAME">%2$s</xliff:g> chako ili itiririshe programu na vipengele vingine vya mfumo kwenye vifaa vilivyo karibu"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"kifaa"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Programu hii itaweza kusawazisha maelezo, kama vile jina la mtu anayepiga simu, kati ya simu na <xliff:g id="DEVICE_NAME">%1$s</xliff:g> yako."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Programu hii itaweza kusawazisha maelezo, kama vile jina la mtu anayepiga simu, kati ya simu yako na kifaa ulichochagua."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Ruhusu"</string>
     <string name="consent_no" msgid="2640796915611404382">"Usiruhusu"</string>
     <string name="consent_back" msgid="2560683030046918882">"Nyuma"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Tiririsha programu za simu yako"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Kutiririsha programu na vipengele vya mfumo kwenye simu yako"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ta/strings.xml b/packages/CompanionDeviceManager/res/values-ta/strings.xml
index 939ba8e..98981b2 100644
--- a/packages/CompanionDeviceManager/res/values-ta/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ta/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"வாட்ச்"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ஆப்ஸ் நிர்வகிக்கக்கூடிய <xliff:g id="PROFILE_NAME">%1$s</xliff:g> தேர்ந்தெடுக்கப்பட வேண்டும்"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"உங்கள் <xliff:g id="DEVICE_NAME">%1$s</xliff:g> சாதனத்தை நிர்வகிக்க இந்த ஆப்ஸ் தேவை. தகவலை (அழைப்பவரின் பெயர் போன்றவை) ஒத்திசைத்தல், உங்கள் அறிவிப்புகளைப் பார்த்தல் போன்றவற்றுக்கான அனுமதியையும் உங்கள் மொபைல், மெசேஜ், தொடர்புகள், கேலெண்டர், அழைப்புப் பதிவுகள், அருகிலுள்ள சாதனங்கள் ஆகியவற்றுக்கான அணுகலையும் <xliff:g id="APP_NAME">%2$s</xliff:g> ஆப்ஸ் பெறும்."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"உங்கள் <xliff:g id="DEVICE_NAME">%1$s</xliff:g> சாதனத்தை நிர்வகிக்க இந்த ஆப்ஸ் தேவை. தகவலை (அழைப்பவரின் பெயர் போன்றவை) ஒத்திசைப்பதற்கும் இந்த அனுமதிகளைப் பயன்படுத்துவதற்கும் <xliff:g id="APP_NAME">%2$s</xliff:g> ஆப்ஸுக்கு அனுமதி வழங்கப்படும்:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&amp;gt சாதனத்தை நிர்வகிக்க &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"கிளாஸஸ்"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> சாதனத்தை நிர்வகிக்க இந்த ஆப்ஸ் தேவை. உங்கள் மொபைல், மெசேஜ், தொடர்புகள், மைக்ரோஃபோன், அருகிலுள்ள சாதனங்கள் ஆகியவற்றுக்கான அணுகலையும் உங்கள் அறிவிப்புகளைப் பார்ப்பதற்கான அனுமதியையும் <xliff:g id="APP_NAME">%2$s</xliff:g> பெறும்."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"உங்கள் மொபைலில் இந்த அனுமதிகளை அணுகுவதற்கு ஆப்ஸுக்கு அனுமதி வழங்கப்படும்:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"மொபைலில் உள்ள இந்தத் தகவல்களை அணுக, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ஆப்ஸை அனுமதிக்கவும்"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"பன்முக சாதன சேவைகள்"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"உங்கள் சாதனங்களுக்கு இடையே ஆப்ஸை ஸ்ட்ரீம் செய்ய உங்கள் <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> சார்பாக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் அனுமதியைக் கோருகிறது"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"இந்தச் செயலைச் செய்ய &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&amp;gt சாதனத்தை அனுமதிக்கவா?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"அருகிலுள்ள சாதனங்களுக்கு ஆப்ஸையும் பிற சிஸ்டம் அம்சங்களையும் ஸ்ட்ரீம் செய்ய உங்கள் <xliff:g id="DEVICE_NAME">%2$s</xliff:g> சார்பாக <xliff:g id="APP_NAME">%1$s</xliff:g> அனுமதி கோருகிறது"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"சாதனம்"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"இந்த ஆப்ஸால் தகவலை (அழைப்பவரின் பெயர் போன்றவை) உங்கள் மொபைலிலும் <xliff:g id="DEVICE_NAME">%1$s</xliff:g> சாதனத்திலும் ஒத்திசைக்க முடியும்."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"இந்த ஆப்ஸால் தகவலை (அழைப்பவரின் பெயர் போன்றவை) உங்கள் மொபைலிலும் தேர்ந்தெடுக்கப்பட்ட சாதனத்திலும் ஒத்திசைக்க முடியும்."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"அனுமதி"</string>
     <string name="consent_no" msgid="2640796915611404382">"அனுமதிக்க வேண்டாம்"</string>
     <string name="consent_back" msgid="2560683030046918882">"பின்செல்"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"உங்கள் மொபைல் ஆப்ஸை ஸ்ட்ரீம் செய்யலாம்"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"உங்கள் மொபைலில் இருந்து ஆப்ஸையும் பிற சிஸ்டம் அம்சங்களையும் ஸ்ட்ரீம் செய்யலாம்"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-te/strings.xml b/packages/CompanionDeviceManager/res/values-te/strings.xml
index 5009407..d7ffce7 100644
--- a/packages/CompanionDeviceManager/res/values-te/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-te/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"వాచ్"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; ద్వారా మేనేజ్ చేయబడటానికి ఒక <xliff:g id="PROFILE_NAME">%1$s</xliff:g>ను ఎంచుకోండి"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"మీ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>‌ను మేనేజ్ చేయడానికి ఈ యాప్ అవసరం. కాల్ చేస్తున్న వారి పేరు వంటి సమాచారాన్ని సింక్ చేయడానికి, మీ నోటిఫికేషన్‌లతో ఇంటరాక్ట్ అవ్వడానికి, అలాగే మీ ఫోన్, SMS, కాంటాక్ట్‌లు, క్యాలెండర్, కాల్ లాగ్‌లు, సమీపంలోని పరికరాల అనుమతులను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%2$s</xliff:g> అనుమతించబడుతుంది."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"మీ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>‌ను మేనేజ్ చేయడానికి ఈ యాప్ అవసరం. కాల్ చేస్తున్న వారి పేరు వంటి సమాచారాన్ని సింక్ చేయడానికి, ఈ అనుమతులను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%2$s</xliff:g> అనుమతించబడుతుంది:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;‌ను మేనేజ్ చేయడానికి &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;‌ను అనుమతించాలా?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"గ్లాసెస్"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‌ను మేనేజ్ చేయడానికి ఈ యాప్ అవసరం. మీ నోటిఫికేషన్‌లతో ఇంటరాక్ట్ అవ్వడానికి, అలాగే మీ ఫోన్, SMS, కాంటాక్ట్‌లు, మైక్రోఫోన్, సమీపంలోని పరికరాల అనుమతులను యాక్సెస్ చేయడానికి <xliff:g id="APP_NAME">%2$s</xliff:g> అనుమతించబడుతుంది."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"మీ ఫోన్‌లో ఈ అనుమతులను యాక్సెస్ చేయడానికి ఈ యాప్ అనుమతించబడుతుంది:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"మీ ఫోన్ నుండి ఈ సమాచారాన్ని యాక్సెస్ చేయడానికి &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; యాప్‌ను అనుమతించండి"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"మీ పరికరాల మధ్య యాప్‌లను స్ట్రీమ్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g> మీ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> తరఫున అనుమతిని రిక్వెస్ట్ చేస్తోంది"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ఈ చర్యను అమలు చేయడానికి &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;‌ను అనుమతించాలా?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"సమీపంలోని పరికరాలకు యాప్‌లను, ఇతర సిస్టమ్ ఫీచర్‌లను స్ట్రీమ్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g> మీ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> తరఫున అనుమతిని రిక్వెస్ట్ చేస్తోంది"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"పరికరం"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"కాల్ చేస్తున్న వారి పేరు వంటి సమాచారాన్ని ఈ యాప్ మీ ఫోన్, <xliff:g id="DEVICE_NAME">%1$s</xliff:g> మధ్య సింక్ చేయగలుగుతుంది."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"కాల్ చేస్తున్న వారి పేరు వంటి సమాచారాన్ని ఈ యాప్ మీ ఫోన్, ఎంచుకున్న పరికరం మధ్య సింక్ చేయగలుగుతుంది."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"అనుమతించండి"</string>
     <string name="consent_no" msgid="2640796915611404382">"అనుమతించవద్దు"</string>
     <string name="consent_back" msgid="2560683030046918882">"వెనుకకు"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"మీ ఫోన్‌లోని యాప్‌లను స్ట్రీమ్ చేయండి"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"మీ ఫోన్ నుండి యాప్‌లను, ఇతర సిస్టమ్ ఫీచర్‌లను స్ట్రీమ్ చేస్తుంది"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-th/strings.xml b/packages/CompanionDeviceManager/res/values-th/strings.xml
index e53f70c..ff17b69 100644
--- a/packages/CompanionDeviceManager/res/values-th/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-th/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"อนุญาตให้ &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"นาฬิกา"</string>
     <string name="chooser_title" msgid="2262294130493605839">"เลือก<xliff:g id="PROFILE_NAME">%1$s</xliff:g>ที่จะให้มีการจัดการโดย &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"ต้องใช้แอปนี้ในการจัดการ<xliff:g id="DEVICE_NAME">%1$s</xliff:g> <xliff:g id="APP_NAME">%2$s</xliff:g> จะได้รับอนุญาตให้ซิงค์ข้อมูล เช่น ชื่อของบุคคลที่โทรเข้ามา โต้ตอบกับการแจ้งเตือน รวมถึงมีสิทธิ์เข้าถึงโทรศัพท์, SMS, รายชื่อติดต่อ, ปฏิทิน, บันทึกการโทร และอุปกรณ์ที่อยู่ใกล้เคียง"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"ต้องใช้แอปนี้ในการจัดการ<xliff:g id="DEVICE_NAME">%1$s</xliff:g> <xliff:g id="APP_NAME">%2$s</xliff:g> จะได้รับอนุญาตให้ซิงค์ข้อมูล เช่น ชื่อของบุคคลที่โทรเข้ามา และมีสิทธิ์เข้าถึงสิ่งต่างๆ ต่อไปนี้"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"แว่นตา"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"ต้องใช้แอปนี้ในการจัดการ<xliff:g id="DEVICE_NAME">%1$s</xliff:g> <xliff:g id="APP_NAME">%2$s</xliff:g> จะได้รับอนุญาตให้โต้ตอบกับการแจ้งเตือนและมีสิทธิ์เข้าถึงโทรศัพท์, SMS, รายชื่อติดต่อ, ไมโครโฟน และอุปกรณ์ที่อยู่ใกล้เคียง"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"แอปนี้จะได้รับสิทธิ์ดังต่อไปนี้ในโทรศัพท์ของคุณ"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"อนุญาตให้ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; เข้าถึงข้อมูลนี้จากโทรศัพท์ของคุณ"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"บริการหลายอุปกรณ์"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> เพื่อสตรีมแอประหว่างอุปกรณ์ต่างๆ ของคุณ"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"อนุญาตให้ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ทำงานนี้ไหม"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> เพื่อสตรีมแอปและฟีเจอร์อื่นๆ ของระบบไปยังอุปกรณ์ที่อยู่ใกล้เคียง"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"อุปกรณ์"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"แอปนี้จะสามารถซิงค์ข้อมูล เช่น ชื่อของบุคคลที่โทรเข้ามา ระหว่างโทรศัพท์ของคุณและ<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ได้"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"แอปนี้จะสามารถซิงค์ข้อมูล เช่น ชื่อของบุคคลที่โทรเข้ามา ระหว่างโทรศัพท์ของคุณและอุปกรณ์ที่เลือกไว้ได้"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"อนุญาต"</string>
     <string name="consent_no" msgid="2640796915611404382">"ไม่อนุญาต"</string>
     <string name="consent_back" msgid="2560683030046918882">"กลับ"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"สตรีมแอปของโทรศัพท์คุณ"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"สตรีมแอปและฟีเจอร์อื่นๆ ของระบบจากโทรศัพท์"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-tl/strings.xml b/packages/CompanionDeviceManager/res/values-tl/strings.xml
index 4195c6d..afb6adb 100644
--- a/packages/CompanionDeviceManager/res/values-tl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-tl/strings.xml
@@ -17,15 +17,19 @@
 <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">"Kasamang Device Manager"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Payagan ang &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na i-access ang &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"relo"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Pumili ng <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para pamahalaan ng &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Kailangan ang app para mapamahalaan ang iyong <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Papayagan ang <xliff:g id="APP_NAME">%2$s</xliff:g> na mag-sync ng impormasyon, tulad ng pangalan ng isang taong tumatawag, makipag-ugnayan sa mga notification mo, at ma-access ang iyong mga pahintulot sa Telepono, SMS, Mga Contact, Kalendaryo, Mga log ng tawag, at Mga kalapit na device."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Kailangan ang app para mapamahalaan ang iyong <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Papayagan ang <xliff:g id="APP_NAME">%2$s</xliff:g> na mag-sync ng impormasyon, tulad ng pangalan ng isang taong tumatawag, at na ma-access ang mga pahintulot na ito:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Payagan ang &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na pamahalaan ang &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"salamin"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Kailangan ang app na ito para mapamahalaan ang <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Papayagan ang <xliff:g id="APP_NAME">%2$s</xliff:g> na makipag-ugnayan sa mga notification mo at i-access ang iyong mga pahintulot sa Telepono, SMS, Mga Contact, Mikropono, at Mga kalapit na device."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Papayagan ang app na ito na i-access ang mga pahintulot na ito sa iyong telepono:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Payagan ang &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na i-access ang impormasyong ito sa iyong telepono"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Mga cross-device na serbisyo"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Ang <xliff:g id="APP_NAME">%1$s</xliff:g> ay humihiling ng pahintulot sa ngalan ng iyong <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> para mag-stream ng mga app sa pagitan ng mga device mo"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Payagan ang &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; na gawin ang pagkilos na ito?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Humihiling ang <xliff:g id="APP_NAME">%1$s</xliff:g> ng pahintulot sa ngalan ng iyong <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para mag-stream ng mga app at iba pang feature ng system sa mga kalapit na device"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Magagawa ng app na ito na mag-sync ng impormasyon, tulad ng pangalan ng isang taong tumatawag, sa pagitan ng iyong telepono at ng <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"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>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Payagan"</string>
     <string name="consent_no" msgid="2640796915611404382">"Huwag payagan"</string>
     <string name="consent_back" msgid="2560683030046918882">"Bumalik"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"I-stream ang mga app ng iyong telepono"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Mag-stream ng mga app at iba pang feature ng system mula sa iyong telepono"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-tr/strings.xml b/packages/CompanionDeviceManager/res/values-tr/strings.xml
index d90fd33..69d08b7 100644
--- a/packages/CompanionDeviceManager/res/values-tr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-tr/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; cihazına erişmesi için &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; uygulamasına izin verin"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"saat"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; tarafından yönetilecek bir <xliff:g id="PROFILE_NAME">%1$s</xliff:g> seçin"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Bu uygulama, <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazınızın yönetilmesi için gereklidir. <xliff:g id="APP_NAME">%2$s</xliff:g> adlı uygulamanın arayan kişinin adı gibi bilgileri senkronize etmesine, bildirimlerinizle etkileşimde bulunup Telefon, SMS, Kişiler, Takvim, Arama kayıtları ve Yakındaki cihazlar izinlerine erişmesine izin verilir."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Bu uygulama, <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazınızın yönetilmesi için gereklidir. <xliff:g id="APP_NAME">%2$s</xliff:g> adlı uygulamanın arayan kişinin adı gibi bilgileri senkronize etmesine ve aşağıdaki izinlere erişmesine izin verilir:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; uygulamasına &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; cihazını yönetmesi için izin verilsin mi?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"glasses"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Bu uygulama, <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazının yönetilmesi için gereklidir. <xliff:g id="APP_NAME">%2$s</xliff:g> adlı uygulamanın bildirimlerinizle etkileşimde bulunup Telefon, SMS, Kişiler, Mikrofon ve Yakındaki cihazlar izinlerine erişmesine izin verilir."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Bu uygulamanın telefonunuzda şu izinlere erişmesine izin verilecek:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; uygulamasının, telefonunuzdaki bu bilgilere erişmesine izin verin"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cihazlar arası hizmetler"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g>, cihazlarınız arasında uygulama akışı gerçekleştirmek için <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> cihazınız adına izin istiyor"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; cihazının bu işlem yapmasına izin verilsin mi?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulaması <xliff:g id="DEVICE_NAME">%2$s</xliff:g> cihazınız adına uygulamaları ve diğer sistem özelliklerini yakındaki cihazlara aktarmak için izin istiyor"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"cihaz"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Bu uygulama, arayan kişinin adı gibi bilgileri telefonunuz ve <xliff:g id="DEVICE_NAME">%1$s</xliff:g> adlı cihaz arasında senkronize edebilir."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Bu uygulama, arayan kişinin adı gibi bilgileri telefonunuz ve seçili cihaz arasında senkronize edebilir."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"İzin ver"</string>
     <string name="consent_no" msgid="2640796915611404382">"İzin verme"</string>
     <string name="consent_back" msgid="2560683030046918882">"Geri"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Telefonunuzun uygulamalarını yayınlama"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Telefonunuzdan uygulamaları ve diğer sistem özelliklerini yayınlayın"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-uk/strings.xml b/packages/CompanionDeviceManager/res/values-uk/strings.xml
index 9af7f46..0733997 100644
--- a/packages/CompanionDeviceManager/res/values-uk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-uk/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"Надати додатку &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"годинник"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Виберіть <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, яким керуватиме додаток &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Цей додаток потрібен, щоб керувати пристроєм \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\". Додаток <xliff:g id="APP_NAME">%2$s</xliff:g> зможе синхронізувати інформацію (наприклад, ім’я абонента, який викликає), взаємодіяти з вашими сповіщеннями й отримає дозволи \"Телефон\", \"SMS\", \"Контакти\", \"Календар\", \"Журнали викликів\" і \"Пристрої поблизу\"."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Цей додаток потрібен, щоб керувати пристроєм \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\". Додаток <xliff:g id="APP_NAME">%2$s</xliff:g> зможе синхронізувати інформацію (наприклад, ім’я абонента, який викликає) і отримає такі дозволи:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"окуляри"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Цей додаток потрібен, щоб керувати пристроєм \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\". Додаток <xliff:g id="APP_NAME">%2$s</xliff:g> зможе взаємодіяти з вашими сповіщеннями й отримає дозволи \"Телефон\", \"SMS\", \"Контакти\", \"Мікрофон\" і \"Пристрої поблизу\"."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Цей додаток матиме доступ до таких дозволів на вашому телефоні:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Надайте додатку &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; доступ до цієї інформації з телефона"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Сервіси для кількох пристроїв"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> від імені вашого пристрою <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> запитує дозвіл на трансляцію додатків між вашими пристроями"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Дозволити додатку &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; виконувати цю дію?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> від імені вашого пристрою (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) запитує дозвіл на трансляцію додатків та інших системних функцій на пристрої поблизу"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"пристрій"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Цей додаток зможе синхронізувати інформацію (наприклад, ім’я абонента, який викликає) між телефоном і пристроєм \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Цей додаток зможе синхронізувати інформацію (наприклад, ім’я абонента, який викликає) між телефоном і вибраним пристроєм."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Дозволити"</string>
     <string name="consent_no" msgid="2640796915611404382">"Не дозволяти"</string>
     <string name="consent_back" msgid="2560683030046918882">"Назад"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Транслювати додатки телефона"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Транслюйте додатки й інші системні функції зі свого телефона"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-ur/strings.xml b/packages/CompanionDeviceManager/res/values-ur/strings.xml
index 148ffab..fee4da2 100644
--- a/packages/CompanionDeviceManager/res/values-ur/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ur/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"‏&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"دیکھیں"</string>
     <string name="chooser_title" msgid="2262294130493605839">"‏&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; کے ذریعے نظم کئے جانے کیلئے <xliff:g id="PROFILE_NAME">%1$s</xliff:g> کو منتخب کریں"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"‏آپ کے <xliff:g id="DEVICE_NAME">%1$s</xliff:g> کا نظم کرنے کے لیے، ایپ کی ضرورت ہے۔ <xliff:g id="APP_NAME">%2$s</xliff:g> کو کسی کے کال کرنے والے کے نام، آپ کی اطلاعات کے ساتھ تعامل، آپ کے فون، SMS، رابطے، کیلنڈر، کال لاگز اور قریبی آلات کی اجازتوں جیسی معلومات کی مطابقت پذیری کی اجازت ہوگی۔"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"آپ کے <xliff:g id="DEVICE_NAME">%1$s</xliff:g> کا نظم کرنے کے لیے، ایپ کی ضرورت ہے۔ <xliff:g id="APP_NAME">%2$s</xliff:g> کو کسی کال کرنے والے کے نام اور ان اجازتوں تک رسائی جیسی معلومات کی مطابقت پذیری کی اجازت ہوگی:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"گلاسز"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"‏<xliff:g id="DEVICE_NAME">%1$s</xliff:g> کا نظم کرنے کے لیے، اس ایپ کی ضرورت ہے۔ <xliff:g id="APP_NAME">%2$s</xliff:g> کو آپ کی اطلاعات کے ساتھ تعامل کرنے اور آپ کے فون، SMS، رابطوں، مائیکروفون اور قریبی آلات کی اجازتوں تک رسائی کی اجازت ہوگی۔"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"اس ایپ کو آپ کے فون پر ان اجازتوں تک رسائی کرنے کی اجازت ہوگی:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"‏اپنے فون سے ان معلومات تک رسائی حاصل کرنے کی &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; کو اجازت دیں"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"کراس ڈیوائس سروسز"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> ایپ آپ کے <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> کی جانب سے آپ کے آلات کے درمیان ایپس کی سلسلہ بندی کرنے کی اجازت کی درخواست کر رہی ہے"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"‏&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; کو یہ کارروائی انجام دینے کی اجازت دیں؟"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> آپ کے <xliff:g id="DEVICE_NAME">%2$s</xliff:g> کی جانب سے ایپس اور سسٹم کی دیگر خصوصیات کی سلسلہ بندی قریبی آلات پر کرنے کی اجازت طلب کر رہی ہے"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"آلہ"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"یہ ایپ آپ کے فون اور <xliff:g id="DEVICE_NAME">%1$s</xliff:g> کے درمیان معلومات، جیسے کسی کال کرنے والے کے نام، کی مطابقت پذیری کر سکے گی۔"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"یہ ایپ آپ کے فون اور منتخب کردہ آلے کے درمیان معلومات، جیسے کسی کال کرنے والے کے نام، کی مطابقت پذیری کر سکے گی۔"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"اجازت دیں"</string>
     <string name="consent_no" msgid="2640796915611404382">"اجازت نہ دیں"</string>
     <string name="consent_back" msgid="2560683030046918882">"پیچھے"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"اپنے فون کی ایپس کی سلسلہ بندی کریں"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"اپنے فون سے ایپس اور سسٹم کی دیگر خصوصیات کی سلسلہ بندی کریں"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-uz/strings.xml b/packages/CompanionDeviceManager/res/values-uz/strings.xml
index 0b66e4f..27f6054 100644
--- a/packages/CompanionDeviceManager/res/values-uz/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-uz/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ilovasiga &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; qurilmasidan foydalanishga ruxsat bering"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"soat"</string>
     <string name="chooser_title" msgid="2262294130493605839">"&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; boshqaradigan <xliff:g id="PROFILE_NAME">%1$s</xliff:g> qurilmasini tanlang"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Ilova <xliff:g id="DEVICE_NAME">%1$s</xliff:g> qurilmangizni boshqarish uchun kerak. <xliff:g id="APP_NAME">%2$s</xliff:g> ilovasiga chaqiruvchining ismi, bildirishnomalar bilan ishlash va telefon, SMS, kontaktlar, taqvim, chaqiruvlar jurnali va yaqin-atrofdagi qurilmalarni aniqlash kabi maʼlumotlarni sinxronlashga ruxsat beriladi."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Ilova <xliff:g id="DEVICE_NAME">%1$s</xliff:g> qurilmangizni boshqarish uchun kerak. <xliff:g id="APP_NAME">%2$s</xliff:g> ilovasiga chaqiruvchining ismi kabi maʼlumotlarni sinxronlash va quyidagi amallarni bajarishga ruxsat beriladi:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ilovasiga &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; qurilmasini boshqarish uchun ruxsat berilsinmi?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"koʻzoynak"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Bu ilova <xliff:g id="DEVICE_NAME">%1$s</xliff:g> qurilmasini boshqarish uchun kerak. <xliff:g id="APP_NAME">%2$s</xliff:g> ilovasiga bildirishnomalar bilan ishlash va telefon, SMS, kontaktlar, mikrofon va yaqin-atrofdagi qurilmalarga kirishga ruxsat beriladi."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Bu ilova telefonda quyidagi ruxsatlarni oladi:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ilovasiga telefondagi ushbu maʼlumot uchun ruxsat bering"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Qurilmalararo xizmatlar"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"Qurilamalararo ilovalar strimingi uchun <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> nomidan ruxsat soʻramoqda"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ilovasiga bu amalni bajarish uchun ruxsat berilsinmi?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DEVICE_NAME">%2$s</xliff:g> qurilmangizdan nomidan atrofdagi qurilmalarga ilova va boshqa tizim funksiyalarini uzatish uchun ruxsat olmoqchi"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"qurilma"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Bu ilova telefoningiz va <xliff:g id="DEVICE_NAME">%1$s</xliff:g> qurilmasida chaqiruvchining ismi kabi maʼlumotlarni sinxronlay oladi."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Bu ilova telefoningiz va tanlangan qurilmada chaqiruvchining ismi kabi maʼlumotlarni sinxronlay oladi."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Ruxsat"</string>
     <string name="consent_no" msgid="2640796915611404382">"Ruxsat berilmasin"</string>
     <string name="consent_back" msgid="2560683030046918882">"Orqaga"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Telefondagi ilovalarni translatsiya qilish"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Telefoningizdan ilovalar va tizim funksiyalarini translatsiya qilish"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-vi/strings.xml b/packages/CompanionDeviceManager/res/values-vi/strings.xml
index c2f9669..fb18b00 100644
--- a/packages/CompanionDeviceManager/res/values-vi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-vi/strings.xml
@@ -17,15 +17,19 @@
 <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">"Trình quản lý thiết bị đồng hành"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Cho phép &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; truy cập &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"đồng hồ"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Chọn một <xliff:g id="PROFILE_NAME">%1$s</xliff:g> sẽ do &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; quản lý"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"Cần có ứng dụng này để quản lý <xliff:g id="DEVICE_NAME">%1$s</xliff:g> của bạn. <xliff:g id="APP_NAME">%2$s</xliff:g> sẽ được phép đồng bộ hoá thông tin (ví dụ: tên người gọi), tương tác với thông báo của bạn cũng như truy cập vào dữ liệu Điện thoại, SMS, Danh bạ, Lịch, Nhật ký cuộc gọi và Thiết bị ở gần."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"Cần có ứng dụng này để quản lý <xliff:g id="DEVICE_NAME">%1$s</xliff:g> của bạn. <xliff:g id="APP_NAME">%2$s</xliff:g> sẽ được phép đồng bộ hoá thông tin (ví dụ: tên người gọi) và có các quyền sau:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Cho phép &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; quản lý &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"kính"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Bạn cần có ứng dụng này để quản lý <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. <xliff:g id="APP_NAME">%2$s</xliff:g> sẽ được phép tương tác với thông báo của bạn, cũng như sử dụng các quyền đối với Điện thoại, SMS, Danh bạ, Micrô và Thiết bị ở gần."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Ứng dụng này sẽ được phép sử dụng những quyền sau trên điện thoại của bạn:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Cho phép &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; truy cập vào thông tin này trên điện thoại của bạn"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Dịch vụ trên nhiều thiết bị"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang yêu cầu quyền thay cho <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> để truyền trực tuyến ứng dụng giữa các thiết bị của bạn"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Cho phép &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; thực hiện hành động này?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang thay <xliff:g id="DEVICE_NAME">%2$s</xliff:g> yêu cầu quyền truyền trực tuyến ứng dụng và các tính năng khác của hệ thống đến các thiết bị ở gần"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"thiết bị"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Ứng dụng này sẽ đồng bộ hoá được thông tin (ví dụ: tên người gọi) giữa điện thoại của bạn và <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Ứng dụng này sẽ đồng bộ hoá được thông tin (ví dụ: tên người gọi) giữa điện thoại của bạn và thiết bị bạn chọn."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Cho phép"</string>
     <string name="consent_no" msgid="2640796915611404382">"Không cho phép"</string>
     <string name="consent_back" msgid="2560683030046918882">"Quay lại"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Truyền các ứng dụng trên điện thoại của bạn"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Truyền trực tuyến ứng dụng và các tính năng khác của hệ thống từ điện thoại của bạn"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
index e3a90cd8..25df727 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"允许&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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"手表"</string>
     <string name="chooser_title" msgid="2262294130493605839">"选择要由&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;管理的<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"需要使用此应用才能管理您的“<xliff:g id="DEVICE_NAME">%1$s</xliff:g>”。<xliff:g id="APP_NAME">%2$s</xliff:g>将能同步信息(例如来电者的姓名),与通知交互,并可获得电话、短信、通讯录、日历、通话记录和附近设备的访问权限。"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"需要使用此应用才能管理您的“<xliff:g id="DEVICE_NAME">%1$s</xliff:g>”。<xliff:g id="APP_NAME">%2$s</xliff:g>将能同步信息(例如来电者的姓名),并可使用以下权限:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"眼镜"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"需要使用此应用才能管理<xliff:g id="DEVICE_NAME">%1$s</xliff:g>。“<xliff:g id="APP_NAME">%2$s</xliff:g>”将能与通知交互,并可获得电话、短信、通讯录、麦克风和附近设备的访问权限。"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"该应用将可以获得您手机上的以下权限:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”&lt;strong&gt;&lt;/strong&gt;访问您手机中的这项信息"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"跨设备服务"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正代表您的<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>请求在您的设备之间流式传输应用内容"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"允许&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;进行此操作?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正代表您的<xliff:g id="DEVICE_NAME">%2$s</xliff:g>请求将应用和其他系统功能流式传输到附近的设备"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"设备"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"此应用将能够在您的手机和“<xliff:g id="DEVICE_NAME">%1$s</xliff:g>”之间同步信息,例如来电者的姓名。"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"此应用将能够在您的手机和所选设备之间同步信息,例如来电者的姓名。"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"允许"</string>
     <string name="consent_no" msgid="2640796915611404382">"不允许"</string>
     <string name="consent_back" msgid="2560683030046918882">"返回"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"流式传输手机上的应用"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"从您的手机流式传输应用和其他系统功能"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
index 66d833d..fe58ddd 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"允許 &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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"手錶"</string>
     <string name="chooser_title" msgid="2262294130493605839">"選擇由 &lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt; 管理的<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"必須使用此應用程式,才能管理「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」。「<xliff:g id="APP_NAME">%2$s</xliff:g>」將可同步資訊 (例如來電者的名稱)、透過通知與您互動,並存取電話、短訊、通訊錄、日曆、通話記錄和附近的裝置權限。"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"必須使用此應用程式,才能管理「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」。「<xliff:g id="APP_NAME">%2$s</xliff:g>」將可同步資訊 (例如來電者的名稱),並存取以下權限:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"眼鏡"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"必須使用此應用程式,才能管理「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」。「<xliff:g id="APP_NAME">%2$s</xliff:g>」將可透過通知與您互動,並存取電話、短訊、通訊錄、麥克風和附近的裝置權限。"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"此應用程式將可在手機上取得以下權限:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;存取您手機中的這項資料"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"跨裝置服務"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在為 <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> 要求權限,以在裝置之間串流應用程式內容"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"要允許「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;執行此操作嗎?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」要求權限,才能在附近的裝置上串流播放應用程式和其他系統功能"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"此應用程式將可同步手機和「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」的資訊,例如來電者的名稱。"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"此應用程式將可同步手機和所選裝置的資訊,例如來電者的名稱。"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"允許"</string>
     <string name="consent_no" msgid="2640796915611404382">"不允許"</string>
     <string name="consent_back" msgid="2560683030046918882">"返回"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"串流播放手機應用程式內容"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"串流播放手機中的應用程式和其他系統功能"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
index c0ce419..33c1f2a 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
@@ -17,15 +17,19 @@
 <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="8024993972587946678">"允許「<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>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"手錶"</string>
     <string name="chooser_title" msgid="2262294130493605839">"選擇要讓「<xliff:g id="APP_NAME">%2$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;管理的<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"你必須使用這個應用程式,才能管理「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」。「<xliff:g id="APP_NAME">%2$s</xliff:g>」將可同步資訊 (例如來電者名稱)、存取通知及在通知上執行操作,並取得電話、簡訊、聯絡人、日曆、通話記錄、麥克風和鄰近裝置權限。"</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"你必須使用這個應用程式,才能管理「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」。「<xliff:g id="APP_NAME">%2$s</xliff:g>」將可同步資訊 (例如來電者名稱),並取得以下權限:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <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="8488394059007275998">"眼鏡"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"你必須使用這個應用程式,才能管理「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」。「<xliff:g id="APP_NAME">%2$s</xliff:g>」將可存取通知及在通知上執行操作,並取得電話、簡訊、聯絡人、麥克風和鄰近裝置權限。"</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"這個應用程式將可在手機上取得以下權限:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;存取手機中的這項資訊"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"跨裝置服務"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表你的「<xliff:g id="DEVICE_TYPE">%2$s</xliff:g>」要求必要權限,以便在裝置之間串流傳輸應用程式內容"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"要允許「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;執行這項操作嗎?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」要求必要權限,才能在鄰近裝置上串流播放應用程式和其他系統功能"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"這個應用程式將可在手機和「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」之間同步資訊,例如來電者名稱。"</string>
-    <string name="summary_generic" msgid="4988130802522924650">"這個應用程式將可在手機和指定裝置之間同步資訊,例如來電者名稱。"</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"允許"</string>
     <string name="consent_no" msgid="2640796915611404382">"不允許"</string>
     <string name="consent_back" msgid="2560683030046918882">"返回"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"串流傳輸手機應用程式內容"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"串流播放手機中的應用程式和其他系統功能"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-zu/strings.xml b/packages/CompanionDeviceManager/res/values-zu/strings.xml
index 39b458c..5a3de1c 100644
--- a/packages/CompanionDeviceManager/res/values-zu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zu/strings.xml
@@ -17,15 +17,19 @@
 <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">"Isiphathi sedivayisi esihambisanayo"</string>
-    <string name="confirmation_title" msgid="8024993972587946678">"Vumela i-&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ukuthi ifinyelele i-&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
+    <!-- no translation found for confirmation_title (4593465730772390351) -->
+    <skip />
     <string name="profile_name_watch" msgid="576290739483672360">"buka"</string>
     <string name="chooser_title" msgid="2262294130493605839">"Khetha i-<xliff:g id="PROFILE_NAME">%1$s</xliff:g> ezophathwa yi-&lt;strong&gt;<xliff:g id="APP_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="summary_watch" msgid="6566922405914995759">"I-app iyadingeka ukuphatha i-<xliff:g id="DEVICE_NAME">%1$s</xliff:g> yakho. I-<xliff:g id="APP_NAME">%2$s</xliff:g> izovunyelwa ukuvumelanisa ulwazi, njengegama lomuntu othile ofonayo, ukusebenzisana nezaziso zakho futhi ufinyelele Ifoni yakho, i-SMS, Oxhumana Nabo, Ikhalenda, Amarekhodi Amakholi nezimvume zamadivayisi aseduze."</string>
-    <string name="summary_watch_single_device" msgid="7443464525873186735">"I-app iyadingeka ukuphatha i-<xliff:g id="DEVICE_NAME">%1$s</xliff:g> yakho. I-<xliff:g id="APP_NAME">%2$s</xliff:g> izovunyelwa ukuvumelanisa ulwazi, njengegama lomuntu othile ofonayo, futhi ufinyelele lezi zimvume:"</string>
+    <!-- no translation found for summary_watch (898569637110705523) -->
+    <skip />
+    <!-- no translation found for summary_watch_single_device (3001383718181475756) -->
+    <skip />
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Vumela i-&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ukuthi ifinyelele i-&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="profile_name_glasses" msgid="8488394059007275998">"Izingilazi"</string>
     <string name="summary_glasses_multi_device" msgid="615259525961937348">"Le app iyadingeka ukuphatha i-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>. I-<xliff:g id="APP_NAME">%2$s</xliff:g> izovunyelwa ukuthi ihlanganyele nezaziso zakho futhi ifinyelele kufoni yakho, i-SMS, Oxhumana nabo, Imakrofoni Nezimvume zamadivayisi aseduze."</string>
-    <string name="summary_glasses_single_device" msgid="5783761806783565716">"Le-app izovunyelwa ukufinyelela lezi zimvume kufoni yakho:"</string>
+    <!-- no translation found for summary_glasses_single_device (403955999347676820) -->
+    <skip />
     <string name="title_app_streaming" msgid="2270331024626446950">"Vumela i-&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ifinyelele lolu lwazi kusukela efonini yakho"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Amasevisi amadivayisi amaningi"</string>
     <string name="helper_summary_app_streaming" msgid="5977509499890099">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela imvume esikhundleni se-<xliff:g id="DEVICE_TYPE">%2$s</xliff:g> yakho ukuze isakaze-bukhoma ama-app phakathi kwamadivayisi akho"</string>
@@ -38,8 +42,10 @@
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vumela i-<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ukwenza lesi senzo?"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela imvume esikhundleni se-<xliff:g id="DEVICE_NAME">%2$s</xliff:g> ukusakaza ama-app nezinye izakhi zesistimu kumadivayisi aseduze"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"idivayisi"</string>
-    <string name="summary_generic_single_device" msgid="4735072202474939111">"Le app izokwazi ukuvumelanisa ulwazi, njengegama lomuntu othile ofonayo, phakathi kwefoni yakho ne-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="summary_generic" msgid="4988130802522924650">"Le app izokwazi ukuvumelanisa ulwazi, njengegama lomuntu othile ofonayo, phakathi kwefoni yakho nedivayisi ekhethiwe."</string>
+    <!-- no translation found for summary_generic_single_device (4181180669689590417) -->
+    <skip />
+    <!-- no translation found for summary_generic (1761976003668044801) -->
+    <skip />
     <string name="consent_yes" msgid="8344487259618762872">"Vumela"</string>
     <string name="consent_no" msgid="2640796915611404382">"Ungavumeli"</string>
     <string name="consent_back" msgid="2560683030046918882">"Emuva"</string>
@@ -69,4 +75,8 @@
     <string name="permission_app_streaming_summary" msgid="606923325679670624">"Sakaza ama-app wefoni yakho"</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_nearby_device_streaming_summary" msgid="8280824871197081246">"Sakaza ama-app nezinye izakhi zesistimu kusuka kufoni yakho"</string>
+    <!-- no translation found for device_type (8268703872070046263) -->
+    <skip />
+    <!-- no translation found for device_type (5038791954983067774) -->
+    <skip />
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values/strings.xml b/packages/CompanionDeviceManager/res/values/strings.xml
index 82e5a7f..d87abb9 100644
--- a/packages/CompanionDeviceManager/res/values/strings.xml
+++ b/packages/CompanionDeviceManager/res/values/strings.xml
@@ -20,7 +20,7 @@
     <string name="app_label">Companion Device Manager</string>
 
     <!-- Title of the device association confirmation dialog. -->
-    <string name="confirmation_title">Allow &lt;strong&gt;<xliff:g id="app_name" example="Android Wear">%1$s</xliff:g>&lt;/strong&gt; to access &lt;strong&gt;<xliff:g id="device_name" example="ASUS ZenWatch 2">%2$s</xliff:g>&lt;/strong&gt;</string>
+    <string name="confirmation_title">Allow &lt;strong&gt;<xliff:g id="app_name" example="Android Wear">%1$s</xliff:g>&lt;/strong&gt; to access &lt;strong&gt;<xliff:g id="device_name" example="ASUS ZenWatch 2">%2$s</xliff:g>&lt;/strong&gt;?</string>
 
     <!-- ================= DEVICE_PROFILE_WATCH and null profile ================= -->
 
@@ -31,10 +31,10 @@
     <string name="chooser_title">Choose a <xliff:g id="profile_name" example="watch">%1$s</xliff:g> to be managed by &lt;strong&gt;<xliff:g id="app_name" example="Android Wear">%2$s</xliff:g>&lt;/strong&gt;</string>
 
     <!-- Description of the privileges the application will get if associated with the companion device of WATCH profile (type) [CHAR LIMIT=NONE] -->
-    <string name="summary_watch">The app is needed to manage your <xliff:g id="device_name" example="My Watch">%1$s</xliff:g>. <xliff:g id="app_name" example="Android Wear">%2$s</xliff:g> will be allowed to sync info, like the name of someone calling, interact with your notifications and access your Phone, SMS, Contacts, Calendar, Call logs and Nearby devices permissions.</string>
+    <string name="summary_watch">This app is needed to manage your <xliff:g id="device_name" example="My Watch">%1$s</xliff:g>. <xliff:g id="app_name" example="Android Wear">%2$s</xliff:g> will be allowed to sync info, like the name of someone calling, interact with your notifications and access your Phone, SMS, Contacts, Calendar, Call logs and Nearby devices permissions.</string>
 
     <!-- Description of the privileges the application will get if associated with the companion device of WATCH profile for singleDevice(type) [CHAR LIMIT=NONE] -->
-    <string name="summary_watch_single_device">The app is needed to manage your <xliff:g id="device_name" example="My Watch">%1$s</xliff:g>. <xliff:g id="app_name" example="Android Wear">%2$s</xliff:g> will be allowed to sync info, like the name of someone calling, and access these permissions:</string>
+    <string name="summary_watch_single_device">This app will be allowed to sync info, like the name of someone calling, and access these permissions on your <xliff:g id="device_name" example="phone">%1$s</xliff:g></string>
 
     <!-- ================= DEVICE_PROFILE_GLASSES ================= -->
 
@@ -48,7 +48,7 @@
     <string name="summary_glasses_multi_device">This app is needed to manage <xliff:g id="device_name" example="My Glasses">%1$s</xliff:g>. <xliff:g id="app_name" example="Glasses">%2$s</xliff:g> will be allowed to interact with your notifications and access your Phone, SMS, Contacts, Microphone and Nearby devices permissions.</string>
 
     <!-- Description of the privileges the application will get if associated with the companion device of GLASSES profile for singleDevice(type) [CHAR LIMIT=NONE] -->
-    <string name="summary_glasses_single_device">This app will be allowed to access these permissions on your phone:</string>
+    <string name="summary_glasses_single_device">This app will be allowed to access these permissions on your <xliff:g id="device_name" example="phone">%1$s</xliff:g></string>
 
     <!-- ================= DEVICE_PROFILE_APP_STREAMING ================= -->
 
@@ -97,10 +97,10 @@
     <string name="profile_name_generic">device</string>
 
     <!-- Description of the privileges the application will get if associated with the companion device of unspecified profile (type) [CHAR LIMIT=NONE] -->
-    <string name="summary_generic_single_device">This app will be able to sync info, like the name of someone calling, between your phone and <xliff:g id="device_name" example="My Watch">%1$s</xliff:g>.</string>
+    <string name="summary_generic_single_device">This app will be able to sync info, like the name of someone calling, between your phone and <xliff:g id="device_name" example="My Watch">%1$s</xliff:g></string>
 
     <!-- Description of the privileges the application will get if associated with the companion device of unspecified profile (type) [CHAR LIMIT=NONE] -->
-    <string name="summary_generic">This app will be able to sync info, like the name of someone calling, between your phone and the chosen device.</string>
+    <string name="summary_generic">This app will be able to sync info, like the name of someone calling, between your phone and the chosen device</string>
 
     <!-- ================= Buttons ================= -->
 
@@ -194,4 +194,10 @@
     <!-- Description of nearby_device_streaming permission of corresponding profile [CHAR LIMIT=NONE] -->
     <string name="permission_nearby_device_streaming_summary">Stream apps and other system features from your phone</string>
 
+    <!-- The type of the device for phone [CHAR LIMIT=30] -->
+    <string name="device_type" product="default">phone</string>
+
+    <!-- The type of the device for tablet [CHAR LIMIT=30] -->
+    <string name="device_type" product="tablet">tablet</string>
+
 </resources>
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java
index 71ae578..4154029 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java
@@ -551,8 +551,8 @@
             summary = getHtmlFromResources(this, SUMMARIES.get(null), deviceName);
             mConstraintList.setVisibility(View.GONE);
         } else {
-            summary = getHtmlFromResources(this, SUMMARIES.get(deviceProfile),
-                    getString(PROFILES_NAME.get(deviceProfile)), appLabel);
+            summary = getHtmlFromResources(
+                    this, SUMMARIES.get(deviceProfile), getString(R.string.device_type));
             mPermissionTypes.addAll(PERMISSION_TYPES.get(deviceProfile));
             setupPermissionList();
         }
diff --git a/packages/CredentialManager/res/values-af/strings.xml b/packages/CredentialManager/res/values-af/strings.xml
index 6b621ce..9def248 100644
--- a/packages/CredentialManager/res/values-af/strings.xml
+++ b/packages/CredentialManager/res/values-af/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Verbeterde rekeningsekuriteit"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Elke sleutel is uitsluitlik gekoppel aan die app of webwerf waarvoor dit geskep is, en daarom kan jy nooit per ongeluk by ’n bedrieglike app of webwerf aanmeld nie. En omdat bedieners net publieke sleutels hou, is kuberkrakery baie moeiliker."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Moeitevrye oorgang"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Wagwoorde sal steeds saam met wagwoordsleutels beskikbaar wees soos ons na ’n wagwoordlose toekoms beweeg."</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Wagwoorde sal steeds saam met wagwoordsleutels beskikbaar wees terwyl ons na ’n wagwoordlose toekoms beweeg."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Kies waar om jou <xliff:g id="CREATETYPES">%1$s</xliff:g> te stoor"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Kies ’n wagwoordbestuurder om jou inligting te stoor en volgende keer vinniger aan te meld"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Skep wagwoordsleutel vir <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gebruik jou gestoorde wagwoordsleutel vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Gebruik jou gestoorde aanmelding vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Kies ’n gestoorde aanmelding vir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Kies ’n opsie vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Meld op ’n ander manier aan"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Bekyk opsies"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Gaan voort"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Bestuur aanmeldings"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Van ’n ander toestel af"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Gebruik ’n ander toestel"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Versoek is deur <xliff:g id="APP_NAME">%1$s</xliff:g> gekanselleer"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-am/strings.xml b/packages/CredentialManager/res/values-am/strings.xml
index 6b00e08..ca7584f 100644
--- a/packages/CredentialManager/res/values-am/strings.xml
+++ b/packages/CredentialManager/res/values-am/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"የተሻሻለ የመለያ ደህንነት"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"ወደ አጭበርባሪ መተግበሪያ ወይም ድር ጣቢያ በስህተት መቼም መግባት እንዳይችሉ እያንዳንዱ ቁልፍ ከተፈጠረለት መተግበሪያ ወይም ድር ጣቢያ ጋር ለሚመለከተው ተወስኖ የተገናኘ ነው። በተጨማሪም አገልጋዮች ይፋዊ ቁልፎችን ብቻ ስለሚጠብቁ ሰርጎ መግባት የበለጠ ከባድ ነው።"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"እንከን አልባ ትርጉም"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"ወደ የይለፍ ቃል የሌለው ወደፊት ስንሄድ የይለፍ ቃላት አሁንም ከይለፍ ቁልፎች ጎን ለጎን ይገኛሉ"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"ወደ የይለፍ ቃል የሌለው ወደፊት ስንሄድ የይለፍ ቃላት ከይለፍ ቁልፎች ጎን ለጎን ይገኛሉ።"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"የእርስዎን <xliff:g id="CREATETYPES">%1$s</xliff:g> የት እንደሚያስቀምጡ ይምረጡ"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"መረጃዎን ለማስቀመጥ እና በቀጣይ ጊዜ በፍጥነት በመለያ ለመግባት የሚስጥር ቁልፍ አስተዳዳሪን ይምረጡ"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"ለ<xliff:g id="APPNAME">%1$s</xliff:g> የይለፍ ቁልፍ ይፈጠር?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"የተቀመጠ የይለፍ ቁልፍዎን ለ<xliff:g id="APP_NAME">%1$s</xliff:g> ይጠቀሙ?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"የተቀመጠ መግቢያዎን ለ<xliff:g id="APP_NAME">%1$s</xliff:g> ይጠቀሙ?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> የተቀመጠ መግቢያ ይጠቀሙ"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"በሌላ መንገድ ይግቡ"</string>
     <string name="snackbar_action" msgid="37373514216505085">"አማራጮችን አሳይ"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"ቀጥል"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"መግቢያዎችን ያስተዳድሩ"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"ከሌላ መሣሪያ"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"የተለየ መሣሪያ ይጠቀሙ"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"ጥያቄ በ<xliff:g id="APP_NAME">%1$s</xliff:g> ተሰርዟል"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ar/strings.xml b/packages/CredentialManager/res/values-ar/strings.xml
index 2d6a606..ef8c6f0 100644
--- a/packages/CredentialManager/res/values-ar/strings.xml
+++ b/packages/CredentialManager/res/values-ar/strings.xml
@@ -20,13 +20,13 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"تحسين أمان الحساب"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"يرتبط كل مفتاح حصريًا بالتطبيق أو الموقع الإلكتروني الذي تم إنشاؤه من أجله، لذلك لا يمكن أبدًا أن تسجّل الدخول إلى تطبيق أو موقع إلكتروني احتيالي عن طريق الخطأ. بالإضافة إلى ذلك، تكون عملية الاختراق أكثر صعوبة لأن الخوادم تحتفظ بالمفاتيح العامة فقط."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"النقل السلس"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"بينما ننطلق نحو مستقبل بدون كلمات مرور، ستظل كلمات المرور متوفّرة إلى جانب مفاتيح المرور."</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"بينما ننطلق نحو مستقبل بدون كلمات مرور، ستظل كلمات المرور متوفّرة إلى جانب مفاتيح المرور."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"اختيار المكان الذي تريد حفظ <xliff:g id="CREATETYPES">%1$s</xliff:g> فيه"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"اختَر مدير كلمات مرور لحفظ معلوماتك وتسجيل الدخول بشكل أسرع في المرة القادمة."</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"هل تريد إنشاء مفتاح مرور لتطبيق \"<xliff:g id="APPNAME">%1$s</xliff:g>\"؟"</string>
     <string name="choose_create_option_password_title" msgid="7097275038523578687">"هل تريد حفظ كلمة المرور لتطبيق \"<xliff:g id="APPNAME">%1$s</xliff:g>\"؟"</string>
     <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"هل تريد حفظ معلومات تسجيل الدخول لتطبيق \"<xliff:g id="APPNAME">%1$s</xliff:g>\"؟"</string>
-    <string name="passkey" msgid="632353688396759522">"مفتاح مرور"</string>
+    <string name="passkey" msgid="632353688396759522">"مفتاح المرور"</string>
     <string name="password" msgid="6738570945182936667">"كلمة المرور"</string>
     <string name="passkeys" msgid="5733880786866559847">"مفاتيح المرور"</string>
     <string name="passwords" msgid="5419394230391253816">"كلمات المرور"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"هل تريد استخدام مفتاح المرور المحفوظ لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"هل تريد استخدام بيانات اعتماد تسجيل الدخول المحفوظة لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"اختيار بيانات اعتماد تسجيل دخول محفوظة لـ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"تسجيل الدخول بطريقة أخرى"</string>
     <string name="snackbar_action" msgid="37373514216505085">"عرض الخيارات"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"متابعة"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"إداراة عمليات تسجيل الدخول"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"من جهاز آخر"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"استخدام جهاز مختلف"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"تم إلغاء الطلب بواسطة \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-as/strings.xml b/packages/CredentialManager/res/values-as/strings.xml
index 8c5e6372..0a6d5d0 100644
--- a/packages/CredentialManager/res/values-as/strings.xml
+++ b/packages/CredentialManager/res/values-as/strings.xml
@@ -16,11 +16,11 @@
     <string name="passwordless_technology_title" msgid="2497513482056606668">"পাছৱৰ্ডবিহীন প্ৰযুক্তি"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"পাছকীসমূহে আপোনাক পাছৱৰ্ডৰ ওপৰত নিৰ্ভৰ নকৰাকৈ ছাইন ইন কৰাৰ অনুমতি দিয়ে। আপুনি আপোনাৰ পৰিচয় সত্যাপন কৰিবলৈ আৰু এটা পাছকী সৃষ্টি কৰিবলৈ কেৱল আপোনাৰ ফিংগাৰপ্ৰিণ্ট, মুখাৱয়ব চিনাক্তকৰণ, পিন অথবা ছোৱাইপ কৰাৰ আৰ্হি ব্যৱহাৰ কৰিলেই হ’ল।"</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"ৰাজহুৱা চাবি ক্ৰিপ্ট’গ্ৰাফী"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO জোঁট (য’ত Google, Apple, Microsoft আৰু অধিক অন্তৰ্ভুক্ত) আৰু W3C মানকসমূহৰ ওপৰত ভিত্তি কৰি, পাছকীসমূহে ক্ৰিপ্ট’গ্ৰাফিক চাবিৰ যোৰা ব্যৱহাৰ কৰে। আমি পাছৱৰ্ডৰ বাবে ব্যৱহাৰ কৰা ব্যৱহাৰকাৰীৰ নাম আৰু বৰ্ণৰ ষ্ট্ৰিঙৰ বিপৰীতে, এটা এপ্‌ অথবা ৱেবছাইটৰ বাবে এটা ব্যক্তিগত-ৰাজহুৱা কীৰ যোৰা সৃষ্টি কৰা হয়। ব্যক্তিগত চাবিটো আপোনাৰ ডিভাইচ অথবা পাছৱৰ্ড পৰিচালকত সুৰক্ষিতভাৱে ষ্ট’ৰ কৰা হয় আৰু ই আপোনাৰ পৰিচয় নিশ্চিত কৰে। ৰাজহুৱা চাবিটো এপ্‌ অথবা ৱেবছাইটৰ ছাৰ্ভাৰৰ সৈতে শ্বেয়াৰ কৰা হয়। সংশ্লিষ্ট চাবিসমূহৰ জৰিয়তে আপুনি তাৎক্ষণিকভাৱে পঞ্জীয়ন আৰু ছাইন ইন কৰিব পাৰিব।"</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO জোঁট (য’ত Google, Apple, Microsoft আৰু অধিক অন্তৰ্ভুক্ত) আৰু W3C মানকসমূহৰ ওপৰত ভিত্তি কৰি, পাছকীসমূহে ক্ৰিপ্ট’গ্ৰাফিক চাবিৰ যোৰা ব্যৱহাৰ কৰে। আমি পাছৱৰ্ডৰ বাবে ব্যৱহাৰ কৰা ব্যৱহাৰকাৰীৰ নাম আৰু বৰ্ণৰ ষ্ট্ৰিঙৰ বিপৰীতে, এটা এপ্‌ অথবা ৱেবছাইটৰ বাবে এটা ব্যক্তিগত-ৰাজহুৱা চাবিৰ যোৰা সৃষ্টি কৰা হয়। ব্যক্তিগত চাবিটো আপোনাৰ ডিভাইচ অথবা পাছৱৰ্ড পৰিচালকত সুৰক্ষিতভাৱে ষ্ট’ৰ কৰা হয় আৰু ই আপোনাৰ পৰিচয় নিশ্চিত কৰে। ৰাজহুৱা চাবিটো এপ্‌ অথবা ৱেবছাইটৰ ছাৰ্ভাৰৰ সৈতে শ্বেয়াৰ কৰা হয়। সংশ্লিষ্ট চাবিসমূহৰ জৰিয়তে আপুনি তাৎক্ষণিকভাৱে পঞ্জীয়ন আৰু ছাইন ইন কৰিব পাৰিব।"</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"একাউণ্টৰ উন্নত সুৰক্ষা"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"প্ৰতিটো চাবি বিশেষভাৱে সেই এপ্‌ অথবা ৱেবছাইটৰ সৈতে লিংক কৰা হয় যাৰ বাবে সেইটো সৃষ্টি কৰা হৈছে, সেয়ে আপুনি কেতিয়াও ভুলতে কোনো প্ৰৱঞ্চনামূলক এপ্‌ অথবা ৱেবছাইটত ছাইন ইন কৰিব নোৱাৰে। ইয়াৰ উপৰিও, কেৱল ৰাজহুৱা চাবিসমূহ ৰখা ছাৰ্ভাৰৰ ক্ষেত্ৰত হেক কৰাটো বহুত কঠিন হৈ পৰে।"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"বাধাহীন স্থানান্তৰণ"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"আমি পাছৱৰ্ডবিহীন ভৱিষ্যতৰ দিশে আগবঢ়াৰ লগে লগে পাছকীৰ লগতে পাছৱৰ্ডসমূহো উপলব্ধ হ’ব"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"আমি পাছৱৰ্ডবিহীন ভৱিষ্যতৰ দিশে আগবঢ়াৰ লগে লগে পাছকীৰ লগতে পাছৱৰ্ডসমূহো উপলব্ধ হ’ব।"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"আপোনাৰ <xliff:g id="CREATETYPES">%1$s</xliff:g> ক’ত ছেভ কৰিব লাগে সেয়া বাছনি কৰক"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"আপোনাৰ তথ্য ছেভ কৰি পৰৱৰ্তী সময়ত দ্ৰুতভাৱে ছাইন ইন কৰিবলৈ এটা পাছৱৰ্ড পৰিচালক বাছনি কৰক"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g>ৰ বাবে পাছকী সৃষ্টি কৰিবনে?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে আপোনাৰ ছেভ হৈ থকা পাছকী ব্যৱহাৰ কৰিবনে?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে আপোনাৰ ছেভ হৈ থকা ছাইন ইন তথ্য ব্যৱহাৰ কৰিবনে?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে ছেভ হৈ থকা এটা ছাইন ইন বাছনি কৰক"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে এটা বিকল্প বাছনি কৰিবনে?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"অন্য উপায়েৰে ছাইন ইন কৰক"</string>
     <string name="snackbar_action" msgid="37373514216505085">"বিকল্পসমূহ চাওক"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"অব্যাহত ৰাখক"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"ছাইন ইন পৰিচালনা কৰক"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"অন্য এটা ডিভাইচৰ পৰা"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"অন্য এটা ডিভাইচ ব্যৱহাৰ কৰক"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ অনুৰোধটো বাতিল কৰিছে"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-az/strings.xml b/packages/CredentialManager/res/values-az/strings.xml
index e016760..97ffd43 100644
--- a/packages/CredentialManager/res/values-az/strings.xml
+++ b/packages/CredentialManager/res/values-az/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Təkmilləşdirilmiş hesab təhlükəsizliyi"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Hər bir açar eksklüziv olaraq onların yaradıldığı tətbiq və ya vebsaytla əlaqələndirilib, ona görə də heç vaxt səhvən saxta tətbiqə və ya vebsayta daxil ola bilməzsiniz. Üstəlik, yalnız ictimai açarları saxlayan serverlərlə hekinq daha çətindir."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Rahat keçid"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Paroldan istifadə azalsa da, parollar yenə də giriş açarları ilə yanaşı əlçatan olacaq"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Parolsuz gələcəyə doğru irəlilədikcə parollar hələ də giriş açarları ilə yanaşı əlçatan olacaq."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> elementinin saxlanacağı yeri seçin"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Məlumatlarınızı yadda saxlamaq və növbəti dəfə daha sürətli daxil olmaq üçün parol meneceri seçin"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> üçün giriş açarı yaradılsın?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün yadda saxlanmış giriş açarı istifadə edilsin?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün yadda saxlanmış girişdən istifadə edilsin?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün yadda saxlanmış girişi seçin"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Başqa üsulla daxil olun"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Seçimlərə baxın"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Davam edin"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Girişləri idarə edin"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Başqa cihazdan"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Başqa cihaz istifadə edin"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> sorğunu ləğv etdi"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-b+sr+Latn/strings.xml b/packages/CredentialManager/res/values-b+sr+Latn/strings.xml
index c80b17e..fb23ee1 100644
--- a/packages/CredentialManager/res/values-b+sr+Latn/strings.xml
+++ b/packages/CredentialManager/res/values-b+sr+Latn/strings.xml
@@ -20,8 +20,8 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Poboljšana bezbednost naloga"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Svaki ključ je isključivo povezan sa aplikacijom ili veb-sajtom za koje je napravljen, pa nikad ne možete greškom da se prijavite u aplikaciju ili na veb-sajt koji služe za prevaru. Osim toga, sa serverima koji čuvaju samo javne ključeve hakovanje je mnogo teže."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Besprekoran prelaz"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Kako se krećemo ka budućnosti bez lozinki, lozinke će i dalje biti dostupne uz pristupne kodove"</string>
-    <string name="choose_provider_title" msgid="8870795677024868108">"Odaberite gde ćete sačuvati stavke <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Kako se krećemo ka budućnosti bez lozinki, lozinke će i dalje biti dostupne uz pristupne kodove."</string>
+    <string name="choose_provider_title" msgid="8870795677024868108">"Odaberite gde ćete sačuvati: <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Izaberite menadžera lozinki da biste sačuvali podatke i brže se prijavili sledeći put"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Želite da napravite pristupni kôd za: <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
     <string name="choose_create_option_password_title" msgid="7097275038523578687">"Želite da sačuvate lozinku za: <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -32,7 +32,7 @@
     <string name="passwords" msgid="5419394230391253816">"lozinke"</string>
     <string name="sign_ins" msgid="4710739369149469208">"prijavljivanja"</string>
     <string name="sign_in_info" msgid="2627704710674232328">"podaci za prijavljivanje"</string>
-    <string name="save_credential_to_title" msgid="3172811692275634301">"Sačuvaj stavku <xliff:g id="CREDENTIALTYPES">%1$s</xliff:g> u"</string>
+    <string name="save_credential_to_title" msgid="3172811692275634301">"Sačuvaj <xliff:g id="CREDENTIALTYPES">%1$s</xliff:g> u"</string>
     <string name="create_passkey_in_other_device_title" msgid="9195411122362461390">"Želite da napravite pristupni kôd na drugom uređaju?"</string>
     <string name="use_provider_for_all_title" msgid="4201020195058980757">"Želite da za sva prijavljivanja koristite: <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g>?"</string>
     <string name="use_provider_for_all_description" msgid="1998772715863958997">"Ovaj menadžer lozinki za <xliff:g id="USERNAME">%1$s</xliff:g> će čuvati lozinke i pristupne kodove da biste se lako prijavljivali"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Želite da koristite sačuvani pristupni kôd za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Želite da koristite sačuvane podatke za prijavljivanje za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Odaberite sačuvano prijavljivanje za: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Želite da odaberete opciju za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Prijavite se na drugi način"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Prikaži opcije"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Nastavi"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Upravljajte prijavljivanjima"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Sa drugog uređaja"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Koristi drugi uređaj"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Zahtve je otkazala aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-be/strings.xml b/packages/CredentialManager/res/values-be/strings.xml
index 13a329a..12b90ee 100644
--- a/packages/CredentialManager/res/values-be/strings.xml
+++ b/packages/CredentialManager/res/values-be/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Павышаная бяспека ўліковага запісу"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Кожны ключ звязаны толькі з праграмай або вэб-сайтам, для якіх ён быў створаны, таму вы не зможаце памылкова ўвайсці ў праграму ці на вэб-сайт, створаныя ў мэтах махлярства. Акрамя таго, на серверах захоўваюцца толькі адкрытыя ключы, таму правесці ўзлом намнога складаней."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Плаўны пераход"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Хоць мы ўжо рухаемся ў бок будучыні без выкарыстання пароляў, яны па-ранейшаму застануцца даступнымі нароўні з ключамі доступу."</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Хоць мы ўжо рухаемся ў бок будучыні без выкарыстання пароляў, яны па-ранейшаму застануцца даступнымі нароўні з ключамі доступу."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Выберыце, куды захаваць <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Выберыце менеджар пароляў, каб захаваць свае даныя і забяспечыць хуткі ўваход у наступныя разы"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Стварыце ключ доступу да праграмы \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Скарыстаць захаваны ключ доступу для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Скарыстаць захаваныя спосабы ўваходу для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Выберыце захаваны спосаб уваходу для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Увайсці іншым спосабам"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Праглядзець варыянты"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Далей"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Кіраваць спосабамі ўваходу"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"З іншай прылады"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Скарыстаць іншую прыладу"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Запыт скасаваны праграмай \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-bg/strings.xml b/packages/CredentialManager/res/values-bg/strings.xml
index 453c58f..f22c83e 100644
--- a/packages/CredentialManager/res/values-bg/strings.xml
+++ b/packages/CredentialManager/res/values-bg/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Подобрена сигурност на профила"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Всеки ключ е свързан само с приложението или уебсайта, за които е създаден. Затова не е възможно да влезете в измамно приложение или уебсайт по погрешка. Освен това сървърите съхраняват само публичните ключове, което значително затруднява опитите за хакерство."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Безпроблемен преход"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Паролите ще продължат да са налице заедно с кодовете за достъп по пътя ни към бъдеще без пароли"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Паролите ще продължат да са налице заедно с кодовете за достъп по пътя ни към бъдеще без пароли."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Изберете къде да запазите своите <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Изберете мениджър на пароли, в който да се запазят данните ви, така че следващия път да влезете по-бързо в профила си"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Да се създаде ли код за достъп за <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Да се използва ли запазеният ви код за достъп за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Да се използват ли запазените ви данни за вход за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Изберете запазени данни за вход за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Влизане в профила по друг начин"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Преглед на опциите"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Напред"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Управление на данните за вход"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"От друго устройство"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Използване на друго устройство"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Заявката е анулирана от <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-bn/strings.xml b/packages/CredentialManager/res/values-bn/strings.xml
index 8360931..c1a74fc 100644
--- a/packages/CredentialManager/res/values-bn/strings.xml
+++ b/packages/CredentialManager/res/values-bn/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"অ্যাকাউন্টের জন্য উন্নত সুরক্ষা"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"প্রতিটি \'কী\' যে অ্যাপ বা ওয়েবসাইটের জন্য তৈরি করা হয়েছে, সেগুলির সাথে এই \'কী\' বিশেষভাবে লিঙ্ক করা থাকে। তাই কখনই আপনি ভুলবশত কোনও ভুয়ো অ্যাপ বা ওয়েবসাইটে সাইন-ইন করতে পারবেন না। পাশাপাশি, যেসব সার্ভারে শুধু সর্বজনীন \'কী\' রয়েছে, তা হ্যাক করা খুবই কঠিন।"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"নির্বিঘ্ন ট্রানজিশন"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"আমরা পাসওয়ার্ডবিহীন ভবিষ্যতের দিকে এগিয়ে গেলেও, এখনও \'পাসকী\'-এর পাশাপাশি পাসওয়ার্ড ব্যবহার করা যাবে"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"আমরা পাসওয়ার্ডবিহীন ভবিষ্যতের দিকে এগিয়ে গেলেও, এখনও \'পাসকী\'-এর পাশাপাশি পাসওয়ার্ড ব্যবহার করা যাবে।"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"আপনার <xliff:g id="CREATETYPES">%1$s</xliff:g> কোথায় সেভ করবেন তা বেছে নিন"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"আপনার তথ্য সেভ করতে একটি Password Manager বেছে নিন এবং পরের বার আরও দ্রুত সাইন-ইন করুন"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g>-এর জন্য \'পাসকী\' তৈরি করবেন?"</string>
@@ -44,7 +44,7 @@
     <string name="more_options_usage_credentials" msgid="1785697001787193984">"<xliff:g id="TOTALCREDENTIALSNUMBER">%1$s</xliff:g>টি ক্রেডেনশিয়াল"</string>
     <string name="passkey_before_subtitle" msgid="2448119456208647444">"পাসকী"</string>
     <string name="another_device" msgid="5147276802037801217">"অন্য ডিভাইস"</string>
-    <string name="other_password_manager" msgid="565790221427004141">"অন্যান্য Password Manager"</string>
+    <string name="other_password_manager" msgid="565790221427004141">"অন্যান্য পাসওয়ার্ড ম্যানেজার"</string>
     <string name="close_sheet" msgid="1393792015338908262">"শিট বন্ধ করুন"</string>
     <string name="accessibility_back_arrow_button" msgid="3233198183497842492">"আগের পৃষ্ঠায় ফিরে যান"</string>
     <string name="accessibility_close_button" msgid="1163435587545377687">"বন্ধ করুন"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য আপনার সেভ করা পাসকী ব্যবহার করবেন?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য আপনার সেভ করা সাইন-ইন সম্পর্কিত ক্রেডেনশিয়াল ব্যবহার করবেন?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য সাইন-ইন করা সম্পর্কিত ক্রেডেনশিয়াল বেছে নিন"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"অন্যভাবে সাইন-ইন করুন"</string>
     <string name="snackbar_action" msgid="37373514216505085">"বিকল্প দেখুন"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"চালিয়ে যান"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"সাইন-ইন করার ক্রেডেনশিয়াল ম্যানেজ করুন"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"অন্য ডিভাইস থেকে"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"আলাদা ডিভাইস ব্যবহার করুন"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> দ্বারা অনুরোধ বাতিল করা হয়েছে"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-bs/strings.xml b/packages/CredentialManager/res/values-bs/strings.xml
index e37232d..7884e9f 100644
--- a/packages/CredentialManager/res/values-bs/strings.xml
+++ b/packages/CredentialManager/res/values-bs/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Poboljšana sigurnost računa"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Svaki ključ je isključivo povezan s aplikacijom ili web lokacijom za koju je kreiran, tako da se nikada ne možete greškom prijaviti u prevarantsku aplikaciju ili na prevarantsku web lokaciju. Osim toga, hakiranje je puno teže zahvaljujući serverima koji čuvaju samo javne ključeve."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Neometani prijelaz"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Kako se krećemo prema budućnosti bez lozinki, lozinke će i dalje biti dostupne uz pristupne ključeve"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Kako se krećemo prema budućnosti bez lozinki, lozinke će i dalje biti dostupne uz pristupne ključeve."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Odaberite gdje će se pohranjivati <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Odaberite upravitelja lozinki da sačuvate svoje informacije i brže se prijavite sljedeći put"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Kreirati pristupni ključ za aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Koristiti sačuvani pristupni ključ za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Koristiti sačuvanu prijavu za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Odaberite sačuvanu prijavu za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Želite li odabrati opciju za <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Prijavite se na drugi način"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Prikaži opcije"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Nastavi"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Upravljajte prijavama"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"S drugog uređaja"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Upotrijebite drugi uređaj"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je otkazala zahtjev"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ca/strings.xml b/packages/CredentialManager/res/values-ca/strings.xml
index aed1610..5e956a0 100644
--- a/packages/CredentialManager/res/values-ca/strings.xml
+++ b/packages/CredentialManager/res/values-ca/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Seguretat dels comptes millorada"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Cada clau està exclusivament enllaçada a l\'aplicació o al lloc web per als quals s\'ha creat. D\'aquesta manera, mai iniciaràs la sessió en una aplicació o un lloc web fraudulents per error. A més, com que els servidors només conserven les claus públiques, el hacking és molt més difícil."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Transició fluida"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Tot i que avancem cap a un futur sense contrasenyes, continuaran estant disponibles juntament amb les claus d\'accés"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Tot i que avancem cap a un futur sense contrasenyes, continuaran estant disponibles juntament amb les claus d\'accés."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Tria on vols desar les <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecciona un gestor de contrasenyes per desar la teva informació i iniciar la sessió més ràpidament la pròxima vegada"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Vols crear la clau d\'accés per a <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vols utilitzar la clau d\'accés desada per a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Vols utilitzar l\'inici de sessió desat per a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Tria un inici de sessió desat per a <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Inicia la sessió d\'una altra manera"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Mostra les opcions"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continua"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Gestiona els inicis de sessió"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Des d\'un altre dispositiu"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Utilitza un dispositiu diferent"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> ha cancel·lat la sol·licitud"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-cs/strings.xml b/packages/CredentialManager/res/values-cs/strings.xml
index 8eb0ff6..4a7b643 100644
--- a/packages/CredentialManager/res/values-cs/strings.xml
+++ b/packages/CredentialManager/res/values-cs/strings.xml
@@ -16,11 +16,11 @@
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Technologie bez hesel"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"Přístupové klíče umožňují přihlašovat se bez hesel. Stačí pomocí otisku prstu, rozpoznání obličeje, kódu PIN nebo gesta ověřit svou totožnost a vytvořit přístupový klíč."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Kryptografie s veřejným klíčem"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Podle pokynů FIDO Alliance (která zahrnuje společnosti Google, Apple, Microsoft a další) a standardů W3C používají přístupové klíče páry kryptografických klíčů. Na rozdíl od uživatelského jména a řetězce znaků, které používáme pro hesla, se pro aplikaci nebo web vytváří pár klíčů (soukromého a veřejného ). Soukromý klíč je bezpečně uložen ve vašem zařízení nebo správci hesel a potvrzuje vaši identitu. Veřejný klíč je sdílen s aplikací nebo webovým serverem. Pomocí odpovídajících klíčů se můžete okamžitě zaregistrovat a přihlásit."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Podle pokynů FIDO Alliance (která zahrnuje společnosti Google, Apple, Microsoft a další) a standardů W3C používají přístupové klíče páry kryptografických klíčů. Na rozdíl od uživatelského jména a řetězce znaků, které používáme pro hesla, se pro aplikaci nebo web vytváří pár klíčů (soukromého a veřejného). Soukromý klíč je bezpečně uložen ve vašem zařízení nebo správci hesel a potvrzuje vaši identitu. Veřejný klíč je sdílen s aplikací nebo webovým serverem. Pomocí odpovídajících klíčů se můžete okamžitě zaregistrovat a přihlásit."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Vylepšené zabezpečení účtu"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Každý klíč je propojen výhradně s aplikací nebo webem, pro které byl vytvořen, takže se nikdy nemůžete omylem přihlásit k podvodné aplikaci nebo webu. Protože na serverech jsou uloženy pouze veřejné klíče, je hackování navíc mnohem obtížnější."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Bezproblémový přechod"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Ačkoliv směřujeme k budoucnosti bez hesel, vedle přístupových klíčů budou stále k dispozici i hesla"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Ačkoliv směřujeme k budoucnosti bez hesel, vedle přístupových klíčů budou stále k dispozici i hesla."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Určete, kam ukládat <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Vyberte správce hesel k uložení svých údajů, abyste se příště mohli přihlásit rychleji"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Vytvořit přístupový klíč pro aplikaci <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Použít uložený přístupový klíč pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Použít uložené přihlášení pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Vyberte uložené přihlášení pro <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Přihlásit se jinak"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Zobrazit možnosti"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Pokračovat"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Spravovat přihlášení"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Z jiného zařízení"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Použít jiné zařízení"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> žádost zrušila"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-da/strings.xml b/packages/CredentialManager/res/values-da/strings.xml
index 8e24cc9..fe728dd 100644
--- a/packages/CredentialManager/res/values-da/strings.xml
+++ b/packages/CredentialManager/res/values-da/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Forbedret kontosikkerhed"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Hver nøgle er udelukkende tilknyttet den app eller det website, som nøglen blev oprettet til. På denne måde kan du aldrig logge ind i en svigagtig app eller på et svigagtigt website ved en fejl. Og da serverne kun opbevarer offentlige nøgler, er kontoer meget sværere at hacke."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Problemfri overgang"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Selvom vi nærmer os en fremtid, hvor adgangskoder er mindre fremtrædende, kan de stadig bruges i samspil med adgangsnøgler"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Selvom vi nærmer os en fremtid, hvor adgangskoder er mindre fremtrædende, kan de stadig bruges i samspil med adgangsnøgler."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Vælg, hvor du vil gemme dine <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Vælg en adgangskodeadministrator for at gemme dine oplysninger, så du kan logge ind hurtigere næste gang"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Vil du oprette en adgangsnøgle til <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vil du bruge din gemte adgangsnøgle til <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Vil du bruge din gemte loginmetode til <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Vælg en gemt loginmetode til <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Log ind på en anden måde"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Se valgmuligheder"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Fortsæt"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Administrer loginmetoder"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Fra en anden enhed"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Brug en anden enhed"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Anmodningen blev annulleret af <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-de/strings.xml b/packages/CredentialManager/res/values-de/strings.xml
index 8c9138c..d48b548 100644
--- a/packages/CredentialManager/res/values-de/strings.xml
+++ b/packages/CredentialManager/res/values-de/strings.xml
@@ -9,8 +9,8 @@
     <string name="content_description_show_password" msgid="3283502010388521607">"Passwort einblenden"</string>
     <string name="content_description_hide_password" msgid="6841375971631767996">"Passwort ausblenden"</string>
     <string name="passkey_creation_intro_title" msgid="4251037543787718844">"Mehr Sicherheit mit Passkeys"</string>
-    <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"Mit Passkeys musst du keine komplizierten Passwörter erstellen oder dir merken"</string>
-    <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"Passkeys sind verschlüsselte digitale Schlüssel, die du mithilfe deines Fingerabdrucks, Gesichts oder deiner Displaysperre erstellst"</string>
+    <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"Mit Passkeys musst du keine komplizierten Passwörter erstellen oder sie dir merken"</string>
+    <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"Passkeys sind verschlüsselte digitale Schlüssel, die du mithilfe deines Fingerabdrucks, der Gesichtserkennung oder deiner Displaysperre erstellst"</string>
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Sie werden in einem Passwortmanager gespeichert, damit du dich auf anderen Geräten anmelden kannst"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"Weitere Informationen zu Passkeys"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Passwortlose Technologie"</string>
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Verbesserte Kontosicherheit"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Jeder Schlüssel ist ausschließlich mit der App oder Website verknüpft, für die er erstellt wurde. Du kannst dich also nicht aus Versehen bei einer betrügerischen App oder Website anmelden. Da auf Servern nur öffentliche Schlüssel verwaltet werden, wird das Hacking außerdem erheblich erschwert."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Nahtlose Umstellung"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Auch wenn wir uns auf eine passwortlose Zukunft zubewegen, werden neben Passkeys weiter Passwörter verfügbar sein"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Auch wenn wir uns auf eine passwortlose Zukunft zubewegen, werden neben Passkeys weiter Passwörter verfügbar sein."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Wähle aus, wo deine <xliff:g id="CREATETYPES">%1$s</xliff:g> gespeichert werden sollen"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Du kannst einen Passwortmanager auswählen, um deine Anmeldedaten zu speichern, damit du dich nächstes Mal schneller anmelden kannst"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Passkey für <xliff:g id="APPNAME">%1$s</xliff:g> erstellen?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gespeicherten Passkey für <xliff:g id="APP_NAME">%1$s</xliff:g> verwenden?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Gespeicherte Anmeldedaten für <xliff:g id="APP_NAME">%1$s</xliff:g> verwenden?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Gespeicherte Anmeldedaten für <xliff:g id="APP_NAME">%1$s</xliff:g> auswählen"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Andere Anmeldeoption auswählen"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Optionen ansehen"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Weiter"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Anmeldedaten verwalten"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Von einem anderen Gerät"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Anderes Gerät verwenden"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Anfrage abgebrochen von <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-el/strings.xml b/packages/CredentialManager/res/values-el/strings.xml
index 7189585..a163954 100644
--- a/packages/CredentialManager/res/values-el/strings.xml
+++ b/packages/CredentialManager/res/values-el/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Βελτιωμένη ασφάλεια λογαριασμού"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Κάθε κλειδί συνδέεται αποκλειστικά με την εφαρμογή ή τον ιστότοπο για τον οποίο δημιουργήθηκε ώστε να μην συνδέεστε ποτέ κατά λάθος σε μη νόμιμες εφαρμογές ή ιστοτόπους. Επιπλέον, οι παραβιάσεις είναι πολύ πιο δύσκολες, επειδή οι διακομιστές διατηρούν μόνο δημόσια κλειδιά."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Απρόσκοπτη μετάβαση"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Καθώς κινούμαστε προς ένα μέλλον χωρίς κωδικούς πρόσβασης, οι κωδικοί πρόσβασης θα εξακολουθούν να είναι διαθέσιμοι μαζί με τα κλειδιά πρόσβασης"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Καθώς κινούμαστε προς ένα μέλλον χωρίς κωδικούς πρόσβασης, οι κωδικοί πρόσβασης θα εξακολουθούν να είναι διαθέσιμοι μαζί με τα κλειδιά πρόσβασης."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Επιλέξτε πού θα αποθηκεύονται τα <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Επιλέξτε ένα πρόγραμμα διαχείρισης κωδικών πρόσβασης για να αποθηκεύσετε τα στοιχεία σας και να συνδεθείτε πιο γρήγορα την επόμενη φορά."</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Δημιουργία κλειδιού πρόσβασης για <xliff:g id="APPNAME">%1$s</xliff:g>;"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Να χρησιμοποιηθεί το αποθηκευμένο κλειδί πρόσβασης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Να χρησιμοποιηθούν τα αποθηκευμένα στοιχεία σύνδεσης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Επιλογή αποθηκευμένων στοιχείων σύνδεσης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <string name="get_dialog_title_use_info_on" msgid="8863708099535435146">"Να χρησιμοποιηθούν αυτές οι πληροφορίες στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Σύνδεση με άλλον τρόπο"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Προβολή επιλογών"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Συνέχεια"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Διαχείριση στοιχείων σύνδεσης"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Από άλλη συσκευή"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Χρήση διαφορετικής συσκευής"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Το αίτημα ακυρώθηκε από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-en-rAU/strings.xml b/packages/CredentialManager/res/values-en-rAU/strings.xml
index 5a5480d..4419366 100644
--- a/packages/CredentialManager/res/values-en-rAU/strings.xml
+++ b/packages/CredentialManager/res/values-en-rAU/strings.xml
@@ -18,9 +18,9 @@
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Public key cryptography"</string>
     <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Based on FIDO Alliance (which includes Google, Apple, Microsoft and more) and W3C standards, passkeys use cryptographic key pairs. Unlike the username and string of characters that we use for passwords, a private-public key pair is created for an app or website. The private key is safely stored on your device or password manager and it confirms your identity. The public key is shared with the app or website server. With corresponding keys, you can instantly register and sign in."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Improved account security"</string>
-    <string name="improved_account_security_detail" msgid="9123750251551844860">"Each key is exclusively linked with the app or website they were created for, so you can never sign in to a fraudulent app or website by mistake. Plus, with servers only keeping public keys, hacking is a lot harder."</string>
+    <string name="improved_account_security_detail" msgid="9123750251551844860">"Each key is exclusively linked with the app or website it was created for, so you can never sign in to a fraudulent app or website by mistake. Plus, with servers only keeping public keys, hacking is a lot harder."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Seamless transition"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"As we move towards a passwordless future, passwords will still be available alongside passkeys"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Create passkey for <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Use your saved sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Choose a saved sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Sign in another way"</string>
     <string name="snackbar_action" msgid="37373514216505085">"View options"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continue"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Manage sign-ins"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"From another device"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Use a different device"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Request cancelled by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-en-rCA/strings.xml b/packages/CredentialManager/res/values-en-rCA/strings.xml
index 23091e79..b08425c 100644
--- a/packages/CredentialManager/res/values-en-rCA/strings.xml
+++ b/packages/CredentialManager/res/values-en-rCA/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Improved account security"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Each key is exclusively linked with the app or website they were created for, so you can never sign in to a fraudulent app or website by mistake. Plus, with servers only keeping public keys, hacking is a lot harder."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Seamless transition"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"As we move towards a passwordless future, passwords will still be available alongside passkeys"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Create passkey for <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,8 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Use your saved sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Choose a saved sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Choose an option for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_use_info_on" msgid="8863708099535435146">"Use this info on <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Sign in another way"</string>
     <string name="snackbar_action" msgid="37373514216505085">"View options"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continue"</string>
@@ -64,4 +66,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Manage sign-ins"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"From another device"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Use a different device"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Request cancelled by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-en-rGB/strings.xml b/packages/CredentialManager/res/values-en-rGB/strings.xml
index 5a5480d..4419366 100644
--- a/packages/CredentialManager/res/values-en-rGB/strings.xml
+++ b/packages/CredentialManager/res/values-en-rGB/strings.xml
@@ -18,9 +18,9 @@
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Public key cryptography"</string>
     <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Based on FIDO Alliance (which includes Google, Apple, Microsoft and more) and W3C standards, passkeys use cryptographic key pairs. Unlike the username and string of characters that we use for passwords, a private-public key pair is created for an app or website. The private key is safely stored on your device or password manager and it confirms your identity. The public key is shared with the app or website server. With corresponding keys, you can instantly register and sign in."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Improved account security"</string>
-    <string name="improved_account_security_detail" msgid="9123750251551844860">"Each key is exclusively linked with the app or website they were created for, so you can never sign in to a fraudulent app or website by mistake. Plus, with servers only keeping public keys, hacking is a lot harder."</string>
+    <string name="improved_account_security_detail" msgid="9123750251551844860">"Each key is exclusively linked with the app or website it was created for, so you can never sign in to a fraudulent app or website by mistake. Plus, with servers only keeping public keys, hacking is a lot harder."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Seamless transition"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"As we move towards a passwordless future, passwords will still be available alongside passkeys"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Create passkey for <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Use your saved sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Choose a saved sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Sign in another way"</string>
     <string name="snackbar_action" msgid="37373514216505085">"View options"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continue"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Manage sign-ins"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"From another device"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Use a different device"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Request cancelled by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-en-rIN/strings.xml b/packages/CredentialManager/res/values-en-rIN/strings.xml
index 5a5480d..4419366 100644
--- a/packages/CredentialManager/res/values-en-rIN/strings.xml
+++ b/packages/CredentialManager/res/values-en-rIN/strings.xml
@@ -18,9 +18,9 @@
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Public key cryptography"</string>
     <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Based on FIDO Alliance (which includes Google, Apple, Microsoft and more) and W3C standards, passkeys use cryptographic key pairs. Unlike the username and string of characters that we use for passwords, a private-public key pair is created for an app or website. The private key is safely stored on your device or password manager and it confirms your identity. The public key is shared with the app or website server. With corresponding keys, you can instantly register and sign in."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Improved account security"</string>
-    <string name="improved_account_security_detail" msgid="9123750251551844860">"Each key is exclusively linked with the app or website they were created for, so you can never sign in to a fraudulent app or website by mistake. Plus, with servers only keeping public keys, hacking is a lot harder."</string>
+    <string name="improved_account_security_detail" msgid="9123750251551844860">"Each key is exclusively linked with the app or website it was created for, so you can never sign in to a fraudulent app or website by mistake. Plus, with servers only keeping public keys, hacking is a lot harder."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Seamless transition"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"As we move towards a passwordless future, passwords will still be available alongside passkeys"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Create passkey for <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Use your saved sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Choose a saved sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Sign in another way"</string>
     <string name="snackbar_action" msgid="37373514216505085">"View options"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continue"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Manage sign-ins"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"From another device"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Use a different device"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Request cancelled by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-en-rXC/strings.xml b/packages/CredentialManager/res/values-en-rXC/strings.xml
index 465fd2c..e2f2dc3 100644
--- a/packages/CredentialManager/res/values-en-rXC/strings.xml
+++ b/packages/CredentialManager/res/values-en-rXC/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‏‎‎‎‏‏‎‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‏‎‎‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‎‏‏‎‏‎‎‎‎‎Improved account security‎‏‎‎‏‎"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‏‎‎‏‎‏‎‎‎‎‎‏‏‏‎‎‏‏‎‏‏‎‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‎‎Each key is exclusively linked with the app or website they were created for, so you can never sign in to a fraudulent app or website by mistake. Plus, with servers only keeping public keys, hacking is a lot harder.‎‏‎‎‏‎"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‏‏‏‎‎‏‎Seamless transition‎‏‎‎‏‎"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‏‏‎‏‎‎‎‎‎‎‏‏‎‎‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‏‏‎As we move towards a passwordless future, passwords will still be available alongside passkeys‎‏‎‎‏‎"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‎‏‏‎‎‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‏‎As we move towards a passwordless future, passwords will still be available alongside passkeys.‎‏‎‎‏‎"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‎‏‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‏‏‎‎‎Choose where to save your ‎‏‎‎‏‏‎<xliff:g id="CREATETYPES">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‎‎‏‎‏‎‏‎‎Select a password manager to save your info and sign in faster next time‎‏‎‎‏‎"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‏‏‎‏‎‎‎‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎Create passkey for ‎‏‎‎‏‏‎<xliff:g id="APPNAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
@@ -52,6 +52,8 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‏‏‎‎‏‏‏‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎Use your saved passkey for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎‎Use your saved sign-in for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‏‎‏‏‏‎‎‏‎‎‎‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‎‏‎‏‎Choose a saved sign-in for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‏‎Choose an option for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
+    <string name="get_dialog_title_use_info_on" msgid="8863708099535435146">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‏‎‎Use this info on ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‏‎‎‏‎‏‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‎‎‎‎‎Sign in another way‎‏‎‎‏‎"</string>
     <string name="snackbar_action" msgid="37373514216505085">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎View options‎‏‎‎‏‎"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‎‎‏‎‎‏‏‎‏‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‎Continue‎‏‎‎‏‎"</string>
@@ -64,4 +66,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‎‎‎‏‎‏‎‏‎‎‎‏‎‎‏‏‏‎‎‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‎‏‏‏‎‎Manage sign-ins‎‏‎‎‏‎"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‏‎‏‏‎‏‏‎‏‏‎‎‏‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‎‎‎‎From another device‎‏‎‎‏‎"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‎‎‏‏‏‎‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‏‎‏‏‏‎‏‏‎‏‎‏‎‏‎‎‏‎‏‏‏‏‎‏‎Use a different device‎‏‎‎‏‎"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎Request cancelled by ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-es-rUS/strings.xml b/packages/CredentialManager/res/values-es-rUS/strings.xml
index 27356a0..d8dd5ed 100644
--- a/packages/CredentialManager/res/values-es-rUS/strings.xml
+++ b/packages/CredentialManager/res/values-es-rUS/strings.xml
@@ -14,13 +14,13 @@
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Se guardan en un administrador de contraseñas para que puedas acceder en otros dispositivos"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"Más información sobre las llaves de acceso"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Tecnología sin contraseñas"</string>
-    <string name="passwordless_technology_detail" msgid="6853928846532955882">"Las llaves de acceso permiten acceder sin depender de contraseñas. Solo tienes que usar tu huella dactilar, reconocimiento facial, PIN o patrón de deslizamiento para verificar tu identidad y crear una clave de acceso."</string>
+    <string name="passwordless_technology_detail" msgid="6853928846532955882">"Las llaves de acceso permiten acceder sin depender de contraseñas. Solo tienes que usar tu huella dactilar, reconocimiento facial, PIN o patrón de deslizamiento para verificar tu identidad y crear una llave de acceso."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Criptografía de claves públicas"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Basadas en la Alianza FIDO (Google, Apple, Microsoft, etc.) y en estándares del W3C, las llaves de acceso usan pares de claves criptográficas. A diferencia de la cadena de caracteres de las contraseñas, para una app o sitio web se crean claves privadas y públicas. La clave privada se guarda en tu dispositivo/administrador de contraseñas, y confirma tu identidad. La clave pública se comparte con el servidor de la app o sitio web. Las claves adecuadas te permiten registrarte y acceder al instante."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Basadas en la Alianza FIDO (que incluye a Google, Apple, Microsoft, etc.) y en estándares del W3C, las llaves de acceso usan pares de claves criptográficas. A diferencia del nombre de usuario y la cadena de caracteres de las contraseñas, para una app o sitio web se crean claves privadas y públicas. La clave privada se guarda en tu dispositivo/administrador de contraseñas, y confirma tu identidad. La clave pública se comparte con el servidor de la app o sitio web. Las claves adecuadas te permiten registrarte y acceder al instante."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Mayor seguridad para las cuentas"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Cada llave está vinculada exclusivamente con el sitio web o la app para la que fue creada, por lo que nunca podrás acceder por error a una app o sitio web fraudulentos. Además, como los servidores solo guardan claves públicas, hackearlas es mucho más difícil."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Transición fluida"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"A medida que avanzamos hacia un futuro sin contraseñas, estas seguirán estando disponibles junto a las llaves de acceso"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"A medida que avanzamos hacia un futuro sin contraseñas, estas seguirán estando disponibles junto a las llaves de acceso."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Elige dónde guardar tus <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecciona un administrador de contraseñas para guardar tu información y acceder más rápido la próxima vez"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"¿Quieres crear una llave de acceso para <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"¿Quieres usar tu llave de acceso guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"¿Quieres usar tu acceso guardado para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Elige un acceso guardado para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Acceder de otra forma"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Ver opciones"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continuar"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Administrar accesos"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Desde otro dispositivo"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Usar otra voz"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> canceló la solicitud"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-es/strings.xml b/packages/CredentialManager/res/values-es/strings.xml
index ebdb00d..73c3b0d 100644
--- a/packages/CredentialManager/res/values-es/strings.xml
+++ b/packages/CredentialManager/res/values-es/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Seguridad de las cuentas mejorada"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Cada llave está vinculada exclusivamente con la aplicación o sitio web para los que se crearon, por lo que nunca puedes iniciar sesión en una aplicación o sitio web fraudulentos por error. Además, dado que los servidores solo mantienen claves públicas, es muy difícil que las pirateen."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Transición fluida"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Aunque nos dirigimos hacia un mundo sin contraseñas, estas seguirán estando disponibles junto con las llaves de acceso"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Aunque nos dirigimos hacia un mundo sin contraseñas, estas seguirán estando disponibles junto con las llaves de acceso."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Elige dónde guardar tus <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecciona un gestor de contraseñas para guardar tu información e iniciar sesión más rápido la próxima vez"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"¿Crear llave de acceso para <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"¿Usar la llave de acceso guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"¿Usar el inicio de sesión guardado para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Elige un inicio de sesión guardado para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Iniciar sesión de otra manera"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Ver opciones"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continuar"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Gestionar inicios de sesión"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"De otro dispositivo"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Usar otro dispositivo"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> ha cancelado la solicitud"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-et/strings.xml b/packages/CredentialManager/res/values-et/strings.xml
index 6d8b032..6f70941 100644
--- a/packages/CredentialManager/res/values-et/strings.xml
+++ b/packages/CredentialManager/res/values-et/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Konto täiustatud turvalisus"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Iga võti on lingitud vaid rakenduse või veebisaidiga, mille jaoks see loodi, seega ei saa te petturlikku rakendusse või veebisaidile kunagi kogemata sisse logida. Ja kuna serverid säilitavad vaid avalikke võtmeid, on häkkimine palju keerulisem."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Sujuv üleminek"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Liigume paroolivaba tuleviku poole, kuid paroolid jäävad pääsuvõtmete kõrval siiski kättesaadavaks"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Liikudes paroolivaba tuleviku poole, jäävad paroolid pääsuvõtmete kõrval siiski kättesaadavaks."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Valige, kuhu soovite oma <xliff:g id="CREATETYPES">%1$s</xliff:g> salvestada"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Valige paroolihaldur, et salvestada oma teave ja järgmisel korral kiiremini sisse logida"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Kas luua rakenduse <xliff:g id="APPNAME">%1$s</xliff:g> jaoks pääsuvõti?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Kas kasutada rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks salvestatud pääsuvõtit?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Kas kasutada rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks salvestatud sisselogimisandmeid?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Valige rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks salvestatud sisselogimisandmed"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Kas teha valik rakendusele <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Logige sisse muul viisil"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Kuva valikud"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Jätka"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Sisselogimisandmete haldamine"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Muus seadmes"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Kasuta teist seadet"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Rakendus <xliff:g id="APP_NAME">%1$s</xliff:g> tühistas taotluse"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-eu/strings.xml b/packages/CredentialManager/res/values-eu/strings.xml
index 34a3e05..3f08b61 100644
--- a/packages/CredentialManager/res/values-eu/strings.xml
+++ b/packages/CredentialManager/res/values-eu/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Kontuaren segurtasun areagotua"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Gako bakoitza harekin batera erabili behar den aplikazioarekin edo webgunearekin soilik lotzen da. Hala, ezingo duzu inoiz hasi saioa nahi gabe iruzurrezko aplikazio edo webgune batean. Gainera, zerbitzarietan gako publikoak soilik gordetzen direnez, askoz zailagoa da sarbide-gakoak hackeatzea."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Etenik gabeko trantsizioa"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Pasahitzik gabeko etorkizun baterantz goazen arren, pasahitzek sarbide-gakoen bizikide izaten jarraituko dute"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Pasahitzik gabeko etorkizun baterantz goazen arren, pasahitzek sarbide-gakoen bizikide izaten jarraituko dute."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Aukeratu non gorde <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Hautatu informazioa gordetzeko pasahitz-kudeatzaile bat eta hasi saioa bizkorrago hurrengoan"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> atzitzeko sarbide-gako bat sortu nahi duzu?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako gorde duzun sarbide-gakoa erabili nahi duzu?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako gorde dituzun kredentzialak erabili nahi dituzu?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Aukeratu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako gorde dituzun kredentzialak"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Hasi saioa beste modu batean"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Ikusi aukerak"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Egin aurrera"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Kudeatu kredentzialak"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Beste gailu batean gordetakoak"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Erabili beste gailu bat"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Utzi du bertan behera eskaera <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-fa/strings.xml b/packages/CredentialManager/res/values-fa/strings.xml
index 2407d10..a1d2446 100644
--- a/packages/CredentialManager/res/values-fa/strings.xml
+++ b/packages/CredentialManager/res/values-fa/strings.xml
@@ -13,16 +13,16 @@
     <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"گذرکلیدها کلیدهای دیجیتالی رمزگذاری‌شده‌ای هستند که بااستفاده از اثر انگشت، چهره، یا قفل صفحه ایجاد می‌کنید"</string>
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"گذرکلیدها در «مدیر گذرواژه» ذخیره می‌شود تا بتوانید در دستگاه‌های دیگر به سیستم وارد شوید"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"اطلاعات بیشتر درباره گذرکلیدها"</string>
-    <string name="passwordless_technology_title" msgid="2497513482056606668">"فناوری بدون گذرواژه"</string>
+    <string name="passwordless_technology_title" msgid="2497513482056606668">"فناوری بی‌گذرواژه"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"گذرکلیدها به شما اجازه می‌دهند بدون اتکا به گذرواژه به سیستم وارد شوید. برای به‌تأیید رساندن هویت خود و ایجاد گذرکلید، کافی است از اثر انگشت، تشخیص چهره، پین، یا الگوی کشیدنی استفاده کنید."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"رمزنگاری کلید عمومی"</string>
     <string name="public_key_cryptography_detail" msgid="6937631710280562213">"‏براساس «اتحاد FIDO» (که شامل Google،‏ Apple،‏ Microsoft، و غیره می‌شود) و استانداردهای W3C، گذرکلیدها از جفت کلیدهای رمزنگاری‌شده استفاده می‌کنند. برخلاف نام کاربری و رشته نویسه‌هایی که برای گذرواژه‌ها استفاده می‌کنیم، یک جفت کلید خصوصی-عمومی برای برنامه یا وب‌سایت ایجاد می‌شود. کلید خصوصی به‌طور امن در دستگاه یا مدیر گذرواژه شما ذخیره می‌شود و هویت شما را تأیید می‌کند. کلید عمومی با سرور وب‌سایت یا برنامه هم‌رسانی می‌شود. با کلیدهای مربوطه می‌توانید بی‌درنگ ثبت‌نام کنید و به سیستم وارد شوید."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"بهبود امنیت حساب"</string>
-    <string name="improved_account_security_detail" msgid="9123750251551844860">"هر کلید با برنامه یا وب‌سایتی که برای آن ایجاد شده است پیوند انحصاری دارد، بنابراین هرگز نمی‌توانید به‌اشتباه به سیستم برنامه یا وب‌سایتی جعلی وارد شوید. به‌علاوه، با سرورهایی که فقط کلیدهای عمومی را نگه می‌دارند رخنه‌گری بسیار سخت‌تر است."</string>
+    <string name="improved_account_security_detail" msgid="9123750251551844860">"هر کلید منحصراً با برنامه یا وب‌سایتی که برای آن ایجاد شده است پیوند داده می‌شود، بنابراین هرگز نمی‌توانید به اشتباه وارد برنامه یا وب‌سایت تقلبی شوید. به‌علاوه، باتوجه‌به اینکه سرورها فقط کلیدهای عمومی را نگه می‌دارند، رخنه‌گری (هک کردن) بسیار سخت‌تر است."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"انتقال یک‌پارچه"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"درحالی‌که به‌سوی آینده‌ای بدون گذرواژه حرکت می‌کنیم، گذرواژه‌ها همچنان در کنار گذرکلیدها دردسترس خواهند بود"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"درحالی‌که به‌سوی آینده‌ای بی‌گذرواژه حرکت می‌کنیم، گذرواژه‌ها همچنان در کنار گذرکلیدها دردسترس خواهند بود"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"جایی را برای ذخیره کردن <xliff:g id="CREATETYPES">%1$s</xliff:g> انتخاب کنید"</string>
-    <string name="choose_provider_body" msgid="4967074531845147434">"مدیر گذرواژه‌ای انتخاب کنید تا اطلاعاتتان ذخیره شود و دفعه بعدی سریع‌تر به سیستم وارد شوید"</string>
+    <string name="choose_provider_body" msgid="4967074531845147434">"مدیر گذرواژه‌ای انتخاب کنید تا اطلاعاتتان را ذخیره کنید و دفعه بعد سریع‌تر به سیستم وارد شوید"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"برای <xliff:g id="APPNAME">%1$s</xliff:g> گذرکلید ایجاد شود؟"</string>
     <string name="choose_create_option_password_title" msgid="7097275038523578687">"گذرواژه <xliff:g id="APPNAME">%1$s</xliff:g> ذخیره شود؟"</string>
     <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"اطلاعات ورود به سیستم <xliff:g id="APPNAME">%1$s</xliff:g> ذخیره شود؟"</string>
@@ -49,9 +49,13 @@
     <string name="accessibility_back_arrow_button" msgid="3233198183497842492">"برگشتن به صفحه قبلی"</string>
     <string name="accessibility_close_button" msgid="1163435587545377687">"بستن"</string>
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"بستن"</string>
-    <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"گذرکلید ذخیره‌شده برای <xliff:g id="APP_NAME">%1$s</xliff:g> استفاده شود؟"</string>
+    <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"از گذرکلید ذخیره‌شده برای «<xliff:g id="APP_NAME">%1$s</xliff:g>» استفاده شود؟"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"ورود به سیستم ذخیره‌شده برای <xliff:g id="APP_NAME">%1$s</xliff:g> استفاده شود؟"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"انتخاب ورود به سیستم ذخیره‌شده برای <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"ورود به سیستم به روشی دیگر"</string>
     <string name="snackbar_action" msgid="37373514216505085">"مشاهده گزینه‌ها"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"ادامه"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"مدیریت ورود به سیستم‌ها"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"از دستگاهی دیگر"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"استفاده از دستگاه دیگری"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"درخواست را <xliff:g id="APP_NAME">%1$s</xliff:g> لغو کرد"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-fi/strings.xml b/packages/CredentialManager/res/values-fi/strings.xml
index 11b4f59..562741e 100644
--- a/packages/CredentialManager/res/values-fi/strings.xml
+++ b/packages/CredentialManager/res/values-fi/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Parempi tilin tietoturva"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Kukin avain yhdistetään vain sovellukseen tai sivustoon, jota varten se on luotu, joten et voi koskaan kirjautua vilpilliseen sovellukseen tai sivustolle vahingossa. Lisäksi palvelimet säilyttävät vain julkisia avaimia, mikä tekee hakkeroinnista paljon vaikeampaa."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Saumaton siirtymä"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Kehitys kulkee kohti salasanatonta tulevaisuutta, mutta salasanat ovat edelleen käytettävissä avainkoodien ohella"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Kehitys kulkee kohti salasanatonta tulevaisuutta, mutta salasanat ovat edelleen käytettävissä avainkoodien ohella."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Valitse, minne <xliff:g id="CREATETYPES">%1$s</xliff:g> tallennetaan"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Valitse salasanojen ylläpitotyökalu, niin voit tallentaa tietosi ja kirjautua ensi kerralla nopeammin sisään"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Luodaanko avainkoodi (<xliff:g id="APPNAME">%1$s</xliff:g>)?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Käytetäänkö tallennettua avainkoodiasi täällä: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Käytetäänkö tallennettuja kirjautumistietoja täällä: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Valitse tallennetut kirjautumistiedot (<xliff:g id="APP_NAME">%1$s</xliff:g>)"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Kirjaudu sisään toisella tavalla"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Katseluasetukset"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Jatka"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Muuta kirjautumistietoja"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Toiselta laitteelta"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Käytä toista laitetta"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> hylkäsi pyynnön"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-fr-rCA/strings.xml b/packages/CredentialManager/res/values-fr-rCA/strings.xml
index 605eed5..af60765 100644
--- a/packages/CredentialManager/res/values-fr-rCA/strings.xml
+++ b/packages/CredentialManager/res/values-fr-rCA/strings.xml
@@ -11,17 +11,17 @@
     <string name="passkey_creation_intro_title" msgid="4251037543787718844">"Une sécurité accrue grâce aux clés d\'accès"</string>
     <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"Avec les clés d\'accès, nul besoin de créer ou de mémoriser des mots de passe complexes"</string>
     <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"Les clés d\'accès sont des clés numériques chiffrées que vous créez en utilisant votre empreinte digitale, votre visage ou le verrouillage de votre écran"</string>
-    <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Elles sont enregistrées dans un gestionnaire de mots de passe pour vous permettre de vous connecter sur d\'autres appareils"</string>
+    <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Elles sont enregistrées dans un gestionnaire de mots de passe pour vous permettre de vous connecter à d\'autres appareils"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"En savoir plus sur les clés d\'accès"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Technologie sans mot de passe"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"Les clés d\'accès vous permettent de vous connecter sans utiliser de mots de passe. Il vous suffit d\'utiliser votre empreinte digitale, la reconnaissance faciale, un NIP ou un schéma de balayage pour vérifier votre identité et créer un mot de passe."</string>
-    <string name="public_key_cryptography_title" msgid="6751970819265298039">"Cryptographie des clés publiques"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Selon les normes de l\'Alliance FIDO (y compris Google, Apple, Microsoft et plus) et du W3C, les clés d\'accès utilisent des biclés cryptographiques. Contrairement au nom d\'utilisateur et à la chaîne de caractères que nous utilisons pour les mots de passe, une biclé privée-publique est créée pour une appli ou un site Web. La clé privée est stockée en toute sécurité sur votre appareil ou votre gestionnaire de mots de passe et confirme votre identité. La clé publique est partagée avec le serveur de l\'appli ou du site Web. Avec les clés correspondantes, vous pouvez vous inscrire et vous connecter instantanément."</string>
+    <string name="public_key_cryptography_title" msgid="6751970819265298039">"Cryptographie à clé publique"</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Selon les normes de l\'Alliance FIDO (y compris Google, Apple, Microsoft et plus) et du W3C, les clés d\'accès utilisent des biclés cryptographiques. Contrairement au nom d\'utilisateur et à la chaîne de caractères que nous utilisons pour les mots de passe, une biclé privée-publique est créée pour une application ou un site Web. La clé privée est stockée en toute sécurité sur votre appareil ou votre gestionnaire de mots de passe et confirme votre identité. La clé publique est partagée avec le serveur de l\'application ou du site Web. Avec les clés correspondantes, vous pouvez vous inscrire et vous connecter instantanément."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Sécurité accrue du compte"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Chaque clé est exclusivement liée à l\'application ou au site Web pour lequel elle a été créée, de sorte que vous ne pourrez jamais vous connecter par erreur à une application ou à un site Web frauduleux. En outre, comme les serveurs ne conservent que les clés publiques, le piratage informatique est beaucoup plus difficile."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Transition fluide"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"À mesure que nous nous dirigeons vers un avenir sans mots de passe, ceux-ci continueront d\'être utilisés parallèlement aux clés d\'accès"</string>
-    <string name="choose_provider_title" msgid="8870795677024868108">"Choisir où sauvegarder vos <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"À mesure que nous nous dirigeons vers un avenir sans mot de passe, les mots de passe seront toujours utilisés parallèlement aux clés d\'accès."</string>
+    <string name="choose_provider_title" msgid="8870795677024868108">"Choisir où enregistrer vos <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Sélectionnez un gestionnaire de mots de passe pour enregistrer vos renseignements et vous connecter plus rapidement la prochaine fois"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Créer une clé d\'accès pour <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
     <string name="choose_create_option_password_title" msgid="7097275038523578687">"Enregistrer le mot de passe pour <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Utiliser votre clé d\'accès enregistrée pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Utiliser votre connexion enregistrée pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Choisir une connexion enregistrée pour <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Choisir une option pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Se connecter d\'une autre manière"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Afficher les options"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continuer"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Gérer les connexions"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"À partir d\'un autre appareil"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Utiliser un autre appareil"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Demande annulée par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-fr/strings.xml b/packages/CredentialManager/res/values-fr/strings.xml
index 3017e74..293738d 100644
--- a/packages/CredentialManager/res/values-fr/strings.xml
+++ b/packages/CredentialManager/res/values-fr/strings.xml
@@ -16,11 +16,11 @@
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Une technologie sans mot de passe"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"Les clés d\'accès vous permettent de vous connecter sans dépendre d\'un mot de passe. Il vous suffit d\'utiliser votre empreinte digitale, la reconnaissance faciale, un code ou un schéma afin de vérifier votre identité et de créer une clé d\'accès."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Cryptographie à clé publique"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Les clés d\'accès, basées sur standards W3C et FIDO Alliance (Google, Apple, Microsoft, etc.), utilisent paires de clés cryptographiques. Une paire est créée pour appli ou site, contrairement au nom d\'utilisateur et au mot de passe. La clé privée, stockée en sécurité sur votre appareil ou sur un gestionnaire de mots de passe, confirme votre identité. La clé publique est partagée avec le serveur de l\'appli ou du site. Avec des clés correspondantes, l\'inscription et la connexion sont instantanées."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Les clés d\'accès, basées sur des standards W3C et FIDO Alliance (Google, Apple, Microsoft, etc.), utilisent des paires de clés cryptographiques. À la différence d\'un nom d\'utilisateur/mot de passe, une paire est créée pour chaque appli ou site. La clé privée, stockée en sécurité sur votre appareil ou dans un gestionnaire de mots de passe, confirme votre identité. La clé publique est partagée avec le serveur de l\'appli ou du site. Si les clés correspondent, l\'inscription et la connexion sont instantanées."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Des comptes plus sécurisés"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Chaque clé est liée exclusivement à l\'appli ou au site Web pour lequel elle a été créée, pour que vous ne puissiez jamais vous connecter par erreur à une appli ou un site Web frauduleux. De plus, le piratage est bien plus difficile, car les serveurs ne conservent que les clés publiques."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Une transition fluide"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Nous nous dirigeons vers un futur sans mots de passe, mais ceux-ci resteront disponibles en plus des clés d\'accès"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Nous nous dirigeons vers un futur sans mots de passe, mais ceux-ci resteront disponibles en plus des clés d\'accès."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Choisissez où enregistrer vos <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Sélectionnez un gestionnaire de mots de passe pour enregistrer vos informations et vous connecter plus rapidement la prochaine fois"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Créer une clé d\'accès pour <xliff:g id="APPNAME">%1$s</xliff:g> ?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Utiliser votre clé d\'accès enregistrée pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Utiliser vos informations de connexion enregistrées pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Choisir des informations de connexion enregistrées pour <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Se connecter d\'une autre manière"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Voir les options"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continuer"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Gérer les connexions"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Depuis un autre appareil"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Utiliser un autre appareil"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Requête annulée par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-gl/strings.xml b/packages/CredentialManager/res/values-gl/strings.xml
index ccb0e3b..f5d5a54 100644
--- a/packages/CredentialManager/res/values-gl/strings.xml
+++ b/packages/CredentialManager/res/values-gl/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Mellora na seguranza das contas"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Cada clave está vinculada de xeito exclusivo coa aplicación ou o sitio web para o que foi creada, de tal forma que nunca poidas iniciar sesión nunha aplicación ou un sitio web fraudulentos por erro. Ademais, como os servidores só gardan as claves públicas, resultan moito máis difíciles de piratear."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Transición fluída"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Durante este percorrido cara a un futuro sen contrasinais, estes seguirán estando dispoñibles a canda as claves de acceso"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Durante este percorrido cara a un futuro sen contrasinais, estes seguirán estando dispoñibles a canda as claves de acceso."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Escolle onde queres gardar: <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecciona un xestor de contrasinais para gardar a túa información e iniciar sesión máis rápido a próxima vez"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Queres crear unha clave de acceso para <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Queres usar a clave de acceso gardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Queres usar o método de inicio de sesión gardado para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Escolle un método de inicio de sesión gardado para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Iniciar sesión doutra forma"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Ver opcións"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continuar"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Xestionar os métodos de inicio de sesión"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Doutro dispositivo"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Usar outro dispositivo"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> cancelou a solicitude"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-gu/strings.xml b/packages/CredentialManager/res/values-gu/strings.xml
index ed34209..ea78097 100644
--- a/packages/CredentialManager/res/values-gu/strings.xml
+++ b/packages/CredentialManager/res/values-gu/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"બહેતર બનાવેલી એકાઉન્ટની સુરક્ષા"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"દરેક કીને જે ઍપ અથવા વેબસાઇટ માટે બનાવવામાં આવી હોય તેની સાથે તે વિશેષ રીતે લિંક થયેલી છે, તેથી તમારાથી ક્યારેય ભૂલથી કપટપૂર્ણ ઍપ અથવા વેબસાઇટ પર સાઇન ઇન ન થાય. ઉપરાંત, સર્વર માત્ર જાહેર કી રાખે છે, હૅકિંગ ઘણું મુશ્કેલ છે."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"વિક્ષેપરહિત ટ્રાન્ઝિશન"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"આપણે પાસવર્ડ રહિત ભવિષ્ય તરફ આગળ વધી રહ્યાં છીએ, છતાં પાસકીની સાથોસાથ હજી પણ પાસવર્ડ ઉપલબ્ધ રહેશે"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"આપણે પાસવર્ડ રહિત ભવિષ્ય તરફ આગળ વધી રહ્યાં છીએ, છતાં પાસકીની સાથોસાથ હજી પણ પાસવર્ડ ઉપલબ્ધ રહેશે."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"તમારી <xliff:g id="CREATETYPES">%1$s</xliff:g> ક્યાં સાચવવી તે પસંદ કરો"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"તમારી માહિતી સાચવવા માટે પાસવર્ડ મેનેજર પસંદ કરો અને આગલી વખતે વધુ ઝડપથી સાઇન ઇન કરો"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> માટે પાસકી બનાવીએ?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે શું તમારી સાચવેલી પાસકીનો ઉપયોગ કરીએ?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે શું તમારા સાચવેલા સાઇન-ઇનનો ઉપયોગ કરીએ?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે કોઈ સાચવેલું સાઇન-ઇન પસંદ કરો"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"<xliff:g id="APP_NAME">%1$s</xliff:g>નો વિકલ્પ પસંદ કરીએ?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"કોઈ અન્ય રીતે સાઇન ઇન કરો"</string>
     <string name="snackbar_action" msgid="37373514216505085">"વ્યૂના વિકલ્પો"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"ચાલુ રાખો"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"સાઇન-ઇન મેનેજ કરો"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"કોઈ અન્ય ડિવાઇસમાંથી"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"કોઈ અન્ય ડિવાઇસનો ઉપયોગ કરો"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> દ્વારા વિનંતી રદ કરવામાં આવી"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-hi/strings.xml b/packages/CredentialManager/res/values-hi/strings.xml
index 029eeee..5b07bda 100644
--- a/packages/CredentialManager/res/values-hi/strings.xml
+++ b/packages/CredentialManager/res/values-hi/strings.xml
@@ -8,8 +8,8 @@
     <string name="string_learn_more" msgid="4541600451688392447">"ज़्यादा जानें"</string>
     <string name="content_description_show_password" msgid="3283502010388521607">"पासवर्ड दिखाएं"</string>
     <string name="content_description_hide_password" msgid="6841375971631767996">"पासवर्ड छिपाएं"</string>
-    <string name="passkey_creation_intro_title" msgid="4251037543787718844">"पासकी के साथ सुरक्षित रहें"</string>
-    <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"पासकी होने पर, आपको जटिल पासवर्ड बनाने या याद रखने की ज़रूरत नहीं पड़ती"</string>
+    <string name="passkey_creation_intro_title" msgid="4251037543787718844">"पासकी से पाएं ज़्यादा सुरक्षा"</string>
+    <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"पासकी होने पर, आपको मुश्किल पासवर्ड बनाने या याद रखने की ज़रूरत नहीं पड़ती"</string>
     <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"पासकी, एन्क्रिप्ट (सुरक्षित) की गई \'डिजिटल की\' होती हैं. इन्हें फ़िंगरप्रिंट, चेहरे या स्क्रीन लॉक का इस्तेमाल करके बनाया जाता है"</string>
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"पासकी को पासवर्ड मैनेजर में सेव किया जाता है, ताकि इनका इस्तेमाल करके आप अन्य डिवाइसों में साइन इन कर सकें"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"पासकी के बारे में ज़्यादा जानकारी"</string>
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"खाते की बेहतर सुरक्षा"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"हर कुंजी खास तौर पर उस ऐप्लिकेशन या वेबसाइट से लिंक होती है जिसके लिए उसे बनाया गया है. ऐसा इसलिए किया जाता है, ताकि कोई भी व्यक्ति धोखाधड़ी करने वाले ऐप्लिकेशन या वेबसाइट पर कभी भी गलती से साइन इन न करे. साथ ही, सर्वर के पास सिर्फ़ सार्वजनिक कुंजी होती हैं, इसलिए पूरी कुंजी को हैक करना काफ़ी मुश्किल होता है."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"आसान ट्रांज़िशन"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"आने वाले समय में, बिना पासवर्ड के टेक्नोलॉजी का इस्तेमाल किया जा सकेगा. हालांकि, पासकी के साथ पासवर्ड भी इस्तेमाल किए जा सकेंगे"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"आने वाले समय में बिना पासवर्ड वाली टेक्नोलॉजी यानी पासकी का इस्तेमाल बढ़ेगा, हालांकि इसके साथ-साथ पासवर्ड भी इस्तेमाल किए जा सकेंगे."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"चुनें कि अपनी <xliff:g id="CREATETYPES">%1$s</xliff:g> कहां सेव करनी हैं"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"अपनी जानकारी सेव करने के लिए, पासवर्ड मैनेजर चुनें और अगली बार ज़्यादा तेज़ी से साइन इन करें"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"क्या आपको <xliff:g id="APPNAME">%1$s</xliff:g> के लिए पासकी बनानी है?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> पर साइन इन करने के लिए, सेव की गई पासकी का इस्तेमाल करना है?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> पर साइन इन करने के लिए, सेव की गई जानकारी का इस्तेमाल करना है?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> पर साइन इन करने के लिए, सेव की गई जानकारी में से चुनें"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"<xliff:g id="APP_NAME">%1$s</xliff:g> में साइन इन करने के लिए सेव किए गए विकल्पों में से किसी को चुनना है?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"किसी दूसरे तरीके से साइन इन करें"</string>
     <string name="snackbar_action" msgid="37373514216505085">"विकल्प देखें"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"जारी रखें"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"साइन इन करने की सुविधा को मैनेज करें"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"किसी दूसरे डिवाइस से"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"दूसरे डिवाइस का इस्तेमाल करें"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> की ओर से अनुरोध रद्द किया गया"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-hr/strings.xml b/packages/CredentialManager/res/values-hr/strings.xml
index b454c41..d9ac249 100644
--- a/packages/CredentialManager/res/values-hr/strings.xml
+++ b/packages/CredentialManager/res/values-hr/strings.xml
@@ -18,9 +18,9 @@
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Kriptografija javnog ključa"</string>
     <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Na temelju organizacije FIDO Alliance (koja uključuje Google, Apple, Microsoft i mnoge druge) i standarda W3C pristupni ključevi koriste kriptografske ključeve. Za razliku od korisničkog imena i niza znakova za zaporke, privatno-javni ključ izrađen je za aplikaciju ili web-lokaciju. Privatni ključ pohranjen je na vašem uređaju ili upravitelju zaporki i potvrđuje vaš identitet. Javni se ključ dijeli s poslužiteljem aplikacije ili web-lokacije. Uz odgovarajuće ključeve možete se odmah registrirati i prijaviti."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Poboljšana sigurnost računa"</string>
-    <string name="improved_account_security_detail" msgid="9123750251551844860">"Svaki ključ povezan isključivo s aplikacijom ili web-lokacijom za koju je izrađen, stoga se nikad ne možete pogreškom prijaviti u prijevarnu aplikaciju ili na web-lokaciju. Osim toga, kad je riječ o poslužiteljima na kojem se nalaze samo javni ključevi, hakiranje je mnogo teže."</string>
+    <string name="improved_account_security_detail" msgid="9123750251551844860">"Svaki je ključ povezan isključivo s aplikacijom ili web-lokacijom za koju je izrađen, stoga se nikad ne možete pogreškom prijaviti u prijevarnu aplikaciju ili na web-lokaciju. Osim toga, kad je riječ o poslužiteljima na kojem se nalaze samo javni ključevi, hakiranje je mnogo teže."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Besprijekorni prijelaz"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Kako idemo u smjeru budućnosti bez zaporki, one će i dalje biti dostupne uz pristupne ključeve"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Kako idemo u smjeru budućnosti bez zaporki, one će i dalje biti dostupne uz pristupne ključeve."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Odaberite gdje će se spremati <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Odaberite upravitelja zaporki kako biste spremili svoje informacije i drugi se put brže prijavili"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Želite li izraditi pristupni ključ za <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Želite li upotrijebiti spremljeni pristupni ključ za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Želite li upotrijebiti spremljene podatke za prijavu za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Odaberite spremljene podatke za prijavu za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Želite li odabrati opciju za <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Prijavite se na neki drugi način"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Prikaži opcije"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Nastavi"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Upravljanje prijavama"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Na drugom uređaju"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Upotrijebite drugi uređaj"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Zahtjev je otkazala aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-hu/strings.xml b/packages/CredentialManager/res/values-hu/strings.xml
index df8210b..92fa388 100644
--- a/packages/CredentialManager/res/values-hu/strings.xml
+++ b/packages/CredentialManager/res/values-hu/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Nagyobb fiókbiztonság"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Minden kulcs kizárólag ahhoz az alkalmazáshoz vagy weboldalhoz kapcsolódik, amelyhez létrehozták, így soha nem fordulhat elő, hogy Ön tévedésből csalárd alkalmazásba vagy webhelyre jelentkezik be. Ráadásul – mivel a szerverek csak nyilvános kulcsokat tárolnak – a hackelés jóval nehezebb."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Zökkenőmentes átmenet"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Miközben a jelszó nélküli jövő felé haladunk, a jelszavak továbbra is rendelkezésre állnak majd az azonosítókulcsok mellett."</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Miközben a jelszó nélküli jövő felé haladunk, a jelszavak továbbra is rendelkezésre állnak majd az azonosítókulcsok mellett."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Válassza ki, hogy hova szeretné menteni <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Válasszon jelszókezelőt, hogy menthesse az adatait, és gyorsabban jelentkezhessen be a következő alkalommal."</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Létrehoz azonosítókulcsot a következőhöz: <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Szeretné a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazáshoz mentett azonosítókulcsot használni?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Szeretné a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazáshoz mentett bejelentkezési adatait használni?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Mentett bejelentkezési adatok választása a következő számára: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Bejelentkezés más módon"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Lehetőségek megtekintése"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Folytatás"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Bejelentkezési adatok kezelése"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Másik eszközről"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Másik eszköz használata"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"A kérelmet törölte a(z) <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-hy/strings.xml b/packages/CredentialManager/res/values-hy/strings.xml
index 66d4339..80947cc 100644
--- a/packages/CredentialManager/res/values-hy/strings.xml
+++ b/packages/CredentialManager/res/values-hy/strings.xml
@@ -12,7 +12,7 @@
     <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"Անցաբառերի շնորհիվ դուք բարդ գաղտնաբառեր ստեղծելու կամ հիշելու անհրաժեշտություն չեք ունենա"</string>
     <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"Անցաբառերը գաղտնագրված թվային բանալիներ են, որոնք ստեղծվում են մատնահետքի, դեմքով ապակողպման կամ էկրանի կողպման օգտագործմամբ"</string>
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Դուք կարող եք մուտք գործել այլ սարքերում, քանի որ անցաբառերը պահվում են գաղտնաբառերի կառավարիչում"</string>
-    <string name="more_about_passkeys_title" msgid="7797903098728837795">"Մանրամասն անցաբառերի մասին"</string>
+    <string name="more_about_passkeys_title" msgid="7797903098728837795">"Ավելին՝ անցաբառերի մասին"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Գաղտնաբառեր չպահանջող տեխնոլոգիա"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"Անցաբառերը ձեզ թույլ են տալիս մուտք գործել առանց գաղտնաբառերի։ Ձեզ պարզապես հարկավոր է օգտագործել ձեր մատնահետքը, դիմաճանաչումը, PIN կոդը կամ նախշը՝ ձեր ինքնությունը հաստատելու և անցաբառ ստեղծելու համար։"</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Բաց բանալու կրիպտոգրաֆիա"</string>
@@ -20,10 +20,10 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Հաշվի բարելավված անվտանգություն"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Յուրաքանչյուր բանալի բացառապես կապված է հավելվածի կամ կայքի հետ, որի համար այն ստեղծվել է, ուստի դուք երբեք չեք կարող սխալմամբ մուտք գործել կեղծ հավելված կամ կայք։ Բացի այդ՝ սերվերներում պահվում են միայն բաց բանալիներ, ինչը զգալիորեն դժվարացնում է կոտրումը։"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Սահուն անցում"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Թեև մենք առանց գաղտնաբառերի ապագայի ճանապարհին ենք, դրանք դեռ հասանելի կլինեն անցաբառերի հետ մեկտեղ"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Թեև մենք առանց գաղտնաբառերի ապագայի ճանապարհին ենք, դրանք դեռ հասանելի կլինեն անցաբառերի հետ մեկտեղ։"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Նշեք, թե որտեղ եք ուզում պահել ձեր <xliff:g id="CREATETYPES">%1$s</xliff:g>ը"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Ընտրեք գաղտնաբառերի կառավարիչ՝ ձեր տեղեկությունները պահելու և հաջորդ անգամ ավելի արագ մուտք գործելու համար"</string>
-    <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Ստեղծե՞լ անցաբառ «<xliff:g id="APPNAME">%1$s</xliff:g>» հավելվածի համար"</string>
+    <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Ստեղծե՞լ անցաբառ <xliff:g id="APPNAME">%1$s</xliff:g> հավելվածի համար"</string>
     <string name="choose_create_option_password_title" msgid="7097275038523578687">"Պահե՞լ «<xliff:g id="APPNAME">%1$s</xliff:g>» հավելվածի գաղտնաբառը"</string>
     <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Պահե՞լ «<xliff:g id="APPNAME">%1$s</xliff:g>» հավելվածի մուտքի տվյալները"</string>
     <string name="passkey" msgid="632353688396759522">"անցաբառ"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Օգտագործե՞լ պահված անցաբառը <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի համար"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Օգտագործե՞լ մուտքի պահված տվյալները <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի համար"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Ընտրեք մուտքի պահված տվյալներ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի համար"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Մուտք գործել այլ եղանակով"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Դիտել տարբերակները"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Շարունակել"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Մուտքի կառավարում"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Մեկ այլ սարքից"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Օգտագործել այլ սարք"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Հարցումը չեղարկվել է <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի կողմից"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-in/strings.xml b/packages/CredentialManager/res/values-in/strings.xml
index cd2e49fa..f72c36d 100644
--- a/packages/CredentialManager/res/values-in/strings.xml
+++ b/packages/CredentialManager/res/values-in/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Keamanan akun yang ditingkatkan"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Setiap kunci ditautkan secara eksklusif dengan aplikasi atau situs tempatnya dibuat, sehingga Anda tidak akan login ke aplikasi atau situs yang menipu secara tidak sengaja. Selain itu, peretasan lebih sulit dilakukan karena server hanya menyimpan kunci publik."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Transisi yang lancar"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Seiring kita menuju masa depan tanpa sandi, sandi akan tetap tersedia bersama kunci sandi"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Sandi akan tetap tersedia bersama kunci sandi seiring perjalanan menuju era di mana sandi tidak diperlukan lagi."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Pilih tempat penyimpanan <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Pilih pengelola sandi untuk menyimpan info Anda dan login lebih cepat lain kali"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Buat kunci sandi untuk <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gunakan kunci sandi tersimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Gunakan info login tersimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Pilih info login tersimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Login dengan cara lain"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Lihat opsi"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Lanjutkan"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Kelola login"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Dari perangkat lain"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Gunakan perangkat lain"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Permintaan dibatalkan oleh <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-is/strings.xml b/packages/CredentialManager/res/values-is/strings.xml
index 3bcf659..fa2d0b5 100644
--- a/packages/CredentialManager/res/values-is/strings.xml
+++ b/packages/CredentialManager/res/values-is/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Bætt reikningsöryggi"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Hver lykill er eingöngu tengdur forritinu eða vefsvæðinu sem hann var búinn til fyrir. Því er engin hætta á að þú skráir þig óvart inn á sviksamlegt forrit eða vefsvæði. Einnig er erfiðara að hakka þegar þjónar geyma aðeins opinbera lykla."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Snurðulaus skipti"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Við stefnum að framtíð án aðgangsorða en aðgangsorð verða áfram í boði samhliða aðgangslyklum"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Við stefnum að framtíð án aðgangsorða en aðgangsorð verða áfram í boði samhliða aðgangslyklum."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Veldu hvar þú vilt vista <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Veldu aðgangsorðastjórnun til að vista upplýsingarnar og vera fljótari að skrá þig inn næst"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Viltu búa til aðgangslykil fyrir <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Nota vistaðan aðgangslykil fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Nota vistaða innskráningu fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Veldu vistaða innskráningu fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Skrá inn með öðrum hætti"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Skoða valkosti"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Áfram"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Stjórna innskráningu"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Úr öðru tæki"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Nota annað tæki"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> hætti við beiðnina"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-it/strings.xml b/packages/CredentialManager/res/values-it/strings.xml
index 97de0fb..a45f39a 100644
--- a/packages/CredentialManager/res/values-it/strings.xml
+++ b/packages/CredentialManager/res/values-it/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Account ancora più sicuri"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Ogni chiave è collegata in modo esclusivo all\'app o al sito web per cui è stata creata, quindi non puoi mai accedere a un\'app o un sito web fraudolenti per sbaglio. Inoltre, le compromissioni diventano molto più difficili perché i server conservano soltanto le chiavi pubbliche."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Transizione graduale"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Mentre ci dirigiamo verso un futuro senza password, queste ultime saranno ancora disponibili insieme alle passkey"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Il futuro sarà senza password, ma per ora saranno ancora disponibili insieme alle passkey."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Scegli dove salvare le <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Seleziona un gestore delle password per salvare i tuoi dati e accedere più velocemente la prossima volta"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Vuoi creare una passkey per <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vuoi usare la passkey salvata per <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Vuoi usare l\'accesso salvato per <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Scegli un accesso salvato per <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Vuoi scegliere un\'opzione per <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Accedi in un altro modo"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Visualizza opzioni"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continua"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Gestisci gli accessi"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Da un altro dispositivo"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Usa un dispositivo diverso"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Richiesta annullata da <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-iw/strings.xml b/packages/CredentialManager/res/values-iw/strings.xml
index f4b1906..b187533 100644
--- a/packages/CredentialManager/res/values-iw/strings.xml
+++ b/packages/CredentialManager/res/values-iw/strings.xml
@@ -16,11 +16,11 @@
     <string name="passwordless_technology_title" msgid="2497513482056606668">"טכנולוגיה ללא סיסמאות"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"מפתחות גישה מאפשרים לך להיכנס לחשבון בלי להסתמך על סיסמאות. עליך רק להשתמש בטביעת אצבע, בזיהוי הפנים, בקוד אימות או בקו ביטול נעילה כדי לאמת את זהותך וליצור מפתח גישה."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"קריפטוגרפיה של מפתח ציבורי"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"‏על סמך תקן FIDO‏ (ארגון שכולל חברות כמו Google,‏ Apple,‏ Microsoft ועוד) ותקני W3C, מפתחות הגישה מבוססים על זוגות של מפתחות קריפטוגרפיים. בניגוד למחרוזות תווים ולשם המשתמש שבהם אנחנו משתמשים בסיסמאות, זוג מפתחות – מפתח פרטי ומפתח ציבורי – נוצר עבור אפליקציה או אתר. המפתח הפרטי מאוחסן בבטחה במכשיר או במנהל הסיסמאות שלך, ומאמת את זהותך. המפתח הציבורי משותף עם השרת של האפליקציה או האתר. בעזרת המפתחות התואמים אפשר מיד להירשם ולהיכנס לחשבון."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"‏על סמך תקן FIDO‏ (ארגון שכולל חברות כמו Google,‏ Apple,‏ Microsoft ועוד) ותקני W3C, מפתחות הגישה מבוססים על זוגות של מפתחות קריפטוגרפיים. בניגוד לשם המשתמש ולמחרוזת התווים ששמשמשת אצלנו בתור סיסמה, בתקן הזה נוצר זוג מפתחות – מפתח פרטי ומפתח ציבורי – עבור אפליקציה או אתר. המפתח הפרטי מאוחסן בבטחה במכשיר או במנהל הסיסמאות שלך, ומאמת את זהותך. המפתח הציבורי משותף עם השרת של האפליקציה או האתר. בעזרת המפתחות התואמים אפשר מיד להירשם ולהיכנס לחשבון."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"אבטחה טובה יותר של החשבון"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"כל מפתח מקושר אך ורק לאפליקציה או לאתר שעבורם הוא נוצר, ולכן אף פעם אי אפשר להיכנס בטעות לחשבון באפליקציה או באתר שמטרתם להונות. בנוסף, כיוון שהשרתים שומרים רק מפתחות ציבוריים, קשה יותר לפרוץ לחשבון."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"מעבר חלק"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"אנחנו מתקדמים לעבר עתיד ללא סיסמאות, אבל עדיין אפשר יהיה להשתמש בסיסמאות וגם במפתחות גישה"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"אנחנו מתקדמים לעבר עתיד ללא סיסמאות, אבל עדיין אפשר יהיה להשתמש בסיסמאות וגם במפתחות גישה."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"בחירת המקום לשמירה של <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"אפשר לבחור באחד משירותי ניהול הסיסמאות כדי לשמור את הפרטים ולהיכנס לחשבון מהר יותר בפעם הבאה"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"ליצור מפתח גישה ל-<xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"להשתמש במפתח גישה שנשמר עבור <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"להשתמש בפרטי הכניסה שנשמרו עבור <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"בחירת פרטי כניסה שמורים עבור <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"כניסה בדרך אחרת"</string>
     <string name="snackbar_action" msgid="37373514216505085">"הצגת האפשרויות"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"המשך"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"ניהול כניסות"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"ממכשיר אחר"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"צריך להשתמש במכשיר אחר"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> ביטלה את הבקשה"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ja/strings.xml b/packages/CredentialManager/res/values-ja/strings.xml
index 35d011c..f930d2a 100644
--- a/packages/CredentialManager/res/values-ja/strings.xml
+++ b/packages/CredentialManager/res/values-ja/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"アカウントのセキュリティを強化"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"作成された各鍵は、対象となるアプリまたはウェブサイトのみとリンクされるため、間違って不正なアプリやウェブサイトにログインすることはありません。さらに、公開鍵はサーバーのみに保存されるため、ハッキングのリスクも大幅に抑えられます。"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"シームレスな移行"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"将来的にパスワードレスに移行するにあたり、パスワードもパスキーと並行して引き続きご利用いただけます"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"将来的にパスワードレスに移行するにあたり、パスワードもパスキーと並行して引き続きご利用いただけます。"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g>の保存先を選択"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"パスワード マネージャーを選択して情報を保存しておくと、次回からすばやくログインできます"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> のパスキーを作成しますか?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> の保存したパスキーを使用しますか?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> の保存したログイン情報を使用しますか?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> の保存したログイン情報の選択"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"<xliff:g id="APP_NAME">%1$s</xliff:g> のオプションを選択しますか?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"別の方法でログイン"</string>
     <string name="snackbar_action" msgid="37373514216505085">"オプションを表示"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"続行"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"ログインを管理"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"別のデバイスを使う"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"別のデバイスを使用"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> がリクエストをキャンセルしました"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ka/strings.xml b/packages/CredentialManager/res/values-ka/strings.xml
index 545106b..a53bb50 100644
--- a/packages/CredentialManager/res/values-ka/strings.xml
+++ b/packages/CredentialManager/res/values-ka/strings.xml
@@ -16,11 +16,11 @@
     <string name="passwordless_technology_title" msgid="2497513482056606668">"უპაროლო ტექნოლოგია"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"წვდომის გასაღებები საშუალებას გაძლევთ, სისტემაში შეხვიდეთ პაროლის გარეშე. უბრალოდ, ვინაობის დასადასტურებლად და წვდომის გასაღების შესაქმნელად უნდა გამოიყენოთ თითის ანაბეჭდი, სახით ამოცნობა, PIN-კოდი, ან განბლოკვის გრაფიკული გასაღები."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"საჯარო გასაღების კრიპტოგრაფია"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO-ს ალიანსისა (Google, Apple, Microsoft და ა.შ.) და W3C-ის სტანდარტების შესაბამისად, წვდომის გასაღებები იყენებს კრიპტოგრაფიულ გასაღებების წყვილს. მომხ. სახ. და სიმბ. სტრიქ. განსხვავებით, რომელთაც პაროლ. ვიყენებთ, რამდენიმე პირადი/საჯარო გას. იქმნება აპის ან ვებსაიტისთვის. პირადი გასაღები უსაფრთხოდ ინახება მოწყობილობაზე ან პაროლ. მმართველში და ის ადასტურებს თქვენს ვინაობას. საჯარო გას. ზიარდება აპისა და ვებ. სერვერის მეშვეობით. შესაბ. გასაღებებით შეგიძლიათ მაშინვე დარეგისტ. და სისტ. შეხვიდეთ."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO ალიანსის (Google, Apple, Microsoft და სხვა) და W3C სტანდარტების შესაბამისად, წვდომის გასაღებები კრიპტოგრაფიულ გასაღებთა წყვილია. პაროლზე გამოყენებული მომხმარებლის სახელის/სიმბოლოთა სტრიქონების განსხვავებით, პირადი/საჯარო გასაღები იქმნება აპისა და ვებსაიტისთვის. პირადი გასაღები უსაფრთხოდ ინახება მოწყობილობაზე/პაროლთა მმართველში და ადასტურებს ვინაობას. საჯარო გასაღები კი ზიარდება აპთან/ვებსერვერთან. შესაბაბისი გასაღებებით შეგიძლიათ დაუყოვნებლივ დარეგისტრირდეთ და სისტემაში შეხვიდეთ."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"ანგარიშის გაუმჯობესებული უსაფრთხოება"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"თითოეული გასაღები დაკავშირებულია მხოლოდ აპთან ან ვებსაიტთან, რომელთათვისაც ის შეიქმნა, ამიტომაც შემთხვევით ვერასდროს შეხვალთ თაღლითურ აპში თუ ვებსაიტზე. ამასთანავე, სერვერები ინახავს მხოლოდ საჯარო გასაღებებს, რაც ართულებს გატეხვის ალბათობას."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"დაუბრკოლებელი გადასვლა"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"უპაროლო მომავალში პაროლები კვლავ ხელმისაწვდომი იქნება, წვდომის გასაღებებთან ერთად"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"უპაროლო მომავალში პაროლები კვლავ ხელმისაწვდომი იქნება, წვდომის გასაღებებთან ერთად."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"აირჩიეთ სად შეინახოთ თქვენი <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"აირჩიეთ პაროლების მმართველი თქვენი ინფორმაციის შესანახად, რომ მომავალში უფრო სწრაფად შეხვიდეთ."</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"შექმნით წვდომის გასაღებს <xliff:g id="APPNAME">%1$s</xliff:g> აპისთვის?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"გსურთ თქვენი დამახსოვრებული წვდომის გასაღების გამოყენება აპისთვის: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"გსურთ თქვენი დამახსოვრებული სისტემაში შესვლის მონაცემების გამოყენება აპისთვის: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"აირჩიეთ სისტემაში შესვლის ინფორმაცია აპისთვის: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"სხვა ხერხით შესვლა"</string>
     <string name="snackbar_action" msgid="37373514216505085">"პარამეტრების ნახვა"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"გაგრძელება"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"სისტემაში შესვლის მონაცემების მართვა"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"სხვა მოწყობილობიდან"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"გამოიყენეთ სხვა მოწყობილობა"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"თხოვნა გაუქმებულია <xliff:g id="APP_NAME">%1$s</xliff:g>-ის მიერ"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-kk/strings.xml b/packages/CredentialManager/res/values-kk/strings.xml
index a4f3dc3..9635d8a 100644
--- a/packages/CredentialManager/res/values-kk/strings.xml
+++ b/packages/CredentialManager/res/values-kk/strings.xml
@@ -16,11 +16,11 @@
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Құпия сөзсіз технология"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"Кіру кілттері сізге құпия сөзге сүйенбей-ақ кіруге мүмкіндік береді. Жеке басыңызды растап, кіру кілтін жасау үшін тек саусақ ізі, бет тану функциясы, PIN коды немесе сырғыту өрнегі қажет."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Ашық кілт криптографиясы"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO Alliance (оған Google, Apple, Microsoft, т.б. кіреді) және W3C стандарттары бойынша кіру кілттерінде криптографиялық кілт жұптары қолданылады. Құпия сөз үшін пайдаланушы аты мен таңбалар қолданылады, ал қолданба немесе веб-сайт үшін жеке-ашық кілт жұбы жасалады. Жеке кілт құрылғыңызда немесе құпия сөз менеджерінде қорғалып, сақталады. Ол жеке басыңызды растау үшін қажет. Ашық кілт қолданба немесе веб-сайт серверіне жіберіледі. Кілттер сәйкес келсе, бірден тіркеліп, аккаунтқа кіре аласыз."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO Alliance (оған Google, Apple, Microsoft, т.б. кіреді) және W3C стандарттары бойынша кіру кілттерінде криптографиялық кілт жұптары қолданылады. Құпия сөз үшін пайдаланушы аты мен таңбалар қолданылады, ал қолданба немесе веб-сайт үшін жеке-ашық кілт жұбы жасалады. Жеке кілт құрылғыңызда немесе құпия сөз менеджерінде қауіпсіз сақталады. Ол жеке басыңызды растау үшін қажет. Ашық кілт қолданба немесе веб-сайт серверіне жіберіледі. Кілттер сәйкес келсе, бірден тіркеліп, аккаунтқа кіре аласыз."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Аккаунттың қосымша қауіпсіздігі"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Әрбір кілт өзі арнайы жасалған қолданбамен немесе веб-сайтпен ғана байланысты болады, сондықтан алаяқтар қолданбасына немесе веб-сайтына байқаусызда кіру мүмкін емес. Онымен қоса тек ашық кілттер сақталатын серверлер арқасында хакерлердің бұзып кіруі айтарлықтай қиындады."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Оңай ауысу"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Құпия сөзсіз болашақ жақын болғанына қарамастан, келешекте құпия сөздерді кіру кілттерімен қатар қолдана беруге болады."</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Құпия сөзсіз болашақ жақын болғанына қарамастан, келешекте құпия сөздерді кіру кілттерімен қатар қолдана беруге болады."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> қайда сақталатынын таңдаңыз"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Мәліметіңізді сақтап, келесіде жылдам кіру үшін құпия сөз менеджерін таңдаңыз."</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> үшін кіру кілтін жасау керек пе?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін сақталған кіру кілті пайдаланылсын ба?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін сақталған тіркелу деректері пайдаланылсын ба?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін сақталған тіркелу деректерін таңдаңыз"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Басқаша кіру"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Опцияларды көру"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Жалғастыру"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Кіру әрекеттерін басқару"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Басқа құрылғыдан жасау"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Басқа құрылғыны пайдалану"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы сұрауды тоқтатты."</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-km/strings.xml b/packages/CredentialManager/res/values-km/strings.xml
index 1e7b4e6..b1c3f5e 100644
--- a/packages/CredentialManager/res/values-km/strings.xml
+++ b/packages/CredentialManager/res/values-km/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"សុវត្ថិភាពគណនីដែលប្រសើរឡើង"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"កូដនីមួយៗត្រូវបានភ្ជាប់ផ្តាច់មុខជាមួយកម្មវិធី ឬគេហទំព័រដែលវាត្រូវបានបង្កើតឡើង ដូច្នេះអ្នកមិនអាចចូលទៅក្នុងកម្មវិធី ឬគេហទំព័រក្លែងបន្លំដោយច្រឡំបានឡើយ។ លើសពីនេះ ជាមួយនឹងម៉ាស៊ីនមេដែលរក្សាតែកូដសាធារណៈប៉ុណ្ណោះ ការលួចចូលគឺពិបាកខ្លាំង។"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"ដំណើរផ្លាស់ប្ដូរយ៉ាងរលូន"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"នៅពេលដែលយើងឈានទៅរកអនាគតដែលគ្មានពាក្យសម្ងាត់ ពាក្យសម្ងាត់នៅតែអាចប្រើបានរួមជាមួយកូដសម្ងាត់"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"នៅពេលដែលយើងឈានទៅរកអនាគតដែលគ្មានពាក្យសម្ងាត់ ពាក្យសម្ងាត់នៅតែអាចប្រើបានរួមជាមួយកូដសម្ងាត់។"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"ជ្រើសរើសកន្លែង​ដែលត្រូវរក្សាទុក<xliff:g id="CREATETYPES">%1$s</xliff:g>របស់អ្នក"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"ជ្រើសរើស​កម្មវិធីគ្រប់គ្រងពាក្យសម្ងាត់ ដើម្បីរក្សាទុក​ព័ត៌មានរបស់អ្នក និងចូលគណនី​បានកាន់តែរហ័ស​នៅពេលលើកក្រោយ"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"បង្កើត​កូដសម្ងាត់​សម្រាប់ <xliff:g id="APPNAME">%1$s</xliff:g> ឬ?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"ប្រើកូដសម្ងាត់ដែលបានរក្សាទុករបស់អ្នកសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"ប្រើការចូល​គណនីដែលបានរក្សាទុករបស់អ្នកសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"ជ្រើសរើសការចូលគណនីដែលបានរក្សាទុកសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"ជ្រើសរើសជម្រើសសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"ចូលគណនីដោយប្រើវិធីផ្សេងទៀត"</string>
     <string name="snackbar_action" msgid="37373514216505085">"មើលជម្រើស"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"បន្ត"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"គ្រប់គ្រងការចូល​គណនី"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"ពីឧបករណ៍ផ្សេងទៀត"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"ប្រើឧបករណ៍ផ្សេង"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"បានបោះបង់សំណើដោយ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-kn/strings.xml b/packages/CredentialManager/res/values-kn/strings.xml
index 561348e..327535f 100644
--- a/packages/CredentialManager/res/values-kn/strings.xml
+++ b/packages/CredentialManager/res/values-kn/strings.xml
@@ -11,17 +11,17 @@
     <string name="passkey_creation_intro_title" msgid="4251037543787718844">"ಪಾಸ್‌ಕೀಗಳ ಸಹಾಯದಿಂದ ಸುರಕ್ಷಿತವಾಗಿರಿ"</string>
     <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"ಪಾಸ್‌ಕೀಗಳ ಮೂಲಕ, ನೀವು ಕ್ಲಿಷ್ಟ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ರಚಿಸುವ ಅಥವಾ ನೆನಪಿಟ್ಟುಕೊಳ್ಳುವ ಅಗತ್ಯವಿಲ್ಲ"</string>
     <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"ಪಾಸ್‌ಕೀಗಳು ನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್, ಫೇಸ್ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು ನೀವು ರಚಿಸುವ ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ಡಿಜಿಟಲ್ ಕೀಗಳಾಗಿವೆ"</string>
-    <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"ಅವುಗಳನ್ನು ಪಾಸ್‌ವರ್ಡ್ ನಿರ್ವಾಹಕದಲ್ಲಿ ಉಳಿಸಲಾಗಿದೆ, ಹಾಗಾಗಿ ನೀವು ಇತರ ಸಾಧನಗಳಲ್ಲಿ ಸೈನ್ ಇನ್ ಮಾಡಬಹುದು"</string>
+    <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"ಅವುಗಳನ್ನು ಪಾಸ್‌ವರ್ಡ್ ನಿರ್ವಾಹಕದಲ್ಲಿ ಉಳಿಸಲಾಗುತ್ತದೆ, ಹಾಗಾಗಿ ನೀವು ಇತರ ಸಾಧನಗಳಲ್ಲಿ ಸೈನ್ ಇನ್ ಮಾಡಬಹುದು"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"ಪಾಸ್‌ಕೀಗಳ ಕುರಿತು ಇನ್ನಷ್ಟು"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"ಪಾಸ್‌ವರ್ಡ್ ರಹಿತ ತಂತ್ರಜ್ಞಾನ"</string>
-    <string name="passwordless_technology_detail" msgid="6853928846532955882">"ಪಾಸ್‌ಕೀಗಳು ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಅವಲಂಬಿಸದೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ. ನಿಮ್ಮ ಗುರುತನ್ನು ಪರಿಶೀಲಿಸಲು ಮತ್ತು ಪಾಸ್‌ಕೀ ರಚಿಸಲು ನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್, ಮುಖ ಗುರುತಿಸುವಿಕೆ, ಪಿನ್ ಅಥವಾ ಸ್ವೈಪ್ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ನೀವು ಬಳಸಬೇಕಾಗುತ್ತದೆ."</string>
+    <string name="passwordless_technology_detail" msgid="6853928846532955882">"ಪಾಸ್‌ಕೀಗಳು ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಅವಲಂಬಿಸದೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಅನುಮತಿಸುತ್ತವೆ. ನಿಮ್ಮ ಗುರುತನ್ನು ದೃಢೀಕರಿಸಲು ಮತ್ತು ಪಾಸ್‌ಕೀ ರಚಿಸಲು ನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್, ಮುಖ ಗುರುತಿಸುವಿಕೆ, ಪಿನ್ ಅಥವಾ ಸ್ವೈಪ್ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ನೀವು ಬಳಸಬೇಕಾಗುತ್ತದೆ."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"ಸಾರ್ವಜನಿಕ ಕೀ ಕ್ರಿಪ್ಟೋಗ್ರಫಿ"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO ಅಲೈಯನ್ಸ್ (ಇದು Google, Apple, Microsoft ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ) ಮತ್ತು W3C ಮಾನದಂಡಗಳನ್ನು ಆಧರಿಸಿ, ಪಾಸ್‌ಕೀಗಳು ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಕೀ ಜೋಡಿಗಳನ್ನು ಬಳಸುತ್ತವೆ. ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿಗಾಗಿ ನಾವು ಬಳಸುವ ಬಳಕೆದಾರಹೆಸರು ಮತ್ತು ಅಕ್ಷರಗಳ ಸ್ಟ್ರಿಂಗ್‌ಗಿಂತ ಭಿನ್ನವಾಗಿ, ಆ್ಯಪ್ ಅಥವಾ ವೆಬ್‌ಸೈಟ್‌ಗಾಗಿ ಖಾಸಗಿ-ಸಾರ್ವಜನಿಕ ಕೀ ಜೋಡಿಯನ್ನು ರಚಿಸಲಾಗಿದೆ. ಖಾಸಗಿ ಕೀ ಅನ್ನು ನಿಮ್ಮ ಸಾಧನ ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್ ನಿರ್ವಾಹಕದಲ್ಲಿ ಸುರಕ್ಷಿತವಾಗಿ ಸಂಗ್ರಹಿಸಲಾಗಿದೆ ಮತ್ತು ಅದು ನಿಮ್ಮ ಗುರುತನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ. ಸಾರ್ವಜನಿಕ ಕೀ ಅನ್ನು ಆ್ಯಪ್ ಅಥವಾ ವೆಬ್‌ಸೈಟ್ ಸರ್ವರ್ ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ. ಅನುಗುಣವಾದ ಕೀ ಮೂಲಕ, ನೀವು ತಕ್ಷಣ ನೋಂದಾಯಿಸಬಹುದು ಮತ್ತು ಸೈನ್ ಇನ್ ಮಾಡಬಹುದು."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO ಅಲೈಯನ್ಸ್ (ಇದು Google, Apple, Microsoft ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಒಳಗೊಂಡಿದೆ) ಮತ್ತು W3C ಮಾನದಂಡಗಳನ್ನು ಆಧರಿಸಿ, ಪಾಸ್‌ಕೀಗಳು ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಕೀ ಜೋಡಿಗಳನ್ನು ಬಳಸುತ್ತವೆ. ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿಗಾಗಿ ನಾವು ಬಳಸುವ ಬಳಕೆದಾರರ ಹೆಸರು ಮತ್ತು ಅಕ್ಷರಗಳ ಸ್ಟ್ರಿಂಗ್‌ಗಿಂತ ಭಿನ್ನವಾಗಿ, ಆ್ಯಪ್ ಅಥವಾ ವೆಬ್‌ಸೈಟ್‌ಗಾಗಿ ಖಾಸಗಿ-ಸಾರ್ವಜನಿಕ ಕೀ ಜೋಡಿಯನ್ನು ರಚಿಸಲಾಗುತ್ತದೆ. ಖಾಸಗಿ ಕೀ ಅನ್ನು ನಿಮ್ಮ ಸಾಧನ ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್ ನಿರ್ವಾಹಕದಲ್ಲಿ ಸುರಕ್ಷಿತವಾಗಿ ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಅದು ನಿಮ್ಮ ಗುರುತನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ. ಸಾರ್ವಜನಿಕ ಕೀ ಅನ್ನು ಆ್ಯಪ್ ಅಥವಾ ವೆಬ್‌ಸೈಟ್ ಸರ್ವರ್ ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ. ಅನುಗುಣವಾದ ಕೀಗಳೊಂದಿಗೆ, ನೀವು ತಕ್ಷಣ ನೋಂದಾಯಿಸಬಹುದು ಮತ್ತು ಸೈನ್ ಇನ್ ಮಾಡಬಹುದು."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"ಸುಧಾರಿತ ಖಾತೆಯ ಭದ್ರತೆ"</string>
-    <string name="improved_account_security_detail" msgid="9123750251551844860">"ಪ್ರತಿಯೊಂದು ಕೀ ಅವುಗಳನ್ನು ರಚಿಸಲಾದ ಆ್ಯಪ್ ಅಥವಾ ವೆಬ್‌ಸೈಟ್‌ನ ಜೊತೆಗೆ ಪ್ರತ್ಯೇಕವಾಗಿ ಲಿಂಕ್ ಮಾಡಲಾಗಿದೆ, ಆದ್ದರಿಂದ ನೀವು ಎಂದಿಗೂ ತಪ್ಪಾಗಿ ವಂಚನೆಯ ಆ್ಯಪ್ ಅಥವಾ ವೆಬ್‌ಸೈಟ್‌ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಜೊತೆಗೆ, ಸರ್ವರ್‌ಗಳು ಮಾತ್ರ ಸಾರ್ವಜನಿಕ ಕೀಗಳನ್ನು ಇಟ್ಟುಕೊಳ್ಳುವುದರಿಂದ, ಹ್ಯಾಕಿಂಗ್ ಮಾಡುವುದು ತುಂಬಾ ಕಷ್ಟಕರವಾಗಿದೆ."</string>
+    <string name="improved_account_security_detail" msgid="9123750251551844860">"ಪ್ರತಿಯೊಂದು ಕೀಯನ್ನು ಯಾವ ಆ್ಯಪ್ ಅಥವಾ ವೆಬ್‌ಸೈಟ್‌ಗಾಗಿ ರಚಿಸಲಾಗಿದೆಯೋ ಅದರೊಂದಿಗೆ ಮಾತ್ರ ಲಿಂಕ್ ಮಾಡಲಾಗುತ್ತದೆ. ಆದ್ದರಿಂದ ನೀವು ಎಂದಿಗೂ ತಪ್ಪಾಗಿ ವಂಚನೆಯ ಆ್ಯಪ್ ಅಥವಾ ವೆಬ್‌ಸೈಟ್‌ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಜೊತೆಗೆ, ಸರ್ವರ್‌ಗಳು ಸಾರ್ವಜನಿಕ ಕೀಗಳನ್ನು ಮಾತ್ರ ಇಟ್ಟುಕೊಳ್ಳುವುದರಿಂದ, ಹ್ಯಾಕಿಂಗ್ ಮಾಡುವುದು ತುಂಬಾ ಕಷ್ಟಕರವಾಗಿದೆ."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"ಅಡಚಣೆರಹಿತ ಪರಿವರ್ತನೆ"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"ನಾವು ಪಾಸ್‌ವರ್ಡ್ ರಹಿತ ಭವಿಷ್ಯದತ್ತ ಸಾಗುತ್ತಿರುವಾಗ, ಪಾಸ್‌ಕೀಗಳ ಜೊತೆಗೆ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಇನ್ನೂ ಲಭ್ಯವಿರುತ್ತವೆ"</string>
-    <string name="choose_provider_title" msgid="8870795677024868108">"ನಿಮ್ಮ <xliff:g id="CREATETYPES">%1$s</xliff:g> ಅನ್ನು ಎಲ್ಲಿ ಉಳಿಸಬೇಕು ಎಂದು ಆರಿಸಿ"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"ನಾವು ಪಾಸ್‌ವರ್ಡ್ ರಹಿತ ತಂತ್ರಜ್ಞಾನದ ಕಡೆಗೆ ಸಾಗುತ್ತಿರುವಾಗ, ಪಾಸ್‌ಕೀಗಳ ಜೊತೆಗೆ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಇನ್ನೂ ಲಭ್ಯವಿರುತ್ತವೆ."</string>
+    <string name="choose_provider_title" msgid="8870795677024868108">"ನಿಮ್ಮ <xliff:g id="CREATETYPES">%1$s</xliff:g> ಎಲ್ಲಿ ಸೇವ್‌ ಆಗಬೇಕು ಎಂಬುದನ್ನು ಆರಿಸಿ"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"ನಿಮ್ಮ ಮಾಹಿತಿಯನ್ನು ಉಳಿಸಲು ಪಾಸ್‌ವರ್ಡ್ ನಿರ್ವಾಹಕವನ್ನು ಆಯ್ಕೆಮಾಡಿ ಹಾಗೂ ಮುಂದಿನ ಬಾರಿ ವೇಗವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿ"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> ಗಾಗಿ ಪಾಸ್‌ಕೀ ಅನ್ನು ರಚಿಸುವುದೇ?"</string>
     <string name="choose_create_option_password_title" msgid="7097275038523578687">"<xliff:g id="APPNAME">%1$s</xliff:g> ಗಾಗಿ ಪಾಸ್‌ವರ್ಡ್‌ ಉಳಿಸುವುದೇ?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಉಳಿಸಲಾದ ನಿಮ್ಮ ಪಾಸ್‌ಕೀ ಅನ್ನು ಬಳಸಬೇಕೆ?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಉಳಿಸಲಾದ ನಿಮ್ಮ ಸೈನ್-ಇನ್ ಅನ್ನು ಬಳಸಬೇಕೆ?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಉಳಿಸಲಾದ ಸೈನ್-ಇನ್ ಮಾಹಿತಿಯನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"ಬೇರೆ ವಿಧಾನದಲ್ಲಿ ಸೈನ್ ಇನ್ ಮಾಡಿ"</string>
     <string name="snackbar_action" msgid="37373514216505085">"ಆಯ್ಕೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"ಮುಂದುವರಿಸಿ"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"ಸೈನ್-ಇನ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"ಮತ್ತೊಂದು ಸಾಧನದಿಂದ"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"ಬೇರೆ ಸಾಧನವನ್ನು ಬಳಸಿ"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಂದ ವಿನಂತಿಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ko/strings.xml b/packages/CredentialManager/res/values-ko/strings.xml
index 502d9ee..3ce0245 100644
--- a/packages/CredentialManager/res/values-ko/strings.xml
+++ b/packages/CredentialManager/res/values-ko/strings.xml
@@ -13,14 +13,14 @@
     <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"패스키는 지문, 얼굴 또는 화면 잠금으로 생성하는 암호화된 디지털 키입니다."</string>
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"비밀번호 관리자에 저장되므로 다른 기기에서 로그인할 수 있습니다."</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"패스키 자세히 알아보기"</string>
-    <string name="passwordless_technology_title" msgid="2497513482056606668">"비밀번호 없는 기술"</string>
+    <string name="passwordless_technology_title" msgid="2497513482056606668">"패스워드리스 기술"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"패스키를 이용하면 비밀번호에 의존하지 않고 로그인할 수 있습니다. 지문, 얼굴 인식, PIN 또는 스와이프 패턴만으로 본인 인증을 하고 패스키를 만들 수 있습니다."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"공개 키 암호화"</string>
     <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO 연합(Google, Apple, Microsoft 등 포함) 및 W3C 표준을 토대로 패스키는 암호화 키 쌍을 사용합니다. 사용자 이름과 비밀번호로 사용하는 문자열과는 달리 비공개-공개 키 쌍은 특정 앱 또는 웹사이트를 대상으로 생성됩니다. 비공개 키는 안전하게 기기 또는 비밀번호 관리자에 저장되며 사용자 본인 인증에 사용됩니다. 공개 키는 앱 또는 웹사이트 서버와 공유됩니다. 해당하는 키를 사용하면 즉시 등록하고 로그인할 수 있습니다."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"계정 보안 향상"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"각 키는 생성 시 대상으로 설정된 앱 또는 웹사이트와 단독으로 연결되어 있으므로 실수로 사기 앱 또는 웹사이트에 로그인할 일이 없습니다. 또한 서버에만 공개 키가 보관되므로 해킹이 더욱 까다롭습니다."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"원활한 이전"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"비밀번호가 필요 없는 미래로 나아가는 동안에도 비밀번호는 여전히 패스키와 함께 사용될 것입니다."</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"비밀번호 없는 미래로 나아가는 과정에서 비밀번호는 여전히 패스키와 함께 사용될 것입니다."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> 저장 위치 선택"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"정보를 저장해서 다음에 더 빠르게 로그인하려면 비밀번호 관리자를 선택하세요."</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g>의 패스키를 만드시겠습니까?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱용으로 저장된 패스키를 사용하시겠습니까?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱용 저장된 로그인 정보를 사용하시겠습니까?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱용 저장된 로그인 정보 선택"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"다른 방법으로 로그인"</string>
     <string name="snackbar_action" msgid="37373514216505085">"옵션 보기"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"계속"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"로그인 관리"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"다른 기기에서"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"다른 기기 사용"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g>에 의해 요청이 취소됨"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ky/strings.xml b/packages/CredentialManager/res/values-ky/strings.xml
index 68f082b..7d82899 100644
--- a/packages/CredentialManager/res/values-ky/strings.xml
+++ b/packages/CredentialManager/res/values-ky/strings.xml
@@ -8,19 +8,19 @@
     <string name="string_learn_more" msgid="4541600451688392447">"Кеңири маалымат"</string>
     <string name="content_description_show_password" msgid="3283502010388521607">"Сырсөздү көрсөтүү"</string>
     <string name="content_description_hide_password" msgid="6841375971631767996">"Сырсөздү жашыруу"</string>
-    <string name="passkey_creation_intro_title" msgid="4251037543787718844">"Мүмкүндүк алуу ачкычтары менен коопсузураак болот"</string>
-    <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"Мүмкүндүк алуу ачкычтары менен татаал сырсөздөрдү түзүп же эстеп калуунун кереги жок"</string>
-    <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"Мүмкүндүк алуу ачкычтары – манжаңыздын изи, жүзүңүз же экранды кулпулоо функциясы аркылуу түзгөн шифрленген санариптик ачкычтар"</string>
+    <string name="passkey_creation_intro_title" msgid="4251037543787718844">"Киргизүүчү ачкычтар менен коопсузураак болот"</string>
+    <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"Киргизүүчү ачкычтар менен татаал сырсөздөрдү түзүп же эстеп калуунун кереги жок"</string>
+    <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"Киргизүүчү ачкычтар – манжаңыздын изи, жүзүңүз же экранды кулпулоо функциясы аркылуу түзгөн шифрленген санариптик ачкычтар"</string>
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Алар сырсөздөрдү башкаргычка сакталып, аккаунтуңузга башка түзмөктөрдөн кире аласыз"</string>
-    <string name="more_about_passkeys_title" msgid="7797903098728837795">"Мүмкүндүк алуу ачкычтары тууралуу кеңири маалымат"</string>
+    <string name="more_about_passkeys_title" msgid="7797903098728837795">"Киргизүүчү ачкычтар тууралуу кеңири маалымат"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Сырсөзсүз технология"</string>
-    <string name="passwordless_technology_detail" msgid="6853928846532955882">"Мүмкүндүк алуу ачкычтары аркылуу сырсөздөрсүз эле аккаунтуңузга кире аласыз. Ким экениңизди ырастоо жана мүмкүндүк алуу ачкычын түзүү үчүн жөн гана манжаңыздын изин, жүзүнөн таануу функциясын, PIN кодду же графикалык ачкычты колдонушуңуз керек болот."</string>
+    <string name="passwordless_technology_detail" msgid="6853928846532955882">"Киргизүүчү ачкычтар аркылуу сырсөздөрсүз эле аккаунтуңузга кире аласыз. Ким экениңизди ырастоо жана киргизүүчү ачкычты түзүү үчүн жөн гана манжаңыздын изин, жүзүнөн таануу функциясын, PIN кодду же графикалык ачкычты колдонушуңуз керек болот."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Жалпыга ачык ачкыч менен криптография"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO Alliance (Google, Apple, Microsoft ж.б.) жана W3C стандартына ылайык, мүмкүндүк алуу ачкычтары криптографиялык жуп ачкычтарды колдонот. Колдонмо же вебсайтта колдонуучунун аты жана сырсөз үчүн колдонулган символ сабы эмес, купуя жана жалпыга ачык жуп ачкыч түзүлөт. Купуя ачкыч түзмөктө же сырсөздөрдү башкаргычта коопсуз сакталып, өздүгүңүздү ырастоо үчүн колдонулат. Жалпыга ачык ачкыч колдонмо же вебсайттын серверине жөнөтүлөт. Туура келген ачкычтар аркылуу тез катталып жана кире аласыз."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO Alliance (Google, Apple, Microsoft ж.б.) жана W3C стандартына ылайык, киргизүүчү ачкычтар криптографиялык жуп ачкычтарды колдонот. Колдонмо же вебсайтта колдонуучунун аты жана сырсөз үчүн колдонулган символ сабы эмес, купуя жана жалпыга ачык жуп ачкыч түзүлөт. Купуя ачкыч түзмөктө же сырсөздөрдү башкаргычта коопсуз сакталып, өздүгүңүздү ырастоо үчүн колдонулат. Жалпыга ачык ачкыч колдонмо же вебсайттын серверине жөнөтүлөт. Туура келген ачкычтар аркылуу тез катталып жана кире аласыз."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Аккаунттун коопсуздугу жакшыртылды"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Ар бир ачкыч өзү арналган колдонмо же вебсайт менен гана байланыштырылгандыктан, эч качан шылуундардын колдонмолоруна же вебсайттарына жаңылыштык менен кирип албайсыз. Мындан тышкары, серверлерде жалпыга ачык ачкычтар гана сакталгандыктан, хакерлик кылуу кыйла кыйын."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Тез которулуу"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Сырсөзсүз келечекти көздөй баратсак да, аларды мүмкүндүк алуу ачкычтары менен бирге колдоно берүүгө болот"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Сырсөзсүз келечекти көздөй баратсак да, аларды киргизүүчү ачкычтар менен бирге колдоно берүүгө болот."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> кайда сакталарын тандаңыз"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Маалыматыңызды сактоо жана кийинки жолу тезирээк кирүү үчүн сырсөздөрдү башкаргычты тандаңыз"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> колдонмосуна киргизүүчү ачкыч түзөсүзбү?"</string>
@@ -28,7 +28,7 @@
     <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> үчүн кирүү маалыматы сакталсынбы?"</string>
     <string name="passkey" msgid="632353688396759522">"киргизүүчү ачкыч"</string>
     <string name="password" msgid="6738570945182936667">"сырсөз"</string>
-    <string name="passkeys" msgid="5733880786866559847">"мүмкүндүк алуу ачкычтары"</string>
+    <string name="passkeys" msgid="5733880786866559847">"киргизүүчү ачкычтар"</string>
     <string name="passwords" msgid="5419394230391253816">"сырсөздөр"</string>
     <string name="sign_ins" msgid="4710739369149469208">"кирүүлөр"</string>
     <string name="sign_in_info" msgid="2627704710674232328">"кирүү маалыматы"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна кирүү үчүн сакталган ачкычты колдоносузбу?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн сакталган кирүү параметрин колдоносузбу?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн кирүү маалыматын тандаңыз"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн параметр тандайсызбы?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Башка жол менен кирүү"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Параметрлерди көрүү"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Улантуу"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Кирүү параметрлерин тескөө"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Башка түзмөктөн"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Башка түзмөктү колдонуу"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Сурамды <xliff:g id="APP_NAME">%1$s</xliff:g> жокко чыгарды"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-lo/strings.xml b/packages/CredentialManager/res/values-lo/strings.xml
index d7e4c31..75726ea 100644
--- a/packages/CredentialManager/res/values-lo/strings.xml
+++ b/packages/CredentialManager/res/values-lo/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"ປັບປຸງຄວາມປອດໄພບັນຊີ"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"ກະແຈແຕ່ລະອັນແມ່ນລິ້ງເຈາະຈົງກັບແອັບ ຫຼື ເວັບໄຊທີ່ພວກມັນຖືກສ້າງໃຫ້, ດັ່ງນັ້ນທ່ານຈະບໍ່ສາມາດເຂົ້າສູ່ລະບົບຫາແອັບ ຫຼື ເວັບໄຊສໍ້ໂກງຕ່າງໆໂດຍບໍ່ໄດ້ຕັ້ງໃຈໄດ້. ນອກຈາກນັ້ນ, ເຊີບເວີຍັງມີການເກັບກະແຈສາທາລະນະໄວ້ເທົ່ານັ້ນ, ການແຮັກຈຶ່ງເປັນເລື່ອງຍາກຂຶ້ນຫຼາຍ."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"ການປ່ຽນຜ່ານທີ່ຕໍ່ເນື່ອງ"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"ໃນຂະນະທີ່ພວກເຮົາກ້າວໄປສູ່ອະນາຄົດທີ່ບໍ່ຕ້ອງໃຊ້ລະຫັດຜ່ານ, ລະຫັດຜ່ານຈະຍັງຄົງໃຊ້ໄດ້ຄວບຄູ່ໄປກັບກະແຈຜ່ານ"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"ໃນຂະນະທີ່ພວກເຮົາກ້າວໄປສູ່ອະນາຄົດທີ່ບໍ່ຕ້ອງໃຊ້ລະຫັດຜ່ານ, ລະຫັດຜ່ານຈະຍັງຄົງໃຊ້ໄດ້ຄວບຄູ່ໄປກັບກະແຈຜ່ານ."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"ເລືອກບ່ອນທີ່ຈະບັນທຶກ <xliff:g id="CREATETYPES">%1$s</xliff:g> ຂອງທ່ານ"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"ເລືອກຕົວຈັດການລະຫັດຜ່ານເພື່ອບັນທຶກຂໍ້ມູນຂອງທ່ານ ແລະ ເຂົ້າສູ່ລະບົບໄວຂຶ້ນໃນເທື່ອຕໍ່ໄປ"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"ສ້າງກະແຈຜ່ານສຳລັບ <xliff:g id="APPNAME">%1$s</xliff:g> ບໍ?"</string>
@@ -52,6 +52,8 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"ໃຊ້ກະແຈຜ່ານທີ່ບັນທຶກໄວ້ຂອງທ່ານສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"ໃຊ້ການເຂົ້າສູ່ລະບົບທີ່ບັນທຶກໄວ້ຂອງທ່ານສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"ເລືອກການເຂົ້າສູ່ລະບົບທີ່ບັນທຶກໄວ້ສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"ເລືອກຕົວເລືອກສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
+    <string name="get_dialog_title_use_info_on" msgid="8863708099535435146">"ໃຊ້ຂໍ້ມູນນີ້ຢູ່ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"ເຂົ້າສູ່ລະບົບດ້ວຍວິທີອື່ນ"</string>
     <string name="snackbar_action" msgid="37373514216505085">"ເບິ່ງຕົວເລືອກ"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"ສືບຕໍ່"</string>
@@ -64,4 +66,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"ຈັດການການເຂົ້າສູ່ລະບົບ"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"ຈາກອຸປະກອນອື່ນ"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"ໃຊ້ອຸປະກອນອື່ນ"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"ການຮ້ອງຂໍຖືກຍົກເລີກໂດຍ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-lt/strings.xml b/packages/CredentialManager/res/values-lt/strings.xml
index 33944c2..ed2db46 100644
--- a/packages/CredentialManager/res/values-lt/strings.xml
+++ b/packages/CredentialManager/res/values-lt/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Geresnė paskyros sauga"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Kiekvienas raktas išskirtinai susietas su programa ar svetaine, kuriai buvo sukurtas, todėl niekada per klaidą neprisijungsite prie apgavikiškos programos ar svetainės. Be to, viešieji raktai laikomi tik serveriuose, todėl įsilaužti tampa gerokai sudėtingiau."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Sklandus perėjimas"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Kol stengiamės padaryti, kad ateityje nereikėtų naudoti slaptažodžių, jie vis dar bus pasiekiami kartu su „passkey“"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Kol stengiamės padaryti, kad ateityje nereikėtų naudoti slaptažodžių, jie vis dar bus pasiekiami kartu su slaptaisiais raktais."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Pasirinkite, kur išsaugoti „<xliff:g id="CREATETYPES">%1$s</xliff:g>“"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Pasirinkite slaptažodžių tvarkyklę, kurią naudodami galėsite išsaugoti informaciją ir kitą kartą prisijungti greičiau"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Sukurti „passkey“, skirtą „<xliff:g id="APPNAME">%1$s</xliff:g>“?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Naudoti išsaugotą „passkey“ programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Naudoti išsaugotą prisijungimo informaciją programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Pasirinkite išsaugotą prisijungimo informaciją programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Prisijungti kitu būdu"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Peržiūrėti parinktis"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Tęsti"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Tvarkyti prisijungimo informaciją"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Naudojant kitą įrenginį"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Naudoti kitą įrenginį"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Užklausą atšaukė „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-lv/strings.xml b/packages/CredentialManager/res/values-lv/strings.xml
index 0aa4aa7..c1ae230 100644
--- a/packages/CredentialManager/res/values-lv/strings.xml
+++ b/packages/CredentialManager/res/values-lv/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Uzlabota kontu drošība"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Katra atslēga ir saistīta tikai ar to lietotni vai vietni, kurai tā tika izveidota, tādēļ jūs nevarēsiet nejauši pierakstīties krāpnieciskā lietotnē vai vietnē. Turklāt uzlaušanu ievērojami sarežģī tas, ka serveros tiek glabātas tikai publiskās atslēgas."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Ērta pāreja"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Kamēr notiek pāreja uz darbu bez parolēm, tās joprojām būs pieejamas līdztekus piekļuves atslēgām."</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Lai arī pamazām notiek pāreja uz darbu bez parolēm, tās joprojām būs pieejamas līdzās piekļuves atslēgām."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Izvēlieties, kur saglabāt savas <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Lai saglabātu informāciju un nākamreiz varētu pierakstīties ātrāk, atlasiet paroļu pārvaldnieku."</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Vai izveidot piekļuves atslēgu lietotnei <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vai izmantot saglabāto piekļuves atslēgu lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Vai izmantot saglabāto pierakstīšanās informāciju lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Saglabātas pierakstīšanās informācijas izvēle lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Pierakstīties citā veidā"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Skatīt opcijas"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Turpināt"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Pierakstīšanās informācijas pārvaldība"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"No citas ierīces"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Izmantot citu ierīci"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> atcēla pieprasījumu"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-mk/strings.xml b/packages/CredentialManager/res/values-mk/strings.xml
index 3287246..969912b 100644
--- a/packages/CredentialManager/res/values-mk/strings.xml
+++ b/packages/CredentialManager/res/values-mk/strings.xml
@@ -14,13 +14,13 @@
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Се зачувуваат во управник со лозинки за да може да се најавувате на други уреди"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"Повеќе за криптографските клучеви"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Технологија без лозинки"</string>
-    <string name="passwordless_technology_detail" msgid="6853928846532955882">"Криптографските клучеви дозволуваат да се најавувате без да се потпирате на лозинки. Треба само да користите отпечаток, препознавање лик, PIN или шема на повлекување за да го потврдите идентитетот и да создадете криптографски клуч."</string>
+    <string name="passwordless_technology_detail" msgid="6853928846532955882">"Криптографските клучеви дозволуваат да се најавувате без да зависите од лозинки. Треба само да користите отпечаток, препознавање лик, PIN или шема на повлекување за да го потврдите идентитетот и да создадете криптографски клуч."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Криптографија за јавни клучеви"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Според FIDO Alliance (во која членуваат Google, Apple, Microsoft и др.) и W3C-стандардите, криптографските клучеви користат криптографски парови на клучеви. За разлика од корисничките имиња и знаците што ги користиме за лозинки, се создава приватно-јавен пар клучеви за апликација или сајт. Приватниот клуч безбедно се чува на уредот или управникот со лозинки и го потврдува вашиот идентитет. Јавниот клуч се споделува со серверот на апликацијата или сајтот. Со соодветните клучеви, може инстантно да се регистрирате и најавувате."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Според FIDO Alliance (во која членуваат Google, Apple, Microsoft и др.) и W3C-стандардите, криптографските клучеви користат парови криптографски клучеви. За разлика од корисничките имиња и знаците што ги користиме за лозинки, се создава приватно-јавен пар клучеви за апликација или сајт. Приватниот клуч безбедно се чува на уредот или управникот со лозинки и го потврдува вашиот идентитет. Јавниот клуч се споделува со серверот на апликацијата или сајтот. Со соодветните клучеви, може инстантно да се регистрирате и најавувате."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Подобрена безбедност на сметката"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Секој клуч е поврзан само со апликацијата или веб-сајтот за кој бил создаден за да не може никогаш по грешка да се најавите на измамничка апликација или веб-сајт. Плус, кога серверите ги чуваат само јавните клучеви, хакирањето е многу потешко."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Беспрекорна транзиција"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Како што се движиме кон иднина без лозинки, лозинките сепак ќе бидат достапни покрај криптографските клучеви"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Како што се движиме кон иднина без лозинки, лозинките сепак ќе бидат достапни покрај криптографските клучеви."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Изберете каде да ги зачувате вашите <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Изберете управник со лозинки за да ги зачувате вашите податоци и да се најавите побрзо следниот пат"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Да се создаде криптографски клуч за <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Да се користи вашиот зачуван криптографски клуч за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Да се користи вашето зачувано најавување за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Изберете зачувано најавување за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Најавете се на друг начин"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Прикажи ги опциите"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Продолжи"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Управувајте со најавувањата"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Од друг уред"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Употребете друг уред"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Барањето е откажано од <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ml/strings.xml b/packages/CredentialManager/res/values-ml/strings.xml
index eb75149..498c9b0 100644
--- a/packages/CredentialManager/res/values-ml/strings.xml
+++ b/packages/CredentialManager/res/values-ml/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"മെച്ചപ്പെടുത്തിയ അക്കൗണ്ട് സുരക്ഷ"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"ഓരോ കീയും ഏത് ആപ്പിന് അല്ലെങ്കിൽ വെബ്സൈറ്റിന് വേണ്ടിയാണോ സൃഷ്ടിച്ചത്, അതുമായി മാത്രം ലിങ്ക് ചെയ്തിരിക്കുന്നു, അതുകൊണ്ട് നിങ്ങൾ ഒരിക്കലും വഞ്ചനാപരമായ ഒരു ആപ്പിലേക്കോ വെബ്സൈറ്റിലേക്കോ അബദ്ധവശാൽ സൈൻ ഇൻ ചെയ്യില്ല. ഇതോടൊപ്പം, സെർവറുകളിൽ എല്ലാവർക്കുമായുള്ള കീകൾ മാത്രം സൂക്ഷിക്കുന്നതിനാൽ ഹാക്ക് ചെയ്യാൻ വളരെ ബുദ്ധിമുട്ടാണ്."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"ആയാസരഹിതമായ മാറ്റം"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"നമ്മൾ പാസ്‍വേഡ് രഹിത ഭാവിയിലേക്ക് ചുവടുവെച്ചുകൊണ്ടിരിക്കുകയാണ് എങ്കിലും, പാസ്‌കീകൾക്കൊപ്പം പാസ്‍വേഡുകൾ തുടർന്നും ലഭ്യമായിരിക്കും"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"നമ്മൾ പാസ്‍വേഡ് രഹിത ഭാവിയിലേക്ക് ചുവടുവെച്ചുകൊണ്ടിരിക്കുകയാണ് എങ്കിലും, പാസ്‌കീകൾക്കൊപ്പം പാസ്‍വേഡുകൾ തുടർന്നും ലഭ്യമായിരിക്കും."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"നിങ്ങളുടെ <xliff:g id="CREATETYPES">%1$s</xliff:g> എവിടെയാണ് സംരക്ഷിക്കേണ്ടതെന്ന് തിരഞ്ഞെടുക്കുക"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"നിങ്ങളുടെ വിവരങ്ങൾ സംരക്ഷിക്കാനും അടുത്ത തവണ വേഗത്തിൽ സൈൻ ഇൻ ചെയ്യാനും ഒരു പാസ്‌വേഡ് മാനേജർ തിരഞ്ഞെടുക്കുക"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> എന്നതിനായി പാസ്‌കീ സൃഷ്ടിക്കണോ?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി നിങ്ങൾ സംരക്ഷിച്ച പാസ്‌കീ ഉപയോഗിക്കണോ?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി നിങ്ങൾ സംരക്ഷിച്ച സൈൻ ഇൻ ഉപയോഗിക്കണോ?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി ഒരു സംരക്ഷിച്ച സൈൻ ഇൻ തിരഞ്ഞെടുക്കുക"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്ന ആപ്പിനായി ഒരു ഓപ്‌ഷൻ തിരഞ്ഞെടുക്കണോ?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"മറ്റൊരു രീതിയിൽ സൈൻ ഇൻ ചെയ്യുക"</string>
     <string name="snackbar_action" msgid="37373514216505085">"ഓപ്ഷനുകൾ കാണുക"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"തുടരുക"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"സൈൻ ഇന്നുകൾ മാനേജ് ചെയ്യുക"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"മറ്റൊരു ഉപകരണത്തിൽ നിന്ന്"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"മറ്റൊരു ഉപകരണം ഉപയോഗിക്കുക"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"അഭ്യർത്ഥന <xliff:g id="APP_NAME">%1$s</xliff:g> റദ്ദാക്കി"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-mn/strings.xml b/packages/CredentialManager/res/values-mn/strings.xml
index cf6a337..f8bd358 100644
--- a/packages/CredentialManager/res/values-mn/strings.xml
+++ b/packages/CredentialManager/res/values-mn/strings.xml
@@ -14,13 +14,13 @@
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Тэдгээрийг нууц үгний менежерт хадгалдаг бөгөөд ингэснээр та бусад төхөөрөмжид нэвтрэх боломжтой"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"Passkey-н талаарх дэлгэрэнгүй"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Нууц үггүй технологи"</string>
-    <string name="passwordless_technology_detail" msgid="6853928846532955882">"Passkey нь танд нууц үгэнд найдалгүйгээр нэвтрэх боломжийг олгодог. Та таниулбараа баталгаажуулах болон passkey үүсгэхийн тулд ердөө хурууны хээ, царай танилт, ПИН эсвэл шудрах хээгээ ашиглах шаардлагатай."</string>
+    <string name="passwordless_technology_detail" msgid="6853928846532955882">"Passkey нь танд нууц үгэнд найдалгүйгээр нэвтрэх боломжийг олгодог. Та хувийн мэдээллээ баталгаажуулах болон passkey үүсгэхийн тулд ердөө хурууны хээ, царай танилт, ПИН эсвэл шудрах хээгээ ашиглах шаардлагатай."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Нийтийн түлхүүрийн криптограф"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO Холбоодын (Google, Apple, Microsoft ба бусад багтдаг) W3C стандартад тулгуурлан passkey нь криптограф түлхүүрийн хослолыг ашигладаг. Хэрэглэгчийн нэр, бидний нууц үгэнд ашигладаг тэмдэгтийн мөрөөс ялгаатай хувийн-нийтийн түлхүүрийн хослолыг апп эсвэл вебсайтад үүсгэдэг. Хувийн түлхүүрийг таны төхөөрөмж эсвэл нууц үгний менежерт аюулгүй хадгалдаг бөгөөд үүнийг таны таниулбарыг баталгаажуулахад ашигладаг. Нийтийн түлхүүрийг апп эсвэл вебсайтын сервертэй хуваалцдаг. Харгалзах түлхүүрээр та даруй бүртгүүлэх, нэвтрэх боломжтой."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Passkey нь FIDO Холбоо (Google, Apple, Microsoft ба бусад багтдаг) болон W3C стандартад тулгуурлан криптограф түлхүүрийн хослолыг ашигладаг. Хэрэглэгчийн нэр, бидний нууц үгэнд ашигладаг тэмдэгтийн мөрөөс ялгаатай хувийн-нийтийн түлхүүрийн хослолыг апп эсвэл вебсайтад үүсгэдэг. Хувийн түлхүүрийг таны төхөөрөмж эсвэл нууц үгний менежерт аюулгүй хадгалдаг бөгөөд үүнийг таны хувийн мэдээллийг баталгаажуулахад ашигладаг. Нийтийн түлхүүрийг апп эсвэл вебсайтын сервертэй хуваалцдаг. Харгалзах түлхүүрээр та даруй бүртгүүлэх, нэвтрэх боломжтой."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Бүртгэлийн сайжруулсан аюулгүй байдал"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Түлхүүр тус бүрийг тэдгээрийг зориулж үүсгэсэн апп эсвэл вебсайттай нь тусгайлан холбодог бөгөөд ингэснээр та залилан мэхэлсэн апп эсвэл вебсайтад санамсаргүй байдлаар хэзээ ч нэвтрэхгүй. Түүнчлэн зөвхөн нийтийн түлхүүрийг хадгалж буй серверүүдийг хакердахад илүү хэцүү байдаг."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Саадгүй шилжилт"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Бид нууц үггүй ирээдүй рүү урагшлахын хэрээр нууц үг нь passkey-н хамтаар боломжтой хэвээр байх болно"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Бид нууц үггүй ирээдүй рүү урагшлахын хэрээр нууц үг нь passkey-н хамтаар боломжтой хэвээр байх болно."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g>-г хаана хадгалахаа сонгоно уу"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Мэдээллээ хадгалж, дараагийн удаа илүү хурдан нэвтрэхийн тулд нууц үгний менежерийг сонгоно уу"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g>-д passkey үүсгэх үү?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д өөрийн хадгалсан passkey-г ашиглах уу?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д хадгалсан нэвтрэх мэдээллээ ашиглах уу?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д зориулж хадгалсан нэвтрэх мэдээллийг сонгоно уу"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д сонголт хийх үү?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Өөр аргаар нэвтрэх"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Сонголт харах"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Үргэлжлүүлэх"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Нэвтрэлтийг удирдах"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Өөр төхөөрөмжөөс"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Өөр төхөөрөмж ашиглах"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Хүсэлтийг <xliff:g id="APP_NAME">%1$s</xliff:g> цуцалсан"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-mr/strings.xml b/packages/CredentialManager/res/values-mr/strings.xml
index 30538b5..4e3c46e 100644
--- a/packages/CredentialManager/res/values-mr/strings.xml
+++ b/packages/CredentialManager/res/values-mr/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"सुधारित खाते सुरक्षा"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"प्रत्येक की ज्यांच्यासाठी बनवली आहे फक्त त्या अ‍ॅप किंवा वेबसाइटसोबत लिंक केलेली असते, ज्यमुळे तुम्ही कधीच कपटपूर्ण अ‍ॅप किंवा वेबसाइटवर चुकूनही साइन इन करणार नाही. तसेच, सर्व्हर फक्त सार्वजनिक की स्टोअर करत असल्यामुळे, हॅक करणे खूप अवघड आहे."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"अखंड संक्रमण"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"पासवर्ड न वापरणाऱ्या भविष्यात पुढे जाताना, पासवर्ड तरीही पासकीच्या बरोबरीने उपलब्ध असतील"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"पासवर्ड न वापरणाऱ्या भविष्यात पुढे जाताना, पासवर्ड तरीही पासकीच्या बरोबरीने उपलब्ध असतील."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"तुमची <xliff:g id="CREATETYPES">%1$s</xliff:g> कुठे सेव्ह करायची ते निवडा"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"तुमची माहिती सेव्ह करण्यासाठी आणि पुढच्या वेळी जलद साइन इन करण्याकरिता Password Manager निवडा"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> साठी पासकी तयार करायची का?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी तुमची सेव्ह केलेली पासकी वापरायची का?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी तुमचे सेव्ह केलेले साइन-इन वापरायचे का?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी सेव्ह केलेले साइन-इन निवडा"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी पर्याय निवडा?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"दुसऱ्या मार्गाने साइन इन करा"</string>
     <string name="snackbar_action" msgid="37373514216505085">"पर्याय पहा"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"पुढे सुरू ठेवा"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"साइन-इन व्यवस्थापित करा"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"दुसऱ्या डिव्हाइस वरून"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"वेगळे डिव्हाइस वापरा"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> ने विनंती रद्द केली आहे"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ms/strings.xml b/packages/CredentialManager/res/values-ms/strings.xml
index fb96a43..f7cd4211 100644
--- a/packages/CredentialManager/res/values-ms/strings.xml
+++ b/packages/CredentialManager/res/values-ms/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Keselamatan akaun yang dipertingkatkan"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Setiap kunci dipautkan secara eksklusif dengan apl atau laman web kunci dicipta, jadi anda tidak boleh log masuk ke apl atau laman web penipuan secara tidak sengaja. Selain itu, dengan pelayan yang hanya menyimpan kunci awam, penggodaman menjadi jauh lebih sukar."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Peralihan yang lancar"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Walaupun kita semakin menghampiri masa hadapan tanpa kata laluan, kata laluan masih akan tersedia bersama dengan kunci laluan"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Semasa kita bergerak menuju ke arah masa depan tanpa kata laluan, kata laluan masih akan tersedia bersama dengan kunci laluan."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Pilih tempat untuk menyimpan <xliff:g id="CREATETYPES">%1$s</xliff:g> anda"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Pilih Password Manager untuk menyimpan maklumat anda dan log masuk lebih pantas pada kali seterusnya"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Cipta kunci laluan untuk <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gunakan kunci laluan anda yang telah disimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Gunakan maklumat log masuk anda yang telah disimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Pilih log masuk yang telah disimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Pilih satu pilihan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Log masuk menggunakan cara lain"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Lihat pilihan"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Teruskan"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Urus log masuk"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Daripada peranti lain"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Gunakan peranti yang lain"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Permintaan dibatalkan oleh <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-my/strings.xml b/packages/CredentialManager/res/values-my/strings.xml
index 8bd934d..85ce79e 100644
--- a/packages/CredentialManager/res/values-my/strings.xml
+++ b/packages/CredentialManager/res/values-my/strings.xml
@@ -9,7 +9,7 @@
     <string name="content_description_show_password" msgid="3283502010388521607">"စကားဝှက်ကို ပြရန်"</string>
     <string name="content_description_hide_password" msgid="6841375971631767996">"စကားဝှက်ကို ဖျောက်ရန်"</string>
     <string name="passkey_creation_intro_title" msgid="4251037543787718844">"လျှို့ဝှက်ကီးများဖြင့် ပိုလုံခြုံသည်"</string>
-    <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"လျှို့ဝှက်ကီးများဖြင့် ရှုပ်ထွေးသောစကားဝှက်များကို ပြုလုပ်ရန် (သို့) မှတ်မိရန် မလိုပါ"</string>
+    <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"လျှို့ဝှက်ကီးများသုံးလျှင် ရှုပ်ထွေးသောစကားဝှက်များကို ပြုလုပ်ရန် (သို့) မှတ်မိရန် မလိုပါ"</string>
     <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"လျှို့ဝှက်ကီးများမှာ သင်၏လက်ဗွေ၊ မျက်နှာ (သို့) ဖန်သားပြင်လော့ခ်သုံး၍ ပြုလုပ်ထားသော အသွင်ဝှက်ထားသည့် ဒစ်ဂျစ်တယ်ကီးများ ဖြစ်သည်"</string>
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"၎င်းတို့ကို စကားဝှက်မန်နေဂျာတွင် သိမ်းသဖြင့် အခြားစက်များတွင် လက်မှတ်ထိုးဝင်နိုင်ပါသည်"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"လျှို့ဝှက်ကီးများအကြောင်း ပိုပြရန်"</string>
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"ပိုကောင်းသော အကောင့်လုံခြုံရေး"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"ကီးတစ်ခုစီကို ၎င်းအတွက် ပြုလုပ်ထားသော အက်ပ် (သို့) ဝဘ်ဆိုက်နှင့် သီးသန့်လင့်ခ်ချိတ်ထားသဖြင့် လိမ်လည်သော အက်ပ် (သို့) ဝဘ်ဆိုက်သို့ မည်သည့်အခါတွင်မှ မှားယွင်း၍ လက်မှတ်ထိုးဝင်နိုင်မည်မဟုတ်ပါ။ ထို့အပြင် ဆာဗာသီးသန့် သိမ်းထားသော အများသုံးကီးများကို ဟက်လုပ်ရန် ပိုခက်ခဲသည်။"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"အလိုအလျောက် ကူးပြောင်းခြင်း"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"စကားဝှက်မသုံးသော အနာဂတ်ဆီသို့ ရှေ့ဆက်ရာတွင် လျှို့ဝှက်ကီးများနှင့်အတူ စကားဝှက်များကို ဆက်လက်သုံးနိုင်မည်"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"စကားဝှက်မသုံးခြင်း အနာဂတ်ဆီသို့ ရှေ့ဆက်ရာတွင် လျှို့ဝှက်ကီးများနှင့်အတူ စကားဝှက်များကို ဆက်လက်အသုံးပြုနိုင်ပါမည်။"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"သင်၏ <xliff:g id="CREATETYPES">%1$s</xliff:g> သိမ်းရန်နေရာ ရွေးခြင်း"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"သင့်အချက်အလက်သိမ်းပြီး နောက်တစ်ကြိမ်၌ ပိုမိုမြန်ဆန်စွာ လက်မှတ်ထိုးဝင်ရန် စကားဝှက်မန်နေဂျာကို ရွေးပါ"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> အတွက် လျှို့ဝှက်ကီးပြုလုပ်မလား။"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"သိမ်းထားသောလျှို့ဝှက်ကီးကို <xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သုံးမလား။"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သိမ်းထားသောလက်မှတ်ထိုးဝင်မှု သုံးမလား။"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သိမ်းထားသော လက်မှတ်ထိုးဝင်မှုကို ရွေးပါ"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"နောက်တစ်နည်းဖြင့် လက်မှတ်ထိုးဝင်ရန်"</string>
     <string name="snackbar_action" msgid="37373514216505085">"ရွေးစရာများကို ကြည့်ရန်"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"ရှေ့ဆက်ရန်"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"လက်မှတ်ထိုးဝင်မှုများ စီမံခြင်း"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"စက်နောက်တစ်ခုမှ"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"အခြားစက်သုံးရန်"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"တောင်းဆိုချက်ကို <xliff:g id="APP_NAME">%1$s</xliff:g> က ပယ်ဖျက်လိုက်သည်"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-nb/strings.xml b/packages/CredentialManager/res/values-nb/strings.xml
index 7e722a5..b7f4aa5 100644
--- a/packages/CredentialManager/res/values-nb/strings.xml
+++ b/packages/CredentialManager/res/values-nb/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Forbedret kontosikkerhet"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Hver nøkkel er eksklusivt tilknyttet appen eller nettstedet den er laget for. Dermed kan du aldri logge på falske apper eller nettsteder ved et uhell. Og siden tjenerne bare har offentlige nøkler, blir det mye vanskeligere å hacke deg."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Sømløs overgang"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Vi går mot en fremtid uten passord, men passord fortsetter å være tilgjengelige ved siden av tilgangsnøkler"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Vi går mot en fremtid uten passord, men passord fortsetter å være tilgjengelige ved siden av tilgangsnøkler."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Velg hvor du vil lagre <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Velg et verktøy for passordlagring for å lagre informasjonen din og logge på raskere neste gang"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Vil du opprette en tilgangsnøkkel for <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vil du bruke den lagrede tilgangsnøkkelen for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Vil du bruke den lagrede påloggingen for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Velg en lagret pålogging for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Bruk en annen påloggingsmetode"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Se alternativene"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Fortsett"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Administrer pålogginger"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Fra en annen enhet"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Bruk en annen enhet"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Forespørselen er kansellert av <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ne/strings.xml b/packages/CredentialManager/res/values-ne/strings.xml
index 08bd9b7..d181aa3 100644
--- a/packages/CredentialManager/res/values-ne/strings.xml
+++ b/packages/CredentialManager/res/values-ne/strings.xml
@@ -18,11 +18,11 @@
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"सार्वजनिक कीको क्रिप्टोग्राफी"</string>
     <string name="public_key_cryptography_detail" msgid="6937631710280562213">"FIDO Alliance (जसमा Google, Apple, Microsoft र अन्य कम्पनी सामेल छन्) र W3C ले तोकेका मापदण्डहरूका आधारमा पासकीमा क्रिप्टोग्राफिक जोडी की प्रयोग गरिएको छ। निजी-सार्वजनिक जोडी की कुनै एप वा वेबसाइटका लागि बनाइन्छ। यो जोडी की युजरनेम र हामीले पासवर्डमा प्रयोग गर्ने वर्णहरूको स्ट्रिङभन्दा फरक हुन्छ। निजी की तपाईंको डिभाइस वा पासवर्ड म्यानेजरमा सुरक्षित रूपमा राखिन्छ र यसले तपाईंको पहिचान पुष्टि गर्छ। सार्वजनिक की चाहिँ एप वा वेबसाइटको सर्भरसँग सेयर गरिन्छ। तपाईं यी की प्रयोग गरी तुरुन्तै दर्ता वा साइन इन गर्न सक्नुहुन्छ।"</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"खाताको सुदृढ सुरक्षा"</string>
-    <string name="improved_account_security_detail" msgid="9123750251551844860">"तपाईं कहिले पनि गल्तीले कुनै कपटपूर्ण एप वा वेबसाइटमा लग इन गर्न नसक्नुहोस् भन्नाका लागि हरेक की जुन एप वा वेबसाइटको लागि बनाइएको थियो त्यसलाई खास गरी सोही एप वा वेबसाइटसँग लिंक गरिन्छ। यसका साथै, सर्भरहरूले सार्वजनिक की मात्र राखिराख्ने भएकाले ह्याक गर्न झनै कठिन भएको छ।"</string>
+    <string name="improved_account_security_detail" msgid="9123750251551844860">"तपाईं कहिले पनि गल्तीले कुनै कपटपूर्ण एप वा वेबसाइटमा लग इन गर्न नसक्नुहोस् भन्नाका लागि हरेक की जुन एप वा वेबसाइटको लागि बनाइएको थियो त्यसलाई खास गरी सोही एप वा वेबसाइटसँग लिंक गरिन्छ। यसका साथै, सर्भरहरूले सार्वजनिक की मात्र राख्ने भएकाले ह्याक गर्न झनै कठिन हुन्छ।"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"निर्बाध ट्रान्जिसन"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"हामी पासवर्डरहित भविष्यतर्फ बढ्दै गर्दा पासकीका साथसाथै पासवर्ड पनि उपलब्ध भइरहने छन्"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"हामी पासवर्डरहित भविष्यतर्फ बढ्दै गर्दा पासकीका साथसाथै पासवर्ड पनि उपलब्ध हुने छ।"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"तपाईं आफ्ना <xliff:g id="CREATETYPES">%1$s</xliff:g> कहाँ सेभ गर्न चाहनुहुन्छ भन्ने कुरा छनौट गर्नुहोस्"</string>
-    <string name="choose_provider_body" msgid="4967074531845147434">"कुनै पासवर्ड म्यानेजरमा आफ्नो जानकारी सेभ गरी अर्को पटक अझ छिटो साइन एन गर्नुहोस्"</string>
+    <string name="choose_provider_body" msgid="4967074531845147434">"कुनै पासवर्ड म्यानेजरमा आफ्नो जानकारी सेभ गरी अर्को पटक अझ छिटो साइन इन गर्नुहोस्"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> को पासकी बनाउने हो?"</string>
     <string name="choose_create_option_password_title" msgid="7097275038523578687">"<xliff:g id="APPNAME">%1$s</xliff:g> को पासवर्ड सेभ गर्ने हो?"</string>
     <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> मा साइन गर्न प्रयोग गरिनु पर्ने जानकारी सेभ गर्ने हो?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"आफूले सेभ गरेको पासकी प्रयोग गरी <xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्ने हो?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"आफूले सेभ गरेको साइन इनसम्बन्धी जानकारी प्रयोग गरी <xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्ने हो?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्नका लागि सेभ गरिएका साइन इनसम्बन्धी जानकारी छनौट गर्नुहोस्"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"अर्कै विधि प्रयोग गरी साइन इन गर्नुहोस्"</string>
     <string name="snackbar_action" msgid="37373514216505085">"विकल्पहरू हेर्नुहोस्"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"जारी राख्नुहोस्"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"साइन इनसम्बन्धी विकल्पहरू व्यवस्थापन गर्नुहोस्"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"अर्को डिभाइसका लागि"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"अर्कै डिभाइस प्रयोग गरी हेर्नुहोस्"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले अनुरोध रद्द गरेको छ"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-nl/strings.xml b/packages/CredentialManager/res/values-nl/strings.xml
index f9892b0..c26a8e5 100644
--- a/packages/CredentialManager/res/values-nl/strings.xml
+++ b/packages/CredentialManager/res/values-nl/strings.xml
@@ -16,17 +16,17 @@
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Wachtwoordloze technologie"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"Met een toegangssleutel heb je geen wachtwoord meer nodig om in te loggen. Als je op deze manier wilt inloggen, moet je je identiteit bevestigen met je vingerafdruk, gezichtsherkenning, pincode of swipepatroon en een toegangssleutel maken."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Cryptografie met openbare sleutels"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Toegangssleutels maken gebruik van cryptografische sleutelparen in overeenstemming met de FIDO Alliance (waartoe onder andere Google, Apple en Microsoft behoren) en W3C-standaarden. Anders dan de combinatie van gebruikersnaam en de tekenreeks die het wachtwoord vormt, wordt bij toegangssleutels voor elke app of website een privé/openbaar sleutelpaar gemaakt. De privésleutel wordt beveiligd opgeslagen op je apparaat of in de wachtwoordmanager om je identiteit te bevestigen. De openbare sleutel wordt gedeeld met de server van de app of website. Als de sleutels overeenkomen, kun je je meteen registreren en inloggen."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Toegangssleutels maken gebruik van cryptografische sleutelparen in overeenstemming met de FIDO Alliance (waartoe onder andere Google, Apple en Microsoft behoren) en W3C-standaarden. Anders dan de combinatie van gebruikersnaam en de tekenreeks die het wachtwoord vormt, wordt bij toegangssleutels voor elke app of website een privé/openbaar sleutelpaar gemaakt. De privésleutel wordt beveiligd opgeslagen op je apparaat of in de wachtwoordmanager en bevestigt je identiteit. De openbare sleutel wordt gedeeld met de server van de app of website. Als de sleutels overeenkomen, kun je je meteen registreren en inloggen."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Verbeterde accountbeveiliging"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Elke sleutel is exclusief gekoppeld aan de app of website waarvoor deze is gemaakt. Je kunt dus nooit per ongeluk inloggen bij een bedrieglijke app of website. Bovendien bewaren servers alleen openbare sleutels, wat hacken een stuk lastiger maakt."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Naadloze overgang"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"We zijn op weg naar een wachtwoordloze toekomst, maar naast toegangssleutels kun je nog steeds gebruikmaken van wachtwoorden."</string>
-    <string name="choose_provider_title" msgid="8870795677024868108">"Kies waar je je <xliff:g id="CREATETYPES">%1$s</xliff:g> wilt opslaan"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"We zijn op weg naar een wachtwoordloze toekomst, maar naast toegangssleutels kun je nog steeds gebruikmaken van wachtwoorden."</string>
+    <string name="choose_provider_title" msgid="8870795677024868108">"Kiezen waar je je <xliff:g id="CREATETYPES">%1$s</xliff:g> wilt opslaan"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecteer een wachtwoordmanager om je informatie op te slaan en de volgende keer sneller in te loggen"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Toegangssleutel maken voor <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
     <string name="choose_create_option_password_title" msgid="7097275038523578687">"Wachtwoord opslaan voor <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
     <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Inloggegevens opslaan voor <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="passkey" msgid="632353688396759522">"toegangssleutel"</string>
+    <string name="passkey" msgid="632353688396759522">"Toegangssleutel"</string>
     <string name="password" msgid="6738570945182936667">"wachtwoord"</string>
     <string name="passkeys" msgid="5733880786866559847">"toegangssleutels"</string>
     <string name="passwords" msgid="5419394230391253816">"wachtwoorden"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Je opgeslagen toegangssleutel gebruiken voor <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Je opgeslagen inloggegevens voor <xliff:g id="APP_NAME">%1$s</xliff:g> gebruiken?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Opgeslagen inloggegevens kiezen voor <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Op een andere manier inloggen"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Opties bekijken"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Doorgaan"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Inloggegevens beheren"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Via een ander apparaat"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Een ander apparaat gebruiken"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Verzoek geannuleerd door <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-or/strings.xml b/packages/CredentialManager/res/values-or/strings.xml
index f91f5a1..75cc974 100644
--- a/packages/CredentialManager/res/values-or/strings.xml
+++ b/packages/CredentialManager/res/values-or/strings.xml
@@ -10,7 +10,7 @@
     <string name="content_description_hide_password" msgid="6841375971631767996">"ପାସୱାର୍ଡ ଲୁଚାନ୍ତୁ"</string>
     <string name="passkey_creation_intro_title" msgid="4251037543787718844">"ପାସକୀ ସହ ଅଧିକ ସୁରକ୍ଷିତ"</string>
     <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"ପାସକୀଗୁଡ଼ିକ ସହ ଆପଣଙ୍କୁ ଜଟିଳ ପାସୱାର୍ଡଗୁଡ଼ିକ ତିଆରି କରିବା କିମ୍ବା ମନେରଖିବାର ଆବଶ୍ୟକତା ନାହିଁ"</string>
-    <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"ପାସକୀଗୁଡ଼ିକ ହେଉଛି ଆପଣ ଆପଣଙ୍କ ଟିପଚିହ୍ନ, ଫେସ କିମ୍ବା ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରି ତିଆରି କରୁଥିବା ଏକକ୍ରିପ୍ଟ କରାଯାଇଥିବା ଡିଜିଟାଲ କୀ"</string>
+    <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"ପାସକୀ ହେଉଛି ଏନକ୍ରିପ୍ଟ ହୋଇଥିବା ଡିଜିଟାଲ କୀ\' ଯାହା ଆପଣ ଆପଣଙ୍କ ଟିପଚିହ୍ନ, ଫେସ କିମ୍ବା ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରି ତିଆରି କରନ୍ତି"</string>
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"ସେଗୁଡ଼ିକୁ ଏକ Password Managerରେ ସେଭ କରାଯାଏ, ଯାହା ଫଳରେ ଆପଣ ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକରେ ସାଇନ ଇନ କରିପାରିବେ"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"ପାସକୀଗୁଡ଼ିକ ବିଷୟରେ ଅଧିକ"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"ପାସୱାର୍ଡ ବିହୀନ ଟେକ୍ନୋଲୋଜି"</string>
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"ଉନ୍ନତ ଆକାଉଣ୍ଟ ସୁରକ୍ଷା"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"ପ୍ରତ୍ୟେକ କୀ\'କୁ ସେହି ଆପ କିମ୍ବା ୱେବସାଇଟ ସହ ଏକ୍ସକ୍ଲୁସିଭ ଭାବେ ଲିଙ୍କ କରାଯାଏ ଯେଉଁଥିପାଇଁ ଏହାକୁ ତିଆରି କରାଯାଇଛି, ଫଳରେ ଆପଣ ଭୁଲବଶତଃ କୌଣସି ପ୍ରତାରଣାମୂଳକ ଆପ କିମ୍ବା ୱେବସାଇଟରେ କେବେ ବି ସାଇନ ଇନ କରିପାରିବେ ନାହିଁ। ଏହା ସହ, କେବଳ ସର୍ଭରଗୁଡ଼ିକ ସାର୍ବଜନୀନ କୀ ରଖୁଥିବା ଯୋଗୁଁ ଏହାକୁ ହେକ କରିବା ବହୁତ କଷ୍ଟକର।"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"ବାଧାରହିତ ଟ୍ରାଞ୍ଜିସନ"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"ଆମେ ଏକ ପାସୱାର୍ଡବିହୀନ ଭବିଷ୍ୟତ ଆଡ଼କୁ ମୁଭ କରୁଥିବା ଯୋଗୁଁ ଏବେ ବି ପାସକୀଗୁଡ଼ିକ ସହିତ ପାସୱାର୍ଡ ଉପଲବ୍ଧ ହେବ"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"ଆମେ ଏକ ପାସୱାର୍ଡ ବିହୀନ ଭବିଷ୍ୟତ ଆଡ଼କୁ ମୁଭ କରୁଥିବା ଯୋଗୁଁ ଏବେ ବି ପାସକୀଗୁଡ଼ିକ ସହିତ ପାସୱାର୍ଡ ଉପଲବ୍ଧ ହେବ।"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"ଆପଣଙ୍କ <xliff:g id="CREATETYPES">%1$s</xliff:g> କେଉଁଠାରେ ସେଭ କରିବେ ତାହା ବାଛନ୍ତୁ"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"ଆପଣଙ୍କ ସୂଚନା ସେଭ କରି ପରବର୍ତ୍ତୀ ସମୟରେ ଶୀଘ୍ର ସାଇନ ଇନ କରିବା ପାଇଁ ଏକ Password Manager ଚୟନ କରନ୍ତୁ"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> ପାଇଁ ପାସକୀ ତିଆରି କରିବେ?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ସେଭ କରାଯାଇଥିବା ଆପଣଙ୍କ ପାସକୀ ବ୍ୟବହାର କରିବେ?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ସେଭ କରାଯାଇଥିବା ଆପଣଙ୍କ ସାଇନ-ଇନ ବ୍ୟବହାର କରିବେ?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ସେଭ କରାଯାଇଥିବା ଏକ ସାଇନ-ଇନ ବାଛନ୍ତୁ"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"ଅନ୍ୟ ଏକ ଉପାୟରେ ସାଇନ ଇନ କରନ୍ତୁ"</string>
     <string name="snackbar_action" msgid="37373514216505085">"ବିକଳ୍ପଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"ଜାରି ରଖନ୍ତୁ"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"ସାଇନ-ଇନ ପରିଚାଳନା କରନ୍ତୁ"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"ଅନ୍ୟ ଏକ ଡିଭାଇସରୁ"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"ଏକ ଭିନ୍ନ ଡିଭାଇସ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଦ୍ୱାରା ଅନୁରୋଧ ବାତିଲ ହୋଇଛି"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-pa/strings.xml b/packages/CredentialManager/res/values-pa/strings.xml
index 64c1149..b7797da 100644
--- a/packages/CredentialManager/res/values-pa/strings.xml
+++ b/packages/CredentialManager/res/values-pa/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"ਬਿਹਤਰ ਖਾਤਾ ਸੁਰੱਖਿਆ"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"ਹਰੇਕ ਕੁੰਜੀ ਖਾਸ ਤੌਰ \'ਤੇ ਉਸ ਐਪ ਜਾਂ ਵੈੱਬਸਾਈਟ ਨਾਲ ਲਿੰਕ ਹੁੰਦੀ ਹੈ ਜਿਸ ਲਈ ਉਹ ਬਣਾਈ ਗਈ ਸੀ, ਇਸ ਲਈ ਤੁਸੀਂ ਕਦੇ ਵੀ ਗਲਤੀ ਨਾਲ ਕਿਸੇ ਧੋਖਾਧੜੀ ਵਾਲੀ ਐਪ ਜਾਂ ਵੈੱਬਸਾਈਟ \'ਤੇ ਸਾਈਨ-ਇਨ ਨਹੀਂ ਕਰ ਸਕਦੇ। ਇਸ ਤੋਂ ਇਲਾਵਾ, ਸਿਰਫ਼ ਜਨਤਕ ਕੁੰਜੀਆਂ ਵਾਲੇ ਸਰਵਰਾਂ \'ਤੇ, ਹੈਕਿੰਗ ਕਰਨਾ ਬਹੁਤ ਔਖਾ ਹੁੰਦਾ ਹੈ।"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"ਸਹਿਜ ਪਰਿਵਰਤਨ"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"ਜਿਵੇਂ ਕਿ ਅਸੀਂ ਪਾਸਵਰਡ-ਰਹਿਤ ਭਵਿੱਖ ਵੱਲ ਵਧ ਰਹੇ ਹਾਂ, ਪਰ ਪਾਸਕੀਆਂ ਦੇ ਨਾਲ ਪਾਸਵਰਡ ਹਾਲੇ ਵੀ ਉਪਲਬਧ ਹੋਣਗੇ"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"ਹਾਲਾਂਕਿ, ਅਸੀਂ ਪਾਸਵਰਡ ਰਹਿਤ ਭਵਿੱਖ ਵੱਲ ਵਧ ਰਹੇ ਹਾਂ, ਪਰ ਪਾਸਕੀਆਂ ਦੇ ਨਾਲ ਪਾਸਵਰਡ ਹਾਲੇ ਵੀ ਉਪਲਬਧ ਹੋਣਗੇ।"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"ਚੁਣੋ ਕਿ ਆਪਣੀਆਂ <xliff:g id="CREATETYPES">%1$s</xliff:g> ਨੂੰ ਕਿੱਥੇ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"ਆਪਣੀ ਜਾਣਕਾਰੀ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਅਤੇ ਅਗਲੀ ਵਾਰ ਤੇਜ਼ੀ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਪ੍ਰਬੰਧਕ ਚੁਣੋ"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"ਕੀ <xliff:g id="APPNAME">%1$s</xliff:g> ਲਈ ਪਾਸਕੀ ਬਣਾਉਣੀ ਹੈ?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਆਪਣੀ ਰੱਖਿਅਤ ਕੀਤੀ ਪਾਸਕੀ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਆਪਣੀ ਰੱਖਿਅਤ ਕੀਤੀ ਸਾਈਨ-ਇਨ ਜਾਣਕਾਰੀ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਰੱਖਿਅਤ ਕੀਤੀ ਸਾਈਨ-ਇਨ ਜਾਣਕਾਰੀ ਚੁਣੋ"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"ਕਿਸੇ ਹੋਰ ਤਰੀਕੇ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰੋ"</string>
     <string name="snackbar_action" msgid="37373514216505085">"ਵਿਕਲਪ ਦੇਖੋ"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"ਜਾਰੀ ਰੱਖੋ"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"ਸਾਈਨ-ਇਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"ਹੋਰ ਡੀਵਾਈਸ ਤੋਂ"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"ਵੱਖਰੇ ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਵੱਲੋਂ ਬੇਨਤੀ ਰੱਦ ਕੀਤੀ ਗਈ"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-pl/strings.xml b/packages/CredentialManager/res/values-pl/strings.xml
index 787a3ba..03a547f 100644
--- a/packages/CredentialManager/res/values-pl/strings.xml
+++ b/packages/CredentialManager/res/values-pl/strings.xml
@@ -16,11 +16,11 @@
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Technologia niewymagająca haseł"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"Klucze umożliwiają logowanie się bez konieczności stosowania haseł. Wystarczy użyć odcisku palca, rozpoznawania twarzy, kodu PIN lub wzoru, aby potwierdzić tożsamość i utworzyć klucz."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Kryptografia klucza publicznego"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Zgodnie z zasadami FIDO Alliance (stowarzyszenia zrzeszającego m.in. Google, Apple i Microsoft) oraz standardami W3C klucze opierają się kluczach kryptograficznych. W odróżnieniu od nazw użytkownika i ciągów znaków stanowiących hasła pary kluczy prywatnych i publicznych są tworzone dla konkretnych aplikacji i stron. Klucz prywatny jest bezpiecznie przechowywany na urządzeniu lub w menedżerze haseł i potwierdza Twoją tożsamość. Klucz publiczny jest udostępniany serwerowi aplikacji lub strony. Mając odpowiednie klucze, od razu się zarejestrujesz i zalogujesz."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Zgodnie z zasadami FIDO Alliance (stowarzyszenia zrzeszającego m.in. Google, Apple i Microsoft) oraz standardami W3C klucze opierają się na kluczach kryptograficznych. W odróżnieniu od nazw użytkownika i ciągów znaków stanowiących hasła pary kluczy prywatnych i publicznych są tworzone dla konkretnych aplikacji i stron. Klucz prywatny jest bezpiecznie przechowywany na urządzeniu lub w menedżerze haseł i potwierdza Twoją tożsamość. Klucz publiczny jest udostępniany serwerowi aplikacji lub strony. Mając odpowiednie klucze, od razu się zarejestrujesz i zalogujesz."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Zwiększone bezpieczeństwo konta"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Każdy klucz jest połączony wyłącznie z aplikacją lub stroną, dla której został utworzony, więc nie zalogujesz się przypadkowo w fałszywej aplikacji ani na fałszywej stronie. Ponadto na serwerach są przechowywane wyłącznie klucze publiczne, co znacznie utrudnia hakowanie."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Płynne przechodzenie"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"W czasie przechodzenia na technologie niewymagające haseł możliwość stosowania haseł – niezależnie od kluczy – wciąż będzie dostępna"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"W czasie przechodzenia na technologie niewymagające haseł możliwość stosowania haseł – niezależnie od kluczy – wciąż będzie dostępna."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Wybierz, gdzie zapisywać <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Wybierz menedżera haseł, aby zapisywać informacje i logować się szybciej"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Utworzyć klucz dla aplikacji <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -31,7 +31,7 @@
     <string name="passkeys" msgid="5733880786866559847">"klucze"</string>
     <string name="passwords" msgid="5419394230391253816">"hasła"</string>
     <string name="sign_ins" msgid="4710739369149469208">"dane logowania"</string>
-    <string name="sign_in_info" msgid="2627704710674232328">"informacje dotyczące logowania"</string>
+    <string name="sign_in_info" msgid="2627704710674232328">"dane logowania"</string>
     <string name="save_credential_to_title" msgid="3172811692275634301">"Zapisać <xliff:g id="CREDENTIALTYPES">%1$s</xliff:g> w:"</string>
     <string name="create_passkey_in_other_device_title" msgid="9195411122362461390">"Utworzyć klucz na innym urządzeniu?"</string>
     <string name="use_provider_for_all_title" msgid="4201020195058980757">"Używać usługi <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g> w przypadku wszystkich danych logowania?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Użyć zapisanego klucza dla aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Użyć zapisanych danych logowania dla aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Wybierz zapisane dane logowania dla aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Zaloguj się w inny sposób"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Wyświetl opcje"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Dalej"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Zarządzanie danymi logowania"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Na innym urządzeniu"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Użyj innego urządzenia"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Żądanie anulowane przez aplikację <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-pt-rBR/strings.xml b/packages/CredentialManager/res/values-pt-rBR/strings.xml
index 3250fb0..a7f1de1 100644
--- a/packages/CredentialManager/res/values-pt-rBR/strings.xml
+++ b/packages/CredentialManager/res/values-pt-rBR/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Mais segurança para sua conta"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Cada chave está vinculada exclusivamente ao app ou site para a qual foi criada. Isso impede que você faça login em um app ou site fraudulento por engano. Além disso, os servidores mantêm apenas chaves públicas, dificultando qualquer invasão."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Transição simplificada"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Estamos avançando rumo a um futuro sem senhas, mas elas ainda vão estar disponíveis junto às chaves de acesso"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Estamos avançando em direção a um futuro sem senhas, mas elas ainda vão estar disponíveis junto às chaves de acesso."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Escolha onde salvar suas <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecione um gerenciador de senhas para salvar suas informações e fazer login mais rapidamente na próxima vez"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Criar uma chave de acesso para o app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -49,9 +49,12 @@
     <string name="accessibility_back_arrow_button" msgid="3233198183497842492">"Voltar à página anterior"</string>
     <string name="accessibility_close_button" msgid="1163435587545377687">"Fechar"</string>
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dispensar"</string>
-    <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Usar sua chave de acesso salva para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Usar sua chave de acesso salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Usar suas informações de login salvas para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Escolher um login salvo para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Escolher uma opção para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Fazer login de outra forma"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Conferir opções"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continuar"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Gerenciar logins"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"De outro dispositivo"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Usar um dispositivo diferente"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Solicitação cancelada por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-pt-rPT/strings.xml b/packages/CredentialManager/res/values-pt-rPT/strings.xml
index 9bf350c..8ca0baf1 100644
--- a/packages/CredentialManager/res/values-pt-rPT/strings.xml
+++ b/packages/CredentialManager/res/values-pt-rPT/strings.xml
@@ -14,13 +14,13 @@
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"São guardadas num gestor de palavras-passe para que possa iniciar sessão noutros dispositivos"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"Mais acerca das chaves de acesso"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Tecnologia sem palavras-passe"</string>
-    <string name="passwordless_technology_detail" msgid="6853928846532955882">"As chaves de acesso permitem-lhe iniciar sessão sem depender das palavras-passe. Basta usar a impressão digital, o reconhecimento facial, o PIN ou o padrão de deslize para validar a sua identidade e criar uma token de acesso."</string>
+    <string name="passwordless_technology_detail" msgid="6853928846532955882">"As chaves de acesso permitem-lhe iniciar sessão sem depender das palavras-passe. Basta usar a impressão digital, o reconhecimento facial, o PIN ou o padrão de deslize para validar a sua identidade e criar uma chave de acesso."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Criptografia de chaves públicas"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Baseadas na FIDO Alliance e no W3C, as palavras de acesso usam pares de chaves criptográficas. Ao contrário do nome de utilizador e da string de carateres das palavras-passe, cria-se um par de chaves públicas/privadas para a app ou Website. A chave privada é armazenada de forma segura no dispositivo ou gestor de palavras-passe e confirma a identidade. A chave pública é partilhada com o servidor do Website ou app. Com as chaves correspondentes, pode registar-se e iniciar sessão instantaneamente."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Baseadas na FIDO Alliance e no W3C, as chaves de acesso usam pares de chaves criptográficas. Ao contrário do nome de utilizador e da string de carateres das palavras-passe, cria-se um par de chaves públicas/privadas para a app ou Website. A chave privada é armazenada de forma segura no dispositivo ou gestor de palavras-passe e confirma a identidade. A chave pública é partilhada com o servidor do Website ou app. Com as chaves correspondentes, pode registar-se e iniciar sessão instantaneamente."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Segurança melhorada nas contas"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Cada chave é exclusivamente associada à app ou ao Website para o qual foi criada, por isso, nunca pode iniciar sessão numa app ou num Website fraudulento acidentalmente. Além disso, os servidores só mantêm chaves públicas, o que dificulta a pirataria."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Transição sem complicações"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"À medida que avançamos para um futuro sem palavras-passe, as palavras-passe continuam disponíveis juntamente com as chaves de acesso"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"À medida que avançamos para um futuro sem palavras-passe, as palavras-passe continuam disponíveis juntamente com as chaves de acesso."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Escolha onde guardar as suas <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecione um gestor de palavras-passe para guardar as suas informações e iniciar sessão mais rapidamente da próxima vez"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Criar uma chave de acesso para a app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,8 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Usar a sua chave de acesso guardada na app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Usar o seu início de sessão guardado na app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Escolha um início de sessão guardado para a app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Escolher uma opção para a app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_use_info_on" msgid="8863708099535435146">"Usar estas informações na app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Iniciar sessão de outra forma"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Ver opções"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continuar"</string>
@@ -64,4 +66,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Faça a gestão dos inícios de sessão"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"De outro dispositivo"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Use um dispositivo diferente"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Pedido cancelado pela app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-pt/strings.xml b/packages/CredentialManager/res/values-pt/strings.xml
index 3250fb0..a7f1de1 100644
--- a/packages/CredentialManager/res/values-pt/strings.xml
+++ b/packages/CredentialManager/res/values-pt/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Mais segurança para sua conta"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Cada chave está vinculada exclusivamente ao app ou site para a qual foi criada. Isso impede que você faça login em um app ou site fraudulento por engano. Além disso, os servidores mantêm apenas chaves públicas, dificultando qualquer invasão."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Transição simplificada"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Estamos avançando rumo a um futuro sem senhas, mas elas ainda vão estar disponíveis junto às chaves de acesso"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Estamos avançando em direção a um futuro sem senhas, mas elas ainda vão estar disponíveis junto às chaves de acesso."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Escolha onde salvar suas <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecione um gerenciador de senhas para salvar suas informações e fazer login mais rapidamente na próxima vez"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Criar uma chave de acesso para o app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -49,9 +49,12 @@
     <string name="accessibility_back_arrow_button" msgid="3233198183497842492">"Voltar à página anterior"</string>
     <string name="accessibility_close_button" msgid="1163435587545377687">"Fechar"</string>
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dispensar"</string>
-    <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Usar sua chave de acesso salva para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Usar sua chave de acesso salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Usar suas informações de login salvas para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Escolher um login salvo para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Escolher uma opção para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Fazer login de outra forma"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Conferir opções"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continuar"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Gerenciar logins"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"De outro dispositivo"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Usar um dispositivo diferente"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Solicitação cancelada por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ro/strings.xml b/packages/CredentialManager/res/values-ro/strings.xml
index 96caac73..a9e76de 100644
--- a/packages/CredentialManager/res/values-ro/strings.xml
+++ b/packages/CredentialManager/res/values-ro/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Securitate îmbunătățită a contului"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Fiecare cheie este conectată în mod exclusiv cu aplicația sau site-ul pentru care a fost creată, prin urmare nu te poți conecta niciodată din greșeală la o aplicație sau un site fraudulos. În plus, întrucât pe servere sunt stocate doar chei publice, hackingul este mult mai dificil."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Tranziție fluidă"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Ne îndreptăm spre un viitor fără parole, în care parolele vor fi disponibile pe lângă cheile de acces"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Ne îndreptăm spre un viitor fără parole, însă acestea sunt încă disponibile, alături de cheile de acces."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Alege unde dorești să salvezi <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selectează un manager de parole pentru a salva informațiile și a te conecta mai rapid data viitoare"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Creezi o cheie de acces pentru <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Folosești cheia de acces salvată pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Folosești datele de conectare salvate pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Alege o conectare salvată pentru <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Conectează-te altfel"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Afișează opțiunile"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Continuă"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Gestionează acreditările"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"De pe alt dispozitiv"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Folosește alt dispozitiv"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Solicitare anulată de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ru/strings.xml b/packages/CredentialManager/res/values-ru/strings.xml
index 4e7ff7d..2694fa5 100644
--- a/packages/CredentialManager/res/values-ru/strings.xml
+++ b/packages/CredentialManager/res/values-ru/strings.xml
@@ -10,17 +10,17 @@
     <string name="content_description_hide_password" msgid="6841375971631767996">"Скрыть пароль"</string>
     <string name="passkey_creation_intro_title" msgid="4251037543787718844">"Ключи доступа безопаснее"</string>
     <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"Благодаря ключам доступа вам не придется создавать или запоминать сложные пароли."</string>
-    <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"Ключ доступа – это зашифрованное цифровое удостоверение, которое создается с использованием отпечатка пальца, функции фейсконтроля или блокировки экрана."</string>
+    <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"Ключ доступа – это зашифрованное цифровое удостоверение, которое создается на основе отпечатка пальца, снимка для фейсконтроля, PIN-кода или графического ключа."</string>
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Данные хранятся в менеджере паролей, чтобы вы могли входить в аккаунт на других устройствах."</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"Подробнее о ключах доступа"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Технология аутентификации без пароля"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"Ключи доступа позволяют входить в аккаунт без ввода пароля. Чтобы подтвердить личность и создать ключ доступа, достаточно использовать отпечаток пальца, распознавание по лицу, PIN-код или графический ключ."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Шифрование с помощью открытого ключа"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Согласно стандартам W3C и ассоциации FIDO Alliance (Google, Apple, Microsoft и др.) для создания ключей доступа используются пары криптографических ключей. В приложении или на сайте создается не имя пользователя и пароль, а пара открытого и закрытого ключей. Закрытый ключ хранится на вашем устройстве или в менеджере паролей и нужен для подтверждения личности. Открытый ключ передается приложению или серверу сайта. Подходящие ключи помогают быстро войти в аккаунт или зарегистрироваться."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Согласно стандартам W3C и ассоциации FIDO Alliance (Google, Apple, Microsoft и др.) для создания ключей доступа используются пары ключей шифрования. В приложении или на сайте создается не имя пользователя и пароль, а пара ключей – открытый и закрытый. Закрытый хранится на вашем устройстве или в менеджере паролей и нужен для подтверждения личности, а открытый передается приложению или серверу сайта. Когда ключи соответствуют друг другу, вы можете быстро зарегистрироваться или войти в аккаунт."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Повышенная безопасность аккаунта"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Каждый ключ связан только с тем приложением или сайтом, для которого был создан, поэтому вы не сможете по ошибке войти в приложение или на сайт мошенников. Кроме того, на серверах хранятся только открытые ключи, что служит дополнительной защитой от взлома."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Плавный переход"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Хотя мы движемся к будущему без паролей, их по-прежнему можно будет использовать наряду с ключами доступа."</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Хотя движение к будущему без паролей уже началось, их по-прежнему можно будет использовать наряду с ключами доступа."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Укажите, куда нужно сохранить <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Выберите менеджер паролей, чтобы сохранять учетные данные и быстро выполнять вход."</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Создать ключ доступа для приложения \"<xliff:g id="APPNAME">%1$s</xliff:g>\"?"</string>
@@ -32,7 +32,7 @@
     <string name="passwords" msgid="5419394230391253816">"пароли"</string>
     <string name="sign_ins" msgid="4710739369149469208">"входы"</string>
     <string name="sign_in_info" msgid="2627704710674232328">"учетные данные"</string>
-    <string name="save_credential_to_title" msgid="3172811692275634301">"Сохранить <xliff:g id="CREDENTIALTYPES">%1$s</xliff:g> в"</string>
+    <string name="save_credential_to_title" msgid="3172811692275634301">"Где сохранить <xliff:g id="CREDENTIALTYPES">%1$s</xliff:g>"</string>
     <string name="create_passkey_in_other_device_title" msgid="9195411122362461390">"Создать ключ доступа на другом устройстве?"</string>
     <string name="use_provider_for_all_title" msgid="4201020195058980757">"Всегда входить с помощью приложения \"<xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g>\"?"</string>
     <string name="use_provider_for_all_description" msgid="1998772715863958997">"В этом менеджере паролей пользователь <xliff:g id="USERNAME">%1$s</xliff:g> сможет сохранять пароли и ключи доступа для быстрого входа."</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Использовать сохраненный ключ доступа для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Использовать сохраненные учетные данные для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Выберите сохраненные данные для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Выберите данные для входа в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Войти другим способом"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Показать варианты"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Продолжить"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Управление входом"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"С другого устройства"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Использовать другое устройство"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" отменило запрос."</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-si/strings.xml b/packages/CredentialManager/res/values-si/strings.xml
index 95e326c7..fc0391e 100644
--- a/packages/CredentialManager/res/values-si/strings.xml
+++ b/packages/CredentialManager/res/values-si/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"වැඩිදියුණු කළ ගිණුම් ආරක්ෂාව"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"සෑම යතුරක්ම ඒවා නිර්මාණය කරන ලද යෙදුම හෝ වෙබ් අඩවිය සමග අනන්‍ය වශයෙන්ම සම්බන්ධ කර ඇත, එබැවින් ඔබට කිසි විටෙක වැරදීමකින් වංචනික යෙදුමකට හෝ වෙබ් අඩවියකට පුරනය විය නොහැක. ඊට අමතරව, සේවාදායකයින් පොදු යතුරු තබා ගැනීමත් සමග, අනවසරයෙන් ඇතුළුවීම වඩා දුෂ්කරය."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"බාධාවකින් තොර සංක්‍රමණය"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"අපි මුරපද රහිත අනාගතයක් කරා ගමන් කරන විට, මුරයතුරු සමග මුරපද තවමත් පවතිනු ඇත"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"අපි මුරපද රහිත අනාගතයක් කරා ගමන් කරන විට, මුරයතුරු සමග මුරපද තවමත් පවතී."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"ඔබේ <xliff:g id="CREATETYPES">%1$s</xliff:g> සුරැකිය යුතු ස්ථානය තෝරා ගන්න"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"ඔබේ තතු සුරැකීමට සහ මීළඟ වතාවේ වේගයෙන් පුරනය වීමට මුරපද කළමනාකරුවෙකු තෝරන්න"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> සඳහා මුරයතුර තනන්න ද?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා ඔබේ සුරැකි මුරයතුර භාවිතා කරන්න ද?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා ඔබේ සුරැකි පුරනය භාවිතා කරන්න ද?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා සුරැකි පුරනයක් තෝරා ගන්න"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා විකල්පයක් තෝරන්නද?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"වෙනත් ආකාරයකින් පුරන්න"</string>
     <string name="snackbar_action" msgid="37373514216505085">"විකල්ප බලන්න"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"ඉදිරියට යන්න"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"පුරනය වීම් කළමනාකරණය කරන්න"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"වෙනත් උපාංගයකින්"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"වෙනස් උපාංගයක් භාවිතා කරන්න"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> විසින් ඉල්ලීම අවලංගු කරන ලදී"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-sk/strings.xml b/packages/CredentialManager/res/values-sk/strings.xml
index 48cece1..fd20696 100644
--- a/packages/CredentialManager/res/values-sk/strings.xml
+++ b/packages/CredentialManager/res/values-sk/strings.xml
@@ -10,17 +10,17 @@
     <string name="content_description_hide_password" msgid="6841375971631767996">"Skryť heslo"</string>
     <string name="passkey_creation_intro_title" msgid="4251037543787718844">"Bezpečnejšie s prístupovými kľúčmi"</string>
     <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"Ak máte prístupové kľúče, nemusíte vytvárať ani si pamätať zložité heslá"</string>
-    <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"Prístupové kľúče sú šifrované digitálne kľúče, ktoré môžete vytvoriť odtlačkom prsta, tvárou alebo zámkou obrazovky."</string>
+    <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"Prístupové kľúče sú šifrované digitálne kľúče, ktoré môžete vytvoriť odtlačkom prsta, tvárou alebo zámkou obrazovky"</string>
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Ukladajú sa do správcu hesiel, aby ste sa mohli prihlasovať v iných zariadeniach"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"Viac o prístupových kľúčoch"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Technológia bez hesiel"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"Prístupové kľúče vám umožňujú prihlásiť sa bez použitia hesiel. Stačí overiť totožnosť odtlačkom prsta, rozpoznávaním tváre, kódom PIN alebo vzorom potiahnutia a vytvoriť prístupový kľúč."</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"Kryptografia verejných kľúčov"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Prístup. kľúče firiem patriacich do združenia FIDO (zahŕňajúceho Google, Apple, Microsoft a ďalšie) využívajú páry kryptograf. kľúčov a štandardy W3C. Na rozdiel od použív. mena a reťazca znakov využívaných v prípade hesiel sa pár súkr. a verej. kľúča vytvára pre aplikáciu alebo web. Súkr. kľúč sa bezpečne ukladá v zar. či správcovi hesiel a slúži na overenie totožnosti. Verej. kľúč sa zdieľa so serverom danej aplik. alebo webu. Príslušnými kľúčami sa môžete okamžite registrovať a prihlasovať."</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Prístupové kľúče založené na štandardoch W3C a aliancie FIDO (do ktorej patria Google, Apple, Microsoft a ďalší) používajú páry kryptografických kľúčov. Na rozdiel od používateľského mena a hesla sa pre každú aplikáciu alebo web vytvára jeden pár kľúčov (súkromný a verejný). Súkromný kľúč, bezpečne uložený v zariadení alebo v správcovi hesiel, potvrdzuje vašu identitu. Verejný kľúč sa zdieľa so serverom aplikácie alebo stránky. Vďaka zhodným kľúčom je registrácia a prihlásenie okamžité."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Lepšie zabezpečenie účtu"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Každý kľúč je výhradne prepojený s aplikáciou alebo webom, pre ktorý bol vytvorený, takže sa nikdy nemôžete omylom prihlásiť do podvodnej aplikácie alebo na podvodnom webe. Servery navyše uchovávajú iba verejné kľúče, čím podstatne sťažujú hackovanie."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Plynulý prechod"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Blížime sa k budúcnosti bez hesiel, ale heslá budú popri prístupových kľúčoch stále k dispozícii"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Blížime sa k budúcnosti bez hesiel, ale heslá budú popri prístupových kľúčoch stále k dispozícii."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Vyberte, kam sa majú ukladať <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Vyberte správcu hesiel, do ktorého sa budú ukladať vaše údaje, aby ste sa nabudúce mohli rýchlejšie prihlásiť"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Chcete vytvoriť prístupový kľúč pre aplikáciu <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Chcete pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g> použiť uložený prístupový kľúč?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Chcete pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g> použiť uložené prihlasovacie údaje?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Vyberte uložené prihlasovacie údaje pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Chcete pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g> vybrať možnosť?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Prihlásiť sa inak"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Zobraziť možnosti"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Pokračovať"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Spravovať prihlasovacie údaje"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Z iného zariadenia"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Použiť iné zariadenie"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Požiadavku zrušila aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-sl/strings.xml b/packages/CredentialManager/res/values-sl/strings.xml
index 5fde9ff..36dbf6e 100644
--- a/packages/CredentialManager/res/values-sl/strings.xml
+++ b/packages/CredentialManager/res/values-sl/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Večja varnost računov"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Vsak ključ je neločljivo povezan z aplikacijo ali spletnim mestom, za katero je bil ustvarjen, zato se nikoli ne morete pomotoma prijaviti v goljufivo aplikacijo ali spletno mesto. Poleg tega so v strežnikih shranjeni le javni ključi, zato je vdiranje v račune precej oteženo."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Prehod brez zapletov"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Na poti v prihodnost brez gesel bodo poleg ključev za dostop še vedno v uporabi tudi gesla."</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Na poti v prihodnost brez gesel bodo poleg ključev za dostop še vedno v uporabi tudi gesla."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Izbira mesta za shranjevanje <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Izberite upravitelja gesel za shranjevanje podatkov za prijavo, da se boste naslednjič lahko hitreje prijavili."</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Želite ustvariti ključ za dostop do aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Želite uporabiti shranjeni ključ za dostop do aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Želite uporabiti shranjene podatke za prijavo v aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Izberite shranjene podatke za prijavo v aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Prijava na drug način"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Prikaz možnosti"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Naprej"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Upravljanje podatkov za prijavo"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Iz druge naprave"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Uporaba druge naprave"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Zahtevo je preklicala aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-sq/strings.xml b/packages/CredentialManager/res/values-sq/strings.xml
index 957fd35..a3b29ee 100644
--- a/packages/CredentialManager/res/values-sq/strings.xml
+++ b/packages/CredentialManager/res/values-sq/strings.xml
@@ -11,7 +11,7 @@
     <string name="passkey_creation_intro_title" msgid="4251037543787718844">"Më e sigurt me çelësat e kalimit"</string>
     <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"Me çelësat e kalimit, nuk ka nevojë të krijosh ose të mbash mend fjalëkalime të ndërlikuara"</string>
     <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"Çelësat e kalimit kanë çelësa dixhitalë të enkriptuar që ti i krijon duke përdorur gjurmën e gishtit, fytyrën ose kyçjen e ekranit"</string>
-    <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Ata ruhen te një menaxher fjalëkalimesh, në mënyrë që mund të identifikohesh në pajisje të tjera"</string>
+    <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Ata ruhen te një menaxher fjalëkalimesh, në mënyrë që të mund të identifikohesh në pajisje të tjera"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"Më shumë rreth çelësave të kalimit"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Teknologji pa fjalëkalime"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"Çelësat e kalimit të lejojnë të identifikohesh pa u mbështetur te fjalëkalimet. Të duhet vetëm të përdorësh gjurmën e gishtit, njohjen e fytyrës, PIN-in ose të rrëshqasësh motivin për të verifikuar identitetin dhe për të krijuar një çelës kalimi."</string>
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Siguri e përmirësuar e llogarisë"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Secili çelës është i lidhur ekskluzivisht me aplikacionin ose sajtin e uebit për të cilin është krijuar, kështu që nuk do të identifikohesh asnjëherë gabimisht në një aplikacion ose sajt uebi mashtrues. Gjithashtu, me serverët që mbajnë vetëm çelësa publikë, pirateria informatike është shumë më e vështirë."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Kalim i thjeshtuar"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Teksa shkojmë drejt një të ardhmeje pa fjalëkalime, këto të fundit do të ofrohen ende së bashku me çelësat e kalimit"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Teksa shkojmë drejt një të ardhmeje pa fjalëkalime, këto të fundit do të ofrohen ende së bashku me çelësat e kalimit."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Zgjidh se ku t\'i ruash <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Zgjidh një menaxher fjalëkalimesh për të ruajtur informacionet e tua dhe për t\'u identifikuar më shpejt herën tjetër"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Të krijohet çelësi i kalimit për <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Të përdoret fjalëkalimi yt i ruajtur për <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Të përdoret identifikimi yt i ruajtur për <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Zgjidh një identifikim të ruajtur për <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Të zgjidhet një opsion për <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Identifikohu me një mënyrë tjetër"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Shiko opsionet"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Vazhdo"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Identifikimet e menaxhimit"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Nga një pajisje tjetër"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Përdor një pajisje tjetër"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Kërkesa u anulua nga <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-sr/strings.xml b/packages/CredentialManager/res/values-sr/strings.xml
index b550c1b..698b367 100644
--- a/packages/CredentialManager/res/values-sr/strings.xml
+++ b/packages/CredentialManager/res/values-sr/strings.xml
@@ -20,8 +20,8 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Побољшана безбедност налога"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Сваки кључ је искључиво повезан са апликацијом или веб-сајтом за које је направљен, па никад не можете грешком да се пријавите у апликацију или на веб-сајт који служе за превару. Осим тога, са серверима који чувају само јавне кључеве хаковање је много теже."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Беспрекоран прелаз"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Како се крећемо ка будућности без лозинки, лозинке ће и даље бити доступне уз приступне кодове"</string>
-    <string name="choose_provider_title" msgid="8870795677024868108">"Одаберите где ћете сачувати ставке <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Како се крећемо ка будућности без лозинки, лозинке ће и даље бити доступне уз приступне кодове."</string>
+    <string name="choose_provider_title" msgid="8870795677024868108">"Одаберите где ћете сачувати: <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Изаберите менаџера лозинки да бисте сачували податке и брже се пријавили следећи пут"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Желите да направите приступни кôд за: <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
     <string name="choose_create_option_password_title" msgid="7097275038523578687">"Желите да сачувате лозинку за: <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -32,7 +32,7 @@
     <string name="passwords" msgid="5419394230391253816">"лозинке"</string>
     <string name="sign_ins" msgid="4710739369149469208">"пријављивања"</string>
     <string name="sign_in_info" msgid="2627704710674232328">"подаци за пријављивање"</string>
-    <string name="save_credential_to_title" msgid="3172811692275634301">"Сачувај ставку <xliff:g id="CREDENTIALTYPES">%1$s</xliff:g> у"</string>
+    <string name="save_credential_to_title" msgid="3172811692275634301">"Сачувај <xliff:g id="CREDENTIALTYPES">%1$s</xliff:g> у"</string>
     <string name="create_passkey_in_other_device_title" msgid="9195411122362461390">"Желите да направите приступни кôд на другом уређају?"</string>
     <string name="use_provider_for_all_title" msgid="4201020195058980757">"Желите да за сва пријављивања користите: <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g>?"</string>
     <string name="use_provider_for_all_description" msgid="1998772715863958997">"Овај менаџер лозинки за <xliff:g id="USERNAME">%1$s</xliff:g> ће чувати лозинке и приступне кодове да бисте се лако пријављивали"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Желите да користите сачувани приступни кôд за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Желите да користите сачуване податке за пријављивање за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Одаберите сачувано пријављивање за: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Желите да одаберете опцију за апликацију <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Пријавите се на други начин"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Прикажи опције"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Настави"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Управљајте пријављивањима"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Са другог уређаја"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Користи други уређај"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Захтве је отказала апликација <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-sv/strings.xml b/packages/CredentialManager/res/values-sv/strings.xml
index 440ee6e..5512701 100644
--- a/packages/CredentialManager/res/values-sv/strings.xml
+++ b/packages/CredentialManager/res/values-sv/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Förbättrad kontosäkerhet"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Varje nyckel är exklusivt länkad till appen eller webbplatsen den skapades för, så du kan aldrig logga in i en bedräglig app eller webbplats av misstag. Hackning blir dessutom mycket svårare eftersom servrar bara behåller offentliga nycklar."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"En sömlös övergång"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Medan vi beger oss mot en lösenordslös framtid kommer lösenord fortfarande att vara tillgängliga utöver nycklar"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Medan vi beger oss mot en lösenordslös framtid kommer lösenord fortfarande att vara tillgängliga utöver nycklar."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Välj var du vill spara <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Välj en lösenordshanterare för att spara dina uppgifter och logga in snabbare nästa gång"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Vill du skapa en nyckel för <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vill du använda din sparade nyckel för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Vill du använda dina sparade inloggningsuppgifter för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Välj en sparad inloggning för <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Logga in på ett annat sätt"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Visa alternativ"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Fortsätt"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Hantera inloggningar"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Via en annan enhet"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Använd en annan enhet"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Begäran avbruten av <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-sw/strings.xml b/packages/CredentialManager/res/values-sw/strings.xml
index 6f71ed7..065765d 100644
--- a/packages/CredentialManager/res/values-sw/strings.xml
+++ b/packages/CredentialManager/res/values-sw/strings.xml
@@ -8,19 +8,19 @@
     <string name="string_learn_more" msgid="4541600451688392447">"Pata maelezo zaidi"</string>
     <string name="content_description_show_password" msgid="3283502010388521607">"Onyesha nenosiri"</string>
     <string name="content_description_hide_password" msgid="6841375971631767996">"Ficha nenosiri"</string>
-    <string name="passkey_creation_intro_title" msgid="4251037543787718844">"Ni salama ukitumia funguo za siri"</string>
+    <string name="passkey_creation_intro_title" msgid="4251037543787718844">"Salama zaidi ukitumia funguo za siri"</string>
     <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"Kwa kutumia funguo za siri, huhitaji kuunda au kukumbuka manenosiri changamano"</string>
     <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"Funguo za siri ni funguo dijitali zilizosimbwa kwa njia fiche unazounda kwa kutumia alama yako ya kidole, uso au mbinu ya kufunga skrini"</string>
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"Vyote huhifadhiwa kwenye kidhibiti cha manenosiri, ili uweze kuingia katika akaunti kwenye vifaa vingine"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"Maelezo zaidi kuhusu funguo za siri"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Teknolojia isiyotumia manenosiri"</string>
-    <string name="passwordless_technology_detail" msgid="6853928846532955882">"Funguo za siri zinakuruhusu uingie katika akaunti bila kutegemea manenosiri. Unapaswa tu kutumia alama yako ya kidole, kipengele cha utambuzi wa uso, PIN au mchoro wa kutelezesha ili uthibitishe utambulisho wako na uunde ufunguo wa siri."</string>
-    <string name="public_key_cryptography_title" msgid="6751970819265298039">"Kriptographia ya ufunguo wa umma"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Kulingana na Ushirikiano wa FIDO (unaojumuisha Google, Apple, Microsoft na zaidi) na viwango vya W3C, funguo za siri hutumia jozi ya funguo za kriptografia. Tofauti na jina la mtumiaji na mfuatano wa herufi tunazotumia kwa ajili ya manenosiri, jozi ya funguo binafsi na za umma imeundwa kwa ajili ya programu au tovuti. Ufunguo binafsi unatunzwa kwa usalama kwenye kifaa chako au kidhibiti cha manenosiri na huthibitisha utambulisho wako. Ufunguo wa umma unashirikiwa na seva ya programu au tovuti. Kwa funguo zinazolingana, unaweza kujisajili na kuingia katika akaunti papo hapo."</string>
+    <string name="passwordless_technology_detail" msgid="6853928846532955882">"Funguo za siri zinakuruhusu uingie katika akaunti bila kutegemea manenosiri. Unahitaji tu kutumia alama yako ya kidole, kipengele cha utambuzi wa uso, PIN au mchoro wa kutelezesha ili kuthibitisha utambulisho wako na kuunda ufunguo wa siri."</string>
+    <string name="public_key_cryptography_title" msgid="6751970819265298039">"Kriptografia ya funguo za umma"</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Kulingana na Muungano wa FIDO (unaojumuisha Google, Apple, Microsoft na zaidi) na viwango vya W3C, funguo za siri hutumia jozi ya funguo za kriptografia. Tofauti na jina la mtumiaji na mfuatano wa herufi tunazotumia kwa ajili ya manenosiri, jozi ya funguo binafsi na za umma imeundwa kwa ajili ya programu au tovuti. Ufunguo binafsi hutunzwa kwa usalama kwenye kifaa chako au kidhibiti cha manenosiri na huthibitisha utambulisho wako. Ufunguo wa umma hushirikiwa na seva ya programu au tovuti. Ukiwa na funguo zinazolingana, unaweza kujisajili na kuingia katika akaunti papo hapo."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Ulinzi wa akaunti ulioboreshwa"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Kila ufunguo umeunganishwa kwa upekee na programu au tovuti husika, kwa hivyo kamwe huwezi kuingia katika akaunti ya programu au tovuti ya kilaghai kwa bahati mbaya. Pia, kwa kuwa seva huhifadhi tu funguo za umma, udukuzi si rahisi."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Mabadiliko rahisi"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Tunavyoelekea katika enzi isiyo ya manenosiri, manenosiri yataendelea kupatikana pamoja na funguo za siri"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Tunavyoelekea katika enzi isiyo ya manenosiri, manenosiri yataendelea kupatikana pamoja na funguo za siri."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Chagua ambako unahifadhi <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Chagua kidhibiti cha manenosiri ili uhifadhi taarifa zako na uingie kwenye akaunti kwa urahisi wakati mwingine"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Ungependa kuunda ufunguo wa siri kwa ajili ya <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Ungependa kutumia ufunguo wa siri uliohifadhiwa wa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Ungependa kutumia kitambulisho kilichohifadhiwa cha kuingia katika akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Chagua vitambulisho vilivyohifadhiwa kwa ajili ya kuingia katika akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Ungependa kuteua chaguo la <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Ingia katika akaunti kwa kutumia njia nyingine"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Angalia chaguo"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Endelea"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Dhibiti michakato ya kuingia katika akaunti"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Kutoka kwenye kifaa kingine"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Tumia kifaa tofauti"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Ombi lilighairiwa na <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ta/strings.xml b/packages/CredentialManager/res/values-ta/strings.xml
index 593aac32..9c99f48 100644
--- a/packages/CredentialManager/res/values-ta/strings.xml
+++ b/packages/CredentialManager/res/values-ta/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"மேம்படுத்தப்பட்ட கணக்குப் பாதுகாப்பு"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"ஒவ்வொரு குறியீடும் எந்த ஆப்ஸ்/இணையதளத்திற்காக உருவாக்கப்பட்டதோ அதனுடன் மட்டுமே இணைக்கப்பட்டிருக்கும். இது மோசடியான ஆப்ஸ்/இணையதளத்தில் நீங்கள் தவறுதலாக உள்நுழைவதைத் தடுக்கும். அத்துடன், சேவையகங்களில் பொதுக் குறியீடுகள் மட்டுமே சேமிக்கப்படுவதால் கணக்கை ஹேக் செய்வது மிகக் கடினமாகும்."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"தடையற்ற டிரான்ஸிஷன்"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"கடவுச்சொல்லற்ற எதிர்காலத்தை நோக்கி நாம் பயணிக்கிறோம். கடவுச்சாவிகளைப் பயன்படுத்தும் இதே வேளையில் கடவுச்சொற்களையும் பயன்படுத்த முடியும்"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"கடவுச்சொல்லற்ற எதிர்காலத்தை நோக்கி நாம் பயணிக்கிறோம். கடவுச்சாவிகளைப் பயன்படுத்தும் இதே வேளையில் கடவுச்சொற்களையும் பயன்படுத்த முடியும்."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"உங்கள் <xliff:g id="CREATETYPES">%1$s</xliff:g> எங்கே சேமிக்கப்பட வேண்டும் என்பதைத் தேர்வுசெய்யுங்கள்"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"உங்கள் தகவல்களைச் சேமித்து அடுத்த முறை விரைவாக உள்நுழைய ஒரு கடவுச்சொல் நிர்வாகியைத் தேர்வுசெய்யுங்கள்"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> ஆப்ஸுக்கான கடவுச்சாவியை உருவாக்கவா?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்கு ஏற்கெனவே சேமிக்கப்பட்ட கடவுக்குறியீட்டைப் பயன்படுத்தவா?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்கு ஏற்கெனவே சேமிக்கப்பட்ட உள்நுழைவுத் தகவலைப் பயன்படுத்தவா?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்கு ஏற்கெனவே சேமிக்கப்பட்ட உள்நுழைவுத் தகவலைத் தேர்வுசெய்யவும்"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"வேறு முறையில் உள்நுழைக"</string>
     <string name="snackbar_action" msgid="37373514216505085">"விருப்பங்களைக் காட்டு"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"தொடர்க"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"உள்நுழைவுகளை நிர்வகித்தல்"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"மற்றொரு சாதனத்திலிருந்து பயன்படுத்து"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"வேறு சாதனத்தைப் பயன்படுத்து"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸால் கோரிக்கை ரத்துசெய்யப்பட்டது"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-te/strings.xml b/packages/CredentialManager/res/values-te/strings.xml
index ae6149d..9a9eafd 100644
--- a/packages/CredentialManager/res/values-te/strings.xml
+++ b/packages/CredentialManager/res/values-te/strings.xml
@@ -11,7 +11,7 @@
     <string name="passkey_creation_intro_title" msgid="4251037543787718844">"పాస్-కీలతో సురక్షితంగా పేమెంట్ చేయవచ్చు"</string>
     <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"పాస్-కీలతో, మీరు క్లిష్టమైన పాస్‌వర్డ్‌లను క్రియేట్ చేయనవసరం లేదు లేదా గుర్తుంచుకోనవసరం లేదు"</string>
     <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"పాస్-కీలు అనేవి మీ వేలిముద్రను, ముఖాన్ని లేదా స్క్రీన్ లాక్‌ను ఉపయోగించి మీరు క్రియేట్ చేసే ఎన్‌క్రిప్ట్ చేసిన డిజిటల్ కీలు"</string>
-    <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"అవి Password Managerకు సేవ్ చేయబడతాయి, తద్వారా మీరు ఇతర పరికరాలలో సైన్ ఇన్ చేయవచ్చు"</string>
+    <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"ఏదైనా ఒక పాస్‌వర్డ్ మేనేజర్‌లో అవి సేవ్ అవుతాయి, తద్వారా మీరు ఇతర పరికరాలలో సైన్ ఇన్ చేయవచ్చు"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"పాస్-కీల గురించి మరిన్ని వివరాలు"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"పాస్‌వర్డ్ రహిత టెక్నాలజీ"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"పాస్‌వర్డ్‌లపై ఆధారపడకుండా సైన్ ఇన్ చేయడానికి పాస్-కీలు మిమ్మల్ని అనుమతిస్తాయి. మీ గుర్తింపును వెరిఫై చేసి, పాస్-కీని క్రియేట్ చేయడానికి మీరు మీ వేలిముద్ర, ముఖ గుర్తింపు, PIN, లేదా స్వైప్ ఆకృతిని ఉపయోగించాలి."</string>
@@ -20,9 +20,9 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"మెరుగైన ఖాతా సెక్యూరిటీ"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"ప్రతి కీ దానిని క్రియేట్ చేసిన యాప్ లేదా వెబ్‌సైట్‌తో ప్రత్యేకంగా లింక్ చేయబడి ఉంటుంది, కాబట్టి మీరు పొరపాటున కూడా మోసపూరిత యాప్ లేదా వెబ్‌సైట్‌కు సైన్ ఇన్ చేయలేరు. అంతే కాకుండా, సర్వర్‌లు పబ్లిక్ కీలను మాత్రమే స్టోర్ చేయడం వల్ల, హ్యాకింగ్ చేయడం చాలా కష్టం."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"అవాంతరాలు లేని పరివర్తన"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"మనం భవిష్యత్తులో పాస్‌వర్డ్ రహిత టెక్నాలజీని ఉపయోగించినా, పాస్-కీలతో పాటు పాస్‌వర్డ్‌లు కూడా అందుబాటులో ఉంటాయి"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"మనం భవిష్యత్తులో పాస్‌వర్డ్ రహిత టెక్నాలజీని ఉపయోగించినా, పాస్‌కీలతో పాటు పాస్‌వర్డ్‌లు కూడా అందుబాటులో ఉంటాయి."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"మీ <xliff:g id="CREATETYPES">%1$s</xliff:g> ఎక్కడ సేవ్ చేయాలో ఎంచుకోండి"</string>
-    <string name="choose_provider_body" msgid="4967074531845147434">"మీ సమాచారాన్ని సేవ్ చేయడం కోసం ఒక Password Managerను ఎంచుకొని, తర్వాతిసారి వేగంగా సైన్ ఇన్ చేయండి"</string>
+    <string name="choose_provider_body" msgid="4967074531845147434">"తర్వాతిసారి మరింత వేగంగా సైన్ ఇన్ చేసేందుకు వీలుగా మీ సమాచారాన్ని సేవ్ చేయడం కోసం ఒక పాస్‌వర్డ్ మేనేజర్‌ను ఎంచుకోండి"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> కోసం పాస్‌-కీని క్రియేట్ చేయాలా?"</string>
     <string name="choose_create_option_password_title" msgid="7097275038523578687">"<xliff:g id="APPNAME">%1$s</xliff:g> కోసం పాస్‌వర్డ్‌ను సేవ్ చేయాలా?"</string>
     <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> కోసం సైన్ ఇన్ సమాచారాన్ని సేవ్ చేయాలా?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం మీ సేవ్ చేసిన పాస్-కీని ఉపయోగించాలా?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం మీరు సేవ్ చేసిన సైన్ ఇన్ వివరాలను ఉపయోగించాలా?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం సేవ్ చేసిన సైన్ ఇన్ వివరాలను ఎంచుకోండి"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"మరొక పద్ధతిలో సైన్ ఇన్ చేయండి"</string>
     <string name="snackbar_action" msgid="37373514216505085">"ఆప్షన్‌లను చూడండి"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"కొనసాగించండి"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"సైన్‌ ఇన్‌లను మేనేజ్ చేయండి"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"మరొక పరికరం నుండి"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"వేరే పరికరాన్ని ఉపయోగించండి"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g>, రిక్వెస్ట్‌ను రద్దు చేసింది"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-th/strings.xml b/packages/CredentialManager/res/values-th/strings.xml
index 894befb..0f6ab5a 100644
--- a/packages/CredentialManager/res/values-th/strings.xml
+++ b/packages/CredentialManager/res/values-th/strings.xml
@@ -16,11 +16,11 @@
     <string name="passwordless_technology_title" msgid="2497513482056606668">"เทคโนโลยีที่ไม่ต้องใช้รหัสผ่าน"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"พาสคีย์ช่วยให้คุณลงชื่อเข้าใช้ได้โดยไม่ต้องใช้รหัสผ่าน ใช้เพียงแค่ลายนิ้วมือ, การจดจำใบหน้า, PIN หรือรูปแบบการลากเส้นในการยืนยันตัวตนและสร้างพาสคีย์"</string>
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"วิทยาการเข้ารหัสคีย์สาธารณะ"</string>
-    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"พาสคีย์ใช้คู่คีย์การเข้ารหัสตามมาตรฐานของ FIDO Alliance (เช่น Google, Apple, Microsoft และอื่นๆ) และ W3C คู่คีย์สาธารณะและคีย์ส่วนตัวจะสร้างขึ้นสำหรับแอปหรือเว็บไซต์ที่ใช้งานคีย์ดังกล่าวต่างจากชื่อผู้ใช้และชุดอักขระที่ใช้เป็นรหัสผ่าน โดยระบบจะจัดเก็บคีย์ส่วนตัวไว้ในอุปกรณ์หรือเครื่องมือจัดการรหัสผ่านและใช้คีย์ดังกล่าวเพื่อยืนยันตัวตน ส่วนคีย์สาธารณะจะแชร์กับเซิร์ฟเวอร์ของแอปหรือเว็บไซต์ ลงทะเบียนและลงชื่อเข้าใช้ได้ทันทีด้วยคีย์ที่สอดคล้องกัน"</string>
+    <string name="public_key_cryptography_detail" msgid="6937631710280562213">"พาสคีย์ใช้คู่คีย์การเข้ารหัสตามมาตรฐานของ FIDO Alliance (เช่น Google, Apple, Microsoft และอื่นๆ) และ W3C คู่คีย์สาธารณะและคีย์ส่วนตัวจะสร้างขึ้นสำหรับแอปหรือเว็บไซต์ ซึ่งต่างจากชื่อผู้ใช้และชุดอักขระที่ใช้เป็นรหัสผ่าน โดยระบบจะจัดเก็บคีย์ส่วนตัวไว้อย่างปลอดภัยในอุปกรณ์หรือเครื่องมือจัดการรหัสผ่านและใช้คีย์ดังกล่าวเพื่อยืนยันตัวตน ส่วนคีย์สาธารณะจะแชร์กับเซิร์ฟเวอร์ของแอปหรือเว็บไซต์ คุณลงทะเบียนและลงชื่อเข้าใช้ได้ทันทีด้วยคีย์ที่สอดคล้องกัน"</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"ความปลอดภัยของบัญชีที่เพิ่มมากขึ้น"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"คีย์ที่สร้างขึ้นแต่ละคีย์จะลิงก์กับแอปหรือเว็บไซต์ที่ใช้งานคีย์ดังกล่าวเท่านั้น ดังนั้นจึงไม่มีการลงชื่อเข้าใช้แอปเว็บไซต์ที่เป็นการฉ้อโกงโดยไม่ตั้งใจเกิดขึ้น นอกจากนี้ เซิร์ฟเวอร์จะบันทึกเฉพาะคีย์สาธารณะ จึงทำให้แฮ็กได้ยากขึ้น"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"การเปลี่ยนผ่านอย่างราบรื่น"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"ในขณะที่เราก้าวไปสู่อนาคตที่ไม่ต้องใช้รหัสผ่านนั้น รหัสผ่านจะยังคงใช้ได้อยู่ควบคู่ไปกับการเปลี่ยนไปใช้พาสคีย์"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"ในขณะที่เราก้าวไปสู่อนาคตที่ไม่ต้องใช้รหัสผ่านนั้น รหัสผ่านจะยังคงใช้ได้อยู่ควบคู่ไปกับการเปลี่ยนไปใช้พาสคีย์"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"เลือกว่าต้องการบันทึก<xliff:g id="CREATETYPES">%1$s</xliff:g>ไว้ที่ใด"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"เลือกเครื่องมือจัดการรหัสผ่านเพื่อบันทึกข้อมูลและลงชื่อเข้าใช้เร็วขึ้นในครั้งถัดไป"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"สร้างพาสคีย์สำหรับ <xliff:g id="APPNAME">%1$s</xliff:g> ไหม"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"ใช้พาสคีย์ที่บันทึกไว้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ใช่ไหม"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"ใช้การลงชื่อเข้าใช้ที่บันทึกไว้สำหรับ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" ใช่ไหม"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"เลือกการลงชื่อเข้าใช้ที่บันทึกไว้สำหรับ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"ลงชื่อเข้าใช้ด้วยวิธีอื่น"</string>
     <string name="snackbar_action" msgid="37373514216505085">"ดูตัวเลือก"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"ต่อไป"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"จัดการการลงชื่อเข้าใช้"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"จากอุปกรณ์อื่น"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"ใช้อุปกรณ์อื่น"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"ยกเลิกคำขอแล้วโดย <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-tl/strings.xml b/packages/CredentialManager/res/values-tl/strings.xml
index 27452d6..269d479 100644
--- a/packages/CredentialManager/res/values-tl/strings.xml
+++ b/packages/CredentialManager/res/values-tl/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Pinahusay na seguridad sa account"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Eksklusibong naka-link sa app o website kung para saan ginawa ang bawat key, kaya hindi ka makakapag-sign in sa isang mapanlokong app o website nang hindi sinasadya. Bukod pa rito, dahil mga pampublikong key lang ang itinatabi ng mga server, lubos na mas mahirap ang pag-hack."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Madaling transition"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Habang papalapit tayo sa panahon kung saan hindi na gagamit ng mga password, magiging available pa rin ang mga password kasama ng mga passkey"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Habang lumalayo tayo sa mga password, magiging available pa rin ang mga password kasama ng mga passkey."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Piliin kung saan mo ise-save ang iyong <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Pumili ng password manager para ma-save ang iyong impormasyon at makapag-sign in nang mas mabilis sa susunod na pagkakataon"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Gumawa ng passkey para sa <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gamitin ang iyong naka-save na passkey para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Gamitin ang iyong naka-save na sign-in para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Pumili ng naka-save na sign-in para sa <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Mag-sign in sa ibang paraan"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Mga opsyon sa view"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Magpatuloy"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Pamahalaan ang mga sign-in"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Mula sa ibang device"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Gumamit ng ibang device"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Kinansela ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang kahilingan"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-tr/strings.xml b/packages/CredentialManager/res/values-tr/strings.xml
index 9ef4fc3..857516c 100644
--- a/packages/CredentialManager/res/values-tr/strings.xml
+++ b/packages/CredentialManager/res/values-tr/strings.xml
@@ -20,19 +20,19 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Daha iyi hesap güvenliği"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Her anahtar, oluşturulduğu uygulama veya web sitesiyle özel olarak bağlantılı olduğu için sahte bir uygulamaya veya web sitesine hiçbir zaman yanlışlıkla giriş yapamazsınız. Ayrıca, sunucularda yalnızca ortak anahtarlar saklandığı için saldırıya uğramak daha zordur."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Sorunsuz geçiş"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Şifresiz bir geleceğe doğru ilerlerken şifreler, şifre anahtarlarıyla birlikte kullanılmaya devam edecektir."</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Şifresiz bir geleceğe doğru ilerlerken şifreler, şifre anahtarlarıyla birlikte kullanılmaya devam edecektir."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> kaydedileceği yeri seçin"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Bilgilerinizi kaydedip bir dahaki sefere daha hızlı oturum açmak için bir şifre yöneticisi seçin"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> için şifre anahtarı oluşturulsun mu?"</string>
     <string name="choose_create_option_password_title" msgid="7097275038523578687">"<xliff:g id="APPNAME">%1$s</xliff:g> için şifre kaydedilsin mi?"</string>
     <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> için oturum açma bilgileri kaydedilsin mi?"</string>
-    <string name="passkey" msgid="632353688396759522">"Şifre anahtarının"</string>
-    <string name="password" msgid="6738570945182936667">"şifre"</string>
+    <string name="passkey" msgid="632353688396759522">"Şifre anahtarı"</string>
+    <string name="password" msgid="6738570945182936667">"Şifre"</string>
     <string name="passkeys" msgid="5733880786866559847">"Şifre anahtarlarınızın"</string>
     <string name="passwords" msgid="5419394230391253816">"şifreler"</string>
     <string name="sign_ins" msgid="4710739369149469208">"oturum aç"</string>
-    <string name="sign_in_info" msgid="2627704710674232328">"oturum açma bilgileri"</string>
-    <string name="save_credential_to_title" msgid="3172811692275634301">"<xliff:g id="CREDENTIALTYPES">%1$s</xliff:g> kaydedileceği yeri seçin"</string>
+    <string name="sign_in_info" msgid="2627704710674232328">"Oturum açma bilgileri"</string>
+    <string name="save_credential_to_title" msgid="3172811692275634301">"<xliff:g id="CREDENTIALTYPES">%1$s</xliff:g> nereye kaydedilsin?"</string>
     <string name="create_passkey_in_other_device_title" msgid="9195411122362461390">"Başka bir cihazda şifre anahtarı oluşturulsun mu?"</string>
     <string name="use_provider_for_all_title" msgid="4201020195058980757">"Tüm oturum açma işlemlerinizde <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g> kullanılsın mı?"</string>
     <string name="use_provider_for_all_description" msgid="1998772715863958997">"<xliff:g id="USERNAME">%1$s</xliff:g> için bu şifre yöneticisi, şifrelerinizi ve şifre anahtarlarınızı saklayarak kolayca oturum açmanıza yardımcı olur"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> için kayıtlı şifre anahtarınız kullanılsın mı?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> için kayıtlı oturum açma bilgileriniz kullanılsın mı?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> için kayıtlı oturum açma bilgilerini kullanın"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Başka bir yöntemle oturum aç"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Seçenekleri göster"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Devam"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Oturum açma bilgilerini yönetin"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Başka bir cihazdan"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Farklı bir cihaz kullan"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"İstek, <xliff:g id="APP_NAME">%1$s</xliff:g> tarafından iptal edildi"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-uk/strings.xml b/packages/CredentialManager/res/values-uk/strings.xml
index 3c06556..6684c43 100644
--- a/packages/CredentialManager/res/values-uk/strings.xml
+++ b/packages/CredentialManager/res/values-uk/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Підвищена безпека облікового запису"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Кожен ключ зв’язано виключно з додатком або веб-сайтом, для якого його створено, тому ви ніколи не зможете помилково ввійти в шахрайський додаток чи на шахрайський веб-сайт. Крім того, коли на серверах зберігаються лише відкриті ключі, зламати захист набагато складніше."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Плавний перехід"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"На шляху до безпарольного майбутнього паролі й надалі будуть використовуватися паралельно з ключами"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"На шляху до безпарольного майбутнього паролі й надалі будуть використовуватися паралельно з ключами."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Виберіть, де зберігати <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Виберіть менеджер паролів, щоб зберігати свої дані й надалі входити в облікові записи швидше"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Створити ключ доступу для додатка <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Використати збережений ключ доступу для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Використати збережені дані для входу для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Виберіть збережені дані для входу в додаток <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Увійти іншим способом"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Переглянути варіанти"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Продовжити"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Керування даними для входу"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"З іншого пристрою"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Використовувати інший пристрій"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> скасував запит"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-ur/strings.xml b/packages/CredentialManager/res/values-ur/strings.xml
index 34813ef..0600a8d 100644
--- a/packages/CredentialManager/res/values-ur/strings.xml
+++ b/packages/CredentialManager/res/values-ur/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"بہتر کردہ اکاؤنٹ کی سیکیورٹی"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"ہر کلید خصوصی طور پر اس ایپ یا ویب سائٹ سے منسلک ہے جس کے لیے اسے تخلیق کیا گیا تھا، اس لیے آپ کبھی بھی غلطی سے کسی پر فریب ایپ یا ویب سائٹ میں سائن ان نہیں کر سکتے ہیں۔ اس کے علاوہ، چونکہ سرورز صرف عوامی کلید رکھتے ہیں، اس لیے ہیکنگ بہت مشکل ہے۔"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"آسان ٹرانزیشن"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"چونکہ ہم بغیر پاس ورڈ والے مستقبل کی طرف جا رہے ہیں اس کے باوجود پاس ورڈز پاس کیز کے ساتھ ہی دستیاب ہوں گے"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"چونکہ ہم بغیر پاس ورڈ والے مستقبل کی طرف جا رہے ہیں اس کے باوجود پاس ورڈز پاس کیز کے ساتھ ہی دستیاب ہوں گے۔"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"منتخب کریں کہ آپ کی <xliff:g id="CREATETYPES">%1$s</xliff:g> کو کہاں محفوظ کرنا ہے"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"اپنی معلومات کو محفوظ کرنے اور اگلی بار تیزی سے سائن ان کرنے کے لیے پاس ورڈ مینیجر منتخب کریں"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> کے لیے پاس کی تخلیق کریں؟"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے اپنی محفوظ کردہ پاس کی استعمال کریں؟"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے اپنے محفوظ کردہ سائن ان کو استعمال کریں؟"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے محفوظ کردہ سائن انز منتخب کریں"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے ایک اختیار منتخب کریں؟"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"دوسرے طریقے سے سائن ان کریں"</string>
     <string name="snackbar_action" msgid="37373514216505085">"اختیارات دیکھیں"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"جاری رکھیں"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"سائن انز کا نظم کریں"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"دوسرے آلے سے"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"ایک مختلف آلہ استعمال کریں"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> نے درخواست منسوخ کر دی"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-uz/strings.xml b/packages/CredentialManager/res/values-uz/strings.xml
index 8605993..4a77350 100644
--- a/packages/CredentialManager/res/values-uz/strings.xml
+++ b/packages/CredentialManager/res/values-uz/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Hisob xavfsizligi yaxshilandi"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Har bir kalit faqat ular uchun yaratilgan ilova yoki veb-sayt bilan ulangan, shuning uchun siz hech qachon xatolik bilan soxta ilova yoki veb-saytga kira olmaysiz. Shuningdek, serverlar bilan faqat ochiq kalitlarni saqlagan holda, buzib kirish ancha qiyinroq boʻladi."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Uzluksiz oʻtish"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Parolsiz kelajak sari borayotganimizda, parollar kodlar bilan birga ishlatilishda davom etadi"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Parolsiz kelajak sari borayotganimizda, parollar kodlar bilan birga ishlatilishda davom etadi."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Bu <xliff:g id="CREATETYPES">%1$s</xliff:g> qayerga saqlanishini tanlang"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Maʼlumotlaringizni saqlash va keyingi safar tez kirish uchun parollar menejerini tanlang"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"<xliff:g id="APPNAME">%1$s</xliff:g> uchun kod yaratilsinmi?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun saqlangan kalit ishlatilsinmi?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun saqlangan maʼlumotlar ishlatilsinmi?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"<xliff:g id="APP_NAME">%1$s</xliff:g> hisob maʼlumotlarini tanlang"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Boshqa usul orqali kirish"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Variantlarni ochish"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Davom etish"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Hisob maʼlumotlarini boshqarish"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Boshqa qurilmada"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Boshqa qurilmadan foydalanish"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Soʻrovni <xliff:g id="APP_NAME">%1$s</xliff:g> bekor qilgan"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-vi/strings.xml b/packages/CredentialManager/res/values-vi/strings.xml
index ab0dd59..da3ce4c 100644
--- a/packages/CredentialManager/res/values-vi/strings.xml
+++ b/packages/CredentialManager/res/values-vi/strings.xml
@@ -15,12 +15,12 @@
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"Xem thêm thông tin về mã xác thực"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"Công nghệ không dùng mật khẩu"</string>
     <string name="passwordless_technology_detail" msgid="6853928846532955882">"Mã xác thực cho phép bạn đăng nhập mà không cần dựa vào mật khẩu. Bạn chỉ cần dùng vân tay, tính năng nhận dạng khuôn mặt, mã PIN hoặc hình mở khoá để xác minh danh tính và tạo mã xác thực."</string>
-    <string name="public_key_cryptography_title" msgid="6751970819265298039">"Mật mã của khoá công khai"</string>
+    <string name="public_key_cryptography_title" msgid="6751970819265298039">"Mã hoá khoá công khai"</string>
     <string name="public_key_cryptography_detail" msgid="6937631710280562213">"Dựa trên Liên minh FIDO (bao gồm Google, Apple, Microsoft, v.v.) và tiêu chuẩn W3C, mã xác thực sử dụng cặp khoá mã hoá. Khác với tên người dùng và chuỗi ký tự chúng tôi dùng cho mật khẩu, một cặp khoá riêng tư – công khai được tạo cho một ứng dụng hoặc trang web. Khoá riêng tư được lưu trữ an toàn trên thiết bị hoặc trình quản lý mật khẩu và xác nhận danh tính của bạn. Khoá công khai được chia sẻ với máy chủ ứng dụng hoặc trang web. Với khoá tương ứng, bạn có thể đăng ký và đăng nhập tức thì."</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"Cải thiện tính bảo mật của tài khoản"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Mỗi khoá được liên kết riêng với ứng dụng hoặc trang web mà khoá đó được tạo. Vì vậy, bạn sẽ không bao giờ đăng nhập nhầm vào một ứng dụng hoặc trang web lừa đảo. Ngoài ra, với các máy chủ chỉ lưu giữ khoá công khai, việc xâm nhập càng khó hơn nhiều."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Chuyển đổi liền mạch"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Trong quá trình chúng tôi hướng đến tương lai không dùng mật khẩu, bạn vẫn sẽ dùng được mật khẩu cùng với mã xác thực"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Trong quá trình chúng tôi hướng đến tương lai không dùng mật khẩu, bạn vẫn sẽ dùng được mật khẩu cùng với mã xác thực."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Chọn vị trí lưu <xliff:g id="CREATETYPES">%1$s</xliff:g> của bạn"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Hãy chọn một trình quản lý mật khẩu để lưu thông tin của bạn và đăng nhập nhanh hơn trong lần tới"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Tạo mã xác thực cho <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Dùng mã xác thực bạn đã lưu cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Dùng thông tin đăng nhập bạn đã lưu cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Chọn thông tin đăng nhập đã lưu cho <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Đăng nhập bằng cách khác"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Xem các lựa chọn"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Tiếp tục"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Quản lý thông tin đăng nhập"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Từ một thiết bị khác"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Dùng thiết bị khác"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g> đã huỷ yêu cầu"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-zh-rCN/strings.xml b/packages/CredentialManager/res/values-zh-rCN/strings.xml
index 22944b2..b6338dc 100644
--- a/packages/CredentialManager/res/values-zh-rCN/strings.xml
+++ b/packages/CredentialManager/res/values-zh-rCN/strings.xml
@@ -10,7 +10,7 @@
     <string name="content_description_hide_password" msgid="6841375971631767996">"隐藏密码"</string>
     <string name="passkey_creation_intro_title" msgid="4251037543787718844">"通行密钥可提高安全性"</string>
     <string name="passkey_creation_intro_body_password" msgid="8825872426579958200">"借助通行密钥,您无需创建或记住复杂的密码"</string>
-    <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"通行密钥是指您使用您的指纹、面孔或屏锁方式创建的加密数字钥匙"</string>
+    <string name="passkey_creation_intro_body_fingerprint" msgid="7331338631826254055">"通行密钥是指您使用自己的指纹、面孔或屏锁创建的加密数字钥匙"</string>
     <string name="passkey_creation_intro_body_device" msgid="1203796455762131631">"系统会将通行密钥保存到密码管理工具中,以便您在其他设备上登录"</string>
     <string name="more_about_passkeys_title" msgid="7797903098728837795">"详细了解通行密钥"</string>
     <string name="passwordless_technology_title" msgid="2497513482056606668">"无密码技术"</string>
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"提升了帐号安全性"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"每个密钥都是专为特定应用或网站创建的,且仅与各自对应的网站或应用关联,因此您绝不会错误地登录任何欺诈性应用或网站。另外,由于服务器只保留公钥,黑客入侵的难度会大大增加。"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"无缝转换"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"我们正在迈向一个无密码的未来,但在此过程中,密码仍会与通行密钥并存"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"在我们向无密码未来迈进的过程中,密码仍会与通行密钥并行使用。"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"选择保存<xliff:g id="CREATETYPES">%1$s</xliff:g>的位置"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"请选择一款密码管理工具来保存您的信息,以便下次更快地登录"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"要为“<xliff:g id="APPNAME">%1$s</xliff:g>”创建通行密钥吗?"</string>
@@ -52,6 +52,10 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"要使用您已保存的\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"通行密钥吗?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"将您已保存的登录信息用于<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"为<xliff:g id="APP_NAME">%1$s</xliff:g>选择已保存的登录信息"</string>
+    <!-- no translation found for get_dialog_title_choose_option_for (4976380044745029107) -->
+    <skip />
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"使用其他登录方式"</string>
     <string name="snackbar_action" msgid="37373514216505085">"查看选项"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"继续"</string>
@@ -64,4 +68,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"管理登录信息"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"通过另一台设备"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"使用其他设备"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"<xliff:g id="APP_NAME">%1$s</xliff:g>已取消请求"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-zh-rHK/strings.xml b/packages/CredentialManager/res/values-zh-rHK/strings.xml
index 46f6bad..b4ae8f3 100644
--- a/packages/CredentialManager/res/values-zh-rHK/strings.xml
+++ b/packages/CredentialManager/res/values-zh-rHK/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"提升帳戶安全性"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"系統會為應用程式或網站建立專用的對應金鑰,因此您不會錯誤登入欺詐的應用程式或網站。此外,伺服器上只會保留公開金鑰,因此可大幅降低駭客入侵的風險。"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"流暢轉換"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"我們將會改用無密碼技術,而密碼仍可與密鑰並行使用"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"我們將會改用無密碼技術,而密碼仍可與密鑰並行使用。"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"選擇儲存<xliff:g id="CREATETYPES">%1$s</xliff:g>的位置"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"選取密碼管理工具即可儲存自己的資料,縮短下次登入的時間"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"要為「<xliff:g id="APPNAME">%1$s</xliff:g>」建立密鑰嗎?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"要使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密鑰嗎?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"要使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」登入資料嗎?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"選擇已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」登入資料"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"要選擇適用於「<xliff:g id="APP_NAME">%1$s</xliff:g>」的項目嗎?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"使用其他方式登入"</string>
     <string name="snackbar_action" msgid="37373514216505085">"查看選項"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"繼續"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"管理登入資料"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"透過其他裝置"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"使用其他裝置"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」已取消要求"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-zh-rTW/strings.xml b/packages/CredentialManager/res/values-zh-rTW/strings.xml
index 3a0bf80..a79f7cf 100644
--- a/packages/CredentialManager/res/values-zh-rTW/strings.xml
+++ b/packages/CredentialManager/res/values-zh-rTW/strings.xml
@@ -18,9 +18,9 @@
     <string name="public_key_cryptography_title" msgid="6751970819265298039">"公開金鑰密碼編譯"</string>
     <string name="public_key_cryptography_detail" msgid="6937631710280562213">"密碼金鑰根據 FIDO 聯盟 (包括 Google、Apple、Microsoft 等) 及 W3C 標準,使用加密編譯金鑰組。有別於傳統密碼,系統會針對應用程式或網站建立專屬的私密 - 公開金鑰組,因此你不再需要輸入使用者名稱和一串密碼字元。私密金鑰會安全地儲存在裝置或密碼管理工具中,並用來確認你的身分。公開金鑰會提供給應用程式或網站伺服器。只要有相對應的金鑰,就能立即註冊和登入。"</string>
     <string name="improved_account_security_title" msgid="1069841917893513424">"提升帳戶安全性"</string>
-    <string name="improved_account_security_detail" msgid="9123750251551844860">"系統會為應用程式或網站建立專屬的對應金鑰,因此你不會意外登入詐欺性的應用程式或網站。此外,伺服器上只存放公開金鑰,因此可大幅降低駭客入侵的風險。"</string>
+    <string name="improved_account_security_detail" msgid="9123750251551844860">"系統會為應用程式或網站建立專屬的對應金鑰,因此你不會意外登入詐騙應用程式或網站。此外,伺服器上只存放公開金鑰,可大幅降低駭客入侵的風險。"</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"流暢轉換"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"即使現在已邁入無密碼時代,密碼仍可與密碼金鑰並用"</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"我們日後將改採無密碼技術,密碼仍可與密碼金鑰並行使用。"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"選擇要將<xliff:g id="CREATETYPES">%1$s</xliff:g>存在哪裡"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"選取密碼管理工具並儲存資訊,下次就能更快登入"</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"要為「<xliff:g id="APPNAME">%1$s</xliff:g>」建立密碼金鑰嗎?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"要使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密碼金鑰嗎?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"要使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」登入資訊嗎?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"選擇已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」登入資訊"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"要選擇適用於「<xliff:g id="APP_NAME">%1$s</xliff:g>」的項目嗎?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"使用其他方式登入"</string>
     <string name="snackbar_action" msgid="37373514216505085">"查看選項"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"繼續"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"管理登入資訊"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"透過其他裝置"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"使用其他裝置"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"要求已由 <xliff:g id="APP_NAME">%1$s</xliff:g> 取消"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values-zu/strings.xml b/packages/CredentialManager/res/values-zu/strings.xml
index b834ec0..2a41982 100644
--- a/packages/CredentialManager/res/values-zu/strings.xml
+++ b/packages/CredentialManager/res/values-zu/strings.xml
@@ -20,7 +20,7 @@
     <string name="improved_account_security_title" msgid="1069841917893513424">"Ukuvikeleka kwe-akhawunti okuthuthukisiwe"</string>
     <string name="improved_account_security_detail" msgid="9123750251551844860">"Ukhiye ngamunye olinkwe ngokukhethekile ne-app noma iwebhusayithi usungulelwe yona, ngakho awukwazi ukungena ngemvume ku-app noma kuwebhusayithi yomgunyathi ngephutha. Futhi, ngamaseva agcina okhiye basesidlangalaleni kuphela, ukugebengu be-inthanethi bunzima kakhulu."</string>
     <string name="seamless_transition_title" msgid="5335622196351371961">"Ushintsho olulula"</string>
-    <string name="seamless_transition_detail" msgid="3440478759491650823">"Njengoba siya ekusaseni elingenaphasiwedi, amagama ayimfihlo asazotholakala eceleni kokhiye bokudlula."</string>
+    <string name="seamless_transition_detail" msgid="4475509237171739843">"Njengoba sibhekela kwikusasa elingenaphasiwedi, amagama ayimfihlo asazotholakala eceleni kokhiye bokudlula."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Khetha lapho ongagcina khona i-<xliff:g id="CREATETYPES">%1$s</xliff:g> yakho"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Khetha isiphathi sephasiwedi ukuze ulondoloze ulwazi lwakho futhi ungene ngemvume ngokushesha ngesikhathi esizayo."</string>
     <string name="choose_create_option_passkey_title" msgid="5220979185879006862">"Sungula ukhiye wokudlula we-<xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
@@ -52,6 +52,9 @@
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Sebenzisa ukhiye wakho wokungena olondoloziwe <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="5283099528915572980">"Sebenzisa ukungena kwakho ngemvume okulondoloziwe <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_sign_in_for" msgid="1361715440877613701">"Khetha ukungena ngemvume okulondoloziwe kwakho <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"Khetha ongakhetha kukho kwe-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <!-- no translation found for get_dialog_title_use_info_on (8863708099535435146) -->
+    <skip />
     <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"Ngena ngemvume ngenye indlela"</string>
     <string name="snackbar_action" msgid="37373514216505085">"Buka okungakhethwa kukho"</string>
     <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"Qhubeka"</string>
@@ -64,4 +67,5 @@
     <string name="get_dialog_heading_manage_sign_ins" msgid="3522556476480676782">"Phatha ukungena ngemvume"</string>
     <string name="get_dialog_heading_from_another_device" msgid="1166697017046724072">"Kusukela kwenye idivayisi"</string>
     <string name="get_dialog_option_headline_use_a_different_device" msgid="8201578814988047549">"Sebenzisa idivayisi ehlukile"</string>
+    <string name="request_cancelled_by" msgid="3735222326886267820">"Isicelo sikhanselwe yi-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/CredentialManager/res/values/strings.xml b/packages/CredentialManager/res/values/strings.xml
index 1e0c2cd..e9b2e10 100644
--- a/packages/CredentialManager/res/values/strings.xml
+++ b/packages/CredentialManager/res/values/strings.xml
@@ -42,7 +42,7 @@
   <!-- Title for subsection of "Learn more about passkeys" screen about seamless transition. [CHAR LIMIT=80] -->
   <string name="seamless_transition_title">Seamless transition</string>
   <!-- Detail for subsection of "Learn more about passkeys" screen about seamless transition. [CHAR LIMIT=500] -->
-  <string name="seamless_transition_detail">As we move towards a passwordless future, passwords will still be available alongside passkeys</string>
+  <string name="seamless_transition_detail">As we move towards a passwordless future, passwords will still be available alongside passkeys.</string>
   <!-- This appears as the title of the modal bottom sheet which provides all available providers for users to choose. [CHAR LIMIT=200] -->
   <string name="choose_provider_title">Choose where to save your <xliff:g id="createTypes" example="passkeys">%1$s</xliff:g></string>
   <!-- This appears as the description body of the modal bottom sheet which provides all available providers for users to choose. [CHAR LIMIT=200] -->
@@ -105,6 +105,8 @@
   <string name="get_dialog_title_choose_sign_in_for">Choose a saved sign-in for <xliff:g id="app_name" example="YouTube">%1$s</xliff:g></string>
   <!-- This appears as the title of the dialog asking for user to make a choice from various previously saved credentials to sign in to the app. [CHAR LIMIT=200] -->
   <string name="get_dialog_title_choose_option_for">Choose an option for <xliff:g id="app_name" example="YouTube">%1$s</xliff:g>?</string>
+  <!-- This appears as the title of the dialog asking user to use a previously saved credentials to sign in to the app. [CHAR LIMIT=200] -->
+  <string name="get_dialog_title_use_info_on">Use this info on <xliff:g id="app_name" example="YouTube">%1$s</xliff:g>?</string>
   <!-- This is a label for a button that links the user to different sign-in methods . [CHAR LIMIT=80] -->
   <string name="get_dialog_use_saved_passkey_for">Sign in another way</string>
   <!-- This is a label for a button that links the user to different sign-in methods. [CHAR LIMIT=80] -->
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
index 28f9453..dd4419b 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
@@ -18,14 +18,8 @@
 
 import android.content.Context
 import android.content.Intent
-import android.credentials.CreateCredentialRequest
-import android.credentials.Credential.TYPE_PASSWORD_CREDENTIAL
-import android.credentials.CredentialOption
-import android.credentials.GetCredentialRequest
-import android.credentials.ui.AuthenticationEntry
 import android.credentials.ui.CancelUiRequest
 import android.credentials.ui.Constants
-import android.credentials.ui.Entry
 import android.credentials.ui.CreateCredentialProviderData
 import android.credentials.ui.GetCredentialProviderData
 import android.credentials.ui.DisabledProviderData
@@ -35,23 +29,16 @@
 import android.credentials.ui.ProviderPendingIntentResponse
 import android.credentials.ui.UserSelectionDialogResult
 import android.os.IBinder
-import android.os.Binder
 import android.os.Bundle
 import android.os.ResultReceiver
+import android.util.Log
 import com.android.credentialmanager.createflow.DisabledProviderInfo
 import com.android.credentialmanager.createflow.EnabledProviderInfo
 import com.android.credentialmanager.createflow.RequestDisplayInfo
 import com.android.credentialmanager.getflow.GetCredentialUiState
 import com.android.credentialmanager.getflow.findAutoSelectEntry
-import androidx.credentials.CreateCredentialRequest.DisplayInfo
-import androidx.credentials.CreatePublicKeyCredentialRequest
-import androidx.credentials.CreatePasswordRequest
-import androidx.credentials.GetPasswordOption
-import androidx.credentials.GetPublicKeyCredentialOption
 import com.android.credentialmanager.common.ProviderActivityState
 
-import java.time.Instant
-
 /**
  * Client for interacting with Credential Manager. Also holds data inputs from it.
  *
@@ -63,7 +50,7 @@
     intent: Intent,
     userConfigRepo: UserConfigRepo,
 ) {
-    val requestInfo: RequestInfo
+    val requestInfo: RequestInfo?
     private val providerEnabledList: List<ProviderData>
     private val providerDisabledList: List<DisabledProviderData>?
     // TODO: require non-null.
@@ -75,27 +62,30 @@
         requestInfo = intent.extras?.getParcelable(
             RequestInfo.EXTRA_REQUEST_INFO,
             RequestInfo::class.java
-        ) ?: testGetRequestInfo()
+        )
 
-        val originName: String? = when (requestInfo.type) {
-            RequestInfo.TYPE_CREATE -> requestInfo.createCredentialRequest?.origin
-            RequestInfo.TYPE_GET -> requestInfo.getCredentialRequest?.origin
+        val originName: String? = when (requestInfo?.type) {
+            RequestInfo.TYPE_CREATE -> requestInfo?.createCredentialRequest?.origin
+            RequestInfo.TYPE_GET -> requestInfo?.getCredentialRequest?.origin
             else -> null
         }
 
-        providerEnabledList = when (requestInfo.type) {
+        providerEnabledList = when (requestInfo?.type) {
             RequestInfo.TYPE_CREATE ->
                 intent.extras?.getParcelableArrayList(
                     ProviderData.EXTRA_ENABLED_PROVIDER_DATA_LIST,
                     CreateCredentialProviderData::class.java
-                ) ?: testCreateCredentialEnabledProviderList()
+                ) ?: emptyList()
             RequestInfo.TYPE_GET ->
                 intent.extras?.getParcelableArrayList(
                     ProviderData.EXTRA_ENABLED_PROVIDER_DATA_LIST,
                     GetCredentialProviderData::class.java
-                ) ?: testGetCredentialProviderList()
+                ) ?: emptyList()
             else -> {
-                throw IllegalStateException("Unrecognized request type: ${requestInfo.type}")
+                Log.d(
+                    com.android.credentialmanager.common.Constants.LOG_TAG,
+                    "Unrecognized request type: ${requestInfo?.type}")
+                emptyList()
             }
         }
 
@@ -103,14 +93,19 @@
             intent.extras?.getParcelableArrayList(
                 ProviderData.EXTRA_DISABLED_PROVIDER_DATA_LIST,
                 DisabledProviderData::class.java
-            ) ?: testDisabledProviderList()
+            )
 
         resultReceiver = intent.getParcelableExtra(
             Constants.EXTRA_RESULT_RECEIVER,
             ResultReceiver::class.java
         )
 
-        initialUiState = when (requestInfo.type) {
+        val cancellationRequest = getCancelUiRequest(intent)
+        val cancelUiRequestState = cancellationRequest?.let {
+            CancelUiRequestState(getAppLabel(context.getPackageManager(), it.appPackageName))
+        }
+
+        initialUiState = when (requestInfo?.type) {
             RequestInfo.TYPE_CREATE -> {
                 val defaultProviderId = userConfigRepo.getDefaultProviderId()
                 val isPasskeyFirstUse = userConfigRepo.getIsPasskeyFirstUse()
@@ -128,6 +123,7 @@
                         isPasskeyFirstUse
                     )!!,
                     getCredentialUiState = null,
+                    cancelRequestState = cancelUiRequestState
                 )
             }
             RequestInfo.TYPE_GET -> {
@@ -142,9 +138,20 @@
                     if (autoSelectEntry == null) ProviderActivityState.NOT_APPLICABLE
                     else ProviderActivityState.READY_TO_LAUNCH,
                     isAutoSelectFlow = autoSelectEntry != null,
+                    cancelRequestState = cancelUiRequestState
                 )
             }
-            else -> throw IllegalStateException("Unrecognized request type: ${requestInfo.type}")
+            else -> {
+                if (cancellationRequest != null) {
+                    UiState(
+                        createCredentialUiState = null,
+                        getCredentialUiState = null,
+                        cancelRequestState = cancelUiRequestState,
+                    )
+                } else {
+                    throw IllegalStateException("Unrecognized request type: ${requestInfo?.type}")
+                }
+            }
         }
     }
 
@@ -167,7 +174,7 @@
     }
 
     fun onCancel(cancelCode: Int) {
-        sendCancellationCode(cancelCode, requestInfo.token, resultReceiver)
+        sendCancellationCode(cancelCode, requestInfo?.token, resultReceiver)
     }
 
     fun onOptionSelected(
@@ -178,7 +185,7 @@
         resultData: Intent? = null,
     ) {
         val userSelectionDialogResult = UserSelectionDialogResult(
-            requestInfo.token,
+            requestInfo?.token,
             providerId,
             entryKey,
             entrySubkey,
@@ -206,10 +213,9 @@
 
     // IMPORTANT: new invocation should be mindful that this method can throw.
     private fun getCreateProviderEnableListInitialUiState(): List<EnabledProviderInfo> {
-        val providerEnabledList = CreateFlowUtils.toEnabledProviderList(
+        return CreateFlowUtils.toEnabledProviderList(
             providerEnabledList as List<CreateCredentialProviderData>, context
         )
-        return providerEnabledList
     }
 
     private fun getCreateProviderDisableListInitialUiState(): List<DisabledProviderInfo> {
@@ -238,250 +244,12 @@
             }
         }
 
-        /** Return the request token whose UI should be cancelled, or null otherwise. */
-        fun getCancelUiRequestToken(intent: Intent): IBinder? {
+        /** Return the cancellation request if present. */
+        fun getCancelUiRequest(intent: Intent): CancelUiRequest? {
             return intent.extras?.getParcelable(
                 CancelUiRequest.EXTRA_CANCEL_UI_REQUEST,
                 CancelUiRequest::class.java
-            )?.token
+            )
         }
     }
-
-    // TODO: below are prototype functionalities. To be removed for productionization.
-    private fun testCreateCredentialEnabledProviderList(): List<CreateCredentialProviderData> {
-        return listOf(
-            CreateCredentialProviderData
-                .Builder("io.enpass.app")
-                .setSaveEntries(
-                    listOf<Entry>(
-                        CreateTestUtils.newCreateEntry(
-                            context,
-                            "key1", "subkey-1", "[email protected]",
-                            20, 7, 27, Instant.ofEpochSecond(10L),
-                            "You can use your passkey on this or other devices. It is saved to " +
-                                "the Password Manager for [email protected]."
-                        ),
-                        CreateTestUtils.newCreateEntry(
-                            context,
-                            "key1", "subkey-2", "[email protected]",
-                            20, 7, 27, Instant.ofEpochSecond(12L),
-                            null
-                        ),
-                    )
-                ).setRemoteEntry(
-                    CreateTestUtils.newRemoteCreateEntry(context, "key2", "subkey-1")
-                ).build(),
-            CreateCredentialProviderData
-                .Builder("com.dashlane")
-                .setSaveEntries(
-                    listOf<Entry>(
-                        CreateTestUtils.newCreateEntry(
-                            context,
-                            "key1", "subkey-3", "[email protected]",
-                            20, 7, 27, Instant.ofEpochSecond(11L),
-                            null
-                        ),
-                        CreateTestUtils.newCreateEntry(
-                            context,
-                            "key1", "subkey-4", "[email protected]",
-                            20, 7, 27, Instant.ofEpochSecond(14L),
-                            "You can use your passkey on this or other devices. It is saved to " +
-                                "the Password Manager for [email protected]"
-                        ),
-                    )
-                ).build(),
-        )
-    }
-
-    private fun testDisabledProviderList(): List<DisabledProviderData>? {
-        return listOf(
-            DisabledProviderData("com.lastpass.lpandroid"),
-            DisabledProviderData("com.google.android.youtube")
-        )
-    }
-
-    private fun testGetCredentialProviderList(): List<GetCredentialProviderData> {
-        return listOf(
-            GetCredentialProviderData.Builder("io.enpass.app")
-                .setCredentialEntries(
-                    listOf(
-                        GetTestUtils.newPasswordEntry(
-                            context, "key1", "subkey-1", "[email protected]", null,
-                            Instant.ofEpochSecond(8000L)
-                        ),
-                        GetTestUtils.newPasskeyEntry(
-                            context, "key1", "subkey-1", "[email protected]", "Elisa Beckett",
-                            null
-                        ),
-                        GetTestUtils.newPasswordEntry(
-                            context, "key1", "subkey-2", "[email protected]", null,
-                            Instant.ofEpochSecond(10000L)
-                        ),
-                        GetTestUtils.newPasskeyEntry(
-                            context, "key1", "subkey-3", "[email protected]",
-                            "Elisa Beckett", Instant.ofEpochSecond(500L)
-                        ),
-                    )
-                ).setAuthenticationEntries(
-                    listOf(
-                        GetTestUtils.newAuthenticationEntry(
-                            context, "key2", "subkey-1", "[email protected]",
-                            AuthenticationEntry.STATUS_LOCKED
-                        ),
-                        GetTestUtils.newAuthenticationEntry(
-                            context, "key2", "subkey-2", "[email protected]",
-                            AuthenticationEntry.STATUS_UNLOCKED_BUT_EMPTY_MOST_RECENT
-                        ),
-                    )
-                ).setActionChips(
-                    listOf(
-                        GetTestUtils.newActionEntry(
-                            context, "key3", "subkey-1",
-                            "Open Google Password Manager", "[email protected]"
-                        ),
-                        GetTestUtils.newActionEntry(
-                            context, "key3", "subkey-2",
-                            "Open Google Password Manager", "[email protected]"
-                        ),
-                    )
-                ).setRemoteEntry(
-                    GetTestUtils.newRemoteCredentialEntry(context, "key4", "subkey-1")
-                ).build(),
-            GetCredentialProviderData.Builder("com.dashlane")
-                .setCredentialEntries(
-                    listOf<Entry>(
-                        GetTestUtils.newPasswordEntry(
-                            context, "key1", "subkey-2", "[email protected]", null,
-                            Instant.ofEpochSecond(9000L)
-                        ),
-                        GetTestUtils.newPasswordEntry(
-                            context, "key1", "subkey-3", "[email protected]", null,
-                            Instant.ofEpochSecond(11000L)
-                        ),
-                    )
-                ).setAuthenticationEntries(
-                     listOf(
-                         GetTestUtils.newAuthenticationEntry(
-                             context, "key2", "subkey-1", "[email protected]",
-                             AuthenticationEntry.STATUS_UNLOCKED_BUT_EMPTY_LESS_RECENT,
-                         )
-                     )
-                ).setActionChips(
-                    listOf(
-                        GetTestUtils.newActionEntry(
-                            context, "key3", "subkey-1", "Open Enpass",
-                            "Manage passwords"
-                        ),
-                    )
-                ).build(),
-        )
-    }
-
-    private fun testCreatePasskeyRequestInfo(): RequestInfo {
-        val request = CreatePublicKeyCredentialRequest(
-            "{\"extensions\": {\n" +
-                "                     \"webauthn.loc\": true\n" +
-                "                   },\n" +
-                "                   \"attestation\": \"direct\",\n" +
-                "                   \"challenge\":" +
-                " \"-rSQHXSQUdaK1N-La5bE-JPt6EVAW4SxX1K_tXhZ_Gk\",\n" +
-                "                   \"user\": {\n" +
-                "                     \"displayName\": \"testName\",\n" +
-                "                     \"name\": \"[email protected]\",\n" +
-                "                     \"id\": \"eD4o2KoXLpgegAtnM5cDhhUPvvk2\"\n" +
-                "                   },\n" +
-                "                   \"excludeCredentials\": [],\n" +
-                "                   \"rp\": {\n" +
-                "                     \"name\": \"Address Book\",\n" +
-                "                     \"id\": \"addressbook-c7876.uc.r.appspot.com\"\n" +
-                "                   },\n" +
-                "                   \"timeout\": 60000,\n" +
-                "                   \"pubKeyCredParams\": [\n" +
-                "                     {\n" +
-                "                       \"type\": \"public-key\",\n" +
-                "                       \"alg\": -7\n" +
-                "                     },\n" +
-                "                     {\n" +
-                "                       \"type\": \"public-key\",\n" +
-                "                       \"alg\": -257\n" +
-                "                     },\n" +
-                "                     {\n" +
-                "                       \"type\": \"public-key\",\n" +
-                "                       \"alg\": -37\n" +
-                "                     }\n" +
-                "                   ],\n" +
-                "                   \"authenticatorSelection\": {\n" +
-                "                     \"residentKey\": \"required\",\n" +
-                "                     \"requireResidentKey\": true\n" +
-                "                   }}",
-            preferImmediatelyAvailableCredentials = true,
-        )
-        val credentialData = request.credentialData
-        return RequestInfo.newCreateRequestInfo(
-                Binder(),
-                CreateCredentialRequest.Builder("androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL",
-                credentialData, Bundle())
-                        .setIsSystemProviderRequired(false)
-                        .setAlwaysSendAppInfoToProvider(true)
-                        .build(),
-                "com.google.android.youtube"
-        )
-    }
-
-    private fun testCreatePasswordRequestInfo(): RequestInfo {
-        val request = CreatePasswordRequest("[email protected]", "password123")
-        return RequestInfo.newCreateRequestInfo(
-                Binder(),
-                CreateCredentialRequest.Builder(TYPE_PASSWORD_CREDENTIAL,
-                request.credentialData, request.candidateQueryData)
-                        .setIsSystemProviderRequired(false)
-                        .setAlwaysSendAppInfoToProvider(true)
-                        .build(),
-                "com.google.android.youtube"
-        )
-    }
-
-    private fun testCreateOtherCredentialRequestInfo(): RequestInfo {
-        val data = Bundle()
-        val displayInfo = DisplayInfo("my-username00", "Joe")
-        data.putBundle(
-            "androidx.credentials.BUNDLE_KEY_REQUEST_DISPLAY_INFO",
-            displayInfo.toBundle()
-        )
-        return RequestInfo.newCreateRequestInfo(
-                Binder(),
-                CreateCredentialRequest.Builder("other-sign-ins", data, Bundle())
-                        .setIsSystemProviderRequired(false)
-                        .setAlwaysSendAppInfoToProvider(true)
-                        .build(),
-                "com.google.android.youtube"
-        )
-    }
-
-    private fun testGetRequestInfo(): RequestInfo {
-        val passwordOption = GetPasswordOption()
-        val passkeyOption = GetPublicKeyCredentialOption(
-            "json", preferImmediatelyAvailableCredentials = false)
-        return RequestInfo.newGetRequestInfo(
-            Binder(),
-            GetCredentialRequest.Builder(
-                Bundle()
-            ).addCredentialOption(
-                CredentialOption.Builder(
-                    passwordOption.type,
-                    passwordOption.requestData,
-                    passwordOption.candidateQueryData,
-                ).setIsSystemProviderRequired(passwordOption.isSystemProviderRequired)
-                .build()
-            ).addCredentialOption(
-                CredentialOption.Builder(
-                    passkeyOption.type,
-                    passkeyOption.requestData,
-                    passkeyOption.candidateQueryData,
-                ).setIsSystemProviderRequired(passkeyOption.isSystemProviderRequired)
-                .build()
-            ).build(),
-            "com.google.android.youtube"
-        )
-    }
 }
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt
index 5d72424..24f92c0 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt
@@ -5,7 +5,7 @@
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *      http://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0N
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -30,11 +30,13 @@
 import androidx.compose.material.ExperimentalMaterialApi
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.ui.res.stringResource
 import androidx.lifecycle.viewmodel.compose.viewModel
 import com.android.credentialmanager.common.Constants
 import com.android.credentialmanager.common.DialogState
 import com.android.credentialmanager.common.ProviderActivityResult
 import com.android.credentialmanager.common.StartBalIntentSenderForResultContract
+import com.android.credentialmanager.common.ui.Snackbar
 import com.android.credentialmanager.createflow.CreateCredentialScreen
 import com.android.credentialmanager.createflow.hasContentToDisplay
 import com.android.credentialmanager.getflow.GetCredentialScreen
@@ -49,10 +51,9 @@
         super.onCreate(savedInstanceState)
         Log.d(Constants.LOG_TAG, "Creating new CredentialSelectorActivity")
         try {
-            if (CredentialManagerRepo.getCancelUiRequestToken(intent) != null) {
-                Log.d(
-                    Constants.LOG_TAG, "Received UI cancellation intent; cancelling the activity.")
-                this.finish()
+            val (isCancellationRequest, shouldShowCancellationUi, _) =
+                maybeCancelUIUponRequest(intent)
+            if (isCancellationRequest && !shouldShowCancellationUi) {
                 return
             }
             val userConfigRepo = UserConfigRepo(this)
@@ -73,16 +74,16 @@
     override fun onNewIntent(intent: Intent) {
         super.onNewIntent(intent)
         setIntent(intent)
-        Log.d(Constants.LOG_TAG, "Existing activity received new intent")
         try {
-            val cancelUiRequestToken = CredentialManagerRepo.getCancelUiRequestToken(intent)
             val viewModel: CredentialSelectorViewModel by viewModels()
-            if (cancelUiRequestToken != null &&
-                viewModel.shouldCancelCurrentUi(cancelUiRequestToken)) {
-                Log.d(
-                    Constants.LOG_TAG, "Received UI cancellation intent; cancelling the activity.")
-                this.finish()
-                return
+            val (isCancellationRequest, shouldShowCancellationUi, appDisplayName) =
+                maybeCancelUIUponRequest(intent, viewModel)
+            if (isCancellationRequest) {
+                if (shouldShowCancellationUi) {
+                    viewModel.onCancellationUiRequested(appDisplayName)
+                } else {
+                    return
+                }
             } else {
                 val userConfigRepo = UserConfigRepo(this)
                 val credManRepo = CredentialManagerRepo(this, intent, userConfigRepo)
@@ -93,11 +94,41 @@
         }
     }
 
+    /**
+     * Cancels the UI activity if requested by the backend. Different from the other finishing
+     * helpers, this does not report anything back to the Credential Manager service backend.
+     *
+     * Can potentially show a transient snackbar before finishing, if the request specifies so.
+     *
+     * Returns <isCancellationRequest, shouldShowCancellationUi, appDisplayName>.
+     */
+    private fun maybeCancelUIUponRequest(
+        intent: Intent,
+        viewModel: CredentialSelectorViewModel? = null
+    ): Triple<Boolean, Boolean, String?> {
+        val cancelUiRequest = CredentialManagerRepo.getCancelUiRequest(intent)
+            ?: return Triple(false, false, null)
+        if (viewModel != null && !viewModel.shouldCancelCurrentUi(cancelUiRequest.token)) {
+            // Cancellation was for a different request, don't cancel the current UI.
+            return Triple(true, false, null)
+        }
+        val shouldShowCancellationUi = cancelUiRequest.shouldShowCancellationUi()
+        Log.d(
+            Constants.LOG_TAG, "Received UI cancellation intent. Should show cancellation" +
+            " ui = $shouldShowCancellationUi")
+        val appDisplayName = getAppLabel(packageManager, cancelUiRequest.appPackageName)
+        if (!shouldShowCancellationUi) {
+            this.finish()
+        }
+        return Triple(true, shouldShowCancellationUi, appDisplayName)
+    }
+
+
     @ExperimentalMaterialApi
     @Composable
-    fun CredentialManagerBottomSheet(
+    private fun CredentialManagerBottomSheet(
         credManRepo: CredentialManagerRepo,
-        userConfigRepo: UserConfigRepo
+        userConfigRepo: UserConfigRepo,
     ) {
         val viewModel: CredentialSelectorViewModel = viewModel {
             CredentialSelectorViewModel(credManRepo, userConfigRepo)
@@ -113,7 +144,17 @@
 
         val createCredentialUiState = viewModel.uiState.createCredentialUiState
         val getCredentialUiState = viewModel.uiState.getCredentialUiState
-        if (createCredentialUiState != null && hasContentToDisplay(createCredentialUiState)) {
+        val cancelRequestState = viewModel.uiState.cancelRequestState
+        if (cancelRequestState != null) {
+            if (cancelRequestState.appDisplayName == null) {
+                Log.d(Constants.LOG_TAG, "Received UI cancel request with an invalid package name.")
+                this.finish()
+                return
+            } else {
+                UiCancellationScreen(cancelRequestState.appDisplayName)
+            }
+        } else if (
+            createCredentialUiState != null && hasContentToDisplay(createCredentialUiState)) {
             CreateCredentialScreen(
                 viewModel = viewModel,
                 createCredentialUiState = createCredentialUiState,
@@ -122,15 +163,15 @@
         } else if (getCredentialUiState != null && hasContentToDisplay(getCredentialUiState)) {
             if (isFallbackScreen(getCredentialUiState)) {
                 GetGenericCredentialScreen(
-                        viewModel = viewModel,
-                        getCredentialUiState = getCredentialUiState,
-                        providerActivityLauncher = launcher
+                    viewModel = viewModel,
+                    getCredentialUiState = getCredentialUiState,
+                    providerActivityLauncher = launcher
                 )
             } else {
                 GetCredentialScreen(
-                        viewModel = viewModel,
-                        getCredentialUiState = getCredentialUiState,
-                        providerActivityLauncher = launcher
+                    viewModel = viewModel,
+                    getCredentialUiState = getCredentialUiState,
+                    providerActivityLauncher = launcher
                 )
             }
         } else {
@@ -172,4 +213,13 @@
         )
         this.finish()
     }
+
+    @Composable
+    private fun UiCancellationScreen(appDisplayName: String) {
+        Snackbar(
+            contentText = stringResource(R.string.request_cancelled_by, appDisplayName),
+            onDismiss = { [email protected]() },
+            dismissOnTimeout = true,
+        )
+    }
 }
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
index e49e3f1..29ec970 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
@@ -51,6 +51,11 @@
     // True if the UI has one and only one auto selectable entry. Its provider activity will be
     // launched immediately, and canceling it will cancel the whole UI flow.
     val isAutoSelectFlow: Boolean = false,
+    val cancelRequestState: CancelUiRequestState?,
+)
+
+data class CancelUiRequestState(
+    val appDisplayName: String?,
 )
 
 class CredentialSelectorViewModel(
@@ -64,7 +69,7 @@
 
     init{
         uiMetrics.logNormal(LifecycleEvent.CREDMAN_ACTIVITY_INIT,
-                credManRepo.requestInfo.appPackageName)
+                credManRepo.requestInfo?.appPackageName)
     }
 
     /**************************************************************************/
@@ -76,6 +81,10 @@
         uiState = uiState.copy(dialogState = DialogState.COMPLETE)
     }
 
+    fun onCancellationUiRequested(appDisplayName: String?) {
+        uiState = uiState.copy(cancelRequestState = CancelUiRequestState(appDisplayName))
+    }
+
     /** Close the activity and don't report anything to the backend.
      *  Example use case is the no-auth-info snackbar where the activity should simply display the
      *  UI and then be dismissed. */
@@ -88,10 +97,10 @@
         this.credManRepo = credManRepo
         uiState = credManRepo.initState()
 
-        if (this.credManRepo.requestInfo.token != credManRepo.requestInfo.token) {
+        if (this.credManRepo.requestInfo?.token != credManRepo.requestInfo?.token) {
             this.uiMetrics.resetInstanceId()
             this.uiMetrics.logNormal(LifecycleEvent.CREDMAN_ACTIVITY_NEW_REQUEST,
-                    credManRepo.requestInfo.appPackageName)
+                    credManRepo.requestInfo?.appPackageName)
         }
     }
 
@@ -165,14 +174,14 @@
     private fun onInternalError() {
         Log.w(Constants.LOG_TAG, "UI closed due to illegal internal state")
         this.uiMetrics.logNormal(LifecycleEvent.CREDMAN_ACTIVITY_INTERNAL_ERROR,
-                credManRepo.requestInfo.appPackageName)
+                credManRepo.requestInfo?.appPackageName)
         credManRepo.onParsingFailureCancel()
         uiState = uiState.copy(dialogState = DialogState.COMPLETE)
     }
 
     /** Return true if the current UI's request token matches the UI cancellation request token. */
     fun shouldCancelCurrentUi(cancelRequestToken: IBinder): Boolean {
-        return credManRepo.requestInfo.token.equals(cancelRequestToken)
+        return credManRepo.requestInfo?.token?.equals(cancelRequestToken) ?: false
     }
 
     /**************************************************************************/
@@ -396,6 +405,6 @@
 
     @Composable
     fun logUiEvent(uiEventEnum: UiEventEnum) {
-        this.uiMetrics.log(uiEventEnum, credManRepo.requestInfo.appPackageName)
+        this.uiMetrics.log(uiEventEnum, credManRepo.requestInfo?.appPackageName)
     }
 }
\ No newline at end of file
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt
index b3d3b6d..725401f 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt
@@ -64,7 +64,7 @@
 import org.json.JSONObject
 
 // TODO: remove all !! checks
-private fun getAppLabel(
+fun getAppLabel(
     pm: PackageManager,
     appPackageName: String
 ): String? {
@@ -102,7 +102,7 @@
                 ).toString()
             providerIcon = pkgInfo.applicationInfo.loadIcon(pm)
         } catch (e: PackageManager.NameNotFoundException) {
-            Log.e(Constants.LOG_TAG, "Provider info not found", e)
+            Log.e(Constants.LOG_TAG, "Provider package info not found", e)
         }
     } else {
         try {
@@ -113,7 +113,23 @@
             ).toString()
             providerIcon = si.loadIcon(pm)
         } catch (e: PackageManager.NameNotFoundException) {
-            Log.e(Constants.LOG_TAG, "Provider info not found", e)
+            Log.e(Constants.LOG_TAG, "Provider service info not found", e)
+            // Added for mdoc use case where the provider may not need to register a service and
+            // instead only relies on the registration api.
+            try {
+                val pkgInfo = pm.getPackageInfo(
+                    component.packageName,
+                    PackageManager.PackageInfoFlags.of(0)
+                )
+                providerLabel =
+                    pkgInfo.applicationInfo.loadSafeLabel(
+                        pm, 0f,
+                        TextUtils.SAFE_STRING_FLAG_FIRST_LINE or TextUtils.SAFE_STRING_FLAG_TRIM
+                    ).toString()
+                providerIcon = pkgInfo.applicationInfo.loadIcon(pm)
+            } catch (e: PackageManager.NameNotFoundException) {
+                Log.e(Constants.LOG_TAG, "Provider package info not found", e)
+            }
         }
     }
     return if (providerLabel == null || providerIcon == null) {
@@ -172,11 +188,11 @@
         }
 
         fun toRequestDisplayInfo(
-            requestInfo: RequestInfo,
+            requestInfo: RequestInfo?,
             context: Context,
             originName: String?,
         ): com.android.credentialmanager.getflow.RequestDisplayInfo? {
-            val getCredentialRequest = requestInfo.getCredentialRequest ?: return null
+            val getCredentialRequest = requestInfo?.getCredentialRequest ?: return null
             val preferImmediatelyAvailableCredentials = getCredentialRequest.credentialOptions.any {
                 val credentialOptionJetpack = CredentialOption.createFrom(
                     it.type,
@@ -434,10 +450,13 @@
         }
 
         fun toRequestDisplayInfo(
-            requestInfo: RequestInfo,
+            requestInfo: RequestInfo?,
             context: Context,
             originName: String?,
         ): RequestDisplayInfo? {
+            if (requestInfo == null) {
+                return null
+            }
             val appLabel = originName
                 ?: getAppLabel(context.packageManager, requestInfo.appPackageName)
                 ?: return null
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/TestUtils.kt b/packages/CredentialManager/src/com/android/credentialmanager/TestUtils.kt
deleted file mode 100644
index 1f99500..0000000
--- a/packages/CredentialManager/src/com/android/credentialmanager/TestUtils.kt
+++ /dev/null
@@ -1,252 +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.credentialmanager
-
-import android.app.PendingIntent
-import android.app.slice.Slice
-import android.app.slice.SliceSpec
-import android.content.Context
-import android.content.Intent
-import android.credentials.Credential.TYPE_PASSWORD_CREDENTIAL
-import android.credentials.ui.AuthenticationEntry
-import android.credentials.ui.Entry
-import android.net.Uri
-import android.os.Bundle
-import android.provider.Settings
-import androidx.credentials.provider.BeginGetPasswordOption
-import androidx.credentials.provider.BeginGetPublicKeyCredentialOption
-import androidx.credentials.provider.CreateEntry
-import androidx.credentials.provider.PasswordCredentialEntry
-import androidx.credentials.provider.PublicKeyCredentialEntry
-import androidx.credentials.provider.RemoteEntry
-
-import java.time.Instant
-
-// TODO: remove once testing is complete
-class GetTestUtils {
-    companion object {
-        internal fun newAuthenticationEntry(
-            context: Context,
-            key: String,
-            subkey: String,
-            title: String,
-            status: Int
-        ): AuthenticationEntry {
-            val slice = Slice.Builder(
-                Uri.EMPTY, SliceSpec("AuthenticationAction", 0)
-            )
-            val intent = Intent(Settings.ACTION_SYNC_SETTINGS)
-            val pendingIntent =
-                PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
-            slice.addAction(
-                pendingIntent,
-                Slice.Builder(slice)
-                    .addHints(listOf("androidx.credentials.provider.authenticationAction" +
-                        ".SLICE_HINT_PENDING_INTENT"))
-                    .build(),
-                /*subType=*/null
-            )
-            slice.addText(
-                title,
-                null,
-                listOf("androidx.credentials.provider.authenticationAction.SLICE_HINT_TITLE")
-            )
-            return AuthenticationEntry(
-                key,
-                subkey,
-                slice.build(),
-                status
-            )
-        }
-
-        internal fun newRemoteCredentialEntry(
-            context: Context,
-            key: String,
-            subkey: String,
-        ): Entry {
-            val intent = Intent(Settings.ACTION_SYNC_SETTINGS)
-            val pendingIntent =
-                PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
-            return Entry(
-                key,
-                subkey,
-                RemoteEntry.toSlice(RemoteEntry(pendingIntent))
-            )
-        }
-
-        internal fun newActionEntry(
-            context: Context,
-            key: String,
-            subkey: String,
-            text: String,
-            subtext: String? = null,
-        ): Entry {
-            val intent = Intent(Settings.ACTION_SYNC_SETTINGS)
-            val pendingIntent =
-                PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
-            val sliceBuilder = Slice.Builder(Uri.EMPTY, SliceSpec("Action", 0))
-                .addText(
-                    text, /*subType=*/null,
-                    listOf("androidx.credentials.provider.action.HINT_ACTION_TITLE")
-                )
-                .addText(
-                    subtext, /*subType=*/null,
-                    listOf("androidx.credentials.provider.action.HINT_ACTION_SUBTEXT")
-                )
-            sliceBuilder.addAction(
-                pendingIntent,
-                Slice.Builder(sliceBuilder)
-                    .addHints(
-                        listOf("androidx.credentials.provider.action.SLICE_HINT_PENDING_INTENT")
-                    )
-                    .build(),
-                /*subType=*/null
-            )
-            return Entry(
-                key,
-                subkey,
-                sliceBuilder.build()
-            )
-        }
-
-        internal fun newPasswordEntry(
-            context: Context,
-            key: String,
-            subkey: String,
-            userName: String,
-            userDisplayName: String?,
-            lastUsedTime: Instant?,
-        ): Entry {
-            val intent = Intent("com.androidauth.androidvault.CONFIRM_PASSWORD")
-                .setPackage("com.androidauth.androidvault")
-            intent.putExtra("provider_extra_sample", "testprovider")
-            val pendingIntent = PendingIntent.getActivity(
-                context, 1,
-                intent, (PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
-                or PendingIntent.FLAG_ONE_SHOT)
-            )
-            val passwordEntry = PasswordCredentialEntry.Builder(
-                context, userName, pendingIntent, BeginGetPasswordOption(Bundle(), "id"))
-                .setDisplayName(userDisplayName).setLastUsedTime(lastUsedTime).build()
-            return Entry(key, subkey, passwordEntry.slice, Intent())
-        }
-
-        internal fun newPasskeyEntry(
-            context: Context,
-            key: String,
-            subkey: String,
-            userName: String,
-            userDisplayName: String?,
-            lastUsedTime: Instant?,
-            isAutoSelectAllowed: Boolean = false,
-        ): Entry {
-            val intent = Intent(Settings.ACTION_SYNC_SETTINGS)
-            val pendingIntent =
-                PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
-            val candidateQueryData = Bundle()
-            candidateQueryData.putBoolean(
-                "androidx.credentials.BUNDLE_KEY_IS_AUTO_SELECT_ALLOWED",
-                isAutoSelectAllowed
-            )
-            val passkeyEntry = PublicKeyCredentialEntry.Builder(
-                context,
-                userName,
-                pendingIntent,
-                BeginGetPublicKeyCredentialOption(candidateQueryData, "id", "requestjson")
-            ).setDisplayName(userDisplayName).setLastUsedTime(lastUsedTime)
-                .setAutoSelectAllowed(isAutoSelectAllowed).build()
-            return Entry(key, subkey, passkeyEntry.slice, Intent())
-        }
-    }
-}
-
-class CreateTestUtils {
-    companion object {
-        private const val TYPE_TOTAL_CREDENTIAL = "TOTAL_CREDENTIAL_COUNT_TYPE"
-        private const val SLICE_HINT_ACCOUNT_NAME =
-            "androidx.credentials.provider.createEntry.SLICE_HINT_USER_PROVIDER_ACCOUNT_NAME"
-        private const val SLICE_HINT_NOTE =
-            "androidx.credentials.provider.createEntry.SLICE_HINT_NOTE"
-        private const val SLICE_HINT_ICON =
-            "androidx.credentials.provider.createEntry.SLICE_HINT_PROFILE_ICON"
-        private const val SLICE_HINT_CREDENTIAL_COUNT_INFORMATION =
-            "androidx.credentials.provider.createEntry.SLICE_HINT_CREDENTIAL_COUNT_INFORMATION"
-        private const val SLICE_HINT_LAST_USED_TIME_MILLIS =
-            "androidx.credentials.provider.createEntry.SLICE_HINT_LAST_USED_TIME_MILLIS"
-        private const val SLICE_HINT_PENDING_INTENT =
-            "androidx.credentials.provider.createEntry.SLICE_HINT_PENDING_INTENT"
-
-        internal fun newCreateEntry(
-            context: Context,
-            key: String,
-            subkey: String,
-            providerUserDisplayName: String,
-            passwordCount: Int?,
-            passkeyCount: Int?,
-            totalCredentialCount: Int?,
-            lastUsedTime: Instant?,
-            footerDescription: String?,
-        ): Entry {
-            val intent = Intent("com.androidauth.androidvault.CONFIRM_PASSWORD")
-                .setPackage("com.androidauth.androidvault")
-            intent.putExtra("provider_extra_sample", "testprovider")
-            val pendingIntent = PendingIntent.getActivity(
-                context, 1,
-                intent, (PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
-                or PendingIntent.FLAG_ONE_SHOT)
-            )
-            val credCountMap = mutableMapOf<String, Int>()
-            passwordCount?.let { credCountMap.put(TYPE_PASSWORD_CREDENTIAL, it) }
-            passkeyCount?.let {
-                credCountMap.put("androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL", it)
-            }
-            totalCredentialCount?.let { credCountMap.put(TYPE_TOTAL_CREDENTIAL, it) }
-            return Entry(
-                key,
-                subkey,
-                CreateEntry.toSlice(
-                    CreateEntry(
-                            accountName = providerUserDisplayName,
-                            pendingIntent = pendingIntent,
-                            description = footerDescription,
-                            lastUsedTime = lastUsedTime,
-                            icon = null,
-                            passwordCredentialCount = passwordCount,
-                            publicKeyCredentialCount = passkeyCount,
-                            totalCredentialCount = totalCredentialCount,
-                    )
-                ),
-                Intent()
-            )
-        }
-
-        internal fun newRemoteCreateEntry(
-            context: Context,
-            key: String,
-            subkey: String,
-        ): Entry {
-            val intent = Intent(Settings.ACTION_SYNC_SETTINGS)
-            val pendingIntent =
-                PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
-            return Entry(
-                key,
-                subkey,
-                RemoteEntry.toSlice(RemoteEntry(pendingIntent))
-            )
-        }
-    }
-}
\ No newline at end of file
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt
index edc902e..53731f0 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt
@@ -22,6 +22,7 @@
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import com.android.compose.rememberSystemUiController
 import com.android.credentialmanager.common.material.ModalBottomSheetLayout
 import com.android.credentialmanager.common.material.ModalBottomSheetValue
 import com.android.credentialmanager.common.material.rememberModalBottomSheetState
@@ -38,6 +39,12 @@
         initialValue = ModalBottomSheetValue.Expanded,
         skipHalfExpanded = true
     )
+    val sysUiController = rememberSystemUiController()
+    if (state.targetValue == ModalBottomSheetValue.Hidden) {
+        setTransparentSystemBarsColor(sysUiController)
+    } else {
+        setBottomSheetSystemBarsColor(sysUiController)
+    }
     ModalBottomSheetLayout(
         sheetBackgroundColor = LocalAndroidColorScheme.current.colorSurfaceBright,
         modifier = Modifier.background(Color.Transparent),
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/SnackBar.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/SnackBar.kt
index 514ff90..244b604 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/SnackBar.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/SnackBar.kt
@@ -30,21 +30,28 @@
 import androidx.compose.material3.IconButton
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalAccessibilityManager
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
+import com.android.compose.rememberSystemUiController
 import com.android.credentialmanager.R
 import com.android.credentialmanager.common.material.Scrim
 import com.android.credentialmanager.ui.theme.Shapes
+import kotlinx.coroutines.delay
 
 @Composable
 fun Snackbar(
     contentText: String,
     action: (@Composable () -> Unit)? = null,
     onDismiss: () -> Unit,
+    dismissOnTimeout: Boolean = false,
 ) {
+    val sysUiController = rememberSystemUiController()
+    setTransparentSystemBarsColor(sysUiController)
     BoxWithConstraints {
         Box(Modifier.fillMaxSize()) {
             Scrim(
@@ -89,4 +96,20 @@
             }
         }
     }
+    val accessibilityManager = LocalAccessibilityManager.current
+    LaunchedEffect(true) {
+        if (dismissOnTimeout) {
+            // Same as SnackbarDuration.Short
+            val originalDuration = 4000L
+            val duration = if (accessibilityManager == null) originalDuration else
+                accessibilityManager.calculateRecommendedTimeoutMillis(
+                    originalDuration,
+                    containsIcons = true,
+                    containsText = true,
+                    containsControls = action != null,
+                )
+            delay(duration)
+            onDismiss()
+        }
+    }
 }
\ No newline at end of file
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt
index 7b98049..648d832 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt
@@ -46,7 +46,6 @@
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.core.graphics.drawable.toBitmap
-import com.android.compose.rememberSystemUiController
 import com.android.credentialmanager.CredentialSelectorViewModel
 import com.android.credentialmanager.R
 import com.android.credentialmanager.common.BaseEntry
@@ -67,7 +66,6 @@
 import com.android.credentialmanager.common.ui.SheetContainerCard
 import com.android.credentialmanager.common.ui.PasskeyBenefitRow
 import com.android.credentialmanager.common.ui.HeadlineText
-import com.android.credentialmanager.common.ui.setBottomSheetSystemBarsColor
 import com.android.credentialmanager.logging.CreateCredentialEvent
 import com.android.internal.logging.UiEventLogger.UiEventEnum
 
@@ -77,8 +75,6 @@
     createCredentialUiState: CreateCredentialUiState,
     providerActivityLauncher: ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult>
 ) {
-    val sysUiController = rememberSystemUiController()
-    setBottomSheetSystemBarsColor(sysUiController)
     ModalBottomSheet(
         sheetContent = {
             // Hide the sheet content as opposed to the whole bottom sheet to maintain the scrim
@@ -296,7 +292,11 @@
         }
         item { Divider(thickness = 24.dp, color = Color.Transparent) }
 
-        item { BodyMediumText(text = stringResource(R.string.choose_provider_body)) }
+        item {
+            Row(modifier = Modifier.fillMaxWidth().wrapContentHeight()) {
+                BodyMediumText(text = stringResource(R.string.choose_provider_body))
+            }
+        }
         item { Divider(thickness = 16.dp, color = Color.Transparent) }
         item {
             CredentialContainerCard {
@@ -444,8 +444,10 @@
         }
         item { Divider(thickness = 24.dp, color = Color.Transparent) }
         item {
-            BodyMediumText(text = stringResource(
-                R.string.use_provider_for_all_description, entryInfo.userProviderDisplayName))
+            Row(modifier = Modifier.fillMaxWidth().wrapContentHeight()) {
+                BodyMediumText(text = stringResource(
+                    R.string.use_provider_for_all_description, entryInfo.userProviderDisplayName))
+            }
         }
         item { Divider(thickness = 24.dp, color = Color.Transparent) }
         item {
@@ -626,25 +628,33 @@
             MoreAboutPasskeySectionHeader(
                 text = stringResource(R.string.passwordless_technology_title)
             )
-            BodyMediumText(text = stringResource(R.string.passwordless_technology_detail))
+            Row(modifier = Modifier.fillMaxWidth().wrapContentHeight()) {
+                BodyMediumText(text = stringResource(R.string.passwordless_technology_detail))
+            }
         }
         item {
             MoreAboutPasskeySectionHeader(
                 text = stringResource(R.string.public_key_cryptography_title)
             )
-            BodyMediumText(text = stringResource(R.string.public_key_cryptography_detail))
+            Row(modifier = Modifier.fillMaxWidth().wrapContentHeight()) {
+                BodyMediumText(text = stringResource(R.string.public_key_cryptography_detail))
+            }
         }
         item {
             MoreAboutPasskeySectionHeader(
                 text = stringResource(R.string.improved_account_security_title)
             )
-            BodyMediumText(text = stringResource(R.string.improved_account_security_detail))
+            Row(modifier = Modifier.fillMaxWidth().wrapContentHeight()) {
+                BodyMediumText(text = stringResource(R.string.improved_account_security_detail))
+            }
         }
         item {
             MoreAboutPasskeySectionHeader(
                 text = stringResource(R.string.seamless_transition_title)
             )
-            BodyMediumText(text = stringResource(R.string.seamless_transition_detail))
+            Row(modifier = Modifier.fillMaxWidth().wrapContentHeight()) {
+                BodyMediumText(text = stringResource(R.string.seamless_transition_detail))
+            }
         }
     }
     onLog(CreateCredentialEvent.CREDMAN_CREATE_CRED_MORE_ABOUT_PASSKEYS_INTRO)
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt
index c27ac94..6d7ecd7 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt
@@ -41,7 +41,6 @@
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.core.graphics.drawable.toBitmap
-import com.android.compose.rememberSystemUiController
 import com.android.credentialmanager.CredentialSelectorViewModel
 import com.android.credentialmanager.R
 import com.android.credentialmanager.common.BaseEntry
@@ -62,8 +61,6 @@
 import com.android.credentialmanager.common.ui.HeadlineIcon
 import com.android.credentialmanager.common.ui.LargeLabelTextOnSurfaceVariant
 import com.android.credentialmanager.common.ui.Snackbar
-import com.android.credentialmanager.common.ui.setTransparentSystemBarsColor
-import com.android.credentialmanager.common.ui.setBottomSheetSystemBarsColor
 import com.android.credentialmanager.logging.GetCredentialEvent
 import com.android.internal.logging.UiEventLogger.UiEventEnum
 
@@ -73,9 +70,7 @@
     getCredentialUiState: GetCredentialUiState,
     providerActivityLauncher: ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult>
 ) {
-    val sysUiController = rememberSystemUiController()
     if (getCredentialUiState.currentScreenState == GetScreenState.REMOTE_ONLY) {
-        setTransparentSystemBarsColor(sysUiController)
         RemoteCredentialSnackBarScreen(
             onClick = viewModel::getFlowOnMoreOptionOnSnackBarSelected,
             onCancel = viewModel::onUserCancel,
@@ -84,7 +79,6 @@
         viewModel.uiMetrics.log(GetCredentialEvent.CREDMAN_GET_CRED_SCREEN_REMOTE_ONLY)
     } else if (getCredentialUiState.currentScreenState
         == GetScreenState.UNLOCKED_AUTH_ENTRIES_ONLY) {
-        setTransparentSystemBarsColor(sysUiController)
         EmptyAuthEntrySnackBarScreen(
             authenticationEntryList =
             getCredentialUiState.providerDisplayInfo.authenticationEntryList,
@@ -95,7 +89,6 @@
         viewModel.uiMetrics.log(GetCredentialEvent
                 .CREDMAN_GET_CRED_SCREEN_UNLOCKED_AUTH_ENTRIES_ONLY)
     } else {
-        setBottomSheetSystemBarsColor(sysUiController)
         ModalBottomSheet(
             sheetContent = {
                 // Hide the sheet content as opposed to the whole bottom sheet to maintain the scrim
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetGenericCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetGenericCredentialComponents.kt
index ba48f2b..57fefbe 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetGenericCredentialComponents.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetGenericCredentialComponents.kt
@@ -34,7 +34,9 @@
 import com.android.credentialmanager.R
 import com.android.credentialmanager.common.BaseEntry
 import com.android.credentialmanager.common.ProviderActivityState
+import com.android.credentialmanager.common.ui.ConfirmButton
 import com.android.credentialmanager.common.ui.CredentialContainerCard
+import com.android.credentialmanager.common.ui.CtaButtonRow
 import com.android.credentialmanager.common.ui.HeadlineIcon
 import com.android.credentialmanager.common.ui.HeadlineText
 import com.android.credentialmanager.common.ui.LargeLabelTextOnSurfaceVariant
@@ -62,6 +64,7 @@
                             providerDisplayInfo = getCredentialUiState.providerDisplayInfo,
                             providerInfoList = getCredentialUiState.providerInfoList,
                             onEntrySelected = viewModel::getFlowOnEntrySelected,
+                            onConfirm = viewModel::getFlowOnConfirmEntrySelected,
                             onLog = { viewModel.logUiEvent(it) },
                     )
                     viewModel.uiMetrics.log(GetCredentialEvent
@@ -93,10 +96,13 @@
         providerDisplayInfo: ProviderDisplayInfo,
         providerInfoList: List<ProviderInfo>,
         onEntrySelected: (BaseEntry) -> Unit,
+        onConfirm: () -> Unit,
         onLog: @Composable (UiEventLogger.UiEventEnum) -> Unit,
 ) {
     val sortedUserNameToCredentialEntryList =
             providerDisplayInfo.sortedUserNameToCredentialEntryList
+    val totalEntriesCount = sortedUserNameToCredentialEntryList
+            .flatMap { it.sortedCredentialEntryList }.size
     SheetContainerCard {
         // When only one provider (not counting the remote-only provider) exists, display that
         // provider's icon + name up top.
@@ -125,7 +131,11 @@
         item {
             HeadlineText(
                     text = stringResource(
-                            R.string.get_dialog_title_choose_option_for,
+                            if (totalEntriesCount == 1) {
+                                R.string.get_dialog_title_use_info_on
+                            } else {
+                                R.string.get_dialog_title_choose_option_for
+                            },
                             requestDisplayInfo.appName
                     ),
             )
@@ -134,7 +144,6 @@
         item {
             CredentialContainerCard {
                 Column(verticalArrangement = Arrangement.spacedBy(2.dp)) {
-                    // Show max 4 entries in this primary page
                     sortedUserNameToCredentialEntryList.forEach {
                         // TODO(b/275375861): fallback UI merges entries by account names.
                         //  Need a strategy to be able to show all entries.
@@ -147,6 +156,19 @@
                 }
             }
         }
+        item { Divider(thickness = 24.dp, color = Color.Transparent) }
+        item {
+            if (totalEntriesCount == 1) {
+                CtaButtonRow(
+                    rightButton = {
+                        ConfirmButton(
+                            stringResource(R.string.get_dialog_button_label_continue),
+                            onClick = onConfirm
+                        )
+                    }
+                )
+            }
+        }
     }
     onLog(GetCredentialEvent.CREDMAN_GET_CRED_PRIMARY_SELECTION_CARD)
 }
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/logging/UIMetrics.kt b/packages/CredentialManager/src/com/android/credentialmanager/logging/UIMetrics.kt
index 035c1e4..9d38b7f 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/logging/UIMetrics.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/logging/UIMetrics.kt
@@ -43,7 +43,7 @@
     }
 
     @Composable
-    fun log(event: UiEventLogger.UiEventEnum, packageName: String) {
+    fun log(event: UiEventLogger.UiEventEnum, packageName: String?) {
         val instanceId: InstanceId = mInstanceId
         LaunchedEffect(true) {
             mUiEventLogger.logWithInstanceId(event, /*uid=*/0, packageName, instanceId)
@@ -51,13 +51,13 @@
     }
 
     @Composable
-    fun log(event: UiEventLogger.UiEventEnum, instanceId: InstanceId, packageName: String) {
+    fun log(event: UiEventLogger.UiEventEnum, instanceId: InstanceId, packageName: String?) {
         LaunchedEffect(true) {
             mUiEventLogger.logWithInstanceId(event, /*uid=*/0, packageName, instanceId)
         }
     }
 
-    fun logNormal(event: UiEventLogger.UiEventEnum, packageName: String) {
+    fun logNormal(event: UiEventLogger.UiEventEnum, packageName: String?) {
         mUiEventLogger.logWithInstanceId(event, /*uid=*/0, packageName, mInstanceId)
     }
 }
diff --git a/packages/PackageInstaller/res/values-af/strings.xml b/packages/PackageInstaller/res/values-af/strings.xml
index 5f0e3c2..267d634 100644
--- a/packages/PackageInstaller/res/values-af/strings.xml
+++ b/packages/PackageInstaller/res/values-af/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Program geïnstalleer."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Wil jy hierdie program installeer?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Wil jy hierdie program opdateer?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Dateer hierdie app vanaf <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> op?\n\nHierdie app kry gewoonlik opdaterings vanaf <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. As jy vanaf ’n ander bron opdateer, kan jy in die toekoms dalk opdaterings vanaf enige bron op jou foon kry. Appfunksie kan verander."</string>
     <string name="install_failed" msgid="5777824004474125469">"Program nie geïnstalleer nie."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Die installering van die pakket is geblokkeer."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Program is nie geïnstalleer nie omdat pakket met \'n bestaande pakket bots."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Hierdie gebruiker kan nie onbekende programme installeer nie"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Hierdie gebruiker word nie toegelaat om programme te installeer nie"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Dateer in elk geval op"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Bestuur programme"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Geen spasie oor nie"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> kon nie geïnstalleer word nie. Maak spasie beskikbaar en probeer weer."</string>
diff --git a/packages/PackageInstaller/res/values-am/strings.xml b/packages/PackageInstaller/res/values-am/strings.xml
index e2a25b3..3dab467c 100644
--- a/packages/PackageInstaller/res/values-am/strings.xml
+++ b/packages/PackageInstaller/res/values-am/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"መተግበሪያ ተጭኗል።"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"ይህን መተግበሪያ መጫን ይፈልጋሉ?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"ይህን መተግበሪያ ማዘመን ይፈልጋሉ?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"ይህ መተግበሪያ ከ<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ይዘምን?\n\nይህ መተግበሪያ በመደበኛነት ዝማኔዎችን ከ<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ይቀበላል። ከተለየ ምንጭ በማዘመን በስልክዎ ላይ ካለ ማንኛውም ምንጭ የወደፊት ዝማኔዎችን ሊቀበሉ ይችላሉ። የመተግበሪያ ተግባራዊነት ሊለወጥ ይችላል።"</string>
     <string name="install_failed" msgid="5777824004474125469">"መተግበሪያ አልተጫነም።"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"ጥቅሉ እንዳይጫን ታግዷል።"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"እንደ ጥቅል ያልተጫነ መተግበሪያ ከነባር ጥቅል ጋር ይጋጫል።"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ያልታወቁ መተግበሪያዎች በዚህ ተጠቃሚ ሊጫኑ አይችሉም"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ይህ ተጠቃሚ መተግበሪያዎችን እንዲጭን አልተፈቀደለትም"</string>
     <string name="ok" msgid="7871959885003339302">"እሺ"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"የሆነው ሆኖ አዘምን"</string>
     <string name="manage_applications" msgid="5400164782453975580">"መተግበሪያዎችን ያቀናብሩ"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ቦታ ሞልቷል"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g>ን መጫን አልቻለም። የተወሰነ ቦታ ያስለቅቁና እንደገና ይሞክሩ።"</string>
diff --git a/packages/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml
index 5c974b0..170c1fc 100644
--- a/packages/PackageInstaller/res/values-ar/strings.xml
+++ b/packages/PackageInstaller/res/values-ar/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"تم تثبيت التطبيق."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"هل تريد تثبيت هذا التطبيق؟"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"هل تريد تحديث هذا التطبيق؟"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"هل تريد تحديث هذا التطبيق من خلال \"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>\"؟\n\nيتلقّى هذا التطبيق التحديثات عادةً من \"<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>\". من خلال إجراء التحديث من مصدر مختلف، قد تتلقّى تحديثات في المستقبل من أي مصدر على هاتفك. قد تتغير وظائف التطبيق."</string>
     <string name="install_failed" msgid="5777824004474125469">"التطبيق ليس مثبتًا."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"تم حظر تثبيت الحزمة."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"لم يتم تثبيت التطبيق لأن حزمة التثبيت تتعارض مع حزمة حالية."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"يتعذر على هذا المستخدم تثبيت التطبيقات غير المعروفة"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"غير مسموح لهذا المستخدم بتثبيت التطبيقات"</string>
     <string name="ok" msgid="7871959885003339302">"حسنًا"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"التحديث على أي حال"</string>
     <string name="manage_applications" msgid="5400164782453975580">"إدارة التطبيقات"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"نفدت مساحة التخزين"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"تعذر تثبيت <xliff:g id="APP_NAME">%1$s</xliff:g> الرجاء تحرير بعض المساحة والمحاولة مرة أخرى."</string>
diff --git a/packages/PackageInstaller/res/values-as/strings.xml b/packages/PackageInstaller/res/values-as/strings.xml
index 5997f2d..c37ed70 100644
--- a/packages/PackageInstaller/res/values-as/strings.xml
+++ b/packages/PackageInstaller/res/values-as/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"এপ্ ইনষ্টল কৰা হ’ল।"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"আপুনি এই এপ্‌টো ইনষ্টল কৰিবলৈ বিচাৰেনে?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"আপুনি এই এপ্‌টো আপডে’ট কৰিবলৈ বিচাৰেনে?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"এই এপ্‌টো <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>ৰ পৰা আপডে’ট কৰিবনে?\n\nএই এপ্‌টোৱে সাধাৰণতে <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>ৰ পৰা আপডে’ট লাভ কৰে। অন্য এটা উৎসৰ পৰা আপডে’ট কৰি আপুনি যিকোনো উৎসৰ পৰা আপোনাৰ ফ’নত অনাগত আপডে’টসমূহ পাব পাৰে। এপৰ কাৰ্যক্ষমতা সলনি হ’ব পাৰে।"</string>
     <string name="install_failed" msgid="5777824004474125469">"এপ্ ইনষ্টল কৰা হোৱা নাই।"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"পেকেজটোৰ ইনষ্টল অৱৰোধ কৰা হৈছে।"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"এপ্‌টো ইনষ্টল কৰিব পৰা নগ\'ল কাৰণ ইয়াৰ সৈতে আগৰে পৰা থকা এটা পেকেজৰ সংঘাত হৈছে।"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"এই ব্যৱহাৰকাৰীয়ে অজ্ঞাত উৎসৰপৰা পোৱা এপসমূহ ইনষ্টল কৰিব নোৱাৰে"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"এই ব্যৱহাৰকাৰীজনৰ এপ্ ইনষ্টল কৰাৰ অনুমতি নাই"</string>
     <string name="ok" msgid="7871959885003339302">"ঠিক আছে"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"যিকোনো প্ৰকাৰে আপডে’ট কৰক"</string>
     <string name="manage_applications" msgid="5400164782453975580">"এপ্ পৰিচালনা"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"খালী ঠাই নাই"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ইনষ্টল কৰিব পৰা নগ\'ল। কিছু খালী ঠাই উলিয়াই আকৌ চেষ্টা কৰক৷"</string>
diff --git a/packages/PackageInstaller/res/values-az/strings.xml b/packages/PackageInstaller/res/values-az/strings.xml
index 0fb5005..ae7b2fc 100644
--- a/packages/PackageInstaller/res/values-az/strings.xml
+++ b/packages/PackageInstaller/res/values-az/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Tətbiq quraşdırılıb."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Bu tətbiqi quraşdırmaq istəyirsiniz?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu tətbiqi güncəlləmək istəyirsiniz?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Bu tətbiq <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> mənbəyindən güncəllənsin?\n\nBu tətbiq adətən <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> mənbəyindən güncəllənmələr qəbul edir. Fərqli mənbədən güncəllədikdə telefonda istənilən mənbədən gələcəkdə güncəllənmələr qəbul edə bilərsiniz. Tətbiq funksionallığı dəyişə bilər."</string>
     <string name="install_failed" msgid="5777824004474125469">"Tətbiq quraşdırılmayıb."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin quraşdırılması blok edildi."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Bu paketin mövcud paket ilə ziddiyətinə görə tətbiq quraşdırılmadı."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Naməlum tətbiqlər bu istifadəçi tərəfindən quraşdırıla bilməz"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Bu istifadəçinin tətbiqi quraşdırmaq üçün icazəsi yoxdur"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"İstənilən halda güncəlləyin"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Tətbiqi idarə edin"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Boş yer yoxdur"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> quraşdırıla bilməz. Yaddaş üçün yer boşaldıb yenidən təkrar edin."</string>
diff --git a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
index f89266c..2b0fa82 100644
--- a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
+++ b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Želite da instalirate ovu aplikaciju?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite da ažurirate ovu aplikaciju?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Želite da ažurirate ovu aplikaciju iz izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija se obično ažurira iz izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako ažurirate iz drugog izvora, možete da primate buduća ažuriranja iz bilo kog izvora na telefonu. Funkcije aplikacije mogu da se promene."</string>
     <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa je blokirano."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer je paket neusaglašen sa postojećim paketom."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ovaj korisnik ne može da instalira nepoznate aplikacije"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ovom korisniku nije dozvoljeno da instalira aplikacije"</string>
     <string name="ok" msgid="7871959885003339302">"Potvrdi"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Ipak ažuriraj"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Upravljajte apl."</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nema više prostora"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Nismo uspeli da instaliramo aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>. Oslobodite prostor i probajte ponovo."</string>
diff --git a/packages/PackageInstaller/res/values-be/strings.xml b/packages/PackageInstaller/res/values-be/strings.xml
index 369a60c..d18e009 100644
--- a/packages/PackageInstaller/res/values-be/strings.xml
+++ b/packages/PackageInstaller/res/values-be/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Праграма ўсталявана."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Усталяваць гэту праграму?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Абнавіць гэту праграму?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Абнавіць праграму ад <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nЗвычайна гэтая праграма атрымлівае абнаўленні ад <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Пры абнаўленні з іншай крыніцы вы, магчыма, будзеце атрымліваць будучыя абнаўленні з любой крыніцы на тэлефоне. Функцыі праграмы могуць змяніцца."</string>
     <string name="install_failed" msgid="5777824004474125469">"Праграма не ўсталявана."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Усталяванне пакета заблакіравана."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Праграма не ўсталявана, таму што пакет канфліктуе з існуючым пакетам."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Гэты карыстальнік не можа ўсталёўваць невядомыя праграмы"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Гэты карыстальнік не можа ўсталёўваць праграмы"</string>
     <string name="ok" msgid="7871959885003339302">"ОК"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Усё роўна абнавіць"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Кіраваць"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Не хапае месца"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Не ўдалося ўсталяваць праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\". Вызваліце месца і паўтарыце спробу."</string>
diff --git a/packages/PackageInstaller/res/values-bg/strings.xml b/packages/PackageInstaller/res/values-bg/strings.xml
index 8263fe1..6dc927f 100644
--- a/packages/PackageInstaller/res/values-bg/strings.xml
+++ b/packages/PackageInstaller/res/values-bg/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Приложението бе инсталирано."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Искате ли да инсталирате това приложение?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Искате ли да актуализирате това приложение?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Да се актуализира ли това приложение от <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nТо обикновено получава актуализации от <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ако инсталирате актуализация от друг източник, може да получавате бъдещи актуализации от който и да е източник на телефона си. Функционалността на приложението може да се промени."</string>
     <string name="install_failed" msgid="5777824004474125469">"Приложението не бе инсталирано."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирането на пакета бе блокирано."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Приложението не бе инсталирано, тъй като пакетът е в конфликт със съществуващ пакет."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Този потребител не може да инсталира неизвестни приложения"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Този потребител няма разрешение да инсталира приложения"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Актуализиране въпреки това"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Прил.: Управл."</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Няма място"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> не можа да се инсталира. Освободете място и опитайте отново."</string>
diff --git a/packages/PackageInstaller/res/values-bn/strings.xml b/packages/PackageInstaller/res/values-bn/strings.xml
index 0d15a7e..5b5c6dc 100644
--- a/packages/PackageInstaller/res/values-bn/strings.xml
+++ b/packages/PackageInstaller/res/values-bn/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"অ্যাপটি ইনস্টল করা হয়ে গেছে।"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"আপনি কি এই অ্যাপটি ইনস্টল করতে চান?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"আপনি কি এই অ্যাপটি আপডেট করতে চান?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> থেকে এই অ্যাপ আপডেট করবেন?\n\nএই অ্যাপ সাধারণত <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> থেকে আপডেট পায়। অন্য কোনও সোর্স থেকে আপডেট করলে, আপনার ফোনে ভবিষ্যতে যেকোনও সোর্স থেকে আপডেট পেতে পারেন। অ্যাপের কার্যকারিতা পরিবর্তন হতে পারে।"</string>
     <string name="install_failed" msgid="5777824004474125469">"অ্যাপটি ইনস্টল করা হয়নি।"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"ইনস্টল হওয়া থেকে প্যাকেজটিকে ব্লক করা হয়েছে।"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"আগে থেকেই থাকা একটি প্যাকেজের সাথে প্যাকেজটির সমস্যা সৃষ্টি হওয়ায় অ্যাপটি ইনস্টল করা যায়নি।"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"এই ব্যবহারকারী অজানা অ্যাপ ইনস্টল করতে পারেন না"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"এই ব্যবহারকারীর অ্যাপ ইনস্টল করার অনুমতি নেই"</string>
     <string name="ok" msgid="7871959885003339302">"ঠিক আছে"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"তবুও আপডেট করতে চাই"</string>
     <string name="manage_applications" msgid="5400164782453975580">"অ্যাপ পরিচালনা"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"জায়গা খালি নেই"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ইনস্টল করা যায়নি। কিছু পরিমাণ জায়গা খালি করে আবার চেষ্টা করুন।"</string>
diff --git a/packages/PackageInstaller/res/values-bs/strings.xml b/packages/PackageInstaller/res/values-bs/strings.xml
index 8b19769..e728937 100644
--- a/packages/PackageInstaller/res/values-bs/strings.xml
+++ b/packages/PackageInstaller/res/values-bs/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Želite li instalirati ovu aplikaciju?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite li ažurirati ovu aplikaciju?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Ažurirati aplikaciju iz izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija obično prima ažuriranja iz izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako je ažurirate iz drugog izvora, možda ćete primati buduća ažuriranja iz bilo kojeg izvora na telefonu. Funkcionalnost aplikacije se može promijeniti."</string>
     <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje ovog paketa je blokirano."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer paket nije usaglašen s postojećim paketom."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ovaj korisnik ne može instalirati nepoznate aplikacije"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ovom korisniku nije dozvoljeno instaliranje aplikacija"</string>
     <string name="ok" msgid="7871959885003339302">"Uredu"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Ipak ažuriraj"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Uprav. aplik."</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nedostatak prostora"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Ne možete instalirati aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>. Oslobodite prostor u pohrani i pokušajte ponovo."</string>
diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml
index d025b9a..7983375 100644
--- a/packages/PackageInstaller/res/values-ca/strings.xml
+++ b/packages/PackageInstaller/res/values-ca/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"S\'ha instal·lat l\'aplicació."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Vols instal·lar aquesta aplicació?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Vols actualitzar aquesta aplicació?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Vols actualitzar l\'aplicació de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAquesta aplicació sol rebre actualitzacions de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> Si l\'actualitzes des d\'una font diferent, pot ser que en el futur rebis actualitzacions des de qualsevol font del teu telèfon. És possible que la funcionalitat de l\'aplicació canviï."</string>
     <string name="install_failed" msgid="5777824004474125469">"No s\'ha instal·lat l\'aplicació."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"El paquet s\'ha bloquejat perquè no es pugui instal·lar."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"L\'aplicació no s\'ha instal·lat perquè el paquet entra en conflicte amb un d\'existent."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Aquest usuari no pot instal·lar aplicacions desconegudes"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Aquest usuari no té permís per instal·lar aplicacions"</string>
     <string name="ok" msgid="7871959885003339302">"D\'acord"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Actualitza de tota manera"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Gestiona apps"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Espai esgotat"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"No s\'ha pogut instal·lar <xliff:g id="APP_NAME">%1$s</xliff:g>. Allibera espai i torna-ho a provar."</string>
diff --git a/packages/PackageInstaller/res/values-cs/strings.xml b/packages/PackageInstaller/res/values-cs/strings.xml
index 5799e72..c96d27e 100644
--- a/packages/PackageInstaller/res/values-cs/strings.xml
+++ b/packages/PackageInstaller/res/values-cs/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Aplikace je nainstalována."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Chcete tuto aplikaci nainstalovat?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Chcete tuto aplikaci aktualizovat?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Aktualizovat tuto aplikaci ze zdroje <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTato aplikace obvykle dostává aktualizace ze zdroje <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Pokud ji aktualizujete z jiného zdroje, budete v budoucnu do telefonu moci dostávat aktualizace z libovolného zdroje. Funkčnost aplikace se může změnit."</string>
     <string name="install_failed" msgid="5777824004474125469">"Aplikaci nelze nainstalovat."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Instalace balíčku byla zablokována."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikaci nelze nainstalovat, protože balíček je v konfliktu se stávajícím balíčkem."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Tento uživatel nemůže instalovat neznámé aplikace"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Tento uživatel nesmí instalovat aplikace"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Přesto aktualizovat"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Správa aplikací"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nedostatek místa"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> nelze nainstalovat. Uvolněte místo v paměti a zkuste to znovu."</string>
diff --git a/packages/PackageInstaller/res/values-da/strings.xml b/packages/PackageInstaller/res/values-da/strings.xml
index d312de2..d8759d4 100644
--- a/packages/PackageInstaller/res/values-da/strings.xml
+++ b/packages/PackageInstaller/res/values-da/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Appen er installeret."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Vil du installere denne app?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Vil du opdatere denne app?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Vil du opdatere denne app fra <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDenne app plejer at modtage opdateringer fra <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Hvis du opdaterer fra en anden kilde, vil du kunne modtage opdateringer fra en hvilken som helst kilde på din telefon fremover. Appfunktionaliteten kan ændre sig."</string>
     <string name="install_failed" msgid="5777824004474125469">"Appen blev ikke installeret."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Pakken blev forhindret i at blive installeret."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Appen blev ikke installeret, da pakken er i strid med en eksisterende pakke."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Denne bruger kan ikke installere ukendte apps"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Denne bruger har ikke tilladelse til at installere apps"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Opdater alligevel"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Administrer apps"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Der er ikke mere plads"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> kunne ikke installeres. Frigør noget plads, og prøv igen."</string>
diff --git a/packages/PackageInstaller/res/values-de/strings.xml b/packages/PackageInstaller/res/values-de/strings.xml
index 1332c940..bb55708 100644
--- a/packages/PackageInstaller/res/values-de/strings.xml
+++ b/packages/PackageInstaller/res/values-de/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"App wurde installiert."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Möchtest du diese App installieren?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Möchtest du diese App aktualisieren?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Diese App mit einem Update von <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> aktualisieren?\n\nSie erhält normalerweise Updates von <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Wenn du ein Update von einer anderen Quelle verwendest, erhältst du möglicherweise zukünftige Updates von beliebigen Quellen auf deinem Smartphone. Die Funktionalität der App kann sich ändern."</string>
     <string name="install_failed" msgid="5777824004474125469">"App wurde nicht installiert."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Die Installation des Pakets wurde blockiert."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Die App wurde nicht installiert, da das Paket in Konflikt mit einem bestehenden Paket steht."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Dieser Nutzer darf keine unbekannten Apps installieren"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Dieser Nutzer darf keine Apps installieren"</string>
     <string name="ok" msgid="7871959885003339302">"Ok"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Trotzdem aktualisieren"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Apps verwalten"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Kein freier Speicher vorhanden"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> konnte nicht installiert werden. Gib Speicherplatz frei und versuche es noch einmal."</string>
diff --git a/packages/PackageInstaller/res/values-el/strings.xml b/packages/PackageInstaller/res/values-el/strings.xml
index 8b092d7..9721a19 100644
--- a/packages/PackageInstaller/res/values-el/strings.xml
+++ b/packages/PackageInstaller/res/values-el/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Η εφαρμογή εγκαταστάθηκε."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Θέλετε να εγκαταστήσετε αυτήν την εφαρμογή;"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Θέλετε να ενημερώσετε αυτήν την εφαρμογή;"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Να ενημερωθεί αυτή η εφαρμογή από <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>;\n\nΗ συγκεκριμένη εφαρμογή λαμβάνει συνήθως ενημερώσεις από <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Αν κάνετε την ενημέρωση από διαφορετική πηγή, μπορεί να λαμβάνετε μελλοντικές ενημερώσεις από οποιαδήποτε πηγή στο τηλέφωνό σας. Η λειτουργικότητα της εφαρμογής μπορεί να αλλάξει."</string>
     <string name="install_failed" msgid="5777824004474125469">"Η εφαρμογή δεν εγκαταστάθηκε."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Η εγκατάσταση του πακέτου αποκλείστηκε."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Η εφαρμογή δεν εγκαταστάθηκε, επειδή το πακέτο είναι σε διένεξη με κάποιο υπάρχον πακέτο."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Δεν είναι δυνατή η εγκατάσταση άγνωστων εφαρμογών από αυτόν τον χρήστη"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Δεν επιτρέπεται η εγκατάσταση εφαρμογών σε αυτόν τον χρήστη"</string>
     <string name="ok" msgid="7871959885003339302">"ΟΚ"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Να ενημερωθεί ούτως ή άλλως"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Διαχ. εφαρμογών"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Δεν υπάρχει χώρος"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Δεν ήταν δυνατή η εγκατάσταση της εφαρμογής <xliff:g id="APP_NAME">%1$s</xliff:g>. Απελευθερώστε λίγο χώρο και προσπαθήστε ξανά."</string>
diff --git a/packages/PackageInstaller/res/values-en-rAU/strings.xml b/packages/PackageInstaller/res/values-en-rAU/strings.xml
index bb05ec4..543dbf6 100644
--- a/packages/PackageInstaller/res/values-en-rAU/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rAU/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"App installed."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string>
     <string name="install_failed" msgid="5777824004474125469">"App not installed."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Unknown apps can\'t be installed by this user"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"This user is not allowed to install apps"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Update anyway"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Manage apps"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Out of space"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> couldn\'t be installed. Free up some space and try again."</string>
diff --git a/packages/PackageInstaller/res/values-en-rGB/strings.xml b/packages/PackageInstaller/res/values-en-rGB/strings.xml
index bb05ec4..543dbf6 100644
--- a/packages/PackageInstaller/res/values-en-rGB/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rGB/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"App installed."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string>
     <string name="install_failed" msgid="5777824004474125469">"App not installed."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Unknown apps can\'t be installed by this user"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"This user is not allowed to install apps"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Update anyway"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Manage apps"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Out of space"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> couldn\'t be installed. Free up some space and try again."</string>
diff --git a/packages/PackageInstaller/res/values-en-rIN/strings.xml b/packages/PackageInstaller/res/values-en-rIN/strings.xml
index bb05ec4..543dbf6 100644
--- a/packages/PackageInstaller/res/values-en-rIN/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rIN/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"App installed."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Update this app from <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nThis app normally receives updates from <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. By updating from a different source, you may receive future updates from any source on your phone. App functionality may change."</string>
     <string name="install_failed" msgid="5777824004474125469">"App not installed."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Unknown apps can\'t be installed by this user"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"This user is not allowed to install apps"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Update anyway"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Manage apps"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Out of space"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> couldn\'t be installed. Free up some space and try again."</string>
diff --git a/packages/PackageInstaller/res/values-es-rUS/strings.xml b/packages/PackageInstaller/res/values-es-rUS/strings.xml
index 12812ae..53514fe 100644
--- a/packages/PackageInstaller/res/values-es-rUS/strings.xml
+++ b/packages/PackageInstaller/res/values-es-rUS/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Se instaló la app."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"¿Deseas instalar esta app?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"¿Deseas actualizar esta app?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"¿Quieres actualizar esta app a través <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEn general, esta suele recibir actualizaciones de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si actualizas a través de otra fuente, es posible que recibas las próximas actualizaciones de cualquier fuente en el teléfono. Por ende, podría verse afectada la funcionalidad de la app."</string>
     <string name="install_failed" msgid="5777824004474125469">"No se instaló la app."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Se bloqueó el paquete para impedir la instalación."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"No se instaló la app debido a un conflicto con un paquete."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Este usuario no puede instalar apps desconocidas"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Este usuario no puede instalar apps"</string>
     <string name="ok" msgid="7871959885003339302">"Aceptar"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Actualizar de todas formas"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Gestionar apps"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Sin espacio"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"No se pudo instalar <xliff:g id="APP_NAME">%1$s</xliff:g>. Libera espacio y vuelve a intentarlo."</string>
diff --git a/packages/PackageInstaller/res/values-es/strings.xml b/packages/PackageInstaller/res/values-es/strings.xml
index b6714d3..efb73b4 100644
--- a/packages/PackageInstaller/res/values-es/strings.xml
+++ b/packages/PackageInstaller/res/values-es/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Aplicación instalada."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"¿Quieres instalar esta aplicación?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"¿Quieres actualizar esta aplicación?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"¿Actualizar esta aplicación con <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nEsta aplicación suele recibir actualizaciones de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si actualizas a través de otra fuente, puede que recibas futuras actualizaciones de cualquier fuente de tu teléfono. La funcionalidad de la aplicación puede cambiar."</string>
     <string name="install_failed" msgid="5777824004474125469">"No se ha instalado la aplicación."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Se ha bloqueado la instalación del paquete."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"La aplicación no se ha instalado debido a un conflicto con un paquete."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Este usuario no puede instalar aplicaciones desconocidas"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Este usuario no tiene permiso para instalar aplicaciones"</string>
     <string name="ok" msgid="7871959885003339302">"Aceptar"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Actualizar igualmente"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Gestionar aplicaciones"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Sin espacio"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"No se ha podido instalar <xliff:g id="APP_NAME">%1$s</xliff:g>. Libera espacio y vuelve a intentarlo."</string>
diff --git a/packages/PackageInstaller/res/values-et/strings.xml b/packages/PackageInstaller/res/values-et/strings.xml
index c4a3d05..cf488a9 100644
--- a/packages/PackageInstaller/res/values-et/strings.xml
+++ b/packages/PackageInstaller/res/values-et/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Rakendus on installitud."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Kas soovite selle rakenduse installida?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Kas soovite seda rakendust värskendada?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Kas värskendada seda rakendust allikast <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nSee rakendus saab tavaliselt värskendusi allikast <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Muust allikast värskendamise korral võite edaspidi saada telefonis värskendusi mis tahes allikast. Rakenduse funktsioonid võivad muutuda."</string>
     <string name="install_failed" msgid="5777824004474125469">"Rakendus pole installitud."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Paketi installimine blokeeriti."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Rakendust ei installitud, kuna pakett on olemasoleva paketiga vastuolus."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"See kasutaja ei saa installida tundmatuid rakendusi"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Kasutajal ei ole lubatud rakendusi installida"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Värskenda ikkagi"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Rakend. haldam."</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Pole ruumi"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Rakendust <xliff:g id="APP_NAME">%1$s</xliff:g> ei saanud installida. Vabastage ruumi ja proovige uuesti."</string>
diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml
index 97339dc..9dadbed 100644
--- a/packages/PackageInstaller/res/values-eu/strings.xml
+++ b/packages/PackageInstaller/res/values-eu/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Instalatu da aplikazioa."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Aplikazioa instalatu nahi duzu?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Aplikazioa eguneratu nahi duzu?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Aplikazioa <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> zerbitzutik eguneratu nahi duzu?\n\nAplikazioak <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> zerbitzutik jaso ohi ditu eguneratzeak. Beste iturburu batetik eguneratuz gero, baliteke aurrerantzeko eguneratzeak telefonoko edozein iturburutatik jasotzea. Baliteke aplikazioaren funtzioak aldatzea."</string>
     <string name="install_failed" msgid="5777824004474125469">"Ez da instalatu aplikazioa."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Paketea instalatzeko aukera blokeatu egin da."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Ez da instalatu aplikazioa, gatazka bat sortu delako lehendik dagoen pakete batekin."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Erabiltzaile honek ezin ditu instalatu aplikazio ezezagunak"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Erabiltzaile honek ez du baimenik aplikazioak instalatzeko"</string>
     <string name="ok" msgid="7871959885003339302">"Ados"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Eguneratu halere"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Kudeatu aplikazioak"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Ez dago behar adina toki"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Ezin izan da instalatu <xliff:g id="APP_NAME">%1$s</xliff:g>. Egin toki pixka bat eta saiatu berriro."</string>
diff --git a/packages/PackageInstaller/res/values-fa/strings.xml b/packages/PackageInstaller/res/values-fa/strings.xml
index 65b3241..73b070d 100644
--- a/packages/PackageInstaller/res/values-fa/strings.xml
+++ b/packages/PackageInstaller/res/values-fa/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"برنامه نصب شد."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"می‌خواهید این برنامه را نصب کنید؟"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"می‌خواهید این برنامه را به‌روزرسانی کنید؟"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"این برنامه ازطریق <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> به‌روز شود؟\n\nاین برنامه معمولاً به‌روزرسانی‌ها را از <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> دریافت می‌کند. با به‌روزرسانی از منبعی متفاوت، ممکن است به‌روزرسانی‌های بعدی را از هر منبعی در تلفنتان دریافت کنید. قابلیت‌های برنامه ممکن است تغییر کند."</string>
     <string name="install_failed" msgid="5777824004474125469">"برنامه نصب نشد."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"از نصب شدن بسته جلوگیری شد."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"برنامه نصب نشد چون بسته با بسته موجود تداخل دارد."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"این کاربر نمی‌تواند برنامه‌های ناشناس نصب کند"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"این کاربر مجاز به نصب برنامه‌ نیست"</string>
     <string name="ok" msgid="7871959885003339302">"بسیار خوب"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"درهرصورت به‌روز شود"</string>
     <string name="manage_applications" msgid="5400164782453975580">"مدیریت برنامه‌ها"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"فضا کافی نیست"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> نصب نمی‌شود. مقداری از فضا را آزاد و دوباره امتحان کنید."</string>
diff --git a/packages/PackageInstaller/res/values-fi/strings.xml b/packages/PackageInstaller/res/values-fi/strings.xml
index a4306ae..ee8910b 100644
--- a/packages/PackageInstaller/res/values-fi/strings.xml
+++ b/packages/PackageInstaller/res/values-fi/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Sovellus on asennettu."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Haluatko asentaa tämän sovelluksen?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Haluatko päivittää tämän sovelluksen?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Voiko <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> päivittää sovelluksen?\n\nTämän sovelluksen päivitykset tarjoaa yleensä <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Kun päivität uudesta lähteestä, tulevat päivitykset voivat tulla mistä tahansa puhelimella olevasta lähteestä. Sovelluksen toiminnot voivat muuttua."</string>
     <string name="install_failed" msgid="5777824004474125469">"Sovellusta ei asennettu."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin asennus estettiin."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Sovellusta ei asennettu, koska paketti on ristiriidassa nykyisen paketin kanssa."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Tämä käyttäjä ei voi asentaa tuntemattomia sovelluksia."</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Tämä käyttäjä ei voi asentaa sovelluksia."</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Päivitä silti"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Sovellusvalinnat"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Tallennustila ei riitä"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Sovelluksen <xliff:g id="APP_NAME">%1$s</xliff:g> asentaminen epäonnistui. Vapauta tallennustilaa ja yritä uudelleen."</string>
diff --git a/packages/PackageInstaller/res/values-fr-rCA/strings.xml b/packages/PackageInstaller/res/values-fr-rCA/strings.xml
index 24efdd7..b971c35 100644
--- a/packages/PackageInstaller/res/values-fr-rCA/strings.xml
+++ b/packages/PackageInstaller/res/values-fr-rCA/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Application installée."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Voulez-vous installer cette application?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Voulez-vous mettre à jour cette application?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Mettre à jour cette application à partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nCette application reçoit normalement des mises à jour de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. En effectuant une mise à jour à partir d\'une source différente, vous pourriez recevoir des mises à jour futures à partir de n\'importe quelle source sur votre téléphone. Le fonctionnement de l\'application peut en être modifié."</string>
     <string name="install_failed" msgid="5777824004474125469">"Application non installée."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du paquet a été bloquée."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le paquet entre en conflit avec un paquet existant."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Cet utilisateur ne peut pas installer d\'applications inconnues"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Cet utilisateur n\'est pas autorisé à installer des applications"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Mettre à jour malgré tout"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Gérer les applis"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Espace insuffisant"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Impossible d\'installer <xliff:g id="APP_NAME">%1$s</xliff:g>. Veuillez libérer de l\'espace, puis réessayer."</string>
diff --git a/packages/PackageInstaller/res/values-fr/strings.xml b/packages/PackageInstaller/res/values-fr/strings.xml
index f3afb90..08d37d1 100644
--- a/packages/PackageInstaller/res/values-fr/strings.xml
+++ b/packages/PackageInstaller/res/values-fr/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Application installée."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Voulez-vous installer cette appli ?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Voulez-vous mettre à jour cette appli ?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Mettre à jour cette appli à partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ?\n\nCette appli reçoit normalement des mises à jour de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Si vous effectuez la mise à jour à partir d\'une autre source, vous recevrez peut-être les prochaines mises à jour depuis n\'importe quelle source sur votre téléphone. Le fonctionnement de l\'application est susceptible de changer."</string>
     <string name="install_failed" msgid="5777824004474125469">"Application non installée."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du package a été bloquée."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le package est en conflit avec un package déjà présent."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Cet utilisateur ne peut pas installer d\'applications inconnues"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Cet utilisateur n\'est pas autorisé à installer des applications"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Mettre à jour quand même"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Gérer applis"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Mémoire insuffisante"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Impossible d\'installer l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>. Veuillez libérer de l\'espace et réessayer."</string>
diff --git a/packages/PackageInstaller/res/values-gl/strings.xml b/packages/PackageInstaller/res/values-gl/strings.xml
index 5763bf1..d6cbf60 100644
--- a/packages/PackageInstaller/res/values-gl/strings.xml
+++ b/packages/PackageInstaller/res/values-gl/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Instalouse a aplicación."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Queres instalar esta aplicación?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Queres actualizar esta aplicación?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Queres actualizar esta aplicación desde <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAs actualizacións desta aplicación adoitan provir de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se actualizas a aplicación desde unha fonte diferente, pode que, a partir de agora, recibas actualizacións de calquera fonte no teléfono. Poderían cambiar as funcións da aplicación."</string>
     <string name="install_failed" msgid="5777824004474125469">"Non se instalou a aplicación"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Bloqueouse a instalación do paquete."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"A aplicación non se instalou porque o paquete presenta un conflito cun paquete que xa hai."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Este usuario non pode instalar aplicacións descoñecidas"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Este usuario non ten permiso para instalar aplicacións"</string>
     <string name="ok" msgid="7871959885003339302">"Aceptar"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Actualizar de todas formas"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Xestionar apps"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Esgotouse o espazo"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Non se puido instalar a aplicación <xliff:g id="APP_NAME">%1$s</xliff:g>. Libera espazo e téntao de novo."</string>
diff --git a/packages/PackageInstaller/res/values-gu/strings.xml b/packages/PackageInstaller/res/values-gu/strings.xml
index b3160e2..dcaa48f 100644
--- a/packages/PackageInstaller/res/values-gu/strings.xml
+++ b/packages/PackageInstaller/res/values-gu/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"શું તમે આ ઍપ ઇન્સ્ટૉલ કરવા માગો છો?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"શું તમે આ ઍપ અપડેટ કરવા માગો છો?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"આ ઍપને <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>થી અપડેટ કરવી છે?\n\nઆ ઍપ સામાન્ય રીતે <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>થી અપડેટ મેળવે છે. અલગ સૉર્સથી અપડેટ કરીને, તમે તમારા ફોન પર કોઈપણ સૉર્સથી ભાવિ અપડેટ મેળવી શકો છો. ઍપની કાર્યક્ષમતા બદલાઈ શકે છે."</string>
     <string name="install_failed" msgid="5777824004474125469">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી નથી."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"પૅકેજને ઇન્સ્ટૉલ થવાથી બ્લૉક કરવામાં આવ્યું હતું."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"પૅકેજનો અસ્તિત્વમાંના પૅકેજ સાથે વિરોધાભાસ હોવાને કારણે ઍપ્લિકેશન ઇન્સ્ટૉલ થઈ નથી."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"આ વપરાશકર્તા અજાણી ઍપ્લિકેશનોને ઇન્સ્ટૉલ કરી શકતા નથી"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"આ વપરાશકર્તાને ઍપ્લિકેશનો ઇન્સ્ટૉલ કરવાની મંજૂરી નથી"</string>
     <string name="ok" msgid="7871959885003339302">"ઓકે"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"તો પણ અપડેટ કરો"</string>
     <string name="manage_applications" msgid="5400164782453975580">"ઍપને મેનેજ કરો"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"સ્પેસ નથી"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ઇન્સ્ટૉલ કરી શકાઈ નથી. થોડું સ્પેસ ખાલી કરો અને ફરીથી પ્રયાસ કરો."</string>
diff --git a/packages/PackageInstaller/res/values-hi/strings.xml b/packages/PackageInstaller/res/values-hi/strings.xml
index 63ee837..48fabd1 100644
--- a/packages/PackageInstaller/res/values-hi/strings.xml
+++ b/packages/PackageInstaller/res/values-hi/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"ऐप्लिकेशन इंस्‍टॉल हो गया."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"क्या आपको यह ऐप्लिकेशन इंस्टॉल करना है?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"क्या आप इस ऐप्लिकेशन को अपडेट करना चाहते हैं?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"क्या इस ऐप्लिकेशन को <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> से अपडेट करना है?\n\nआम तौर पर, इस ऐप्लिकेशन को <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> से अपडेट मिलते हैं. किसी दूसरे सोर्स से अपडेट करने पर, आपको आगे से अपने फ़ोन पर किसी भी सोर्स से अपडेट मिल सकते हैं. ऐप्लिकेशन की मुख्य सुविधाएं और उनके काम करने का तरीका बदल सकता है."</string>
     <string name="install_failed" msgid="5777824004474125469">"ऐप्लिकेशन इंस्‍टॉल नहीं हुआ."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"पैकेज को इंस्टॉल होने से ब्लॉक किया हुआ है."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"ऐप्लिकेशन इंस्टॉल नहीं हुआ क्योंकि पैकेज का किसी मौजूदा पैकेज से विरोध है."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"यह उपयोगकर्ता अनजान ऐप्लिकेशन इंस्टॉल नहीं कर सकता"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"इस उपयोगकर्ता को ऐप्लिकेशन इंस्टॉल करने की अनुमति नहीं है"</string>
     <string name="ok" msgid="7871959885003339302">"ठीक है"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"फिर भी अपडेट करें"</string>
     <string name="manage_applications" msgid="5400164782453975580">"ऐप्लिकेशन प्रबंधित करें"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"जगह नहीं है"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> को इंस्‍टॉल नहीं किया जा सका. थोड़ी जगह खाली करें और फिर से कोशिश करें."</string>
diff --git a/packages/PackageInstaller/res/values-hr/strings.xml b/packages/PackageInstaller/res/values-hr/strings.xml
index 2372754..2d79d1e 100644
--- a/packages/PackageInstaller/res/values-hr/strings.xml
+++ b/packages/PackageInstaller/res/values-hr/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Želite li instalirati ovu aplikaciju?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite li ažurirati ovu aplikaciju?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Želite li ažurirati ovu aplikaciju s izvora <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nOva aplikacija obično prima ažuriranja s izvora <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ako je ažurirate s nekog drugog izvora, buduća ažuriranja možete primati s bilo kojeg izvora na svojem telefonu. Funkcije aplikacije mogu se promijeniti."</string>
     <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa blokirano je."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija koja nije instalirana kao paket u sukobu je s postojećim paketom."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ovaj korisnik ne može instalirati nepoznate aplikacije"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ovaj korisnik nema dopuštenje za instaliranje aplikacija"</string>
     <string name="ok" msgid="7871959885003339302">"U redu"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Ipak ažuriraj"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Upravljanje apl."</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nema dovoljno mjesta"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> nije moguće instalirati. Oslobodite dio prostora i pokušajte ponovo."</string>
diff --git a/packages/PackageInstaller/res/values-hu/strings.xml b/packages/PackageInstaller/res/values-hu/strings.xml
index 0ede377..98072ef 100644
--- a/packages/PackageInstaller/res/values-hu/strings.xml
+++ b/packages/PackageInstaller/res/values-hu/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Alkalmazás telepítve."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Telepíti ezt az alkalmazást?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Frissíti ezt az alkalmazást?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"A(z) <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> forrásból rissíti ezt az appot?\n\nEz az app általában a következő forrásból kap frissítéseket: <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ha másik forrásból frissíti, a későbbiekben bármelyik forrásból kaphat frissítéseket a telefonján. Emiatt megváltozhat az app működése."</string>
     <string name="install_failed" msgid="5777824004474125469">"Az alkalmazás nincs telepítve."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"A csomag telepítését letiltotta a rendszer."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"A nem csomagként telepített alkalmazás ütközik egy már létező csomaggal."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ez a felhasználó nem telepíthet ismeretlen alkalmazásokat"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ez a felhasználó nem telepíthet alkalmazásokat"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Frissítés mindenképp"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Alkalmazáskezelés"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nincs elég hely"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazást nem lehet telepíteni. Szabadítson fel egy kis helyet, és próbálkozzon újra."</string>
diff --git a/packages/PackageInstaller/res/values-hy/strings.xml b/packages/PackageInstaller/res/values-hy/strings.xml
index ccf1ee4..4f56568 100644
--- a/packages/PackageInstaller/res/values-hy/strings.xml
+++ b/packages/PackageInstaller/res/values-hy/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Հավելվածը տեղադրված է:"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Տեղադրե՞լ այս հավելվածը:"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Թարմացնե՞լ այս հավելվածը։"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Թարմացնե՞լ այս հավելվածը <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-ից։\n\nՍովորաբար այս հավելվածի թարմացումները ստացվում են <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-ից։ Եթե թարմացնեք այլ աղբյուրից, հետագայում կարող եք ձեր հեռախոսում թարմացումներ ստանալ ցանկացած աղբյուրից։ Հավելվածի գործառույթները կարող են փոփոխվել։"</string>
     <string name="install_failed" msgid="5777824004474125469">"Հավելվածը տեղադրված չէ:"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Փաթեթի տեղադրումն արգելափակվել է:"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Հավելվածը չի տեղադրվել, քանի որ տեղադրման փաթեթն ունի հակասություն առկա փաթեթի հետ:"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Այս օգտատերը չի կարող անհայտ հավելվածներ տեղադրել"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Այս օգտատիրոջը չի թույլատրվում տեղադրել հավելվածներ"</string>
     <string name="ok" msgid="7871959885003339302">"Եղավ"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Թարմացնել"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Կառավարել հավելվածները"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Բավարար տարածք չկա"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Չհաջողվեց տեղադրել <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը: Ազատեք տարածք և նորից փորձեք:"</string>
diff --git a/packages/PackageInstaller/res/values-in/strings.xml b/packages/PackageInstaller/res/values-in/strings.xml
index 0e4d700..0758a1d 100644
--- a/packages/PackageInstaller/res/values-in/strings.xml
+++ b/packages/PackageInstaller/res/values-in/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Aplikasi terinstal."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Ingin menginstal aplikasi ini?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Ingin mengupdate aplikasi ini?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Update aplikasi ini dari <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAplikasi ini biasanya menerima update dari <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dengan mengupdate dari sumber yang berbeda, Anda mungkin menerima update berikutnya dari sumber mana pun di ponsel. Fungsi aplikasi mungkin berubah."</string>
     <string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak terinstal."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Paket diblokir sehingga tidak dapat diinstal."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikasi tidak diinstal karena paket ini bentrok dengan paket yang sudah ada."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Aplikasi yang tidak dikenal tidak dapat diinstal oleh pengguna ini"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Pengguna ini tidak diizinkan menginstal aplikasi"</string>
     <string name="ok" msgid="7871959885003339302">"Oke"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Tetap update"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Kelola aplikasi"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Kehabisan ruang penyimpanan"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat diinstal. Kosongkan sebagian ruang dan coba lagi."</string>
diff --git a/packages/PackageInstaller/res/values-is/strings.xml b/packages/PackageInstaller/res/values-is/strings.xml
index 64086c8..6cbb2ee 100644
--- a/packages/PackageInstaller/res/values-is/strings.xml
+++ b/packages/PackageInstaller/res/values-is/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Forritið er uppsett."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Viltu setja upp þetta forrit?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Viltu uppfæra þetta forrit?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Uppfæra þetta forrit frá <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nÞetta forrit fær venjulega uppfærslur frá <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Með því að uppfæra frá öðrum uppruna gætirðu fengið framtíðaruppfærslur frá hvaða uppruna sem er í símanum. Forritseiginleikar kunna að breytast."</string>
     <string name="install_failed" msgid="5777824004474125469">"Forritið er ekki uppsett."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Lokað var á uppsetningu pakkans."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Forritið var ekki sett upp vegna árekstra á milli pakkans og annars pakka."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Þessi notandi getur ekki sett upp óþekkt forrit"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Þessi notandi hefur ekki leyfi til að setja upp forrit"</string>
     <string name="ok" msgid="7871959885003339302">"Í lagi"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Uppfæra samt"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Stj. forritum"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Ekkert pláss eftir"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Ekki tókst að setja <xliff:g id="APP_NAME">%1$s</xliff:g> upp. Losaðu um pláss og reyndu aftur."</string>
diff --git a/packages/PackageInstaller/res/values-it/strings.xml b/packages/PackageInstaller/res/values-it/strings.xml
index 617bfda..e635313 100644
--- a/packages/PackageInstaller/res/values-it/strings.xml
+++ b/packages/PackageInstaller/res/values-it/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"App installata."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Vuoi installare questa app?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Vuoi aggiornare questa app?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Vuoi aggiornare questa app da <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nGeneralmente l\'app riceve gli aggiornamenti da <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se la aggiorni da un\'origine diversa, in futuro potresti ricevere gli aggiornamenti da qualsiasi origine sul telefono. La funzionalità dell\'app potrebbe cambiare."</string>
     <string name="install_failed" msgid="5777824004474125469">"App non installata."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"È stata bloccata l\'installazione del pacchetto."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"App non installata poiché il pacchetto è in conflitto con un pacchetto esistente."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Questo utente non può installare app sconosciute"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"L\'utente non è autorizzato a installare app"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Aggiorna comunque"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Gestisci app"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Spazio esaurito"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Impossibile installare <xliff:g id="APP_NAME">%1$s</xliff:g>. Libera dello spazio e riprova."</string>
diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml
index 2261218..cf098ac 100644
--- a/packages/PackageInstaller/res/values-iw/strings.xml
+++ b/packages/PackageInstaller/res/values-iw/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"האפליקציה הותקנה."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"האם ברצונך להתקין אפליקציה זו?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"האם ברצונך לעדכן אפליקציה זו?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"לקבל את העדכון לאפליקציה הזו מ-<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nהאפליקציה הזו בדרך כלל מקבלת עדכונים מ-<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. אם בחרת לעדכן ממקור אחר, יכול להיות שבעתיד יתקבלו עדכונים ממקורות אחרים בטלפון. תכונות האפליקציה יכולות להשתנות."</string>
     <string name="install_failed" msgid="5777824004474125469">"האפליקציה לא הותקנה."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"החבילה נחסמה להתקנה."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"האפליקציה לא הותקנה כי החבילה מתנגשת עם חבילה קיימת."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"למשתמש הזה אין הרשאה להתקין אפליקציות שאינן מוכרות"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"למשתמש הזה אין הרשאה להתקין אפליקציות"</string>
     <string name="ok" msgid="7871959885003339302">"אישור"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"אני רוצה לעדכן בכל זאת"</string>
     <string name="manage_applications" msgid="5400164782453975580">"ניהול אפליקציות"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"אין מספיק מקום"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"לא ניתן להתקין את <xliff:g id="APP_NAME">%1$s</xliff:g>. יש לפנות מקום אחסון ולנסות שוב."</string>
diff --git a/packages/PackageInstaller/res/values-ja/strings.xml b/packages/PackageInstaller/res/values-ja/strings.xml
index 9764f1b..3e7a6c8 100644
--- a/packages/PackageInstaller/res/values-ja/strings.xml
+++ b/packages/PackageInstaller/res/values-ja/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"アプリをインストールしました。"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"このアプリをインストールしますか?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"このアプリを更新しますか?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"このアプリを <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> から更新しますか?\n\nこのアプリは通常、<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> からアップデートを受信しています。別の提供元から更新することにより、お使いのスマートフォンで今後のアップデートを任意の提供元から受け取ることになります。アプリの機能は変更される場合があります。"</string>
     <string name="install_failed" msgid="5777824004474125469">"アプリはインストールされていません。"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"パッケージのインストールはブロックされています。"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"パッケージが既存のパッケージと競合するため、アプリをインストールできませんでした。"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"このユーザーは不明なアプリをインストールできません"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"このユーザーはアプリをインストールできません"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"更新する"</string>
     <string name="manage_applications" msgid="5400164782453975580">"アプリの管理"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"容量不足"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> をインストールできませんでした。空き容量を増やしてもう一度お試しください。"</string>
diff --git a/packages/PackageInstaller/res/values-ka/strings.xml b/packages/PackageInstaller/res/values-ka/strings.xml
index ee0cefa..0699f0b 100644
--- a/packages/PackageInstaller/res/values-ka/strings.xml
+++ b/packages/PackageInstaller/res/values-ka/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"აპი დაინსტალირებულია."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"გნებავთ ამ აპის დაყენება?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"გსურთ ამ აპის განახლება?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"გსურთ განაახლოთ ეს აპი <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-ისგან?\n\nეს აპი, როგორც წესი, განახლებებს იღებს <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-ისგან. აპის სხვა წყაროდან განახლებით შემდგომში განახლებების მიღებას შეძლებთ ნებისმიერი წყაროდან თქვენს ტელეფონზე. აპის ფუნქციები, შესაძლოა, შეიცვალოს."</string>
     <string name="install_failed" msgid="5777824004474125469">"აპი დაუინსტალირებელია."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"ამ პაკეტის ინსტალაცია დაბლოკილია."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"აპი ვერ დაინსტალირდა, რადგან პაკეტი კონფლიქტშია არსებულ პაკეტთან."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ამ მომხმარებელს არ შეუძლია უცნობი აპების ინსტალაცია"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ამ მომხმარებელს არ აქვს აპების ინსტალაციის უფლება"</string>
     <string name="ok" msgid="7871959885003339302">"კარგი"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"მაინც განახლდეს"</string>
     <string name="manage_applications" msgid="5400164782453975580">"აპების მართვა"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"მეხსიერება არასაკმარისია"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ვერ დაინსტალირდა. გაათავისუფლეთ მეხსიერება და ცადეთ ხელახლა."</string>
diff --git a/packages/PackageInstaller/res/values-kk/strings.xml b/packages/PackageInstaller/res/values-kk/strings.xml
index 27b0289..371aca3 100644
--- a/packages/PackageInstaller/res/values-kk/strings.xml
+++ b/packages/PackageInstaller/res/values-kk/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Қолданба орнатылды."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Бұл қолданбаны орнатқыңыз келе ме?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Бұл қолданбаны жаңартқыңыз келе ме?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Бұл қолданба <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> арқылы жаңартылсын ба?\n\nБұл қолданба әдетте <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> көмегімен жаңартылады. Басқа дереккөзден жаңартсаңыз, телефоныңыздағы кез келген дереккөзден алдағы жаңартулар берілуі мүмкін. Қолданба функциялары өзгеруі мүмкін."</string>
     <string name="install_failed" msgid="5777824004474125469">"Қолданба орнатылмады."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Пакетті орнатуға тыйым салынды."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Жаңа пакет пен бұрыннан бар пакеттің арасында қайшылық туындағандықтан, қолданба орнатылмады."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Бұл пайдаланушы белгісіз қолданбаларды орната алмайды"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Бұл пайдаланушының қолданбаларды орнату рұқсаты жоқ"</string>
     <string name="ok" msgid="7871959885003339302">"Жарайды"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Бәрібір жаңарту"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Қолданбаларды басқару"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Орын жоқ"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы орнатылмады. Орын босатып, қайталап көріңіз."</string>
diff --git a/packages/PackageInstaller/res/values-km/strings.xml b/packages/PackageInstaller/res/values-km/strings.xml
index 1262181..04dc574 100644
--- a/packages/PackageInstaller/res/values-km/strings.xml
+++ b/packages/PackageInstaller/res/values-km/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"បាន​ដំឡើង​កម្មវិធី។"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"តើ​អ្នក​ចង់​ដំឡើង​កម្មវិធី​នេះ​ដែរទេ?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"តើអ្នកចង់ដំឡើងកំណែ​កម្មវិធីនេះដែរទេ?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"ដំឡើងកំណែកម្មវិធីនេះពី <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ឬ?\n\nកម្មវិធីនេះជាធម្មតាទទួលបានកំណែថ្មីពី <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>។ តាមរយៈការដំឡើងកំណែពីប្រភពផ្សេង អ្នកអាចនឹងទទួលបានកំណែថ្មីនាពេលអនាគតពីប្រភពណាក៏បាននៅលើទូរសព្ទរបស់អ្នក។ មុខងារ​កម្មវិធីអាចមានការផ្លាស់ប្ដូរ។"</string>
     <string name="install_failed" msgid="5777824004474125469">"មិន​បាន​ដំឡើង​កម្មវិធីទេ។"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"កញ្ចប់ត្រូវបានទប់ស្កាត់​មិន​ឱ្យ​ដំឡើង។"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"កម្មវិធីមិនបានដំឡើងទេ ដោយសារកញ្ចប់កម្មវិធីមិនត្រូវគ្នាជាមួយកញ្ចប់ដែលមានស្រាប់។"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"អ្នកប្រើប្រាស់​នេះ​មិនអាច​ដំឡើងកម្មវិធីមិនស្គាល់​​បាន​ទេ"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"មិន​អនុញ្ញាត​ឱ្យអ្នក​ប្រើ​ប្រាស់នេះ​ដំឡើងកម្មវិធីទេ"</string>
     <string name="ok" msgid="7871959885003339302">"យល់ព្រម"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"មិនអីទេ ដំឡើង​កំណែ​ចុះ"</string>
     <string name="manage_applications" msgid="5400164782453975580">"គ្រប់គ្រង​កម្មវិធី"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"អស់​ទំហំផ្ទុក"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"មិន​អាច​ដំឡើង <xliff:g id="APP_NAME">%1$s</xliff:g> បានទេ។ សូម​បង្កើន​ទំហំ​ផ្ទុក​ទំនេរ​មួយចំនួន​ រួច​ព្យាយាម​ម្ដង​ទៀត។"</string>
diff --git a/packages/PackageInstaller/res/values-kn/strings.xml b/packages/PackageInstaller/res/values-kn/strings.xml
index 43aaab1..0378712 100644
--- a/packages/PackageInstaller/res/values-kn/strings.xml
+++ b/packages/PackageInstaller/res/values-kn/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"ಆ್ಯಪ್‌ ಅನ್ನು ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡಲಾಗಿದೆ."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"ನೀವು ಈ ಆ್ಯಪ್‌ ಅನ್ನು ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡಲು ಬಯಸುವಿರಾ?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"ನೀವು ಈ ಆ್ಯಪ್‌ ಅನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಲು ಬಯಸುವಿರಾ?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ನಿಂದ ಈ ಆ್ಯಪ್ ಅನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬೇಕೇ?\n\nಈ ಆ್ಯಪ್ ಸಾಮಾನ್ಯವಾಗಿ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ನಿಂದ ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಸ್ವೀಕರಿಸುತ್ತದೆ. ಬೇರೆ ಮೂಲವೊಂದರಿಂದ ಅಪ್‌ಡೇಟ್‌ ಮಾಡುವ ಮೂಲಕ, ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿರುವ ಯಾವುದೇ ಮೂಲದಿಂದ ಭವಿಷ್ಯದ ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ನೀವು ಸ್ವೀಕರಿಸಬಹುದು. ಆ್ಯಪ್‌ನ ಕಾರ್ಯಚಟುವಟಿಕೆಯು ಬದಲಾಗಬಹುದು."</string>
     <string name="install_failed" msgid="5777824004474125469">"ಆ್ಯಪ್‌ ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡಲಾಗಿಲ್ಲ."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡುವ ಪ್ಯಾಕೇಜ್‌ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"ಪ್ಯಾಕೇಜ್‌ನಂತೆ ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡಲಾಗಿರುವ ಆ್ಯಪ್‌ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪ್ಯಾಕೇಜ್ ಜೊತೆಗೆ ಸಂಘರ್ಷವಾಗುತ್ತದೆ."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ಈ ಬಳಕೆದಾರರು ಅಪರಿಚಿತ ಆ್ಯಪ್‌ಗಳನ್ನು ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ಆ್ಯಪ್‌ಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡಲು ಈ ಬಳಕೆದಾರರನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ"</string>
     <string name="ok" msgid="7871959885003339302">"ಸರಿ"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"ಪರವಾಗಿಲ್ಲ, ಅಪ್‌ಡೇಟ್ ಮಾಡಿ"</string>
     <string name="manage_applications" msgid="5400164782453975580">"ಆ್ಯಪ್ ನಿರ್ವಹಿಸಿ"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ಸಂಗ್ರಹಣೆ ಖಾಲಿ ಇಲ್ಲ"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಅನ್ನು ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಕೊಂಚ ಸ್ಥಳವನ್ನು ಖಾಲಿ ಮಾಡಿ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
diff --git a/packages/PackageInstaller/res/values-ko/strings.xml b/packages/PackageInstaller/res/values-ko/strings.xml
index 9da1182..06ce095 100644
--- a/packages/PackageInstaller/res/values-ko/strings.xml
+++ b/packages/PackageInstaller/res/values-ko/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"앱이 설치되었습니다."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"이 앱을 설치하시겠습니까?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"이 앱을 업데이트하시겠습니까?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>에서 이 앱을 업데이트하시겠습니까?\n\n평소에는 <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>에서 앱을 업데이트했습니다. 다른 출처에서 업데이트를 받으면 향후 휴대전화에 있는 어떤 출처든지 업데이트를 받을 수 있습니다. 앱 기능도 변경될 수 있습니다."</string>
     <string name="install_failed" msgid="5777824004474125469">"앱이 설치되지 않았습니다."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"패키지 설치가 차단되었습니다."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"패키지가 기존 패키지와 충돌하여 앱이 설치되지 않았습니다."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"이 사용자는 알 수 없는 앱을 설치할 수 없습니다."</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"이 사용자는 앱을 설치할 권한이 없습니다."</string>
     <string name="ok" msgid="7871959885003339302">"확인"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"업데이트"</string>
     <string name="manage_applications" msgid="5400164782453975580">"앱 관리"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"여유 공간이 없음"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱을 설치할 수 없습니다. 여유 공간을 늘린 후에 다시 시도하세요."</string>
diff --git a/packages/PackageInstaller/res/values-ky/strings.xml b/packages/PackageInstaller/res/values-ky/strings.xml
index 00a32f4..c37775c 100644
--- a/packages/PackageInstaller/res/values-ky/strings.xml
+++ b/packages/PackageInstaller/res/values-ky/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Колдонмо орнотулду."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Бул колдонмону орнотоюн деп жатасызбы?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Бул колдонмону жаңыртайын деп жатасызбы?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Колдонмо <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> аркылуу жаңыртылсынбы?\n\nАдатта бул колдонмо <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> жөнөткөн жаңыртууларды алат. Башка булактан жаңыртуу менен келечекте телефонуңуз ар кайсы булактардан жаңыртылып калат. Колдонмонун функциялары өзгөрүшү мүмкүн."</string>
     <string name="install_failed" msgid="5777824004474125469">"Колдонмо орнотулган жок."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Топтомду орнотууга болбойт."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Башка топтом менен дал келбегендиктен колдонмо орнотулган жок."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Бул колдонуучу белгисиз колдонмолорду орното албайт"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Бул колдонуучу колдонмолорду орното албайт"</string>
     <string name="ok" msgid="7871959885003339302">"ЖАРАЙТ"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Баары бир жаңыртылсын"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Колд. башкаруу"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Бош орун жок"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосун телефонуңузга орнотуу мүмкүн эмес. Орун бошотуп, кайталап орнотуп көрүңүз."</string>
diff --git a/packages/PackageInstaller/res/values-lo/strings.xml b/packages/PackageInstaller/res/values-lo/strings.xml
index 3cce796..f3912cc 100644
--- a/packages/PackageInstaller/res/values-lo/strings.xml
+++ b/packages/PackageInstaller/res/values-lo/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"ຕິດຕັ້ງແອັບແລ້ວ."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"ທ່ານຕ້ອງການຕິດຕັ້ງແອັບນີ້ບໍ່?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"ທ່ານຕ້ອງການອັບເດດແອັບນີ້ບໍ່?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"ອັບເດດແອັບນີ້ຈາກ <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ບໍ?\n\nໂດຍທົ່ວໄປແລ້ວແອັບນີ້ຈະໄດ້ຮັບການອັບເດດຈາກ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. ການອັບເດດຈາກແຫຼ່ງທີ່ມາອື່ນອາດເຮັດໃຫ້ໂທລະສັບຂອງທ່ານໄດ້ຮັບການອັບເດດຈາກແຫຼ່ງທີ່ມານັ້ນໃນອະນາຄົດ. ຟັງຊັນການເຮັດວຽກຂອງແອັບອາດມີການປ່ຽນແປງ."</string>
     <string name="install_failed" msgid="5777824004474125469">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເທື່ອ."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"ແພັກ​ເກດ​ຖືກບ​ລັອກ​ບໍ່​ໃຫ້​ໄດ້​ຮັບ​ການ​ຕິດ​ຕັ້ງ."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເນື່ອງຈາກແພັກເກດຂັດແຍ່ງກັບແພັກເກດທີ່ມີຢູ່ກ່ອນແລ້ວ."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ຜູ້ໃຊ້ນີ້ບໍ່ສາມາດຕິດຕັ້ງແອັບທີ່ບໍ່ຮູ້ຈັກໄດ້"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ຜູ້ໃຊ້ນີ້ບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ຕິດຕັ້ງແອັບໄດ້"</string>
     <string name="ok" msgid="7871959885003339302">"ຕົກລົງ"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"ຢືນຢັນການອັບເດດ"</string>
     <string name="manage_applications" msgid="5400164782453975580">"ຈັດການແອັບ"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ພື້ນທີ່ຫວ່າງບໍ່ພຽງພໍ"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"ບໍ່ສາມາດຕິດຕັ້ງ <xliff:g id="APP_NAME">%1$s</xliff:g> ໄດ້. ກະລຸນາລຶບຂໍ້ມູນທີ່ບໍ່ຈຳເປັນອອກເພື່ອໃຫ້ມີບ່ອນຈັດເກັບຂໍ້ມູນຫວ່າງເພີ່ມຂຶ້ນ ແລ້ວລອງໃໝ່ອີກຄັ້ງ."</string>
diff --git a/packages/PackageInstaller/res/values-lv/strings.xml b/packages/PackageInstaller/res/values-lv/strings.xml
index 55a9f3c..17dd542 100644
--- a/packages/PackageInstaller/res/values-lv/strings.xml
+++ b/packages/PackageInstaller/res/values-lv/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Lietotne ir instalēta."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Vai vēlaties instalēt šo lietotni?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Vai vēlaties atjaunināt šo lietotni?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Vai atjaunināt šo lietotni, izmantojot “<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>”?\n\nŠī lietotne parasti saņem atjauninājumus no “<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>”. Veicot atjaunināšanu no cita avota, iespējams, turpmāk tālrunī saņemsiet atjauninājumus no jebkāda avota. Lietotnes funkcionalitāte var mainīties."</string>
     <string name="install_failed" msgid="5777824004474125469">"Lietotne nav instalēta."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Pakotnes instalēšana tika bloķēta."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Lietotne netika instalēta, jo pastāv pakotnes konflikts ar esošu pakotni."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Šis lietotājs nevar instalēt nezināmas lietotnes"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Šim lietotājam nav atļauts instalēt lietotnes"</string>
     <string name="ok" msgid="7871959885003339302">"Labi"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Tik un tā atjaunināt"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Pārv. lietotnes"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nav brīvas vietas"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Lietotni <xliff:g id="APP_NAME">%1$s</xliff:g> nevarēja instalēt. Atbrīvojiet vietu un mēģiniet vēlreiz."</string>
diff --git a/packages/PackageInstaller/res/values-mk/strings.xml b/packages/PackageInstaller/res/values-mk/strings.xml
index 4024d8a..b8bb6b9 100644
--- a/packages/PackageInstaller/res/values-mk/strings.xml
+++ b/packages/PackageInstaller/res/values-mk/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Апликацијата е инсталирана."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Дали сакате да ја инсталирате апликацијава?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Дали сакате да ја ажурирате апликацијава?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Ажурирајте ја апликацијава од <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nАпликацијава вообичаено добива ажурирања од<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Со ажурирање од различен извор, може да добивате идни ажурирања од кој било извор на вашиот телефон. Функционалноста на апликацијата може да се промени."</string>
     <string name="install_failed" msgid="5777824004474125469">"Апликацијата не е инсталирана."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирањето на пакетот е блокирано."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Апликација што не е инсталирана како пакет е во конфликт со постоечки пакет."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Корисников не може да инсталира непознати апликации"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"На корисников не му е дозволено да инсталира апликации"</string>
     <string name="ok" msgid="7871959885003339302">"Во ред"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Сепак ажурирај"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Управување со апликациите"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Нема простор"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> не може да се инсталира. Ослободете простор и обидете се повторно."</string>
diff --git a/packages/PackageInstaller/res/values-ml/strings.xml b/packages/PackageInstaller/res/values-ml/strings.xml
index 42790b2..0535843 100644
--- a/packages/PackageInstaller/res/values-ml/strings.xml
+++ b/packages/PackageInstaller/res/values-ml/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"ആപ്പ് ഇൻസ്‌റ്റാൾ ചെയ്‌തു."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"ഈ ആപ്പ് ഇൻസ്‌റ്റാൾ ചെയ്യണോ?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"ഈ ആപ്പ് അപ്‌ഡേറ്റ് ചെയ്യണോ?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> എന്നതിൽ നിന്ന് ഈ ആപ്പ് അപ്‌ഡേറ്റ് ചെയ്യണോ?\n\nഈ ആപ്പിന് സാധാരണയായി <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> എന്നതിൽ നിന്ന് അപ്‌ഡേറ്റുകൾ ലഭിക്കാറുണ്ട്. മറ്റൊരു ഉറവിടത്തിൽ നിന്ന് അപ്‌ഡേറ്റ് ചെയ്യുന്നത് വഴി, നിങ്ങളുടെ ഫോണിലെ ഏത് ഉറവിടത്തിൽ നിന്നും ഭാവിയിൽ അപ്‌ഡേറ്റുകൾ ലഭിക്കാൻ ഇടയുണ്ട്. ആപ്പ് ഫംഗ്ഷണാലിറ്റിയിൽ വ്യത്യാസം വന്നേക്കാം."</string>
     <string name="install_failed" msgid="5777824004474125469">"ആപ്പ് ഇൻസ്‌റ്റാൾ ചെയ്‌തിട്ടില്ല."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"പാക്കേജ് ഇൻസ്‌റ്റാൾ ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്‌തു."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"പാക്കേജിന് നിലവിലുള്ള പാക്കേജുമായി പൊരുത്തക്കേടുള്ളതിനാൽ, ആപ്പ് ഇൻസ്‌റ്റാൾ ചെയ്‌തില്ല."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ഈ ഉപയോക്താവിന്, അജ്ഞാത ആപ്പുകൾ ഇൻസ്‌റ്റാൾ ചെയ്യാനാവില്ല"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ആപ്പുകൾ ഇൻ‌സ്‌റ്റാൾ ചെയ്യാൻ ഈ ഉപയോക്താവിന് അനുവാദമില്ല"</string>
     <string name="ok" msgid="7871959885003339302">"ശരി"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"എന്തായാലും അപ്‌ഡേറ്റ് ചെയ്യുക"</string>
     <string name="manage_applications" msgid="5400164782453975580">"ആപ്പുകൾ മാനേജ് ചെയ്യുക"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ഇടമില്ല"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ഇൻസ്‌റ്റാൾ ചെയ്യാനായില്ല. കുറച്ച് ഇടമുണ്ടാക്കി, വീണ്ടും ശ്രമിക്കുക."</string>
diff --git a/packages/PackageInstaller/res/values-mn/strings.xml b/packages/PackageInstaller/res/values-mn/strings.xml
index 01e7aec..84a3909 100644
--- a/packages/PackageInstaller/res/values-mn/strings.xml
+++ b/packages/PackageInstaller/res/values-mn/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Аппыг суулгасан."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Та энэ аппыг суулгахыг хүсэж байна уу?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Та энэ аппыг шинэчлэхийг хүсэж байна уу?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Аппыг <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>-с шинэчлэх үү?\n\nЭнэ апп ихэвчлэн <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>-с шинэчлэлт хүлээн авдаг. Өөр эх сурвалжаас шинэчилснээр та ирээдүйн шинэчлэлтийг утсан дээрх аливаа эх сурвалжаас хүлээн авч магадгүй. Аппын ажиллагаа өөрчлөгдөж магадгүй."</string>
     <string name="install_failed" msgid="5777824004474125469">"Аппыг суулгаагүй."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Багц суулгахыг блоклосон байна."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Багц одоо байгаа багцтай тохирохгүй байгаа тул аппыг суулгаж чадсангүй."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Энэ хэрэглэгч тодорхойгүй апп суулгах боломжгүй"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Энэ хэрэглэгч нь апп суулгах зөвшөөрөлгүй байна"</string>
     <string name="ok" msgid="7871959885003339302">"ОК"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Ямартай ч шинэчлэх"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Аппуудыг удирдах"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Орон зай дутагдаж байна"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g>-г суулгаж чадсангүй. Хэсэг зай чөлөөлөөд дахин оролдоно уу."</string>
diff --git a/packages/PackageInstaller/res/values-mr/strings.xml b/packages/PackageInstaller/res/values-mr/strings.xml
index 5ae257a..367dede 100644
--- a/packages/PackageInstaller/res/values-mr/strings.xml
+++ b/packages/PackageInstaller/res/values-mr/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"अ‍ॅप इंस्टॉल झाले."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"तुम्हाला हे ॲप इंस्टॉल करायचे आहे का?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"तुम्हाला हे ॲप अपडेट करायचे आहे का?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> वरून हे अ‍ॅप अपडेट करायचे आहे का?\n\nया अ‍ॅपला सामान्यतः <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> कडून अपडेट मिळतात. वेगवेगळ्या स्रोताकडून अपडेट करून, तुम्हाला तुमच्या फोनवरील कोणत्याही स्रोताकडून भविष्यातील अपडेट मिळू शकतात. अ‍ॅपची कार्यक्षमता बदलू शकते."</string>
     <string name="install_failed" msgid="5777824004474125469">"अ‍ॅप इंस्टॉल झाले नाही."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"पॅकेज इंस्टॉल होण्यापासून ब्लॉक केले होते."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"पॅकेजचा विद्यमान पॅकेजशी विरोध असल्याने अ‍ॅप इंस्टॉल झाले नाही."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"या वापरकर्त्याद्वारे अज्ञात अ‍ॅप्स इंस्टॉल केली जाऊ शकत नाहीत"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"या वापरकर्त्याला अ‍ॅप्स इंस्टॉल करण्याची अनुमती नाही"</string>
     <string name="ok" msgid="7871959885003339302">"ओके"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"तरीही अपडेट करा"</string>
     <string name="manage_applications" msgid="5400164782453975580">"अ‍ॅप्स व्यवस्थापन"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"जागा संपली"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> इंस्टॉल केले जाऊ शकत नाही. काही जागा मोकळी करा आणि पुन्हा प्रयत्न करा."</string>
diff --git a/packages/PackageInstaller/res/values-ms/strings.xml b/packages/PackageInstaller/res/values-ms/strings.xml
index a26d274..6ab6622 100644
--- a/packages/PackageInstaller/res/values-ms/strings.xml
+++ b/packages/PackageInstaller/res/values-ms/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Aplikasi dipasang."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Adakah anda ingin memasang aplikasi ini?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Adakah anda mahu mengemas kini apl ini?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Kemas kinikan apl ini daripada <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nApl ini biasanya menerima kemaskinian daripada <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dengan membuat kemaskinian daripada sumber yang berbeza, anda mungkin menerima kemaskinian masa hadapan daripada sebarang sumber pada telefon anda. Fungsi apl mungkin berubah."</string>
     <string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak dipasang."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Pakej ini telah disekat daripada dipasang."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Apl tidak dipasang kerana pakej bercanggah dengan pakej yang sedia ada."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Apl yang tidak diketahui tidak boleh dipasang oleh pengguna ini"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Pengguna ini tidak dibenarkan memasang apl"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Kemas kinikan juga"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Urus apl"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Kehabisan ruang"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dapat dipasang. Kosongkan sebahagian ruang dan cuba lagi."</string>
diff --git a/packages/PackageInstaller/res/values-my/strings.xml b/packages/PackageInstaller/res/values-my/strings.xml
index db21cf7..4844d58 100644
--- a/packages/PackageInstaller/res/values-my/strings.xml
+++ b/packages/PackageInstaller/res/values-my/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"အက်ပ်ထည့်သွင်းပြီးပါပြီ။"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"ဤအက်ပ်ကို ထည့်သွင်းလိုသလား။"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"ဤအက်ပ်ကို အပ်ဒိတ်လုပ်လိုသလား။"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"ဤအက်ပ်ကို <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> မှ အပ်ဒိတ်လုပ်မလား။\n\nဤအက်ပ်သည် ပုံမှန်အားဖြင့် <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> မှ အပ်ဒိတ်များ ရရှိသည်။ မတူညီသောရင်းမြစ်မှ အပ်ဒိတ်လုပ်ခြင်းဖြင့် ဖုန်းပေါ်တွင် နောင်လာမည့်အပ်ဒိတ်များကို မည်သည့်ရင်းမြစ်မဆိုမှ လက်ခံရယူနိုင်သည်။ အက်ပ်လုပ်ဆောင်ချက် ပြောင်းလဲနိုင်သည်။"</string>
     <string name="install_failed" msgid="5777824004474125469">"အက်ပ်မထည့်သွင်းရသေးပါ"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"ပက်ကေ့ဂျ်ထည့်သွင်းခြင်းကို ပိတ်ထားသည်။"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"ပက်ကေ့ဂျ်အဖြစ် ထည့်သွင်းမထားသော အက်ပ်သည် လက်ရှိပက်ကေ့ဂျ်နှင့် တိုက်နေသည်။"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"အရင်းအမြစ်မသိသော အက်ပ်များကို ဤအသုံးပြုသူက ထည့်သွင်းခွင့်မရှိပါ"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ဤအသုံးပြုသူသည် အက်ပ်များကို ထည့်သွင်းခွင့်မရှိပါ"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"ဘာဖြစ်ဖြစ် အပ်ဒိတ်လုပ်ရန်"</string>
     <string name="manage_applications" msgid="5400164782453975580">"အက်ပ်စီမံခြင်း"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"နေရာလွတ်မရှိပါ"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ကို ထည့်သွင်း၍ မရနိုင်ပါ။ နေရာလွတ်ပြုလုပ်ပြီး ထပ်စမ်းကြည့်ပါ။"</string>
diff --git a/packages/PackageInstaller/res/values-nb/strings.xml b/packages/PackageInstaller/res/values-nb/strings.xml
index 94b7f50..7532d7b 100644
--- a/packages/PackageInstaller/res/values-nb/strings.xml
+++ b/packages/PackageInstaller/res/values-nb/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Appen er installert."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Vil du installere denne appen?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Vil du oppdatere denne appen?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Vil du oppdatere denne appen fra <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDenne appen mottar vanligvis oppdateringer fra <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Hvis du oppdaterer fra en annen kilde, kan du få fremtidige oppdateringer fra en hvilken som helst kilde på telefonen. Appfunksjonaliteten kan endres."</string>
     <string name="install_failed" msgid="5777824004474125469">"Appen ble ikke installert."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Pakken er blokkert fra å bli installert."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Appen ble ikke installert fordi pakken er i konflikt med en eksisterende pakke."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ukjente apper kan ikke installeres av denne brukeren"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Brukeren har ikke tillatelse til å installere apper"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Oppdater likevel"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Administrer apper"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Tom for plass"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> kunne ikke installeres. Frigjør plass og prøv på nytt."</string>
diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml
index d531d5c..14f387f 100644
--- a/packages/PackageInstaller/res/values-ne/strings.xml
+++ b/packages/PackageInstaller/res/values-ne/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"एप इन्स्टल गरियो।"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"तपाईं यो एप इन्स्टल गर्न चाहनुहुन्छ?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"तपाईं यो एप अपडेट गर्न चाहनुहुन्छ?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"यो एप <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> बाट अपडेट गर्ने हो?\n\nयो एपले सामान्यतया <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> बाट अपडेट प्राप्त गर्छ। तपाईंले कुनै फरक स्रोतबाट अपडेट गर्नुभयो भने तपाईं भविष्यमा आफ्नो फोनमा भएको जुनसुकै स्रोतबाट अपडेटहरू प्राप्त गर्न सक्नुहुन्छ। यसो गर्दा एपको विशेषता परिवर्तन हुन सक्छ।"</string>
     <string name="install_failed" msgid="5777824004474125469">"एप स्थापना गरिएन।"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"यो प्याकेज स्थापना गर्ने क्रममा अवरोध गरियो।"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"प्याकेजका रूपमा स्थापना नगरिएको एप विद्यमान प्याकेजसँग मेल खाँदैन।"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"यी प्रयोगकर्ता अज्ञात एपहरू इन्स्टल गर्न सक्नुहुन्न"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"यो प्रयोगकर्तालाई एपहरू इन्स्टल गर्ने अनुमति छैन"</string>
     <string name="ok" msgid="7871959885003339302">"ठिक छ"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"जे भए पनि अपडेट गर्नुहोस्"</string>
     <string name="manage_applications" msgid="5400164782453975580">"एपको प्रबन्ध गर्नु…"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"खाली ठाउँ छैन"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> स्थापना गर्न सकिएन। केही ठाउँ खाली गरेर फेरि प्रयास गर्नुहोस्।"</string>
diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml
index ad4df64..fab6d51 100644
--- a/packages/PackageInstaller/res/values-nl/strings.xml
+++ b/packages/PackageInstaller/res/values-nl/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"App geïnstalleerd."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Wil je deze app installeren?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Wil je deze app updaten?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Deze app updaten via <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDeze app krijgt gewoonlijk updates via <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Als je updatet via een andere bron, kun je toekomstige updates via elke bron op je telefoon krijgen. De app-functionaliteit kan veranderen."</string>
     <string name="install_failed" msgid="5777824004474125469">"App niet geïnstalleerd."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"De installatie van het pakket is geblokkeerd."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"App die niet is geïnstalleerd als pakket conflicteert met een bestaand pakket."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Onbekende apps kunnen niet worden geïnstalleerd door deze gebruiker"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Deze gebruiker mag geen apps installeren"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Toch updaten"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Apps beheren"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Geen ruimte beschikbaar"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan niet worden geïnstalleerd. Maak ruimte vrij en probeer het opnieuw."</string>
diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml
index db908fd..ee6fa60 100644
--- a/packages/PackageInstaller/res/values-or/strings.xml
+++ b/packages/PackageInstaller/res/values-or/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"ଆପ ଇନଷ୍ଟଲ ହୋଇଗଲା।"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"ଆପଣ ଏହି ଆପକୁ ଇନଷ୍ଟଲ୍ କରିବା ପାଇଁ ଚାହୁଁଛନ୍ତି କି?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"ଆପଣ ଏହି ଆପକୁ ଅପଡେଟ୍ କରିବା ପାଇଁ ଚାହୁଁଛନ୍ତି କି?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>ରୁ ଏହି ଆପକୁ ଅପଡେଟ କରିବେ?\n\nଏହି ଆପ ସାଧାରଣତଃ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>ରୁ ଅପଡେଟ ପାଇଥାଏ। ଏକ ଭିନ୍ନ ସୋର୍ସରୁ ଅପଡେଟ କରି ଆପଣ ଆପଣଙ୍କ ଫୋନରେ ଯେ କୌଣସି ସୋର୍ସରୁ ଭବିଷ୍ୟତର ଅପଡେଟଗୁଡ଼ିକ ପାଇପାରନ୍ତି। ଆପ କାର୍ଯ୍ୟକ୍ଷମତା ପରିବର୍ତ୍ତନ ହୋଇପାରେ।"</string>
     <string name="install_failed" msgid="5777824004474125469">"ଆପ୍‍ ଇନଷ୍ଟଲ୍‌ ହୋଇନାହିଁ।"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"ଏହି ପ୍ୟାକେଜ୍‌କୁ ଇନଷ୍ଟଲ୍‍ କରାଯିବାରୁ ଅବରୋଧ କରାଯାଇଥିଲା।"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"ପୂର୍ବରୁ ଥିବା ପ୍ୟାକେଜ୍‍ ସହ ଏହି ପ୍ୟାକେଜ୍‌ର ସମସ୍ୟା ଉପୁଯିବାରୁ ଆପ୍‍ ଇନଷ୍ଟଲ୍‍ ହୋଇପାରିଲା ନାହିଁ।"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ଏହି ୟୁଜରଙ୍କ ଦ୍ୱାରା ଅଜଣା ଆପ୍‍ ଇନଷ୍ଟଲ୍‍ କରାଯାଇପାରିବ ନାହିଁ"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ଏହି ୟୁଜର୍‌ ଆପ୍‍ ଇନଷ୍ଟଲ୍‍ କରିପାରିବେ ନାହିଁ"</string>
     <string name="ok" msgid="7871959885003339302">"ଠିକ୍ ଅଛି"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"ଯେ କୌଣସି ମତେ ଅପଡେଟ କରନ୍ତୁ"</string>
     <string name="manage_applications" msgid="5400164782453975580">"ଆପ୍‌ଗୁଡ଼ିକର ପରିଚାଳନା କରନ୍ତୁ"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ଆଉ ସ୍ଥାନ ନାହିଁ"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଇନଷ୍ଟଲ୍‌ କରାଯାଇପାରିଲା ନାହିଁ। କିଛି ସ୍ଥାନ ଖାଲିକରି ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
diff --git a/packages/PackageInstaller/res/values-pa/strings.xml b/packages/PackageInstaller/res/values-pa/strings.xml
index 64dd9c7..1ef4921 100644
--- a/packages/PackageInstaller/res/values-pa/strings.xml
+++ b/packages/PackageInstaller/res/values-pa/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"ਐਪ ਸਥਾਪਤ ਕੀਤੀ ਗਈ।"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"ਕੀ ਤੁਸੀਂ ਇਸ ਐਪ ਨੂੰ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"ਕੀ ਤੁਸੀਂ ਇਸ ਐਪ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"ਕੀ ਇਸ ਐਪ ਨੂੰ <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ਤੋਂ ਅੱਪਡੇਟ ਕਰਨਾ ਹੈ?\n\nਇਸ ਐਪ ਨੂੰ ਆਮ ਤੌਰ \'ਤੇ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> ਤੋਂ ਅੱਪਡੇਟਾਂ ਪ੍ਰਾਪਤ ਹੁੰਦੀਆਂ ਹਨ। ਕਿਸੇ ਵੱਖਰੇ ਸਰੋਤ ਤੋਂ ਅੱਪਡੇਟ ਕਰ ਕੇ, ਤੁਸੀਂ ਆਪਣੇ ਫ਼ੋਨ \'ਤੇ ਕਿਸੇ ਵੀ ਸਰੋਤ ਤੋਂ ਭਵਿੱਖੀ ਅੱਪਡੇਟਾਂ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ। ਐਪ ਪ੍ਰਕਾਰਜਾਤਮਕਤਾ ਬਦਲ ਸਕਦੀ ਹੈ।"</string>
     <string name="install_failed" msgid="5777824004474125469">"ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"ਪੈਕੇਜ ਨੂੰ ਸਥਾਪਤ ਹੋਣ ਤੋਂ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਸੀ।"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"ਪੈਕੇਜ ਦੇ ਇੱਕ ਮੌਜੂਦਾ ਪੈਕੇਜ ਨਾਲ ਵਿਵਾਦ ਹੋਣ ਕਰਕੇ ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ਇਹ ਵਰਤੋਂਕਾਰ ਅਗਿਆਤ ਐਪਾਂ ਨੂੰ ਸਥਾਪਤ ਨਹੀਂ ਕਰ ਸਕਦਾ"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"</string>
     <string name="ok" msgid="7871959885003339302">"ਠੀਕ ਹੈ"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"ਫਿਰ ਵੀ ਅੱਪਡੇਟ ਕਰੋ"</string>
     <string name="manage_applications" msgid="5400164782453975580">"ਐਪਾਂ ਪ੍ਰਬੰਧਿਤ ਕਰੋ"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ਜਗ੍ਹਾ ਖਾਲੀ ਨਹੀਂ"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਕੁਝ ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
diff --git a/packages/PackageInstaller/res/values-pl/strings.xml b/packages/PackageInstaller/res/values-pl/strings.xml
index c05c81a..e44a391 100644
--- a/packages/PackageInstaller/res/values-pl/strings.xml
+++ b/packages/PackageInstaller/res/values-pl/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Aplikacja została zainstalowana."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Zainstalować tę aplikację?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Zaktualizować tę aplikację?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Zastosować do aplikacji aktualizację pochodzącą z tego źródła (<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>)?\n\nAktualizacje dla tej aplikacji zwykle dostarcza <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Jeśli zastosujesz aplikację pochodzącą z innego źródła, możesz w przyszłości otrzymywać na telefonie aktualizacje z dowolnych źródeł. Funkcje aplikacji mogą się zmienić."</string>
     <string name="install_failed" msgid="5777824004474125469">"Aplikacja nie została zainstalowana."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Instalacja pakietu została zablokowana."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacja nie została zainstalowana, bo powoduje konflikt z istniejącym pakietem."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ten użytkownik nie może instalować nieznanych aplikacji"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ten użytkownik nie może instalować aplikacji"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Zaktualizuj mimo to"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Zarządzaj aplikacjami"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Brak miejsca"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Nie można zainstalować aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>. Zwolnij trochę miejsca i spróbuj ponownie."</string>
diff --git a/packages/PackageInstaller/res/values-pt-rBR/strings.xml b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
index f2eab25..990895c 100644
--- a/packages/PackageInstaller/res/values-pt-rBR/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"App instalado."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Quer instalar esse app?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Quer atualizar esse app?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Atualizar este app com <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAs atualizações dele normalmente são feitas com <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ao atualizar usando uma origem diferente, as próximas atualizações poderão ser feitas com qualquer origem no seu smartphone. A funcionalidade do app pode mudar."</string>
     <string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Apps desconhecidos não podem ser instalados por este usuário"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Este usuário não tem permissão para instalar apps"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Atualizar mesmo assim"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Gerenciar apps"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Sem espaço"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Não foi possível instalar <xliff:g id="APP_NAME">%1$s</xliff:g>. Libere um pouco de espaço e tente novamente."</string>
diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
index c440880..aff06e9 100644
--- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"App instalada."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Instalar esta app?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Pretende atualizar esta app?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Atualizar esta app a partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nNormalmente, esta app recebe atualizações de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se atualizar a partir de uma origem diferente, poderá receber futuras atualizações de qualquer origem no seu telemóvel. A funcionalidade da app pode sofrer alterações."</string>
     <string name="install_failed" msgid="5777824004474125469">"Aplicação não instalada."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Foi bloqueada a instalação do pacote."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"A app não foi instalada porque o pacote entra em conflito com um pacote existente."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Este utilizador não pode instalar aplicações desconhecidas."</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Este utilizador não tem autorização para instalar aplicações."</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Atualizar mesmo assim"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Gerir app"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Sem espaço"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Não foi possível instalar a app <xliff:g id="APP_NAME">%1$s</xliff:g>. Liberte algum espaço e tente novamente."</string>
diff --git a/packages/PackageInstaller/res/values-pt/strings.xml b/packages/PackageInstaller/res/values-pt/strings.xml
index f2eab25..990895c 100644
--- a/packages/PackageInstaller/res/values-pt/strings.xml
+++ b/packages/PackageInstaller/res/values-pt/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"App instalado."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Quer instalar esse app?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Quer atualizar esse app?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Atualizar este app com <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAs atualizações dele normalmente são feitas com <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ao atualizar usando uma origem diferente, as próximas atualizações poderão ser feitas com qualquer origem no seu smartphone. A funcionalidade do app pode mudar."</string>
     <string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Apps desconhecidos não podem ser instalados por este usuário"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Este usuário não tem permissão para instalar apps"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Atualizar mesmo assim"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Gerenciar apps"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Sem espaço"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Não foi possível instalar <xliff:g id="APP_NAME">%1$s</xliff:g>. Libere um pouco de espaço e tente novamente."</string>
diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml
index f12e364..de4dd55 100644
--- a/packages/PackageInstaller/res/values-ro/strings.xml
+++ b/packages/PackageInstaller/res/values-ro/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Aplicație instalată."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Vrei să instalezi această aplicație?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Vrei să actualizezi această aplicație?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Actualizezi aplicația de la <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nDe obicei, aplicația primește actualizări de la <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Dacă actualizezi din altă sursă, este posibil să primești actualizări viitoare din orice sursă pe telefon. Funcționalitatea aplicației se poate modifica."</string>
     <string name="install_failed" msgid="5777824004474125469">"Aplicația nu a fost instalată."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Instalarea pachetului a fost blocată."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Aplicația nu a fost instalată deoarece pachetul intră în conflict cu un pachet existent."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Aplicațiile necunoscute nu pot fi instalate de acest utilizator"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Acest utilizator nu are permisiunea să instaleze aplicații"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Actualizează oricum"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Gestionează"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Spațiu de stocare insuficient"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Aplicația <xliff:g id="APP_NAME">%1$s</xliff:g> nu a putut fi instalată. Eliberează spațiu și încearcă din nou."</string>
diff --git a/packages/PackageInstaller/res/values-ru/strings.xml b/packages/PackageInstaller/res/values-ru/strings.xml
index e7e9e33..2e28c30 100644
--- a/packages/PackageInstaller/res/values-ru/strings.xml
+++ b/packages/PackageInstaller/res/values-ru/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Приложение установлено."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Установить приложение?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Обновить приложение?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Обновить приложение с помощью <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nОбычно обновления для этого приложения поступают из <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Если обновить приложение с помощью другого источника, в будущем для этого могут использоваться любые источники на телефоне. Функции приложения могут измениться."</string>
     <string name="install_failed" msgid="5777824004474125469">"Приложение не установлено."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Установка пакета заблокирована."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Приложение не установлено, так как оно конфликтует с другим пакетом."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Этот пользователь не может устанавливать неизвестные приложения."</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Этому пользователю не разрешено устанавливать приложения."</string>
     <string name="ok" msgid="7871959885003339302">"ОК"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Все равно обновить"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Управление приложениями"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Недостаточно места"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Не удалось установить приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\". Освободите место на устройстве и повторите попытку."</string>
diff --git a/packages/PackageInstaller/res/values-si/strings.xml b/packages/PackageInstaller/res/values-si/strings.xml
index 0f5dbb6..c300b68 100644
--- a/packages/PackageInstaller/res/values-si/strings.xml
+++ b/packages/PackageInstaller/res/values-si/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"යෙදුම ස්ථාපනය කර ඇත."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"මෙම යෙදුම ස්ථාපනය කිරීමට ඔබට අවශ්‍යද?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"ඔබට මෙම යෙදුම යාවත්කාලීන කිරීමට අවශ්‍යද?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> වෙතින් මෙම යෙදුම යාවත්කාලීන කරන්න ද?\n\nමෙම යෙදුමට සාමාන්‍යයෙන් <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> සිට යාවත්කාලීන ලැබේ. වෙනස් මූලාශ්‍රයකින් යාවත්කාලීන කිරීමෙන්, ඔබට ඔබේ දුරකථනයෙහි ඕනෑම මූලාශ්‍රයකින් අනාගත යාවත්කාලීන ලැබීමට ඉඩ ඇත. යෙදුම් ක්‍රියාකාරිත්වය වෙනස් වීමට ඉඩ ඇත."</string>
     <string name="install_failed" msgid="5777824004474125469">"යෙදුම ස්ථාපනය කර නැත."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"මෙම පැකේජය ස්ථාපනය කිරීම අවහිර කරන ලදි."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"පැකේජය දැනට පවතින පැකේජයක් සමග ගැටෙන නිසා යෙදුම ස්ථාපනය නොකරන ලදී."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"මෙම පරිශීලකයා මඟින් නොදන්නා යෙදුම් ස්ථාපනය කළ නොහැක"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"මෙම පරිශීලකයාට යෙදුම් ස්ථාපනය කිරීමට අවසර නැත"</string>
     <string name="ok" msgid="7871959885003339302">"හරි"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"කෙසේ වෙතත් යාවත්කාලීන කරන්න"</string>
     <string name="manage_applications" msgid="5400164782453975580">"යෙදුම් කළමනාකරණය කරන්න"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ඉඩ නොමැත"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ස්ථාපිත කිරීමට නොහැකි විය. ඉඩ පොඩ්ඩක් නිදහස් කොට නැවත උත්සාහ කරන්න."</string>
diff --git a/packages/PackageInstaller/res/values-sk/strings.xml b/packages/PackageInstaller/res/values-sk/strings.xml
index 8363fb6..0afce1b 100644
--- a/packages/PackageInstaller/res/values-sk/strings.xml
+++ b/packages/PackageInstaller/res/values-sk/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Aplikácia bola nainštalovaná."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Chcete túto aplikáciu nainštalovať?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Chcete túto aplikáciu aktualizovať?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Chcete aktualizovať túto aplikáciu zo zdroja <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTáto aplikácia obvykle dostáva aktualizácie zo zdroja <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ak aktualizujete z iného zdroja, môžete v budúcnosti dostávať aktualizácie z ľubovoľného zdroja v telefóne. Funkcie aplikácie sa môžu zmeniť."</string>
     <string name="install_failed" msgid="5777824004474125469">"Aplikácia nebola nainštalovaná."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Inštalácia balíka bola zablokovaná."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikácia sa nenainštalovala, pretože balík je v konflikte s existujúcim balíkom."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Tento používateľ nemôže inštalovať neznáme aplikácie"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Tento používateľ nemá povolené inštalovať aplikácie"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Napriek tomu aktualizovať"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Spravovať aplikácie"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nedostatok miesta"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g> sa nepodarilo nainštalovať. Uvoľnite miesto v pamäti a skúste to znova."</string>
diff --git a/packages/PackageInstaller/res/values-sl/strings.xml b/packages/PackageInstaller/res/values-sl/strings.xml
index 5c28979..00c3d15 100644
--- a/packages/PackageInstaller/res/values-sl/strings.xml
+++ b/packages/PackageInstaller/res/values-sl/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Aplikacija je nameščena."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Ali želite namestiti to aplikacijo?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Ali želite posodobiti to aplikacijo?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Želite to aplikacijo posodobiti iz vira <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nTa aplikacija običajno prejema posodobitve iz vira <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Če jo posodobite iz drugega vira, boste prihodnje posodobitve morda prejemali iz katerega koli vira v telefonu. Funkcija aplikacije se lahko spremeni."</string>
     <string name="install_failed" msgid="5777824004474125469">"Aplikacija ni nameščena."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Namestitev paketa je bila blokirana."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija ni bila nameščena, ker je paket v navzkrižju z obstoječim paketom."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Ta uporabnik nima dovoljenja za nameščanje neznanih aplikacij"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ta uporabnik nima dovoljenja za nameščanje aplikacij"</string>
     <string name="ok" msgid="7871959885003339302">"V redu"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Vseeno posodobi"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Upravlj. aplik."</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Zmanjkalo je prostora"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> ni bilo mogoče namestiti. Sprostite prostor in poskusite znova."</string>
diff --git a/packages/PackageInstaller/res/values-sq/strings.xml b/packages/PackageInstaller/res/values-sq/strings.xml
index 709b7fd..9904bc0 100644
--- a/packages/PackageInstaller/res/values-sq/strings.xml
+++ b/packages/PackageInstaller/res/values-sq/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Aplikacioni u instalua."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Dëshiron ta instalosh këtë aplikacion?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Dëshiron ta përditësosh këtë aplikacion?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Të përditësohet ky aplikacion nga <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nKy aplikacion zakonisht merr përditësime nga <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Duke përditësuar nga një burim tjetër, mund të marrësh përditësime të ardhshme nga çdo burim në telefonin tënd. Funksionaliteti i aplikacionit mund të ndryshojë."</string>
     <string name="install_failed" msgid="5777824004474125469">"Aplikacioni nuk u instalua."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Instalimi paketës u bllokua."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacioni nuk u instalua pasi paketa është në konflikt me një paketë ekzistuese."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Aplikacionet e panjohura nuk mund të instalohen nga ky përdorues"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Ky përdorues nuk lejohet të instalojë aplikacione"</string>
     <string name="ok" msgid="7871959885003339302">"Në rregull"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Përditësoje gjithsesi"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Menaxho aplikacionet"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nuk ka hapësirë"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk mund të instalohej. Liro pak hapësirë dhe provo përsëri."</string>
diff --git a/packages/PackageInstaller/res/values-sr/strings.xml b/packages/PackageInstaller/res/values-sr/strings.xml
index 3a62db3..5a0f52d 100644
--- a/packages/PackageInstaller/res/values-sr/strings.xml
+++ b/packages/PackageInstaller/res/values-sr/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Апликација је инсталирана."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Желите да инсталирате ову апликацију?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Желите да ажурирате ову апликацију?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Желите да ажурирате ову апликацију из извора <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nОва апликација се обично ажурира из извора <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ако ажурирате из другог извора, можете да примате будућа ажурирања из било ког извора на телефону. Функције апликације могу да се промене."</string>
     <string name="install_failed" msgid="5777824004474125469">"Апликација није инсталирана."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирање пакета је блокирано."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Апликација није инсталирана јер је пакет неусаглашен са постојећим пакетом."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Овај корисник не може да инсталира непознате апликације"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Овом кориснику није дозвољено да инсталира апликације"</string>
     <string name="ok" msgid="7871959885003339302">"Потврди"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Ипак ажурирај"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Управљајте апл."</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Нема више простора"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Нисмо успели да инсталирамо апликацију <xliff:g id="APP_NAME">%1$s</xliff:g>. Ослободите простор и пробајте поново."</string>
diff --git a/packages/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml
index d8ed4b1..ec6af2e 100644
--- a/packages/PackageInstaller/res/values-sv/strings.xml
+++ b/packages/PackageInstaller/res/values-sv/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Appen har installerats."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Vill du installera den här appen?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Vill du uppdatera den här appen?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Vill du uppdatera den här appen från <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nAppen tar vanligtvis emot uppdateringar från <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Genom att uppdatera från en annan källa kan du komma att ta emot framtida uppdateringar från olika källor på telefonen. Appfunktioner kan förändras."</string>
     <string name="install_failed" msgid="5777824004474125469">"Appen har inte installerats."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Paketet har blockerats för installation."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Appen har inte installerats på grund av en konflikt mellan detta paket och ett befintligt paket."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Denna användare får inte installera okända appar"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Användaren har inte behörighet att installera appar"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Uppdatera ändå"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Hantera appar"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Slut på utrymme"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Det gick inte att avinstallera <xliff:g id="APP_NAME">%1$s</xliff:g>. Frigör minne och försök igen."</string>
diff --git a/packages/PackageInstaller/res/values-sw/strings.xml b/packages/PackageInstaller/res/values-sw/strings.xml
index 4919cb55..d396472 100644
--- a/packages/PackageInstaller/res/values-sw/strings.xml
+++ b/packages/PackageInstaller/res/values-sw/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Imesakinisha programu."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Ungependa kusakinisha programu hii?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Ungependa kusasisha programu hii?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Ungependa kusasisha hii programu kutoka kwa<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nProgramu hii kwa kawaida hupokea masasisho kutoka kwa <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Kwa kusasisha kutoka chanzo tofauti, huenda ukapokea masasisho ya siku zijazo kutoka chanzo chochote kwenye simu yako. Utendaji wa programu unaweza kubadilika."</string>
     <string name="install_failed" msgid="5777824004474125469">"Imeshindwa kusakinisha programu."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Kifurushi kimezuiwa kisisakinishwe."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Programu haikusakinishwa kwa sababu kifurushi kinakinzana na kifurushi kingine kilichopo."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Mtumiaji huyu hana idhini ya kusakinisha programu ambazo hazijulikani"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Mtumiaji huyu haruhusiwi kusakinisha programu"</string>
     <string name="ok" msgid="7871959885003339302">"Sawa"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Sasisha tu"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Dhibiti programu"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Nafasi imejaa"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Imeshindwa kusakinisha <xliff:g id="APP_NAME">%1$s</xliff:g>. Futa baadhi ya maudhui ili upate nafasi kisha ujaribu tena."</string>
diff --git a/packages/PackageInstaller/res/values-ta/strings.xml b/packages/PackageInstaller/res/values-ta/strings.xml
index d867ee8..c60910c 100644
--- a/packages/PackageInstaller/res/values-ta/strings.xml
+++ b/packages/PackageInstaller/res/values-ta/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"ஆப்ஸ் நிறுவப்பட்டது."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"இந்த ஆப்ஸை நிறுவ வேண்டுமா?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"இந்த ஆப்ஸைப் புதுப்பிக்க வேண்டுமா?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> இலிருந்து இந்த ஆப்ஸைப் புதுப்பிக்க வேண்டுமா?\n\nபொதுவாக இந்த ஆப்ஸ்<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> இலிருந்து புதுப்பிப்புகளைப் பெறும். வேறொன்றின் மூலம் புதுப்பித்தால் எதிர்காலத்தில் மொபைலில் வேறு இடத்திலிருந்து புதுப்பிப்புகளை நீங்கள் பெறக்கூடும். ஆப்ஸ் செயல்பாடுகள் மாறுபடக்கூடும்."</string>
     <string name="install_failed" msgid="5777824004474125469">"ஆப்ஸ் நிறுவப்படவில்லை."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"இந்தத் தொகுப்பு நிறுவப்படுவதிலிருந்து தடுக்கப்பட்டது."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"இந்தத் தொகுப்பு ஏற்கனவே உள்ள தொகுப்புடன் முரண்படுவதால் ஆப்ஸ் நிறுவப்படவில்லை."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"அறியப்படாத ஆப்ஸை இந்தப் பயனரால் நிறுவ இயலாது"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ஆப்ஸை நிறுவ இந்தப் பயனருக்கு அனுமதியில்லை"</string>
     <string name="ok" msgid="7871959885003339302">"சரி"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"பரவாயில்லை, புதுப்பிக்கவும்"</string>
     <string name="manage_applications" msgid="5400164782453975580">"ஆப்ஸை நிர்வகி"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"போதுமான சேமிப்பிடம் இல்லை"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை நிறுவ இயலவில்லை. சிறிது சேமிப்பிடத்தைக் காலிசெய்து மீண்டும் முயலவும்."</string>
diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml
index 7e1c9da..2dd66bc 100644
--- a/packages/PackageInstaller/res/values-te/strings.xml
+++ b/packages/PackageInstaller/res/values-te/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"యాప్ ఇన్‌స్టాల్ చేయబడింది."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"మీరు ఈ యాప్‌ను ఇన్‌స్టాల్ చేయాలనుకుంటున్నారా?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"మీరు ఈ యాప్‌ను అప్‌డేట్ చేయాలనుకుంటున్నారా?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> నుండి ఈ యాప్‌ను అప్‌డేట్ చేయాలా?\n\nఈ యాప్ సాధారణంగా <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> నుండి అప్‌డేట్‌లను అందుకుంటుంది. విభిన్న సోర్స్ నుండి అప్‌డేట్ చేయడం ద్వారా, మీరు మీ ఫోన్‌లోని ఏదైనా సోర్స్ నుండి భవిష్యత్తు అప్‌డేట్‌లను పొందవచ్చు. యాప్ ఫంక్షనాలిటీ మారవచ్చు."</string>
     <string name="install_failed" msgid="5777824004474125469">"యాప్ ఇన్‌స్టాల్ చేయబడలేదు."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"ప్యాకేజీ ఇన్‌స్టాల్ కాకుండా బ్లాక్ చేయబడింది."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"ప్యాకేజీ, అలాగే ఇప్పటికే ఉన్న ప్యాకేజీ మధ్య వైరుధ్యం ఉన్నందున యాప్ ఇన్‌స్టాల్ చేయబడలేదు."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ఈ వినియోగదారు తెలియని యాప్‌లను ఇన్‌స్టాల్ చేయలేరు"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"యాప్‌లను ఇన్‌స్టాల్ చేయడానికి ఈ వినియోగదారుకు అనుమతి లేదు"</string>
     <string name="ok" msgid="7871959885003339302">"సరే"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"ఏదేమైనా అప్‌డేట్ చేయండి"</string>
     <string name="manage_applications" msgid="5400164782453975580">"యాప్‌లను నిర్వహించండి"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ఖాళీ లేదు"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g>ని ఇన్‌స్టాల్ చేయడం సాధ్యపడలేదు. కొంత స్థలాన్ని ఖాళీ చేసి మళ్లీ ప్రయత్నించండి."</string>
diff --git a/packages/PackageInstaller/res/values-th/strings.xml b/packages/PackageInstaller/res/values-th/strings.xml
index 37caaa7..0bf2f84 100644
--- a/packages/PackageInstaller/res/values-th/strings.xml
+++ b/packages/PackageInstaller/res/values-th/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"ติดตั้งแอปแล้ว"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"คุณต้องการติดตั้งแอปนี้ไหม"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"คุณต้องการอัปเดตแอปนี้ไหม"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"อัปเดตแอปนี้จาก <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> ไหม\n\nโดยปกติแล้ว แอปนี้จะได้รับการอัปเดตจาก <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> การอัปเดตจากแหล่งที่มาอื่นอาจทำให้โทรศัพท์ของคุณได้รับการอัปเดตจากแหล่งที่มานั้นในอนาคต ฟังก์ชันการทำงานของแอปอาจมีการเปลี่ยนแปลง"</string>
     <string name="install_failed" msgid="5777824004474125469">"ไม่ได้ติดตั้งแอป"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"มีการบล็อกแพ็กเกจไม่ให้ติดตั้ง"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"ไม่ได้ติดตั้งแอปเพราะแพ็กเกจขัดแย้งกับแพ็กเกจที่มีอยู่"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ผู้ใช้รายนี้ไม่สามารถติดตั้งแอปที่ไม่รู้จัก"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ผู้ใช้รายนี้ไม่ได้รับอนุญาตให้ติดตั้งแอป"</string>
     <string name="ok" msgid="7871959885003339302">"ตกลง"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"อัปเดตเลย"</string>
     <string name="manage_applications" msgid="5400164782453975580">"จัดการแอป"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ไม่มีพื้นที่"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"ติดตั้ง <xliff:g id="APP_NAME">%1$s</xliff:g> ไม่ได้ เพิ่มพื้นที่ว่างแล้วลองอีกครั้ง"</string>
diff --git a/packages/PackageInstaller/res/values-tl/strings.xml b/packages/PackageInstaller/res/values-tl/strings.xml
index 87c408a..4d516b5 100644
--- a/packages/PackageInstaller/res/values-tl/strings.xml
+++ b/packages/PackageInstaller/res/values-tl/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Na-install na ang app."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Gusto mo bang i-install ang app na ito?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Gusto mo bang i-update ang app na ito?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"I-update itong app na mula sa <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nKaraniwang nakakatanggap ang app na ito ng mga update mula sa <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Sa pag-update mula sa ibang pinagmulan, puwede kang makatanggap ng mga update mula sa anumang pinagmulan sa iyong telepono sa hinaharap. Posibleng magbago ang functionality ng app."</string>
     <string name="install_failed" msgid="5777824004474125469">"Hindi na-install ang app."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Na-block ang pag-install sa package."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Hindi na-install ang app dahil nagkakaproblema ang package sa isang dati nang package."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Hindi maaaring mag-install ang user na ito ng mga hindi kilalang app"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Hindi pinapayagan ang user na ito na mag-install ng mga app"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"I-update pa rin"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Pamahalaan ang app"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Wala nang espasyo"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Hindi ma-install ang <xliff:g id="APP_NAME">%1$s</xliff:g>. Magbakante ng ilang espasyo at subukan ulit."</string>
diff --git a/packages/PackageInstaller/res/values-tr/strings.xml b/packages/PackageInstaller/res/values-tr/strings.xml
index a775b4c..050d398 100644
--- a/packages/PackageInstaller/res/values-tr/strings.xml
+++ b/packages/PackageInstaller/res/values-tr/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Uygulama yüklendi."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Bu uygulamayı yüklemek istiyor musunuz?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu uygulamayı güncellemek istiyor musunuz?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Bu uygulama <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> kaynağından güncellensin mi?\n\nBu uygulama genellikle <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> kaynağından güncelleme alır. Farklı bir kaynaktan güncellerseniz ileride telefonunuzda herhangi bir kaynaktan güncelleme alabilirsiniz. Uygulama işlevselliği değişebilir."</string>
     <string name="install_failed" msgid="5777824004474125469">"Uygulama yüklenmedi."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin yüklemesi engellendi."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Paket, mevcut bir paketle çakıştığından uygulama yüklenemedi."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Bilinmeyen uygulamalar bu kullanıcı tarafından yüklenemez"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Bu kullanıcının uygulama yüklemesine izin verilmiyor"</string>
     <string name="ok" msgid="7871959885003339302">"Tamam"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Yine de güncelle"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Uygulamaları yönet"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Yer kalmadı"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> yüklenemedi. Boş alan açın ve yeniden deneyin."</string>
diff --git a/packages/PackageInstaller/res/values-uk/strings.xml b/packages/PackageInstaller/res/values-uk/strings.xml
index ab07754..e0e7d88 100644
--- a/packages/PackageInstaller/res/values-uk/strings.xml
+++ b/packages/PackageInstaller/res/values-uk/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Програму встановлено."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Установити цей додаток?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Оновити цей додаток?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Оновити цей додаток від <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nЗазвичай цей додаток отримує оновлення від <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Якщо встановити оновлення з іншого джерела, надалі на ваш телефон зможуть надходити оновлення з будь-яких джерел. Це може змінити функції додатка."</string>
     <string name="install_failed" msgid="5777824004474125469">"Програму не встановлено."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Встановлення пакета заблоковано."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Додаток не встановлено, оскільки пакет конфліктує з наявним пакетом."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Цей користувач не може встановлювати невідомі додатки"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Цей користувач не може встановлювати додатки"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Усе одно оновити"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Керувати додатками"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Недостат. місця"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Програму <xliff:g id="APP_NAME">%1$s</xliff:g> неможливо встановити. Звільніть місце та повторіть спробу."</string>
diff --git a/packages/PackageInstaller/res/values-ur/strings.xml b/packages/PackageInstaller/res/values-ur/strings.xml
index 4f23cd2..b3b4c0d 100644
--- a/packages/PackageInstaller/res/values-ur/strings.xml
+++ b/packages/PackageInstaller/res/values-ur/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"ایپ انسٹال ہو گئی۔"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"کیا آپ یہ ایپ انسٹال کرنا چاہتے ہیں؟"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"کیا آپ یہ ایپ اپ ڈیٹ کرنا چاہتے ہیں؟"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"اس ایپ کو <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> سے اپ ڈیٹ کریں؟\n\n اس ایپ کو عام طور پر <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> سے اپ ڈیٹس موصول ہوتی ہیں۔ کسی مختلف ذریعے سے اپ ڈیٹ کر کے، آپ اپنے فون پر کسی بھی ذریعے سے مستقبل کی اپ ڈیٹس حاصل کر سکتے ہیں۔ ایپ کی فعالیت تبدیل ہو سکتی ہے۔"</string>
     <string name="install_failed" msgid="5777824004474125469">"ایپ انسٹال نہیں ہوئی۔"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"پیکج کو انسٹال ہونے سے مسدود کر دیا گیا تھا۔"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"ایپ انسٹال نہیں ہوئی کیونکہ پیکج ایک موجودہ پیکیج سے متصادم ہے۔"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"یہ صارف نامعلوم ایپس کو انسٹال نہیں کر سکتا"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"اس صارف کو ایپس انسٹال کرنے کی اجازت نہیں ہے"</string>
     <string name="ok" msgid="7871959885003339302">"ٹھیک ہے"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"بہر حال اپ ڈیٹ کریں"</string>
     <string name="manage_applications" msgid="5400164782453975580">"ایپس منظم کریں"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"جگہ نہیں ہے"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> کو انسٹال نہیں کیا جا سکا۔ کچھ جگہ خالی کریں اور دوبارہ کوشش کریں۔"</string>
diff --git a/packages/PackageInstaller/res/values-uz/strings.xml b/packages/PackageInstaller/res/values-uz/strings.xml
index 48d8681..2993663c 100644
--- a/packages/PackageInstaller/res/values-uz/strings.xml
+++ b/packages/PackageInstaller/res/values-uz/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Ilova o‘rnatildi."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Bu ilovani oʻrnatmoqchimisiz?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu ilova yangilansinmi?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Bu ilova <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g> orqali yangilansinmi?\n\nBu ilova odatda <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g> orqali yangilanishlar oladi. Boshqa manbadan yangilash orqali siz kelajakdagi yangilanishlarni telefoningizda istalgan manbadan olishingiz mumkin. Ilova funksiyalari oʻzgarishi mumkin."</string>
     <string name="install_failed" msgid="5777824004474125469">"Ilova o‘rnatilmadi."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Paket o‘rnatilishga qarshi bloklangan."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Paket mavjud paket bilan zid kelganligi uchun ilovani o‘rnatib bo‘lmadi."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Notanish ilovalarni bu foydalanuvchi tomonidan o‘rnatib bo‘lmaydi"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Bu foydalanuvchiga ilovalarni o‘rnatish uchun ruxsat berilmagan"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Baribir yangilansin"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Ilovalarni boshqarish"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Joy qolmadi"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> o‘rnatilmadi. Xotiradan biroz joy bo‘shating va qaytadan urining."</string>
diff --git a/packages/PackageInstaller/res/values-vi/strings.xml b/packages/PackageInstaller/res/values-vi/strings.xml
index 4cc563d..f6ffa3a 100644
--- a/packages/PackageInstaller/res/values-vi/strings.xml
+++ b/packages/PackageInstaller/res/values-vi/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Ứng dụng đã được cài đặt."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Bạn có muốn cài đặt ứng dụng này không?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Bạn có muốn cập nhật ứng dụng này không?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Cập nhật ứng dụng này của <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nỨng dụng này thường nhận thông tin cập nhật từ <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Khi cập nhật từ một nguồn khác, trong tương lai, bạn có thể nhận thông tin cập nhật từ nguồn bất kỳ trên điện thoại của bạn. Chức năng ứng dụng có thể thay đổi."</string>
     <string name="install_failed" msgid="5777824004474125469">"Ứng dụng chưa được cài đặt."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Đã chặn cài đặt gói."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Chưa cài đặt được ứng dụng do gói xung đột với một gói hiện có."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Người dùng này không thể cài đặt ứng dụng không xác định"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Người dùng này không được phép cài đặt ứng dụng"</string>
     <string name="ok" msgid="7871959885003339302">"OK"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Vẫn cập nhật"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Quản lý ứng dụng"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Hết dung lượng"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Không thể cài đặt <xliff:g id="APP_NAME">%1$s</xliff:g>. Hãy giải phóng dung lượng và thử lại."</string>
diff --git a/packages/PackageInstaller/res/values-zh-rCN/strings.xml b/packages/PackageInstaller/res/values-zh-rCN/strings.xml
index b4bf413..a59f940 100644
--- a/packages/PackageInstaller/res/values-zh-rCN/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rCN/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"已安装应用。"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"要安装此应用吗?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新此应用吗?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"要通过<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>更新此应用?\n\n此应用通常通过<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>接收更新。如果通过其他来源更新,手机未来可能会收到任何来源的更新。应用功能可能会变化。"</string>
     <string name="install_failed" msgid="5777824004474125469">"未安装应用。"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"系统已禁止安装该软件包。"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"应用未安装:软件包与现有软件包存在冲突。"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"该用户无法安装未知应用"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"此用户无权安装应用"</string>
     <string name="ok" msgid="7871959885003339302">"确定"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"仍然更新"</string>
     <string name="manage_applications" msgid="5400164782453975580">"管理应用"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"空间不足"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"无法安装<xliff:g id="APP_NAME">%1$s</xliff:g>。请释放一些存储空间并重试。"</string>
diff --git a/packages/PackageInstaller/res/values-zh-rHK/strings.xml b/packages/PackageInstaller/res/values-zh-rHK/strings.xml
index 0c4ed6c..6412eff 100644
--- a/packages/PackageInstaller/res/values-zh-rHK/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rHK/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"要安裝此應用程式嗎?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新此應用程式嗎?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"要從「<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>」更新此應用程式嗎?\n\n在正常情況下,系統會透過「<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>」更新此應用程式。如果透過其他來源更新,手機未來可能會收到任何來源的更新。應用程式功能可能會有變動。"</string>
     <string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"套件已遭封鎖,無法安裝。"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"套件與現有的套件發生衝突,無法安裝應用程式。"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"此使用者無法安裝來源不明的應用程式"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"此使用者無法安裝應用程式"</string>
     <string name="ok" msgid="7871959885003339302">"確定"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"仍要更新"</string>
     <string name="manage_applications" msgid="5400164782453975580">"管理應用程式"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"儲存空間不足"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"無法安裝「<xliff:g id="APP_NAME">%1$s</xliff:g>」。請先騰出一些儲存空間,然後再試一次。"</string>
diff --git a/packages/PackageInstaller/res/values-zh-rTW/strings.xml b/packages/PackageInstaller/res/values-zh-rTW/strings.xml
index 9b7bda6..2a87eb8 100644
--- a/packages/PackageInstaller/res/values-zh-rTW/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rTW/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"要安裝這個應用程式嗎?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新這個應用程式嗎?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"要透過「<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>」更新這個應用程式嗎?\n\n在正常情況下,系統會透過「<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>」更新這個應用程式。如果透過其他來源更新,手機未來可能會收到任何來源的更新。應用程式功能可能會有變動。"</string>
     <string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"系統已封鎖這個套件,因此無法安裝。"</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"應用程式套件與現有套件衝突,因此未能完成安裝。"</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"這位使用者無法安裝不明的應用程式"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"這位使用者無法安裝應用程式"</string>
     <string name="ok" msgid="7871959885003339302">"確定"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"仍要更新"</string>
     <string name="manage_applications" msgid="5400164782453975580">"管理應用程式"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"空間不足"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"無法安裝「<xliff:g id="APP_NAME">%1$s</xliff:g>」。請先釋出部分空間,然後再試一次。"</string>
diff --git a/packages/PackageInstaller/res/values-zu/strings.xml b/packages/PackageInstaller/res/values-zu/strings.xml
index 7317abc..ca9c63b 100644
--- a/packages/PackageInstaller/res/values-zu/strings.xml
+++ b/packages/PackageInstaller/res/values-zu/strings.xml
@@ -26,8 +26,7 @@
     <string name="install_done" msgid="5987363587661783896">"Uhlelo lokusebenza olufakiwe."</string>
     <string name="install_confirm_question" msgid="7663733664476363311">"Ingabe ufuna ukufaka le app?"</string>
     <string name="install_confirm_question_update" msgid="3348888852318388584">"Ingabe ufuna ukubuyekeza le app?"</string>
-    <!-- no translation found for install_confirm_question_update_owner_reminder (3750986542284587290) -->
-    <skip />
+    <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Buyekeza le app kusuka ku-<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nNgokuvamile le app ithola izibuyekezo kusuka ku-<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Ngokubuyekeza kusuka kumthombo ohlukile, ungase uthole izibuyekezo zesikhathi esizayo kusuka kunoma yimuphi umthombo efonini yakho. Okwenziwa yi-app kungase kushintshe."</string>
     <string name="install_failed" msgid="5777824004474125469">"Uhlelo lokusebenza alufakiwe."</string>
     <string name="install_failed_blocked" msgid="8512284352994752094">"Iphakheji livinjiwe kusukela ekufakweni."</string>
     <string name="install_failed_conflict" msgid="3493184212162521426">"Uhlelo lokusebenza alufakiwe njengoba ukuphakheja kushayisana nephakheji elikhona."</string>
@@ -43,8 +42,7 @@
     <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Izinhlelo zokusebenza ezingaziwa azikwazi ukufakwa ilo msebenzisi"</string>
     <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"Lo msebenzisi akavunyelwe ukufaka izinhlelo zokusebenza"</string>
     <string name="ok" msgid="7871959885003339302">"KULUNGILE"</string>
-    <!-- no translation found for update_anyway (8792432341346261969) -->
-    <skip />
+    <string name="update_anyway" msgid="8792432341346261969">"Buyekeza noma kunjalo"</string>
     <string name="manage_applications" msgid="5400164782453975580">"Phatha izinhlelo zokusebenza"</string>
     <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Iphelelwe yisikhala"</string>
     <string name="out_of_space_dlg_text" msgid="8727714096031856231">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ayikwazanga ukufakwa. Khulula isikhala bese uzama futhi."</string>
diff --git a/packages/SettingsLib/AppPreference/res/values-en-rCA/strings.xml b/packages/SettingsLib/AppPreference/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..595fea3
--- /dev/null
+++ b/packages/SettingsLib/AppPreference/res/values-en-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (C) 2022 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="install_type_instant" msgid="7217305006127216917">"Instant app"</string>
+</resources>
diff --git a/packages/SettingsLib/AppPreference/res/values-en-rXC/strings.xml b/packages/SettingsLib/AppPreference/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..ba37e36
--- /dev/null
+++ b/packages/SettingsLib/AppPreference/res/values-en-rXC/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (C) 2022 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="install_type_instant" msgid="7217305006127216917">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‎‏‎‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‏‎‏‎‏‎Instant app‎‏‎‎‏‎"</string>
+</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-en-rCA/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..478e603
--- /dev/null
+++ b/packages/SettingsLib/ProfileSelector/res/values-en-rCA/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  Copyright (C) 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
+    <string name="settingslib_category_work" msgid="4867750733682444676">"Work"</string>
+</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-en-rXC/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..89b7183
--- /dev/null
+++ b/packages/SettingsLib/ProfileSelector/res/values-en-rXC/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  Copyright (C) 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="settingslib_category_personal" msgid="1142302328104700620">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‎‏‏‎‎‏‏‎‎‎Personal‎‏‎‎‏‎"</string>
+    <string name="settingslib_category_work" msgid="4867750733682444676">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‎‎‎‎‎‏‏‏‏‎‎‎‎‏‎‎‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‎‎‎Work‎‏‎‎‏‎"</string>
+</resources>
diff --git a/packages/SettingsLib/res/drawable/ic_dock_device.xml b/packages/SettingsLib/res/drawable/ic_dock_device.xml
new file mode 100644
index 0000000..96a4900
--- /dev/null
+++ b/packages/SettingsLib/res/drawable/ic_dock_device.xml
@@ -0,0 +1,26 @@
+<!--
+  ~ Copyright (C) 2023 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="960"
+        android:viewportHeight="960"
+        android:tint="?attr/colorControlNormal">
+    <path
+        android:fillColor="#000000"
+        android:pathData="M480,280Q497,280 508.5,268.5Q520,257 520,240Q520,223 508.5,211.5Q497,200 480,200Q463,200 451.5,211.5Q440,223 440,240Q440,257 451.5,268.5Q463,280 480,280ZM120,720Q87,720 63.5,696.5Q40,673 40,640L60,160Q60,127 83.5,103.5Q107,80 140,80L820,80Q853,80 876.5,103.5Q900,127 900,160L920,640Q920,673 896.5,696.5Q873,720 840,720L120,720ZM120,640L840,640Q840,640 840,640Q840,640 840,640L820,160Q820,160 820,160Q820,160 820,160L140,160Q140,160 140,160Q140,160 140,160L120,640Q120,640 120,640Q120,640 120,640ZM320,880Q259,880 209.5,850Q160,820 160,765L160,720L240,720L240,760Q253,780 274.5,790Q296,800 320,800L640,800Q664,800 685.5,790.5Q707,781 720,761L720,720L800,720L800,765Q800,820 750.5,850Q701,880 640,880L320,880ZM480,400Q480,400 480,400Q480,400 480,400L480,400Q480,400 480,400Q480,400 480,400L480,400Q480,400 480,400Q480,400 480,400L480,400Q480,400 480,400Q480,400 480,400L480,400Z"/>
+</vector>
\ No newline at end of file
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 353c7cc7..8071be4 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -571,7 +571,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"ಬಳಕೆದಾರ"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"ನಿರ್ಬಂಧಿಸಿದ ಪ್ರೊಫೈಲ್"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸುವುದೇ?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"ನೀವು ಹೆಚ್ಚುವರಿ ಬಳಕೆದಾರರನ್ನು ರಚಿಸುವ ಮೂಲಕ ಇತರ ಜನರ ಜೊತೆಗೆ ಈ ಸಾಧನವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು. ಪ್ರತಿ ಬಳಕೆದಾರರು ತಮ್ಮದೇ ಸ್ಥಳವನ್ನು ಹೊಂದಿರುತ್ತಾರೆ, ಇದರಲ್ಲಿ ಅವರು ತಮ್ಮದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ವಾಲ್‌ಪೇಪರ್ ಮತ್ತು ಮುಂತಾದವುಗಳ ಮೂಲಕ ಕಸ್ಟಮೈಸ್ ಮಾಡಿಕೊಳ್ಳಬಹುದು. ಎಲ್ಲರ ಮೇಲೂ ಪರಿಣಾಮ ಬೀರುವಂತೆ ವೈ-ಫೈ ರೀತಿಯ ಸಾಧನ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಕೆದಾರರು ಸರಿಹೊಂದಿಸಬಹುದು.\n\nನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಹೊಂದಿಸಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗೆ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು. ಪ್ರವೇಶಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಸೇವೆಗಳು ಹೊಸ ಬಳಕೆದಾರರಿಗೆ ವರ್ಗಾವಣೆ ಆಗದಿರಬಹುದು."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"ನೀವು ಹೆಚ್ಚುವರಿ ಬಳಕೆದಾರರನ್ನು ರಚಿಸುವ ಮೂಲಕ ಇತರ ಜನರ ಜೊತೆಗೆ ಈ ಸಾಧನವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು. ಪ್ರತಿ ಬಳಕೆದಾರರು ತಮ್ಮದೇ ಸ್ಥಳವನ್ನು ಹೊಂದಿರುತ್ತಾರೆ, ಇದರಲ್ಲಿ ಅವರು ತಮ್ಮದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ವಾಲ್‌ಪೇಪರ್ ಮತ್ತು ಮುಂತಾದವುಗಳ ಮೂಲಕ ಕಸ್ಟಮೈಸ್ ಮಾಡಿಕೊಳ್ಳಬಹುದು. ಎಲ್ಲರ ಮೇಲೂ ಪರಿಣಾಮ ಬೀರುವಂತೆ ವೈ-ಫೈ ರೀತಿಯ ಸಾಧನ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಕೆದಾರರು ಸರಿಹೊಂದಿಸಬಹುದು.\n\nನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಹೊಂದಿಸಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗೆ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು. ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಸೇವೆಗಳು ಹೊಸ ಬಳಕೆದಾರರಿಗೆ ವರ್ಗಾವಣೆ ಆಗದಿರಬಹುದು."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"ನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು."</string>
     <string name="user_grant_admin_title" msgid="5565796912475193314">"ಈ ಬಳಕೆದಾರರಿಗೆ ನಿರ್ವಾಹಕ ಸೌಲಭ್ಯ ನೀಡಬೇಕೆ?"</string>
     <string name="user_grant_admin_message" msgid="7925257971286380976">"ನಿರ್ವಾಹಕರಾಗಿ, ಅವರು ಇತರ ಬಳಕೆದಾರರನ್ನು ನಿರ್ವಹಿಸಲು, ಸಾಧನ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಮತ್ತು ಸಾಧನವನ್ನು ಫ್ಯಾಕ್ಟರಿ ರೀಸೆಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 6640b43..814fa63 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -571,7 +571,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"Uporabnik"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"Omejen profil"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"Želite dodati uporabnika?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"To napravo lahko delite z drugimi tako, da ustvarite dodatne uporabnike. Vsak ima svoj prostor, ki ga lahko prilagodi z aplikacijami, ozadji in drugim. Uporabniki lahko tudi prilagodijo nastavitve naprave, ki vplivajo na vse, na primer nastavitve omrežja Wi-Fi.\n\nKo dodate novega uporabnika, mora ta nastaviti svoj prostor.\n\nVsak uporabnik lahko posodobi aplikacije za vse druge uporabnike. Nastavitve in storitve funkcij za ljudi s posebnimi potrebami morda ne bodo prenesene v prostor novega uporabnika."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"To napravo lahko delite z drugimi tako, da ustvarite dodatne uporabnike. Vsak ima svoj prostor, ki ga lahko prilagodi z aplikacijami, ozadji in drugim. Uporabniki lahko tudi prilagodijo nastavitve naprave, ki vplivajo na vse, na primer nastavitve omrežja Wi-Fi.\n\nKo dodate novega uporabnika, mora ta nastaviti svoj prostor.\n\nVsak uporabnik lahko posodobi aplikacije za vse druge uporabnike. Nastavitve in storitve za dostopnost morda ne bodo prenesene v prostor novega uporabnika."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor.\n\nVsak uporabnik lahko posodobi aplikacije za vse druge uporabnike."</string>
     <string name="user_grant_admin_title" msgid="5565796912475193314">"Naj ta uporabnik dobi skrbniške pravice?"</string>
     <string name="user_grant_admin_message" msgid="7925257971286380976">"Skrbniške pravice omogočajo upravljanje drugih uporabnikov, spreminjanje nastavitev naprave in ponastavitev naprave na tovarniške nastavitve."</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 0512a0d..d800433 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -310,7 +310,7 @@
     <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"లాగర్ నిరంతర నిల్వలోని డేటాను తీసివేయాలా?"</string>
     <string name="dev_logpersist_clear_warning_message" msgid="6447590867594287413">"మేము నిరంతర లాగర్‌తో ఇక పర్యవేక్షించనప్పుడు, మీ పరికరంలోని లాగర్ డేటాను మేము తొలగించాల్సి ఉంటుంది."</string>
     <string name="select_logpersist_title" msgid="447071974007104196">"పరికరంలో లాగర్ డేటా నిరంతరం స్టోర్ చేయి"</string>
-    <string name="select_logpersist_dialog_title" msgid="7745193591195485594">"పరికరంలో నిరంతరం నిల్వ చేయాల్సిన లాగ్ బఫర్‌లను ఎంచుకోండి"</string>
+    <string name="select_logpersist_dialog_title" msgid="7745193591195485594">"పరికరంలో నిరంతరం స్టోరేజ్‌ చేయాల్సిన లాగ్ బఫర్‌లను ఎంచుకోండి"</string>
     <string name="select_usb_configuration_title" msgid="6339801314922294586">"USB కాన్ఫిగరేషన్‌ని ఎంచుకోండి"</string>
     <string name="select_usb_configuration_dialog_title" msgid="3579567144722589237">"USB కాన్ఫిగరేషన్‌ని ఎంచుకోండి"</string>
     <string name="allow_mock_location" msgid="2102650981552527884">"డమ్మీ లొకేషన్లను అనుమతించండి"</string>
@@ -576,7 +576,7 @@
     <string name="user_grant_admin_title" msgid="5565796912475193314">"వీరికి అడ్మిన్ హక్కు ఇవ్వాలా?"</string>
     <string name="user_grant_admin_message" msgid="7925257971286380976">"ఒక అడ్మిన్‌గా, వారు ఇతర యూజర్‌లను మేనేజ్ చేయగలరు, పరికర సెట్టింగ్‌లను ఎడిట్ చేయగలరు, పరికరాన్ని ఫ్యాక్టరీ రీసెట్ చేయగలరు."</string>
     <string name="user_setup_dialog_title" msgid="8037342066381939995">"యూజర్‌ను ఇప్పుడే సెటప్ చేయాలా?"</string>
-    <string name="user_setup_dialog_message" msgid="269931619868102841">"పరికరాన్ని తీసుకోవడానికి వ్యక్తి అందుబాటులో ఉన్నారని నిర్ధారించుకొని, ఆపై వారికి నిల్వ స్థలాన్ని సెటప్ చేయండి"</string>
+    <string name="user_setup_dialog_message" msgid="269931619868102841">"పరికరాన్ని తీసుకోవడానికి వ్యక్తి అందుబాటులో ఉన్నారని నిర్ధారించుకొని, ఆపై వారికి స్టోరేజ్‌ స్థలాన్ని సెటప్ చేయండి"</string>
     <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"ఇప్పుడు ప్రొఫైల్‌ను సెటప్ చేయాలా?"</string>
     <string name="user_setup_button_setup_now" msgid="1708269547187760639">"ఇప్పుడే సెట‌ప్ చేయి"</string>
     <string name="user_setup_button_setup_later" msgid="8712980133555493516">"ఇప్పుడు కాదు"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index e3b95ae..60d5f11 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -254,7 +254,7 @@
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"‏براہ کرم ایک Wi-Fi نیٹ ورک سے منسلک ہوں"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"‏adb، ڈیبگ، dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"بگ رپورٹ کا شارٹ کٹ"</string>
-    <string name="bugreport_in_power_summary" msgid="1885529649381831775">"بگ رپورٹ لینے کیلئے پاور مینو میں ایک بٹن دکھائیں"</string>
+    <string name="bugreport_in_power_summary" msgid="1885529649381831775">"بگ رپورٹ لینے کیلئے پاور مینیو میں ایک بٹن دکھائیں"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"بیدار رکھیں"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"چارج ہوتے وقت اسکرین کبھی بھی سلیپ وضع میں نہيں جائے گی"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"‏بلوٹوتھ HCI کا جاسوسی لاگ فعال کریں"</string>
@@ -501,7 +501,7 @@
     <string name="screen_zoom_summary_very_large" msgid="7317423942896999029">"قدرے بڑا"</string>
     <string name="screen_zoom_summary_extremely_large" msgid="1438045624562358554">"سب سے بڑا"</string>
     <string name="screen_zoom_summary_custom" msgid="3468154096832912210">"حسب ضرورت (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
-    <string name="content_description_menu_button" msgid="6254844309171779931">"مینو"</string>
+    <string name="content_description_menu_button" msgid="6254844309171779931">"مینیو"</string>
     <string name="retail_demo_reset_message" msgid="5392824901108195463">"ڈیمو موڈ میں فیکٹری ری سیٹ کیلئے پاس ورڈ درج کریں"</string>
     <string name="retail_demo_reset_next" msgid="3688129033843885362">"اگلا"</string>
     <string name="retail_demo_reset_title" msgid="1866911701095959800">"پاس ورڈ درکار ہے"</string>
diff --git a/packages/SettingsLib/res/values-uz/arrays.xml b/packages/SettingsLib/res/values-uz/arrays.xml
index 4b08f47..da14d78 100644
--- a/packages/SettingsLib/res/values-uz/arrays.xml
+++ b/packages/SettingsLib/res/values-uz/arrays.xml
@@ -59,7 +59,7 @@
     <item msgid="6421717003037072581">"Har doim HDCP tekshiruvidan foydalanilsin"</item>
   </string-array>
   <string-array name="bt_hci_snoop_log_entries">
-    <item msgid="695678520785580527">"Yoqilmagan"</item>
+    <item msgid="695678520785580527">"Oʻchiq"</item>
     <item msgid="6336372935919715515">"Filtrlar yoniq"</item>
     <item msgid="2779123106632690576">"Yoniq"</item>
   </string-array>
@@ -171,7 +171,7 @@
     <item msgid="5001852592115448348">", faol (telefon)"</item>
   </string-array>
   <string-array name="select_logd_size_titles">
-    <item msgid="1191094707770726722">"Yoqilmagan"</item>
+    <item msgid="1191094707770726722">"Oʻchiq"</item>
     <item msgid="7839165897132179888">"64 KB"</item>
     <item msgid="2715700596495505626">"256 KB"</item>
     <item msgid="7099386891713159947">"1 MB"</item>
@@ -179,13 +179,13 @@
     <item msgid="6078203297886482480">"8 MB"</item>
   </string-array>
   <string-array name="select_logd_size_lowram_titles">
-    <item msgid="1145807928339101085">"Yoqilmagan"</item>
+    <item msgid="1145807928339101085">"Oʻchiq"</item>
     <item msgid="4064786181089783077">"64 KB"</item>
     <item msgid="3052710745383602630">"256 KB"</item>
     <item msgid="3691785423374588514">"1 MB"</item>
   </string-array>
   <string-array name="select_logd_size_summaries">
-    <item msgid="409235464399258501">"Yoqilmagan"</item>
+    <item msgid="409235464399258501">"Oʻchiq"</item>
     <item msgid="4195153527464162486">"Bufer: maks. 64 KB"</item>
     <item msgid="7464037639415220106">"Bufer: maks. 256 KB"</item>
     <item msgid="8539423820514360724">"Bufer: maks. 1 MB"</item>
@@ -193,13 +193,13 @@
     <item msgid="2983219471251787208">"Bufer: maksimum 8 MB"</item>
   </string-array>
   <string-array name="select_logpersist_titles">
-    <item msgid="704720725704372366">"Yoqilmagan"</item>
+    <item msgid="704720725704372366">"Oʻchiq"</item>
     <item msgid="6014837961827347618">"Hammasi"</item>
     <item msgid="7387060437894578132">"Radiodan boshqa hammasi"</item>
     <item msgid="7300881231043255746">"faqat yadro"</item>
   </string-array>
   <string-array name="select_logpersist_summaries">
-    <item msgid="97587758561106269">"Yoqilmagan"</item>
+    <item msgid="97587758561106269">"Oʻchiq"</item>
     <item msgid="7126170197336963369">"Barcha jurnallar buferi"</item>
     <item msgid="7167543126036181392">"Radio jurnallar buferidan tashqari hammasi"</item>
     <item msgid="5135340178556563979">"faqat yadro jurnali buferi"</item>
@@ -262,7 +262,7 @@
     <item msgid="5023908510820531131">"“<xliff:g id="AS_TYPED_COMMAND">adb shell dumpsys gfxinfo</xliff:g>” buyrug‘ida"</item>
   </string-array>
   <string-array name="debug_hw_overdraw_entries">
-    <item msgid="1968128556747588800">"Yoqilmagan"</item>
+    <item msgid="1968128556747588800">"Oʻchiq"</item>
     <item msgid="3033215374382962216">"Ortiqcha chizilgan joylarni ko‘rsatish"</item>
     <item msgid="3474333938380896988">"Muayyan rangdagi hududlarni ajratib belgilash"</item>
   </string-array>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 503a3e0..93a21b7 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -51,7 +51,7 @@
     <string name="wifi_security_eap_suiteb" msgid="415842785991698142">"WPA3-Enterprise 192-bit"</string>
     <string name="wifi_remembered" msgid="3266709779723179188">"Saqlangan"</string>
     <string name="wifi_disconnected" msgid="7054450256284661757">"Ulanmagan"</string>
-    <string name="wifi_disabled_generic" msgid="2651916945380294607">"Yoqilmagan"</string>
+    <string name="wifi_disabled_generic" msgid="2651916945380294607">"Oʻchiq"</string>
     <string name="wifi_disabled_network_failure" msgid="2660396183242399585">"IP manzilini sozlab bo‘lmadi"</string>
     <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Tekshiruvda muammo"</string>
     <string name="wifi_cant_connect" msgid="5718417542623056783">"Tarmoqqa ulanilmadi"</string>
@@ -294,7 +294,7 @@
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Translatsiya: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
     <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Shaxsiy DNS"</string>
     <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Shaxsiy DNS rejimini tanlang"</string>
-    <string name="private_dns_mode_off" msgid="7065962499349997041">"Yoqilmagan"</string>
+    <string name="private_dns_mode_off" msgid="7065962499349997041">"Oʻchiq"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Avtomatik"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"Shaxsiy DNS provayderining host nomi"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS provayderining host nomini kiriting"</string>
@@ -435,7 +435,7 @@
     <string name="select_webview_provider_toast_text" msgid="8512254949169359848">"Bu variant endi yaroqsiz. Qaytadan urining."</string>
     <string name="picture_color_mode" msgid="1013807330552931903">"Rang rejimi"</string>
     <string name="picture_color_mode_desc" msgid="151780973768136200">"sRGB ranglaridan foydalanish"</string>
-    <string name="daltonizer_mode_disabled" msgid="403424372812399228">"Yoqilmagan"</string>
+    <string name="daltonizer_mode_disabled" msgid="403424372812399228">"Oʻchiq"</string>
     <string name="daltonizer_mode_monochromacy" msgid="362060873835885014">"Monoxrom"</string>
     <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"Deyteranomaliya (qizil/yashil)"</string>
     <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaliya (qizil/yashil)"</string>
@@ -483,7 +483,7 @@
     <string name="battery_info_status_full_charged" msgid="3536054261505567948">"Toʻliq quvvatlandi"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Administrator tomonidan boshqariladi"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Cheklangan sozlama tomonidan boshqariladi"</string>
-    <string name="disabled" msgid="8017887509554714950">"Yoqilmagan"</string>
+    <string name="disabled" msgid="8017887509554714950">"Oʻchiq"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Ruxsat berilgan"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Ruxsat berilmagan"</string>
     <string name="install_other_apps" msgid="3232595082023199454">"Notanish ilovalarni o‘rnatish"</string>
@@ -571,7 +571,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"Foydalanuvchi"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"Cheklangan profil"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"Foydalanuvchi qo‘shilsinmi?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"Bu qurilmadan bir necha kishi alohida foydalanuvchilar qo‘shib foydalanishi mumkin. Har bir foydalanuvchiga diskda joy ajratiladi, tayinlangan hajm ilovalar, ekran foni rasmi, va hokazolarga taqsimlanishi mumkin. Foydalanuvchilar Wi-Fi kabi sozlamalarni o‘zgartirsa, qolganlarda ham aks etishi mumkin. \n\nYangi profil qo‘shilgach, uni sozlash lozim.\n\nQurilmaning istalgan foydalanuvchisi ilovalarni barcha hisoblar uchun yangilashi mumkin. Maxsus imkoniyatlar sozlamalari va xizmatlar yangi foydalanuvchiga o‘tkazilmasligi mumkin."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"Bu qurilmadan bir necha kishi alohida foydalanuvchilar qo‘shib foydalanishi mumkin. Har bir foydalanuvchiga diskda joy ajratiladi, tayinlangan hajm ilovalar, ekran foni rasmi, va hokazolarga taqsimlanishi mumkin. Foydalanuvchilar Wi-Fi kabi sozlamalarni o‘zgartirsa, qolganlarda ham aks etishi mumkin. \n\nYangi profil qo‘shilgach, uni sozlash lozim.\n\nQurilmaning istalgan foydalanuvchisi ilovalarni barcha hisoblar uchun yangilashi mumkin. Qulayliklar sozlamalari va xizmatlar yangi foydalanuvchiga o‘tkazilmasligi mumkin."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Yangi profil qo‘shilgach, uni sozlash lozim.\n\nQurilmaning istalgan foydalanuvchisi ilovalarni barcha hisoblar uchun yangilashi mumkin."</string>
     <string name="user_grant_admin_title" msgid="5565796912475193314">"Foydalanuvchiga admin huquqi berilsinmi?"</string>
     <string name="user_grant_admin_message" msgid="7925257971286380976">"Administrator sifatida ular boshqa foydalanuvchilarni boshqarish, qurilma sozlamalarini oʻzgartirish va qurilmani zavod sozlamalariga qaytarish huquqiga ega boʻladi."</string>
@@ -627,7 +627,7 @@
     <string name="failed_attempts_now_wiping_profile" msgid="7626589520888963129">"Juda koʻp marta muvaffaqiyatsiz urindingiz. Bu ish profili va undagi maʼlumotlar oʻchirib tashlanadi."</string>
     <string name="failed_attempts_now_wiping_dialog_dismiss" msgid="2749889771223578925">"Yopish"</string>
     <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Qurilma standarti"</string>
-    <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Yoqilmagan"</string>
+    <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Oʻchiq"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Yoniq"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Oʻzgarishlar kuchga kirishi uchun qurilmani oʻchirib yoqing. Buni hozir yoki keyinroq bajarishingiz mumkin."</string>
     <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"Simli quloqlik"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java
index 78b7810..964e4b2 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java
@@ -119,29 +119,15 @@
         }
 
         final int restrictionSource = enforcingUsers.get(0).getUserRestrictionSource();
-        final int adminUserId = enforcingUsers.get(0).getUserHandle().getIdentifier();
-        if (restrictionSource == UserManager.RESTRICTION_SOURCE_PROFILE_OWNER) {
-            // Check if it is a profile owner of the user under consideration.
-            if (adminUserId == userId) {
-                return getProfileOwner(context, userRestriction, adminUserId);
-            } else {
-                // Check if it is a profile owner of a managed profile of the current user.
-                // Otherwise it is in a separate user and we return a default EnforcedAdmin.
-                final UserInfo parentUser = um.getProfileParent(adminUserId);
-                return (parentUser != null && parentUser.id == userId)
-                        ? getProfileOwner(context, userRestriction, adminUserId)
-                        : EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(userRestriction);
-            }
-        } else if (restrictionSource == UserManager.RESTRICTION_SOURCE_DEVICE_OWNER) {
-            // When the restriction is enforced by device owner, return the device owner admin only
-            // if the admin is for the {@param userId} otherwise return a default EnforcedAdmin.
-            return adminUserId == userId
-                    ? getDeviceOwner(context, userRestriction)
-                    : EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(userRestriction);
+        if (restrictionSource == UserManager.RESTRICTION_SOURCE_SYSTEM) {
+            return null;
         }
 
-        // If the restriction is enforced by system then return null.
-        return null;
+        final EnforcedAdmin admin = getProfileOrDeviceOwner(context, userHandle);
+        if (admin != null) {
+            return admin;
+        }
+        return EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(userRestriction);
     }
 
     public static boolean hasBaseUserRestriction(Context context,
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
index 48d449d..5e8f3a1 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
@@ -483,7 +483,10 @@
     public AppEntry getEntry(String packageName, int userId) {
         if (DEBUG_LOCKING) Log.v(TAG, "getEntry about to acquire lock...");
         synchronized (mEntriesMap) {
-            AppEntry entry = mEntriesMap.get(userId).get(packageName);
+            AppEntry entry = null;
+            if (mEntriesMap.contains(userId)) {
+                entry = mEntriesMap.get(userId).get(packageName);
+            }
             if (entry == null) {
                 ApplicationInfo info = getAppInfoLocked(packageName, userId);
                 if (info == null) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index 04168ce..e884cf8 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -305,10 +305,11 @@
         synchronized (mProfileLock) {
             if (getGroupId() != BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
                 for (CachedBluetoothDevice member : getMemberDevice()) {
-                    Log.d(TAG, "Disconnect the member(" + member.getAddress() + ")");
+                    Log.d(TAG, "Disconnect the member:" + member);
                     member.disconnect();
                 }
             }
+            Log.d(TAG, "Disconnect " + this);
             mDevice.disconnect();
         }
         // Disconnect  PBAP server in case its connected
@@ -440,11 +441,11 @@
                 Log.d(TAG, "No profiles. Maybe we will connect later for device " + mDevice);
                 return;
             }
-
+            Log.d(TAG, "connect " + this);
             mDevice.connect();
             if (getGroupId() != BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
                 for (CachedBluetoothDevice member : getMemberDevice()) {
-                    Log.d(TAG, "connect the member(" + member.getAddress() + ")");
+                    Log.d(TAG, "connect the member:" + member);
                     member.connect();
                 }
             }
@@ -530,7 +531,7 @@
     }
 
     // TODO: do any of these need to run async on a background thread?
-    private void fillData() {
+    void fillData() {
         updateProfiles();
         fetchActiveDevices();
         migratePhonebookPermissionChoice();
@@ -933,15 +934,15 @@
 
     @Override
     public String toString() {
-        return "CachedBluetoothDevice ("
+        return "CachedBluetoothDevice{"
                 + "anonymizedAddress="
                 + mDevice.getAnonymizedAddress()
                 + ", name="
                 + getName()
                 + ", groupId="
                 + mGroupId
-                + ", member= " + mMemberDevices
-                + ")";
+                + ", member=" + mMemberDevices
+                + "}";
     }
 
     @Override
@@ -1483,6 +1484,7 @@
      * Store the member devices that are in the same coordinated set.
      */
     public void addMemberDevice(CachedBluetoothDevice memberDevice) {
+        Log.d(TAG, this + " addMemberDevice = " + memberDevice);
         mMemberDevices.add(memberDevice);
     }
 
@@ -1495,6 +1497,34 @@
     }
 
     /**
+     * In order to show the preference for the whole group, we always set the main device as the
+     * first connected device in the coordinated set, and then switch the content of the main
+     * device and member devices.
+     *
+     * @param newMainDevice the new Main device which is from the previous main device's member
+     *                      list.
+     */
+    public void switchMemberDeviceContent(CachedBluetoothDevice newMainDevice) {
+        // Backup from main device
+        final BluetoothDevice tmpDevice = mDevice;
+        final short tmpRssi = mRssi;
+        final boolean tmpJustDiscovered = mJustDiscovered;
+        // Set main device from sub device
+        release();
+        mDevice = newMainDevice.mDevice;
+        mRssi = newMainDevice.mRssi;
+        mJustDiscovered = newMainDevice.mJustDiscovered;
+        fillData();
+
+        // Set sub device from backup
+        newMainDevice.release();
+        newMainDevice.mDevice = tmpDevice;
+        newMainDevice.mRssi = tmpRssi;
+        newMainDevice.mJustDiscovered = tmpJustDiscovered;
+        newMainDevice.fillData();
+    }
+
+    /**
      * Get cached bluetooth icon with description
      */
     public Pair<Drawable, String> getDrawableWithDescription() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
index d191b1e..7b4c862 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
@@ -464,59 +464,6 @@
         return !(mOngoingSetMemberPair == null) && mOngoingSetMemberPair.equals(device);
     }
 
-    /**
-     * In order to show the preference for the whole group, we always set the main device as the
-     * first connected device in the coordinated set, and then switch the relationship of the main
-     * device and member devices.
-     *
-     * @param newMainDevice the new Main device which is from the previous main device's member
-     *                      list.
-     */
-    public void switchRelationshipFromMemberToMain(CachedBluetoothDevice newMainDevice) {
-        if (newMainDevice == null) {
-            log("switchRelationshipFromMemberToMain: input is null");
-            return;
-        }
-        log("switchRelationshipFromMemberToMain: CachedBluetoothDevice list: " + mCachedDevices);
-
-        final CachedBluetoothDevice finalNewMainDevice = newMainDevice;
-        int newMainGroupId = newMainDevice.getGroupId();
-        CachedBluetoothDevice oldMainDevice = mCachedDevices.stream()
-                .filter(cachedDevice -> !cachedDevice.equals(finalNewMainDevice)
-                        && cachedDevice.getGroupId() == newMainGroupId).findFirst().orElse(null);
-        boolean hasMainDevice = oldMainDevice != null;
-        Set<CachedBluetoothDevice> memberSet =
-                hasMainDevice ? oldMainDevice.getMemberDevice() : null;
-        boolean isMemberDevice = memberSet != null && memberSet.contains(newMainDevice);
-        if (!hasMainDevice || !isMemberDevice) {
-            log("switchRelationshipFromMemberToMain: "
-                    + newMainDevice.getDevice().getAnonymizedAddress()
-                    + " is not the member device.");
-            return;
-        }
-
-        mCachedDevices.remove(oldMainDevice);
-        // When both LE Audio devices are disconnected, receiving member device
-        // connection. To switch content and dispatch to notify UI change
-        mBtManager.getEventManager().dispatchDeviceRemoved(oldMainDevice);
-
-        for (CachedBluetoothDevice memberDeviceItem : memberSet) {
-            if (memberDeviceItem.equals(newMainDevice)) {
-                continue;
-            }
-            newMainDevice.addMemberDevice(memberDeviceItem);
-        }
-        memberSet.clear();
-        newMainDevice.addMemberDevice(oldMainDevice);
-
-        mCachedDevices.add(newMainDevice);
-        // It is necessary to do remove and add for updating the mapping on
-        // preference and device
-        mBtManager.getEventManager().dispatchDeviceAdded(newMainDevice);
-        log("switchRelationshipFromMemberToMain: After change, CachedBluetoothDevice list: "
-                + mCachedDevices);
-    }
-
     private void log(String msg) {
         if (DEBUG) {
             Log.d(TAG, msg);
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java
index 814c395..356bb82 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java
@@ -71,7 +71,7 @@
                 return BluetoothCsipSetCoordinator.GROUP_ID_INVALID;
             }
 
-            for (Map.Entry<Integer, ParcelUuid> entry: groupIdMap.entrySet()) {
+            for (Map.Entry<Integer, ParcelUuid> entry : groupIdMap.entrySet()) {
                 if (entry.getValue().equals(BluetoothUuid.CAP)) {
                     return entry.getKey();
                 }
@@ -153,72 +153,13 @@
             return;
         }
         log("onGroupIdChanged: mCachedDevices list =" + mCachedDevices.toString());
-        final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager();
-        final CachedBluetoothDeviceManager deviceManager = mBtManager.getCachedDeviceManager();
-        final LeAudioProfile leAudioProfile = profileManager.getLeAudioProfile();
-        final BluetoothDevice mainBluetoothDevice = (leAudioProfile != null && isAtLeastT()) ?
-                leAudioProfile.getConnectedGroupLeadDevice(groupId) : null;
+        List<CachedBluetoothDevice> memberDevicesList = getMemberDevicesList(groupId);
         CachedBluetoothDevice newMainDevice =
-                mainBluetoothDevice != null ? deviceManager.findDevice(mainBluetoothDevice) : null;
-        if (newMainDevice != null) {
-            final CachedBluetoothDevice finalNewMainDevice = newMainDevice;
-            final List<CachedBluetoothDevice> memberDevices = mCachedDevices.stream()
-                    .filter(cachedDevice -> !cachedDevice.equals(finalNewMainDevice)
-                            && cachedDevice.getGroupId() == groupId)
-                    .collect(Collectors.toList());
-            if (memberDevices == null || memberDevices.isEmpty()) {
-                log("onGroupIdChanged: There is no member device in list.");
-                return;
-            }
-            log("onGroupIdChanged: removed from UI device =" + memberDevices
-                    + ", with groupId=" + groupId + " mainDevice= " + newMainDevice);
-            for (CachedBluetoothDevice memberDeviceItem : memberDevices) {
-                Set<CachedBluetoothDevice> memberSet = memberDeviceItem.getMemberDevice();
-                if (!memberSet.isEmpty()) {
-                    log("onGroupIdChanged: Transfer the member list into new main device.");
-                    for (CachedBluetoothDevice memberListItem : memberSet) {
-                        if (!memberListItem.equals(newMainDevice)) {
-                            newMainDevice.addMemberDevice(memberListItem);
-                        }
-                    }
-                    memberSet.clear();
-                }
+                getPreferredMainDeviceWithoutConectionState(groupId, memberDevicesList);
 
-                newMainDevice.addMemberDevice(memberDeviceItem);
-                mCachedDevices.remove(memberDeviceItem);
-                mBtManager.getEventManager().dispatchDeviceRemoved(memberDeviceItem);
-            }
-
-            if (!mCachedDevices.contains(newMainDevice)) {
-                mCachedDevices.add(newMainDevice);
-                mBtManager.getEventManager().dispatchDeviceAdded(newMainDevice);
-            }
-        } else {
-            log("onGroupIdChanged: There is no main device from the LE profile.");
-            int firstMatchedIndex = -1;
-
-            for (int i = mCachedDevices.size() - 1; i >= 0; i--) {
-                final CachedBluetoothDevice cachedDevice = mCachedDevices.get(i);
-                if (cachedDevice.getGroupId() != groupId) {
-                    continue;
-                }
-
-                if (firstMatchedIndex == -1) {
-                    // Found the first one
-                    firstMatchedIndex = i;
-                    newMainDevice = cachedDevice;
-                    continue;
-                }
-
-                log("onGroupIdChanged: removed from UI device =" + cachedDevice
-                        + ", with groupId=" + groupId + " firstMatchedIndex=" + firstMatchedIndex);
-
-                newMainDevice.addMemberDevice(cachedDevice);
-                mCachedDevices.remove(i);
-                mBtManager.getEventManager().dispatchDeviceRemoved(cachedDevice);
-                break;
-            }
-        }
+        log("onGroupIdChanged: The mainDevice= " + newMainDevice
+                + " and the memberDevicesList of groupId= " + groupId + " =" + memberDevicesList);
+        addMemberDevicesIntoMainDevice(memberDevicesList, newMainDevice);
     }
 
     // @return {@code true}, the event is processed inside the method. It is for updating
@@ -238,10 +179,14 @@
                         mainDevice.refresh();
                         return true;
                     } else {
-                        final CachedBluetoothDeviceManager deviceManager =
-                                mBtManager.getCachedDeviceManager();
-                        deviceManager.switchRelationshipFromMemberToMain(cachedDevice);
-                        cachedDevice.refresh();
+                        // When both LE Audio devices are disconnected, receiving member device
+                        // connection. To switch content and dispatch to notify UI change
+                        mBtManager.getEventManager().dispatchDeviceRemoved(mainDevice);
+                        mainDevice.switchMemberDeviceContent(cachedDevice);
+                        mainDevice.refresh();
+                        // It is necessary to do remove and add for updating the mapping on
+                        // preference and device
+                        mBtManager.getEventManager().dispatchDeviceAdded(mainDevice);
                         return true;
                     }
                 }
@@ -259,13 +204,17 @@
                     break;
                 }
 
-                for (CachedBluetoothDevice device: memberSet) {
+                for (CachedBluetoothDevice device : memberSet) {
                     if (device.isConnected()) {
                         log("set device: " + device + " as the main device");
-                        final CachedBluetoothDeviceManager deviceManager =
-                                mBtManager.getCachedDeviceManager();
-                        deviceManager.switchRelationshipFromMemberToMain(device);
-                        device.refresh();
+                        // Main device is disconnected and sub device is connected
+                        // To copy data from sub device to main device
+                        mBtManager.getEventManager().dispatchDeviceRemoved(cachedDevice);
+                        cachedDevice.switchMemberDeviceContent(device);
+                        cachedDevice.refresh();
+                        // It is necessary to do remove and add for updating the mapping on
+                        // preference and device
+                        mBtManager.getEventManager().dispatchDeviceAdded(cachedDevice);
                         return true;
                     }
                 }
@@ -288,7 +237,7 @@
                     continue;
                 }
 
-                for (CachedBluetoothDevice memberDevice: memberSet) {
+                for (CachedBluetoothDevice memberDevice : memberSet) {
                     if (memberDevice != null && memberDevice.equals(device)) {
                         return cachedDevice;
                     }
@@ -302,7 +251,6 @@
      * Check if the {@code groupId} is existed.
      *
      * @param groupId The group id
-     *
      * @return {@code true}, if we could find a device with this {@code groupId}; Otherwise,
      * return {@code false}.
      */
@@ -314,6 +262,116 @@
         return false;
     }
 
+    private List<CachedBluetoothDevice> getMemberDevicesList(int groupId) {
+        return mCachedDevices.stream()
+                .filter(cacheDevice -> cacheDevice.getGroupId() == groupId)
+                .collect(Collectors.toList());
+    }
+
+    private CachedBluetoothDevice getPreferredMainDeviceWithoutConectionState(int groupId,
+            List<CachedBluetoothDevice> memberDevicesList) {
+        // First, priority connected lead device from LE profile
+        // Second, the DUAL mode device which has A2DP/HFP and LE audio
+        // Last, any one of LE device in the list.
+        if (memberDevicesList == null || memberDevicesList.isEmpty()) {
+            return null;
+        }
+
+        final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager();
+        final CachedBluetoothDeviceManager deviceManager = mBtManager.getCachedDeviceManager();
+        final LeAudioProfile leAudioProfile = profileManager.getLeAudioProfile();
+        final BluetoothDevice mainBluetoothDevice = (leAudioProfile != null && isAtLeastT())
+                ? leAudioProfile.getConnectedGroupLeadDevice(groupId) : null;
+
+        if (mainBluetoothDevice != null) {
+            log("getPreferredMainDevice: The LeadDevice from LE profile is "
+                    + mainBluetoothDevice.getAnonymizedAddress());
+        }
+
+        // 1st
+        CachedBluetoothDevice newMainDevice =
+                mainBluetoothDevice != null ? deviceManager.findDevice(mainBluetoothDevice) : null;
+        if (newMainDevice != null) {
+            if (newMainDevice.isConnected()) {
+                log("getPreferredMainDevice: The connected LeadDevice from LE profile");
+                return newMainDevice;
+            } else {
+                log("getPreferredMainDevice: The LeadDevice is not connect.");
+            }
+        } else {
+            log("getPreferredMainDevice: The LeadDevice is not in the all of devices list");
+        }
+
+        // 2nd
+        newMainDevice = memberDevicesList.stream()
+                .filter(cachedDevice -> cachedDevice.getConnectableProfiles().stream()
+                        .anyMatch(profile -> profile instanceof A2dpProfile
+                                || profile instanceof HeadsetProfile))
+                .findFirst().orElse(null);
+        if (newMainDevice != null) {
+            log("getPreferredMainDevice: The DUAL mode device");
+            return newMainDevice;
+        }
+
+        // last
+        if (!memberDevicesList.isEmpty()) {
+            newMainDevice = memberDevicesList.get(0);
+        }
+        return newMainDevice;
+    }
+
+    private void addMemberDevicesIntoMainDevice(List<CachedBluetoothDevice> memberDevicesList,
+            CachedBluetoothDevice newMainDevice) {
+        if (newMainDevice == null) {
+            log("addMemberDevicesIntoMainDevice: No main device. Do nothing.");
+            return;
+        }
+        if (memberDevicesList.isEmpty()) {
+            log("addMemberDevicesIntoMainDevice: No member device in list. Do nothing.");
+            return;
+        }
+        CachedBluetoothDevice mainDeviceOfNewMainDevice = findMainDevice(newMainDevice);
+        boolean isMemberInOtherMainDevice = mainDeviceOfNewMainDevice != null;
+        if (!memberDevicesList.contains(newMainDevice) && isMemberInOtherMainDevice) {
+            log("addMemberDevicesIntoMainDevice: The 'new main device' is not in list, and it is "
+                    + "the member at other device. Do switch main and member.");
+            // To switch content and dispatch to notify UI change
+            mBtManager.getEventManager().dispatchDeviceRemoved(mainDeviceOfNewMainDevice);
+            mainDeviceOfNewMainDevice.switchMemberDeviceContent(newMainDevice);
+            mainDeviceOfNewMainDevice.refresh();
+            // It is necessary to do remove and add for updating the mapping on
+            // preference and device
+            mBtManager.getEventManager().dispatchDeviceAdded(mainDeviceOfNewMainDevice);
+        } else {
+            log("addMemberDevicesIntoMainDevice: Set new main device");
+            for (CachedBluetoothDevice memberDeviceItem : memberDevicesList) {
+                if (memberDeviceItem.equals(newMainDevice)) {
+                    continue;
+                }
+                Set<CachedBluetoothDevice> memberSet = memberDeviceItem.getMemberDevice();
+                if (!memberSet.isEmpty()) {
+                    for (CachedBluetoothDevice memberSetItem : memberSet) {
+                        if (!memberSetItem.equals(newMainDevice)) {
+                            newMainDevice.addMemberDevice(memberSetItem);
+                        }
+                    }
+                    memberSet.clear();
+                }
+
+                newMainDevice.addMemberDevice(memberDeviceItem);
+                mCachedDevices.remove(memberDeviceItem);
+                mBtManager.getEventManager().dispatchDeviceRemoved(memberDeviceItem);
+            }
+
+            if (!mCachedDevices.contains(newMainDevice)) {
+                mCachedDevices.add(newMainDevice);
+                mBtManager.getEventManager().dispatchDeviceAdded(newMainDevice);
+            }
+        }
+        log("addMemberDevicesIntoMainDevice: After changed, CachedBluetoothDevice list: "
+                + mCachedDevices);
+    }
+
     private void log(String msg) {
         if (DEBUG) {
             Log.d(TAG, msg);
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java b/packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java
index 6c0eab3..e38e041 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java
@@ -55,7 +55,7 @@
                 new Device(
                     AudioDeviceInfo.TYPE_DOCK,
                     MediaRoute2Info.TYPE_DOCK,
-                    R.drawable.ic_headphone),
+                    R.drawable.ic_dock_device),
                 new Device(
                     AudioDeviceInfo.TYPE_HDMI,
                     MediaRoute2Info.TYPE_HDMI,
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
index 1791dce..4b3820e 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
@@ -604,87 +604,4 @@
         verify(mDevice2).setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
         verify(mDevice2).createBond(BluetoothDevice.TRANSPORT_LE);
     }
-
-    @Test
-    public void switchRelationshipFromMemberToMain_switchesMainDevice_switchesSuccessful() {
-        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1);
-        CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1);
-        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2);
-        doReturn(CAP_GROUP2).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3);
-        CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2);
-        CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3);
-        assertThat(mCachedDeviceManager.isSubDevice(mDevice1)).isFalse();
-        assertThat(mCachedDeviceManager.isSubDevice(mDevice2)).isTrue();
-        assertThat(mCachedDeviceManager.isSubDevice(mDevice3)).isFalse();
-        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue();
-
-        mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice2);
-
-        assertThat(mCachedDeviceManager.isSubDevice(mDevice1)).isTrue();
-        assertThat(mCachedDeviceManager.isSubDevice(mDevice2)).isFalse();
-        assertThat(mCachedDeviceManager.isSubDevice(mDevice3)).isFalse();
-        assertThat(cachedDevice2.getMemberDevice().contains(cachedDevice1)).isTrue();
-    }
-
-    @Test
-    public void switchRelationshipFromMemberToMain_moreMembersCase_switchesSuccessful() {
-        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1);
-        CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1);
-        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2);
-        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3);
-        CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2);
-        CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3);
-        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue();
-        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue();
-
-        mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice2);
-
-        assertThat(mCachedDeviceManager.isSubDevice(mDevice1)).isTrue();
-        assertThat(mCachedDeviceManager.isSubDevice(mDevice2)).isFalse();
-        assertThat(mCachedDeviceManager.isSubDevice(mDevice3)).isTrue();
-        assertThat(cachedDevice2.getMemberDevice().contains(cachedDevice1)).isTrue();
-        assertThat(cachedDevice2.getMemberDevice().contains(cachedDevice3)).isTrue();
-    }
-
-    @Test
-    public void switchRelationshipFromMemberToMain_inputDeviceIsMainDevice_doesNotChangelist() {
-        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1);
-        CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1);
-        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2);
-        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3);
-        CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2);
-        CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3);
-        Collection<CachedBluetoothDevice> devices = mCachedDeviceManager.getCachedDevicesCopy();
-        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue();
-        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue();
-
-        mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice1);
-
-        devices = mCachedDeviceManager.getCachedDevicesCopy();
-        assertThat(devices).contains(cachedDevice1);
-        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue();
-        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue();
-    }
-
-    @Test
-    public void switchRelationshipFromMemberToMain_inputDeviceNotInMemberList_doesNotChangelist() {
-        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1);
-        CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1);
-        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2);
-        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3);
-        CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2);
-        cachedDevice1.getMemberDevice().remove(cachedDevice2);
-        CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3);
-        Collection<CachedBluetoothDevice> devices = mCachedDeviceManager.getCachedDevicesCopy();
-
-        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isFalse();
-        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue();
-
-        mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice2);
-
-        devices = mCachedDeviceManager.getCachedDevicesCopy();
-        assertThat(devices).contains(cachedDevice1);
-        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isFalse();
-        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue();
-    }
 }
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 ff1af92..6444f3b 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
@@ -1138,6 +1138,27 @@
     }
 
     @Test
+    public void switchMemberDeviceContent_switchMainDevice_switchesSuccessful() {
+        mCachedDevice.mRssi = RSSI_1;
+        mCachedDevice.mJustDiscovered = JUSTDISCOVERED_1;
+        mSubCachedDevice.mRssi = RSSI_2;
+        mSubCachedDevice.mJustDiscovered = JUSTDISCOVERED_2;
+        mCachedDevice.addMemberDevice(mSubCachedDevice);
+
+        mCachedDevice.switchMemberDeviceContent(mSubCachedDevice);
+
+        assertThat(mCachedDevice.mRssi).isEqualTo(RSSI_2);
+        assertThat(mCachedDevice.mJustDiscovered).isEqualTo(JUSTDISCOVERED_2);
+        assertThat(mCachedDevice.mDevice).isEqualTo(mSubDevice);
+        verify(mCachedDevice).fillData();
+        assertThat(mSubCachedDevice.mRssi).isEqualTo(RSSI_1);
+        assertThat(mSubCachedDevice.mJustDiscovered).isEqualTo(JUSTDISCOVERED_1);
+        assertThat(mSubCachedDevice.mDevice).isEqualTo(mDevice);
+        verify(mSubCachedDevice).fillData();
+        assertThat(mCachedDevice.getMemberDevice().contains(mSubCachedDevice)).isTrue();
+    }
+
+    @Test
     public void isConnectedHearingAidDevice_isConnectedAshaHearingAidDevice_returnTrue() {
         when(mProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile);
 
diff --git a/packages/SettingsProvider/res/values-te/strings.xml b/packages/SettingsProvider/res/values-te/strings.xml
index fa2191f..95be5c5 100644
--- a/packages/SettingsProvider/res/values-te/strings.xml
+++ b/packages/SettingsProvider/res/values-te/strings.xml
@@ -19,7 +19,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="4567566098528588863">"సెట్టింగ్‌ల నిల్వ"</string>
+    <string name="app_label" msgid="4567566098528588863">"సెట్టింగ్‌ల స్టోరేజ్‌"</string>
     <string name="wifi_softap_config_change" msgid="5688373762357941645">"హాట్‌స్పాట్ సెట్టింగ్‌లు మార్చబడ్డాయి"</string>
     <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"వివరాలను చూడటానికి ట్యాప్ చేయండి"</string>
 </resources>
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index 6312913..59cd7a0 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -25,6 +25,8 @@
     <!-- Comma-separated list of bluetooth, wifi, and cell. -->
     <string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,uwb,wifi,wimax</string>
     <string name="airplane_mode_toggleable_radios" translatable="false">bluetooth,wifi</string>
+    <string name="def_satellite_mode_radios" translatable="false"></string>
+    <integer name="def_satellite_mode_enabled" translatable="false">0</integer>
     <string name="def_bluetooth_disabled_profiles" translatable="false">0</string>
     <bool name="def_auto_time">true</bool>
     <bool name="def_auto_time_zone">true</bool>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 7477416..ed5654d 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -2413,6 +2413,12 @@
             loadStringSetting(stmt, Settings.Global.AIRPLANE_MODE_RADIOS,
                     R.string.def_airplane_mode_radios);
 
+            loadStringSetting(stmt, Global.SATELLITE_MODE_RADIOS,
+                    R.string.def_satellite_mode_radios);
+
+            loadIntegerSetting(stmt, Global.SATELLITE_MODE_ENABLED,
+                    R.integer.def_satellite_mode_enabled);
+
             loadStringSetting(stmt, Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
                     R.string.airplane_mode_toggleable_radios);
 
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/GenerationRegistry.java b/packages/SettingsProvider/src/com/android/providers/settings/GenerationRegistry.java
index 80030f7..02ec486 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/GenerationRegistry.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/GenerationRegistry.java
@@ -20,14 +20,19 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.provider.Settings;
+import android.providers.settings.BackingStoreProto;
+import android.providers.settings.CacheEntryProto;
+import android.providers.settings.GenerationRegistryProto;
 import android.util.ArrayMap;
 import android.util.MemoryIntArray;
 import android.util.Slog;
+import android.util.proto.ProtoOutputStream;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.io.IOException;
+import java.io.PrintWriter;
 
 /**
  * This class tracks changes for config/global/secure/system tables
@@ -292,4 +297,94 @@
     int getMaxNumBackingStores() {
         return mMaxNumBackingStore;
     }
+
+    public void dumpProto(ProtoOutputStream proto) {
+        synchronized (mLock) {
+            final int numBackingStores = mKeyToBackingStoreMap.size();
+            proto.write(GenerationRegistryProto.NUM_BACKING_STORES, numBackingStores);
+            proto.write(GenerationRegistryProto.NUM_MAX_BACKING_STORES, getMaxNumBackingStores());
+
+            for (int i = 0; i < numBackingStores; i++) {
+                final long token = proto.start(GenerationRegistryProto.BACKING_STORES);
+                final int key = mKeyToBackingStoreMap.keyAt(i);
+                proto.write(BackingStoreProto.KEY, key);
+                try {
+                    proto.write(BackingStoreProto.BACKING_STORE_SIZE,
+                            mKeyToBackingStoreMap.valueAt(i).size());
+                } catch (IOException ignore) {
+                }
+                proto.write(BackingStoreProto.NUM_CACHED_ENTRIES,
+                        mKeyToIndexMapMap.get(key).size());
+                final ArrayMap<String, Integer> indexMap = mKeyToIndexMapMap.get(key);
+                final MemoryIntArray backingStore = getBackingStoreLocked(key,
+                        /* createIfNotExist= */ false);
+                if (indexMap == null || backingStore == null) {
+                    continue;
+                }
+                for (String setting : indexMap.keySet()) {
+                    try {
+                        final int index = getKeyIndexLocked(key, setting, mKeyToIndexMapMap,
+                                backingStore, /* createIfNotExist= */ false);
+                        if (index < 0) {
+                            continue;
+                        }
+                        final long cacheEntryToken = proto.start(
+                                BackingStoreProto.CACHE_ENTRIES);
+                        final int generation = backingStore.get(index);
+                        proto.write(CacheEntryProto.NAME,
+                                setting.equals(DEFAULT_MAP_KEY_FOR_UNSET_SETTINGS)
+                                        ? "UNSET" : setting);
+                        proto.write(CacheEntryProto.GENERATION, generation);
+                        proto.end(cacheEntryToken);
+                    } catch (IOException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+                proto.end(token);
+            }
+
+        }
+    }
+
+    public void dump(PrintWriter pw) {
+        pw.println("GENERATION REGISTRY");
+        pw.println("Maximum number of backing stores:" + getMaxNumBackingStores());
+        synchronized (mLock) {
+            final int numBackingStores = mKeyToBackingStoreMap.size();
+            pw.println("Number of backing stores:" + numBackingStores);
+            for (int i = 0; i < numBackingStores; i++) {
+                final int key = mKeyToBackingStoreMap.keyAt(i);
+                pw.print("_Backing store for type:"); pw.print(SettingsState.settingTypeToString(
+                        SettingsState.getTypeFromKey(key)));
+                pw.print(" user:"); pw.print(SettingsState.getUserIdFromKey(key));
+                try {
+                    pw.print(" size:" + mKeyToBackingStoreMap.valueAt(i).size());
+                } catch (IOException ignore) {
+                }
+                pw.println(" cachedEntries:" + mKeyToIndexMapMap.get(key).size());
+                final ArrayMap<String, Integer> indexMap = mKeyToIndexMapMap.get(key);
+                final MemoryIntArray backingStore = getBackingStoreLocked(key,
+                        /* createIfNotExist= */ false);
+                if (indexMap == null || backingStore == null) {
+                    continue;
+                }
+                for (String setting : indexMap.keySet()) {
+                    try {
+                        final int index = getKeyIndexLocked(key, setting, mKeyToIndexMapMap,
+                                backingStore, /* createIfNotExist= */ false);
+                        if (index < 0) {
+                            continue;
+                        }
+                        final int generation = backingStore.get(index);
+                        pw.print("  setting: "); pw.print(
+                                setting.equals(DEFAULT_MAP_KEY_FOR_UNSET_SETTINGS)
+                                        ? "UNSET" : setting);
+                        pw.println(" generation:" + generation);
+                    } catch (IOException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/OWNERS b/packages/SettingsProvider/src/com/android/providers/settings/OWNERS
new file mode 100644
index 0000000..0b71816
--- /dev/null
+++ b/packages/SettingsProvider/src/com/android/providers/settings/OWNERS
@@ -0,0 +1 @@
+per-file WritableNamespacePrefixes.java = [email protected],[email protected]
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index d49627e..d3a9e91 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -120,6 +120,17 @@
             dumpProtoUserSettingsLocked(proto, SettingsServiceDumpProto.USER_SETTINGS,
                     settingsRegistry, UserHandle.of(users.keyAt(i)));
         }
+
+        // Generation registry
+        dumpProtoGenerationRegistryLocked(proto, SettingsServiceDumpProto.GENERATION_REGISTRY,
+                settingsRegistry);
+    }
+
+    private static void dumpProtoGenerationRegistryLocked(@NonNull ProtoOutputStream proto,
+            long fieldId, SettingsProvider.SettingsRegistry settingsRegistry) {
+        final long token = proto.start(fieldId);
+        settingsRegistry.getGenerationRegistry().dumpProto(proto);
+        proto.end(token);
     }
 
     /**
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 5a8c594..b0a1927 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -900,6 +900,7 @@
             } finally {
                 Binder.restoreCallingIdentity(identity);
             }
+            mSettingsRegistry.mGenerationRegistry.dump(pw);
         }
     }
 
@@ -2323,7 +2324,15 @@
             return;
         } else if (hasAllowlistPermission) {
             for (String flag : flags) {
-                if (!DeviceConfig.getAdbWritableFlags().contains(flag)) {
+                boolean namespaceAllowed = false;
+                for (String allowlistedPrefix : WritableNamespacePrefixes.ALLOWLIST) {
+                    if (flag.startsWith(allowlistedPrefix)) {
+                        namespaceAllowed = true;
+                        break;
+                    }
+                }
+
+                if (!namespaceAllowed && !DeviceConfig.getAdbWritableFlags().contains(flag)) {
                     throw new SecurityException("Permission denial for flag '"
                         + flag
                         + "'; allowlist permission granted, but must add flag to the allowlist.");
@@ -3739,7 +3748,7 @@
         }
 
         private final class UpgradeController {
-            private static final int SETTINGS_VERSION = 216;
+            private static final int SETTINGS_VERSION = 217;
 
             private final int mUserId;
 
@@ -5702,7 +5711,7 @@
                             .getSettingLocked(Settings.Secure.CREDENTIAL_SERVICE);
                     if (currentSetting.isNull()) {
                         final int resourceId =
-                            com.android.internal.R.string.config_defaultCredentialProviderService;
+                            com.android.internal.R.array.config_defaultCredentialProviderService;
                         final Resources resources = getContext().getResources();
                         // If the config has not be defined we might get an exception. We also get
                         // values from both the string array type and the single string in case the
@@ -5762,6 +5771,39 @@
                     currentVersion = 216;
                 }
 
+                if (currentVersion == 216) {
+                    // Version 216: Set a default value for Credential Manager service.
+                    // We are doing this migration again because of an incorrect setting.
+
+                    final SettingsState secureSettings = getSecureSettingsLocked(userId);
+                    final Setting currentSetting = secureSettings
+                            .getSettingLocked(Settings.Secure.CREDENTIAL_SERVICE);
+                    if (currentSetting.isNull()) {
+                        final int resourceId =
+                            com.android.internal.R.array.config_defaultCredentialProviderService;
+                        final Resources resources = getContext().getResources();
+                        // If the config has not be defined we might get an exception.
+                        final List<String> providers = new ArrayList<>();
+                        try {
+                            providers.addAll(Arrays.asList(resources.getStringArray(resourceId)));
+                        } catch (Resources.NotFoundException e) {
+                            Slog.w(LOG_TAG,
+                                "Get default array Cred Provider not found: " + e.toString());
+                        }
+
+                        if (!providers.isEmpty()) {
+                            final String defaultValue = String.join(":", providers);
+                            Slog.d(LOG_TAG, "Setting [" + defaultValue + "] as CredMan Service "
+                                    + "for user " + userId);
+                            secureSettings.insertSettingOverrideableByRestoreLocked(
+                                    Settings.Secure.CREDENTIAL_SERVICE, defaultValue, null, true,
+                                    SettingsState.SYSTEM_PACKAGE_NAME);
+                        }
+                    }
+
+                    currentVersion = 217;
+                }
+
                 // vXXX: Add new settings above this point.
 
                 if (currentVersion != newVersion) {
@@ -6016,5 +6058,10 @@
             return !a11yButtonTargetsSettings.isNull()
                     && !TextUtils.isEmpty(a11yButtonTargetsSettings.getValue());
         }
+
+        @NonNull
+        public GenerationRegistry getGenerationRegistry() {
+            return mGenerationRegistry;
+        }
     }
 }
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespacePrefixes.java b/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespacePrefixes.java
new file mode 100644
index 0000000..bd99a8b
--- /dev/null
+++ b/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespacePrefixes.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.settings;
+
+import android.util.ArraySet;
+
+import java.util.Arrays;
+import java.util.Set;
+
+/**
+ * Contains the list of prefixes for namespaces in which any flag can be written with adb.
+ * <p>
+ * A security review is required for any prefix that's added to this list. To add to
+ * the list, create a change and tag the OWNER. In the change description, include a
+ * description of the flag's functionality, and a justification for why it needs to be
+ * allowlisted.
+ */
+final class WritableNamespacePrefixes {
+    public static final Set<String> ALLOWLIST =
+            new ArraySet<String>(Arrays.asList(
+                "app_compat_overrides",
+                "game_overlay",
+                "namespace1",
+                "accessibility",
+                "activity_manager",
+                "activity_manager_native_boot",
+                "adaptive_charging",
+                "adservices",
+                "aiai_controlled_releases",
+                "alarm_manager",
+                "app_cloning",
+                "app_compat",
+                "app_compat_overrides",
+                "app_hibernation",
+                "app_standby",
+                "appsearch",
+                "arc_app_compat",
+                "astrea_controlled_releases",
+                "attention_manager_service",
+                "auto_pin_confirmation",
+                "autofill",
+                "backup_and_restore",
+                "base",
+                "battery_saver",
+                "biometrics",
+                "bluetooth",
+                "bluetooth_native",
+                "camera_native",
+                "captive_portal_login",
+                "car",
+                "cellular_security",
+                "clipboard",
+                "codegen_feature_flag_extractor",
+                "companion",
+                "configuration",
+                "connectivity",
+                "connectivity_thermal_power_manager",
+                "constrain_display_apis",
+                "content_capture",
+                "credential_manager",
+                "device_idle",
+                "device_personalization_services",
+                "device_policy_manager",
+                "devicelock",
+                "display_manager",
+                "dropbox",
+                "edgetpu_native",
+                "exo",
+                "flipendo",
+                "game_driver",
+                "game_overlay",
+                "gantry",
+                "halyard_demo",
+                "haptics",
+                "hdmi_control",
+                "health_fitness",
+                "input",
+                "input_method",
+                "input_native",
+                "input_native_boot",
+                "intelligence_bubbles",
+                "interaction_jank_monitor",
+                "ipsec",
+                "jobscheduler",
+                "kiwi",
+                "latency_tracker",
+                "launcher",
+                "launcher_lily",
+                "leaked_animator",
+                "lmkd_native",
+                "location",
+                "logcat_manager",
+                "low_power_standby",
+                "media",
+                "media_better_together",
+                "media_native",
+                "memory_safety_native",
+                "memory_safety_native_boot",
+                "mglru_native",
+                "nearby",
+                "netd_native",
+                "nnapi_native",
+                "notification_assistant",
+                "odad",
+                "on_device_abuse",
+                "on_device_personalization",
+                "oslo",
+                "ota",
+                "package_manager_service",
+                "permissions",
+                "privacy",
+                "private_compute_services",
+                "profcollect_native_boot",
+                "remote_auth",
+                "remote_key_provisioning_native",
+                "rollback",
+                "rollback_boot",
+                "rotation_resolver",
+                "runtime",
+                "runtime_native",
+                "runtime_native_boot",
+                "sdk_sandbox",
+                "settings_stats",
+                "shared",
+                "shared_native",
+                "shared_native_boot",
+                "statsd_java",
+                "statsd_java_boot",
+                "statsd_native",
+                "statsd_native_boot",
+                "storage_native_boot",
+                "surface_flinger_native_boot",
+                "swcodec_native",
+                "system_scheduler",
+                "system_server_watchdog",
+                "system_time",
+                "systemui",
+                "tare",
+                "telephony",
+                "testing",
+                "tethering",
+                "text",
+                "textclassifier",
+                "touchflow_native",
+                "tv_hdr_output_control",
+                "twoshay_native",
+                "uwb",
+                "vcn",
+                "vendor_system_native",
+                "vendor_system_native_boot",
+                "virtualization_framework_native",
+                "vpn",
+                "wallpaper_content",
+                "wear",
+                "wearable_sensing",
+                "widget",
+                "wifi",
+                "window_manager",
+                "window_manager_native_boot",
+                "wrong"
+            ));
+}
diff --git a/packages/SettingsProvider/test/AndroidManifest.xml b/packages/SettingsProvider/test/AndroidManifest.xml
index ebdf9b1..6464c12 100644
--- a/packages/SettingsProvider/test/AndroidManifest.xml
+++ b/packages/SettingsProvider/test/AndroidManifest.xml
@@ -20,7 +20,8 @@
     <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />
 
     <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
-    <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG"/>
+    <uses-permission android:name="android.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG"/>
+    <uses-permission android:name="android.permission.READ_WRITE_SYNC_DISABLED_MODE_CONFIG"/>
     <uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/>
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
diff --git a/packages/Shell/res/values-as/strings.xml b/packages/Shell/res/values-as/strings.xml
index 9b9db6e..f8895ee 100644
--- a/packages/Shell/res/values-as/strings.xml
+++ b/packages/Shell/res/values-as/strings.xml
@@ -26,8 +26,8 @@
     <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"আপোনাৰ বাগ সম্পৰ্কীয় অভিযোগ শ্বেয়াৰ কৰিবৰ বাবে বাছনি কৰক"</string>
     <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"আপোনাৰ বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবৰ বাবে ইয়াত টিপক"</string>
     <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"ষ্ক্ৰীণশ্বট নোলোৱাকৈ বাগ সম্পৰ্কীয় অভিযোগ শ্বেয়াৰ কৰিবলৈ বাছনি কৰক বা ষ্ক্ৰীণশ্বট লোৱা কাৰ্য সম্পূৰ্ণ হোৱালৈ অপেক্ষা কৰক"</string>
-    <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"স্ক্ৰীণশ্বট নোলোৱাকৈ বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবলৈ ইয়াত টিপক বা স্ক্ৰীণশ্বট সম্পূৰ্ণ হোৱালৈ অপেক্ষা কৰক"</string>
-    <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"স্ক্ৰীণশ্বট নোলোৱাকৈ বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবলৈ ইয়াত টিপক বা স্ক্ৰীণশ্বট সম্পূৰ্ণ হোৱালৈ অপেক্ষা কৰক"</string>
+    <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"স্ক্ৰীনশ্বট নোলোৱাকৈ বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবলৈ ইয়াত টিপক বা স্ক্ৰীনশ্বট সম্পূৰ্ণ হোৱালৈ অপেক্ষা কৰক"</string>
+    <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"স্ক্ৰীনশ্বট নোলোৱাকৈ বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবলৈ ইয়াত টিপক বা স্ক্ৰীনশ্বট সম্পূৰ্ণ হোৱালৈ অপেক্ষা কৰক"</string>
     <string name="bugreport_confirm" msgid="5917407234515812495">"বাগ সম্পর্কীয় অভিযোগত ছিষ্টেমৰ বিভিন্ন লগ ফাইল থাকে, ইয়াৰ ভিতৰত আপুনি স্পর্শকাতৰ বুলি গণ্য কৰা ডেটা (যেনে এপৰ ব্যৱহাৰ আৰু অৱস্থান সম্পৰ্কীয় তথ্য) অন্তর্ভুক্ত হ\'ব পাৰে। কেৱল আপোনাৰ বিশ্বাসী লোক বা এপৰ সৈতেহে বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিব।"</string>
     <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"পুনৰাই নেদেখুৱাব"</string>
     <string name="bugreport_storage_title" msgid="5332488144740527109">"বাগ সম্পর্কীয় প্ৰতিবেদনসমূহ"</string>
@@ -35,9 +35,9 @@
     <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"বাগ সম্পর্কীয় অভিযোগৰ বিৱৰণ জিপ ফাইলত যোগ কৰিব পৰা নগ\'ল"</string>
     <string name="bugreport_unnamed" msgid="2800582406842092709">"নামবিহীন"</string>
     <string name="bugreport_info_action" msgid="2158204228510576227">"সবিশেষ"</string>
-    <string name="bugreport_screenshot_action" msgid="8677781721940614995">"স্ক্ৰীণশ্বট"</string>
-    <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"স্ক্ৰীণশ্বট সফলতাৰে লোৱা হ\'ল৷"</string>
-    <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"স্ক্ৰীণশ্বট ল\'ব পৰা নগ\'ল।"</string>
+    <string name="bugreport_screenshot_action" msgid="8677781721940614995">"স্ক্ৰীনশ্বট"</string>
+    <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"স্ক্ৰীনশ্বট সফলতাৰে লোৱা হ\'ল৷"</string>
+    <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"স্ক্ৰীনশ্বট ল\'ব পৰা নগ\'ল।"</string>
     <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"বাগ সম্পর্কীয় অভিযোগৰ বিৱৰণ <xliff:g id="ID">#%d</xliff:g>"</string>
     <string name="bugreport_info_name" msgid="4414036021935139527">"ফাইলৰ নাম"</string>
     <string name="bugreport_info_title" msgid="2306030793918239804">"বাগৰ শিৰোনাম"</string>
diff --git a/packages/Shell/res/values-hi/strings.xml b/packages/Shell/res/values-hi/strings.xml
index 666d254..42b635a 100644
--- a/packages/Shell/res/values-hi/strings.xml
+++ b/packages/Shell/res/values-hi/strings.xml
@@ -40,7 +40,7 @@
     <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"स्क्रीनशॉट नहीं लिया जा सका."</string>
     <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"गड़बड़ी की रिपोर्ट <xliff:g id="ID">#%d</xliff:g> की पूरी जानकारी"</string>
     <string name="bugreport_info_name" msgid="4414036021935139527">"फ़ाइल नाम"</string>
-    <string name="bugreport_info_title" msgid="2306030793918239804">"गड़बड़ी का शीर्षक"</string>
+    <string name="bugreport_info_title" msgid="2306030793918239804">"गड़बड़ी का टाइटल"</string>
     <string name="bugreport_info_description" msgid="5072835127481627722">"गड़बड़ी का सारांश"</string>
     <string name="save" msgid="4781509040564835759">"सेव करें"</string>
     <string name="bugreport_intent_chooser_title" msgid="7605709494790894076">"गड़बड़ी की रिपोर्ट शेयर करें"</string>
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 067efe9..e069a9a 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -455,7 +455,8 @@
         intent.putExtra(DevicePolicyManager.EXTRA_REMOTE_BUGREPORT_HASH, bugreportHash);
         intent.putExtra(DevicePolicyManager.EXTRA_REMOTE_BUGREPORT_NONCE, nonce);
         intent.putExtra(EXTRA_BUGREPORT, bugreportFileName);
-        context.sendBroadcast(intent, android.Manifest.permission.DUMP);
+        context.sendBroadcastAsUser(intent, UserHandle.SYSTEM,
+                android.Manifest.permission.DUMP);
     }
 
     /**
diff --git a/packages/StatementService/res/values-en-rCA/strings.xml b/packages/StatementService/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..deb3d4c
--- /dev/null
+++ b/packages/StatementService/res/values-en-rCA/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="service_name" msgid="5049486369463670924">"Intent Filter Verification Service"</string>
+</resources>
diff --git a/packages/StatementService/res/values-en-rXC/strings.xml b/packages/StatementService/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..146db34
--- /dev/null
+++ b/packages/StatementService/res/values-en-rXC/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="service_name" msgid="5049486369463670924">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‎‎‎‎‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‏‎‎‎‏‏‎‎‎Intent Filter Verification Service‎‏‎‎‏‎"</string>
+</resources>
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index ac75cc8..3007d4a 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -182,7 +182,6 @@
         "androidx.dynamicanimation_dynamicanimation",
         "androidx-constraintlayout_constraintlayout",
         "androidx.exifinterface_exifinterface",
-        "androidx.test.ext.junit",
         "com.google.android.material_material",
         "kotlinx_coroutines_android",
         "kotlinx_coroutines",
@@ -191,6 +190,7 @@
         "SystemUI-proto",
         "monet",
         "dagger2",
+        "jsr305",
         "jsr330",
         "lottie",
         "LowLightDreamLib",
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index ff57052..36a0b5d 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -872,6 +872,20 @@
             </intent-filter>
         </activity>
 
+        <activity
+            android:name=".contrast.ContrastDialogActivity"
+            android:label="@string/quick_settings_contrast_label"
+            android:theme="@style/Theme.SystemUI.ContrastDialog"
+            android:finishOnCloseSystemDialogs="true"
+            android:launchMode="singleInstance"
+            android:excludeFromRecents="true"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="com.android.intent.action.SHOW_CONTRAST_DIALOG" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
         <activity android:name=".ForegroundServicesDialog"
             android:process=":fgservices"
             android:excludeFromRecents="true"
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/layout/footerlayout_switch_page.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/layout/footerlayout_switch_page.xml
index 91cb4ba..462c90b 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/layout/footerlayout_switch_page.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/layout/footerlayout_switch_page.xml
@@ -56,6 +56,7 @@
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:paddingStart="16dp"
+      android:paddingEnd="16dp"
       android:gravity="center_vertical"
       android:textColor="@color/colorControlNormal"
       android:textSize="@dimen/label_text_size"
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-af/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-af/strings.xml
index d25970c..cbb5ad7 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-af/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-af/strings.xml
@@ -1,16 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Toeganklikheid- kieslys"</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Toeganklikheid-kieslys"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Die Toeganklikheidkieslys bied ’n groot kieslys op die skerm om jou toestel te beheer. Jy kan jou toestel sluit, volume en helderheid beheer, skermskote neem, en meer."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistent"</string>
-    <string name="a11y_settings_label" msgid="3977714687248445050">"Toeganklikheidinstellings"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Volumekontroles"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"Toeganklikheid-instellings"</string>
     <string name="power_label" msgid="7699720321491287839">"Krag"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Kragopsies"</string>
-    <string name="recent_apps_label" msgid="6583276995616385847">"Onlangse programme"</string>
+    <string name="recent_apps_label" msgid="6583276995616385847">"Onlangse apps"</string>
     <string name="lockscreen_label" msgid="648347953557887087">"Sluitskerm"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"Kitsinstellings"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Kennisgewings"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml
index fa18989..f215e85 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"የተደራሽነት ምናሌ"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"የተደራሽነት ምናሌ መሣሪያዎን ለመቆጣጠር ትልቅ የማያ ገጽ ላይ ምናሌን ያቀርባል። የእርስዎን መሣሪያ መቆለፍ፣ ድምፅን እና ብሩህነትን መቆጣጠር፣ ቅጽበታዊ ገጽ ዕይታዎችን ማንሳት እና ተጨማሪ ነገሮችን ማድረግ ይችላሉ።"</string>
     <string name="assistant_label" msgid="6796392082252272356">"ረዳት"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"ረዳት"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"የተደራሽነት ቅንብሮች"</string>
-    <string name="volume_label" msgid="3682221827627150574">"ድምፅ"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"የድምጽ መቆጣጠሪያዎች"</string>
     <string name="power_label" msgid="7699720321491287839">"ኃይል"</string>
     <string name="power_utterance" msgid="7444296686402104807">"የኃይል አማራጮች"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"የቅርብ ጊዜ መተግበሪያዎች"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ar/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ar/strings.xml
index 89e42a3..29a09d5 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ar/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ar/strings.xml
@@ -1,14 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"قائمة \"تسهيل الاستخدام\""</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"قائمة \"تسهيل الاستخدام\" هي قائمة كبيرة تظهر على الشاشة وتتيح لك التحكّم في جهازك. يمكنك من خلال هذه القائمة قفل جهازك والتحكّم في مستوى الصوت والسطوع وتسجيل لقطات الشاشة وغير ذلك."</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"قائمة تسهيل الاستخدام"</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"\"قائمة تسهيل الاستخدام\" هي قائمة كبيرة تظهر على الشاشة وتتيح لك التحكّم في جهازك. يمكنك من خلال هذه القائمة قفل جهازك والتحكّم في مستوى الصوت والسطوع وتسجيل لقطات الشاشة وغير ذلك."</string>
     <string name="assistant_label" msgid="6796392082252272356">"مساعِد"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
-    <string name="a11y_settings_label" msgid="3977714687248445050">"إعدادات \"سهولة الاستخدام\""</string>
-    <string name="volume_label" msgid="3682221827627150574">"مستوى الصوت"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"عناصر التحكم في مستوى الصوت"</string>
+    <string name="assistant_utterance" msgid="65509599221141377">"‏مساعد Google"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"إعدادات تسهيل الاستخدام"</string>
     <string name="power_label" msgid="7699720321491287839">"زر التشغيل"</string>
     <string name="power_utterance" msgid="7444296686402104807">"خيارات التشغيل"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"التطبيقات المستخدمة مؤخرًا"</string>
@@ -23,12 +20,12 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"خفض مستوى السطوع"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"الانتقال إلى الشاشة السابقة"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"الانتقال إلى الشاشة التالية"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"توفّر قائمة \"تسهيل الاستخدام\" قائمةً كبيرةً تُعرض على الشاشة تتيح لك الحكّم في جهازك. يمكنك من خلال هذه القائمة قفل جهازك أو التحكّم في مستوى الصوت والسطوع وتسجيل لقطات الشاشة وغير ذلك."</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"توفّر \"قائمة تسهيل الاستخدام\" قائمةً كبيرةً تُعرض على الشاشة وتتيح لك التحكّم في جهازك. يمكنك من خلال هذه القائمة قفل جهازك أو التحكّم في مستوى الصوت والسطوع وتسجيل لقطات الشاشة وغير ذلك."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"التحكُّم في جهازك من خلال قائمة كبيرة الحجم"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"إعدادات قائمة \"سهولة الاستخدام\""</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"إعدادات \"قائمة تسهيل الاستخدام\""</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"الأزرار الكبيرة"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"زيادة حجم أزرار قائمة \"سهولة الاستخدام\""</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"زيادة حجم أزرار \"قائمة تسهيل الاستخدام\""</string>
     <string name="pref_help_title" msgid="6871558837025010641">"مساعدة"</string>
-    <string name="brightness_percentage_label" msgid="7391554573977867369">"السطوع <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"مستوى صوت الموسيقى <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="brightness_percentage_label" msgid="7391554573977867369">"السطوع %%<xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"مستوى صوت الموسيقى %%<xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-as/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-as/strings.xml
index 0528f39..1ed78d6 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-as/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-as/strings.xml
@@ -4,19 +4,16 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"সাধ্য সুবিধাসমূহৰ মেনু"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"সাধ্য সুবিধাৰ মেনুখনে আপোনাৰ ডিভাইচটো নিয়ন্ত্ৰণ কৰিবলৈ স্ক্ৰীনত এখন ডাঙৰ মেনু দেখুৱায়। আপুনি নিজৰ ডিভাইচটো লক কৰিব পাৰে, ভলিউম আৰু উজ্জ্বলতা নিয়ন্ত্ৰণ কৰিব পাৰে, স্ক্ৰীনশ্বট ল’ব পাৰে আৰু বহুতো কাম কৰিব পাৰে।"</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"সাধ্য সুবিধাৰ ছেটিং"</string>
-    <string name="volume_label" msgid="3682221827627150574">"ভলিউম"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"ভলিউমৰ নিয়ন্ত্ৰণসমূহ"</string>
     <string name="power_label" msgid="7699720321491287839">"অন/অফ"</string>
     <string name="power_utterance" msgid="7444296686402104807">"অন/অফ বুটামৰ বিকল্পসমূহ"</string>
-    <string name="recent_apps_label" msgid="6583276995616385847">"শেহতীয়া এপসমূহ"</string>
+    <string name="recent_apps_label" msgid="6583276995616385847">"শেহতীয়া এপ্‌সমূহ"</string>
     <string name="lockscreen_label" msgid="648347953557887087">"লক স্ক্ৰীন"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"ক্ষিপ্ৰ ছেটিং"</string>
     <string name="notifications_label" msgid="6829741046963013567">"জাননীসমূহ"</string>
-    <string name="screenshot_label" msgid="863978141223970162">"স্ক্ৰীণশ্বট"</string>
-    <string name="screenshot_utterance" msgid="1430760563401895074">"স্ক্ৰীণশ্বট লওক"</string>
+    <string name="screenshot_label" msgid="863978141223970162">"স্ক্ৰীনশ্বট"</string>
+    <string name="screenshot_utterance" msgid="1430760563401895074">"স্ক্ৰীনশ্বট লওক"</string>
     <string name="volume_up_label" msgid="8592766918780362870">"ভলিউম বঢ়াওক"</string>
     <string name="volume_down_label" msgid="8574981863656447346">"ভলিউম কমাওক"</string>
     <string name="brightness_up_label" msgid="8010753822854544846">"উজ্জ্বলতা বঢ়াওক"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-az/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-az/strings.xml
index f366f3d..49c26bf 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-az/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-az/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Əlçatımlılıq Menyusu"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Əlçatımlılıq Menyusu cihazınızı idarə etmək üçün böyük geniş ekran menyusu təqdim edir. Cihazı kilidləyə, səs səviyyəsinə və parlaqlığa nəzarət edə, skrinşotlar çəkə və s. edə bilərsiniz."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistent"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Əlçatımlılıq Ayarları"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Səs"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Səs nəzarətləri"</string>
     <string name="power_label" msgid="7699720321491287839">"Yandırıb-söndürmə düyməsi"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Qidalanma düyməsi seçimləri"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Son tətbiqlər"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-b+sr+Latn/strings.xml
index fa2ca24..d051bb7 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-b+sr+Latn/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Meni Pristupačnost"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Meni Pristupačnost pruža veliki meni na ekranu za kontrolu uređaja. Možete da zaključate uređaj, kontrolišete jačinu zvuka i osvetljenost, pravite snimke ekrana i drugo."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Pomoćnik"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Pomoćnik"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Podešavanja pristupačnosti"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Jačina zvuka"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Kontrole jačine zvuka"</string>
     <string name="power_label" msgid="7699720321491287839">"Napajanje"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opcije napajanja"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Nedavne aplikacije"</string>
@@ -30,5 +27,5 @@
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Povećajte veličinu dugmadi u meniju za pristupačnost"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Pomoć"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Osvetljenost: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"Jačina zvuka muzike: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"Jačina muzike: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-be/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-be/strings.xml
index 53ce5fa..572d25c 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-be/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-be/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Спецыяльныя магчымасці"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Меню спецыяльных магчымасцей – гэта вялікае экраннае меню для кіравання прыладай. Вы можаце блакіраваць прыладу, рэгуляваць гучнасць і яркасць, рабіць здымкі экрана і выконваць іншыя дзеянні."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Памочнік"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Памочнік"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Налады спецыяльных магчымасцей"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Гучнасць"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Рэгулятары гучнасці"</string>
     <string name="power_label" msgid="7699720321491287839">"Кнопка сілкавання"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Налады кнопкі сілкавання"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Нядаўнія праграмы"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-bg/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-bg/strings.xml
index 709a6e0..165b927 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-bg/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-bg/strings.xml
@@ -6,8 +6,6 @@
     <string name="assistant_label" msgid="6796392082252272356">"Асистент"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Асистент"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Настройки за достъпност"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Сила на звука"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Контроли за силата на звука"</string>
     <string name="power_label" msgid="7699720321491287839">"Захранване"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Опции за захранването"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Скорошни приложения"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-bn/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-bn/strings.xml
index b5d6593..9a0ebef 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-bn/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-bn/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"অ্যাক্সেসিবিলিটি মেনু"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"আপনার ডিভাইস নিয়ন্ত্রণ করতে, \'অ্যাক্সেসিবিলিটি মেনু\' একটি বড় অন-স্ক্রিন মেনু দেখায়। আপনি ফোন লক, ভলিউম ও উজ্জ্বলতা নিয়ন্ত্রণ, স্ক্রিনশট নেওয়া এবং আরও অনেক কিছু করতে পারবেন।"</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"অ্যাক্সেসিবিলিটি সেটিংস"</string>
-    <string name="volume_label" msgid="3682221827627150574">"ভলিউম"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"ভলিউম নিয়ন্ত্রণ"</string>
     <string name="power_label" msgid="7699720321491287839">"পাওয়ার"</string>
     <string name="power_utterance" msgid="7444296686402104807">"পাওয়ারের বিকল্পগুলি"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"সাম্প্রতিক অ্যাপ"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-bs/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-bs/strings.xml
index 227186b..749a6f2 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-bs/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-bs/strings.xml
@@ -6,8 +6,6 @@
     <string name="assistant_label" msgid="6796392082252272356">"Asistent"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Asistent"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Postavke pristupačnosti"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Jačina zvuka"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Kontrole jačine zvuka"</string>
     <string name="power_label" msgid="7699720321491287839">"Napajanje"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opcije napajanja"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Nedavne aplikacije"</string>
@@ -18,8 +16,8 @@
     <string name="screenshot_utterance" msgid="1430760563401895074">"Napravi snimak ekrana"</string>
     <string name="volume_up_label" msgid="8592766918780362870">"Pojačaj zvuk"</string>
     <string name="volume_down_label" msgid="8574981863656447346">"Utišaj zvuk"</string>
-    <string name="brightness_up_label" msgid="8010753822854544846">"Jače osvjetljenje"</string>
-    <string name="brightness_down_label" msgid="7115662941913272072">"Slabije osvjetljenje"</string>
+    <string name="brightness_up_label" msgid="8010753822854544846">"Posvijetli"</string>
+    <string name="brightness_down_label" msgid="7115662941913272072">"Zatamni"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Idi na prethodni ekran"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Idi na sljedeći ekran"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"Meni za pristupačnost pruža veliki meni na ekranu za upravljanje uređajem. Možete zaključati uređaj, kontrolirati jačinu zvuka i osvjetljenje, praviti snimke ekrana i drugo."</string>
@@ -29,5 +27,5 @@
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Povećajte dugmad menija za pristupačnost"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Pomoć"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Osvjetljenje: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"Jačina zvuka muzike: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"Jačina muzike: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ca/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ca/strings.xml
index 08a301c..2dc2c7c 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ca/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ca/strings.xml
@@ -2,13 +2,10 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menú d\'accessibilitat"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"El menú d\'accessibilitat t\'ofereix un menú gran en pantalla perquè controlis el dispositiu. Pots bloquejar-lo, controlar-ne el volum i la brillantor, fer captures de pantalla i molt més."</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"El menú d\'accessibilitat t\'ofereix un menú gran en pantalla per controlar el dispositiu. Pots bloquejar el dispositiu, controlar-ne el volum i la brillantor, fer captures de pantalla i molt més."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistent"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Configuració d\'accessibilitat"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volum"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Controls de volum"</string>
     <string name="power_label" msgid="7699720321491287839">"Botó d\'engegada"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opcions d\'engegada"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Aplicacions recents"</string>
@@ -23,7 +20,7 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"Disminueix la brillantor"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Ves a la pantalla anterior"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Ves a la pantalla següent"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"El menú d\'accessibilitat t\'ofereix un menú gran en pantalla perquè controlis el dispositiu. Pots bloquejar-lo, controlar-ne el volum i la brillantor, fer captures de pantalla i molt més."</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"El menú d\'accessibilitat t\'ofereix un menú gran en pantalla per controlar el dispositiu. Pots bloquejar el dispositiu, controlar-ne el volum i la brillantor, fer captures de pantalla i molt més."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Controla el dispositiu amb un menú gran"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Config. del menú d\'accessibilitat"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botons grans"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-cs/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-cs/strings.xml
index 796a3d5..c0d9d45 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-cs/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-cs/strings.xml
@@ -6,8 +6,6 @@
     <string name="assistant_label" msgid="6796392082252272356">"Asistent"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Asistent"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Nastavení usnadnění přístupu"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Hlasitost"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Ovládání hlasitosti"</string>
     <string name="power_label" msgid="7699720321491287839">"Vypínač"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Možnosti napájení"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Poslední aplikace"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-da/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-da/strings.xml
index 6cde7a1..d801298 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-da/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-da/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menuen Hjælpefunktioner"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menuen Hjælpefunktioner giver dig en stor menu på skærmen, som du kan bruge til at styre din enhed. Du kan låse din enhed, justere lyd- og lysstyrken, tage screenshots og meget mere."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistent"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Indstillinger for hjælpefunktioner"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Lydstyrke"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Lydstyrkeknapper"</string>
     <string name="power_label" msgid="7699720321491287839">"Afbryderknap"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Indstillinger for afbryderknappen"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Seneste apps"</string>
@@ -23,9 +20,9 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"Lysstyrke ned"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Gå til forrige skærm"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Gå til næste skærm"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"Menuen Hjælpefunktioner giver dig en stor menu på skærmen, som bruges til at styre din enhed. Du kan låse din enhed, justere lyd- og lysstyrken, tage screenshots og meget mere."</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"Menuen Hjælpefunktioner giver dig en stor menu på skærmen, som du kan bruge til at styre din enhed. Du kan låse din enhed, justere lyd- og lysstyrken, tage screenshots og meget mere."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Styr enheden via den store menu"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Indstillinger for menuen Hjælpefunktioner"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Indst. for menuen Hjælpefunktioner"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Store knapper"</string>
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Forstør knapperne i menuen Hjælpefunktioner"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Hjælp"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-de/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-de/strings.xml
index 7b94d98..9214197 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-de/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-de/strings.xml
@@ -4,17 +4,14 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menü für Bedienungshilfen"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Über das Menü „Bedienungshilfen“ lässt sich ein großes Menü zur Bedienung deines Geräts auf dem Bildschirm öffnen. Du kannst beispielsweise das Gerät sperren, die Lautstärke und Helligkeit anpassen und Screenshots machen."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Einstellungen für Bedienungshilfen"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Lautstärke"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Lautstärketasten"</string>
     <string name="power_label" msgid="7699720321491287839">"Ein/Aus"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Optionen für Ein-/Aus-Taste"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Kürzlich geöffnete Apps"</string>
     <string name="lockscreen_label" msgid="648347953557887087">"Sperrbildschirm"</string>
-    <string name="quick_settings_label" msgid="2999117381487601865">"Schnelleinstellungen"</string>
-    <string name="notifications_label" msgid="6829741046963013567">"Benachrichtigungen"</string>
+    <string name="quick_settings_label" msgid="2999117381487601865">"Schnell­einstellungen"</string>
+    <string name="notifications_label" msgid="6829741046963013567">"Benach­richtigungen"</string>
     <string name="screenshot_label" msgid="863978141223970162">"Screenshot"</string>
     <string name="screenshot_utterance" msgid="1430760563401895074">"Screenshot erstellen"</string>
     <string name="volume_up_label" msgid="8592766918780362870">"Lautstärke erhöhen"</string>
@@ -25,9 +22,9 @@
     <string name="next_button_content_description" msgid="6810058269847364406">"Zum nächsten Bildschirm"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"Über das Menü „Bedienungshilfen“ lässt sich ein großes Menü zur Bedienung deines Geräts auf dem Bildschirm öffnen. Du kannst beispielsweise das Gerät sperren, die Lautstärke und Helligkeit anpassen und Screenshots machen."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Gerät mit großem Menü steuern"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Menüeinstellungen für Bedienungshilfen"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Menüeinstellungen f. Bedienungshilfen"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Große Schaltflächen"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Schaltflächen für das Menü \"Bedienungshilfen\" vergrößern"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Schaltflächen für das Menü „Bedienungshilfen“ vergrößern"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Hilfe"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Helligkeit: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Musiklautstärke: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-el/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-el/strings.xml
index e5f7cd4..c51c9af 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-el/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-el/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Μενού προσβασιμότητας"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Το μενού προσβασιμότητας παρέχει ένα μεγάλο μενού στην οθόνη για να ελέγχετε τη συσκευή σας. Μπορείτε να κλειδώνετε τη συσκευή, να ελέγχετε την ένταση ήχου και τη φωτεινότητα, να λαμβάνετε στιγμιότυπα οθόνης και άλλα."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Βοηθός"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Βοηθός"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Ρυθμίσεις προσβασιμότητας"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Ένταση"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Πλήκτρα έντασης ήχου"</string>
     <string name="power_label" msgid="7699720321491287839">"Κουμπί λειτουργίας"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Επιλογές λειτουργίας"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Πρόσφατες εφαρμογές"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rAU/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rAU/strings.xml
index 04b18dd..4670291 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rAU/strings.xml
@@ -5,9 +5,7 @@
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"The Accessibility menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots and more."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
-    <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibility Settings"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Volume controls"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibility settings"</string>
     <string name="power_label" msgid="7699720321491287839">"Power"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Power options"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Recent apps"</string>
@@ -24,10 +22,10 @@
     <string name="next_button_content_description" msgid="6810058269847364406">"Go to next screen"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"The Accessibility menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots and more."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Control device via large menu"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Accessibility Menu Settings"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Accessibility menu settings"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Large buttons"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Increase size of Accessibility Menu Buttons"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Increase size of Accessibility menu buttons"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Help"</string>
-    <string name="brightness_percentage_label" msgid="7391554573977867369">"Brightness <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"Music volume <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="brightness_percentage_label" msgid="7391554573977867369">"Brightness <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"Music volume <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rCA/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rCA/strings.xml
index 2b300620..5fc3afd 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rCA/strings.xml
@@ -6,8 +6,6 @@
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibility Settings"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Volume controls"</string>
     <string name="power_label" msgid="7699720321491287839">"Power"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Power options"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Recent apps"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rGB/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rGB/strings.xml
index 04b18dd..4670291 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rGB/strings.xml
@@ -5,9 +5,7 @@
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"The Accessibility menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots and more."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
-    <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibility Settings"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Volume controls"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibility settings"</string>
     <string name="power_label" msgid="7699720321491287839">"Power"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Power options"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Recent apps"</string>
@@ -24,10 +22,10 @@
     <string name="next_button_content_description" msgid="6810058269847364406">"Go to next screen"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"The Accessibility menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots and more."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Control device via large menu"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Accessibility Menu Settings"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Accessibility menu settings"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Large buttons"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Increase size of Accessibility Menu Buttons"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Increase size of Accessibility menu buttons"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Help"</string>
-    <string name="brightness_percentage_label" msgid="7391554573977867369">"Brightness <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"Music volume <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="brightness_percentage_label" msgid="7391554573977867369">"Brightness <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"Music volume <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rIN/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rIN/strings.xml
index 04b18dd..4670291 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rIN/strings.xml
@@ -5,9 +5,7 @@
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"The Accessibility menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots and more."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
-    <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibility Settings"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Volume controls"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibility settings"</string>
     <string name="power_label" msgid="7699720321491287839">"Power"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Power options"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Recent apps"</string>
@@ -24,10 +22,10 @@
     <string name="next_button_content_description" msgid="6810058269847364406">"Go to next screen"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"The Accessibility menu provides a large on-screen menu to control your device. You can lock your device, control volume and brightness, take screenshots and more."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Control device via large menu"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Accessibility Menu Settings"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Accessibility menu settings"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Large buttons"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Increase size of Accessibility Menu Buttons"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Increase size of Accessibility menu buttons"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Help"</string>
-    <string name="brightness_percentage_label" msgid="7391554573977867369">"Brightness <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"Music volume <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="brightness_percentage_label" msgid="7391554573977867369">"Brightness <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"Music volume <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rXC/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rXC/strings.xml
index 8ab2c52..fec60d5 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-en-rXC/strings.xml
@@ -6,8 +6,6 @@
     <string name="assistant_label" msgid="6796392082252272356">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‏‎‏‎‎‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‎Assistant‎‏‎‎‏‎"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‏‎‏‎‎‎‏‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎Assistant‎‏‎‎‏‎"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎Accessibility Settings‎‏‎‎‏‎"</string>
-    <string name="volume_label" msgid="3682221827627150574">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‎‎‎‏‎‎‏‏‏‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‏‏‎‎Volume‎‏‎‎‏‎"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎‎‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‎‏‏‎‏‏‎‎‏‏‎‎‏‎‎Volume controls‎‏‎‎‏‎"</string>
     <string name="power_label" msgid="7699720321491287839">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‏‎‏‏‏‎‎‏‏‎‏‏‎‏‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎‎‎‎‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎Power‎‏‎‎‏‎"</string>
     <string name="power_utterance" msgid="7444296686402104807">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‏‏‏‎‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎Power options‎‏‎‎‏‎"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‏‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎Recent apps‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-es-rUS/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-es-rUS/strings.xml
index f7628eb..4249958 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-es-rUS/strings.xml
@@ -1,18 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menú de Accesibilidad"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"El menú de Accesibilidad es un menú de gran tamaño que se muestra en la pantalla y te permite controlar tu dispositivo. Puedes bloquearlo, controlar el volumen y el brillo, realizar capturas de pantalla y mucho más."</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menú de accesibilidad"</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"El Menú de accesibilidad es un menú de gran tamaño que se muestra en pantalla y te permite controlar tu dispositivo para bloquearlo, controlar su volumen y brillo, realizar capturas de pantalla y mucho más."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Asistente"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Asistente"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Configuración de accesibilidad"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volumen"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Controles de volumen"</string>
     <string name="power_label" msgid="7699720321491287839">"Encendido"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opciones de encendido"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Apps recientes"</string>
-    <string name="lockscreen_label" msgid="648347953557887087">"Pantalla de bloqueo"</string>
+    <string name="lockscreen_label" msgid="648347953557887087">"Bloquear pantalla"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"Configuración rápida"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Notificaciones"</string>
     <string name="screenshot_label" msgid="863978141223970162">"Captura de pantalla"</string>
@@ -24,10 +21,10 @@
     <string name="previous_button_content_description" msgid="840869171117765966">"Ir a la pantalla anterior"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Ir a la siguiente pantalla"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"El menú de Accesibilidad es un menú de gran tamaño que se muestra en la pantalla y te permite controlar tu dispositivo. Puedes bloquearlo, controlar el volumen y el brillo, realizar capturas de pantalla y mucho más."</string>
-    <string name="accessibility_menu_summary" msgid="340071398148208130">"Controlar el dispositivo mediante el menú ampliado"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Configuración del menú de accesibilidad"</string>
+    <string name="accessibility_menu_summary" msgid="340071398148208130">"Controla el dispositivo con un menú de gran tamaño"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Configuración del Menú de accesibilidad"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botones grandes"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumenta el tamaño de los botones del menú de accesibilidad"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumenta el tamaño de los botones del Menú de accesibilidad"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Ayuda"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Brillo: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Volumen de la música: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-es/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-es/strings.xml
index 50c93f7..b97df64 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-es/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-es/strings.xml
@@ -4,15 +4,12 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menú de accesibilidad"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"El menú de accesibilidad es un menú de gran tamaño que se muestra en pantalla para controlar tu dispositivo. Puedes bloquear el dispositivo, controlar el volumen y el brillo, hacer capturas de pantalla y más."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Asistente"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Asistente"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Ajustes de accesibilidad"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volumen"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Controles de volumen"</string>
-    <string name="power_label" msgid="7699720321491287839">"Encender"</string>
+    <string name="power_label" msgid="7699720321491287839">"Encendido"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opciones de encendido"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Aplicaciones recientes"</string>
-    <string name="lockscreen_label" msgid="648347953557887087">"Pantalla de bloqueo"</string>
+    <string name="lockscreen_label" msgid="648347953557887087">"Bloquear pantalla"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"Ajustes rápidos"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Notificaciones"</string>
     <string name="screenshot_label" msgid="863978141223970162">"Captura de pantalla"</string>
@@ -27,7 +24,7 @@
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Controla el dispositivo con un menú de gran tamaño"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Ajustes del menú de accesibilidad"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botones grandes"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumentar el tamaño de los botones del menú de accesibilidad"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumenta el tamaño de los botones del menú de accesibilidad"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Ayuda"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Brillo: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Volumen de la música: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-et/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-et/strings.xml
index 790d060..8ba0206 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-et/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-et/strings.xml
@@ -2,13 +2,10 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Juurdepääsetavuse menüü"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Juurdepääsetavuse menüü on suur ekraanil kuvatav menüü, mille abil oma seadet hallata. Saate oma seadme lukustada, hallata helitugevust ja heledust, jäädvustada ekraanipilte ning teha muudki."</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Juurdepääsetavuse menüü on suur ekraanil kuvatav menüü, mille abil oma seadet hallata. Saate oma seadme lukustada, hallata helitugevust ja eredust, jäädvustada ekraanipilte ning teha muudki."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
-    <string name="a11y_settings_label" msgid="3977714687248445050">"Juurdepääsetavuse seaded"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Helitugevus"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Helitugevuse juhtnupud"</string>
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistent"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"Juurde­pääsetavuse seaded"</string>
     <string name="power_label" msgid="7699720321491287839">"Toitenupp"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Toitevalikud"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Hiljutised rakendused"</string>
@@ -23,11 +20,11 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"Vähenda eredust"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Eelmise ekraanikuva avamine"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Järgmise ekraanikuva avamine"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"Juurdepääsetavuse menüü on suur ekraanil kuvatav menüü, mille abil oma seadet hallata. Saate oma seadme lukustada, hallata helitugevust ja heledust, jäädvustada ekraanipilte ning teha muudki."</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"Juurdepääsetavuse menüü on suur ekraanil kuvatav menüü, mille abil oma seadet hallata. Saate oma seadme lukustada, hallata helitugevust ja eredust, jäädvustada ekraanipilte ning teha muudki."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Seadme juhtimine suure menüü kaudu"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Juurdepääsetavuse menüü seaded"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Suured nupud"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Juurdepääsetavusmenüü nuppude suuruse suurendamine"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Juurdepääsetavuse menüü nuppude suurendamine"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Abi"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Eredus on <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Muusika helitugevus on <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-eu/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-eu/strings.xml
index 98c0146..28b560a 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-eu/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-eu/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Erabilerraztasun-menua"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Erabilerraztasun-menuari esker, tamaina handiko menu bat izango duzu pantailan; menu horren bidez, gailua kontrolatzeko aukera izango duzu. Besteak beste, hauek egin ahalko dituzu: gailua blokeatu; bolumena eta distira kontrolatu, eta pantaila-argazkiak egin."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Laguntzailea"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Laguntzailea"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Erabilerraztasun-ezarpenak"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Bolumena"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Bolumena kontrolatzeko aukerak"</string>
     <string name="power_label" msgid="7699720321491287839">"Bateria"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Bateria kontrolatzeko aukerak"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Azken aplikazioak"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fa/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fa/strings.xml
index c922b24..49d8f69 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fa/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fa/strings.xml
@@ -4,13 +4,10 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"منوی دسترس‌پذیری"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"«منوی دسترس‌پذیری» منوی بزرگی را روی صفحه برای کنترل دستگاه ارائه می‌دهد. می‌توانید دستگاه را قفل کنید، میزان صدا و روشنایی را کنترل کنید، نماگرفت ثبت کنید، و کارهای بیشتری انجام دهید."</string>
     <string name="assistant_label" msgid="6796392082252272356">"دستیار"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"دستیار"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"تنظیمات دسترس‌پذیری"</string>
-    <string name="volume_label" msgid="3682221827627150574">"میزان صدا"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"کنترل‌های میزان صدا"</string>
-    <string name="power_label" msgid="7699720321491287839">"نیرو"</string>
-    <string name="power_utterance" msgid="7444296686402104807">"گزینه‌های نیرو"</string>
+    <string name="power_label" msgid="7699720321491287839">"دکمه روشن/خاموش"</string>
+    <string name="power_utterance" msgid="7444296686402104807">"گزینه‌های دکمه روشن/خاموش"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"برنامه‌های اخیر"</string>
     <string name="lockscreen_label" msgid="648347953557887087">"صفحه قفل"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"تنظیمات سریع"</string>
@@ -23,7 +20,7 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"کاهش روشنایی"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"رفتن به صفحه قبل"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"رفتن به صفحه بعد"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"«منوی دسترس‌پذیری» منوی بزرگی را روی صفحه برای کنترل دستگاه ارائه می‌دهد. می‌توانید دستگاه را قفل کنید، میزان صدا و روشنایی را کنترل کنید، نماگرفت ثبت کنید، و کارهای بیشتری انجام دهید."</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"«منوی دسترس‌پذیری» منوی بزرگی را روی صفحه برای کنترل دستگاه ارائه می‌دهد. می‌توانید دستگاه را قفل کنید، میزان صدا و روشنایی را کنترل کنید، از صفحه نمایش عکس بگیرید، و کارهای بیشتری انجام دهید."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"کنترل دستگاه ازطریق منوی بزرگ"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"تنظیمات منوی دسترس‌پذیری"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"دکمه‌های بزرگ"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fi/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fi/strings.xml
index b9926a5..5e31739 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fi/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fi/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Saavutettavuusvalikko"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Saavutettavuusvalikko on suuri näyttövalikko, josta voit ohjata laitettasi. Voit esimerkiksi lukita laitteen, säätää äänenvoimakkuutta ja kirkkautta sekä ottaa kuvakaappauksia."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
-    <string name="a11y_settings_label" msgid="3977714687248445050">"Esteettömyysasetukset"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Äänenvoimakkuus"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Äänenvoimakkuuden hallinta"</string>
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"Saavutettavuusasetukset"</string>
     <string name="power_label" msgid="7699720321491287839">"Virta"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Virta-asetukset"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Viimeaikaiset sovellukset"</string>
@@ -25,9 +22,9 @@
     <string name="next_button_content_description" msgid="6810058269847364406">"Siirry seuraavalle näytölle"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"Saavutettavuusvalikko on suuri näyttövalikko, josta voit ohjata laitettasi. Voit esimerkiksi lukita laitteen, säätää äänenvoimakkuutta ja kirkkautta sekä ottaa kuvakaappauksia."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Ohjaa laitetta suurella valikolla"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Esteettömyysvalikon asetukset"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Saavutettavuusvalikon asetukset"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Suuret painikkeet"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Suurenna esteettömyysvalikon painikkeita"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Suurenna saavutettavuusvalikon painikkeita"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Ohje"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Kirkkaus <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Musiikin äänenvoimakkuus <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr-rCA/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr-rCA/strings.xml
index 9ac0f04..87a9503 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr-rCA/strings.xml
@@ -1,18 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu d\'accessibilité"</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu Accessibilité"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Le menu Accessibilité propose un grand espace à l\'écran à l\'aide duquel vous pouvez contrôler votre appareil. Utilisez-le pour verrouiller votre appareil, régler le volume et la luminosité, prendre des captures d\'écran et plus."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Paramètres d\'accessibilité"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Commandes de volume"</string>
     <string name="power_label" msgid="7699720321491287839">"Alimentation"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Options d\'alimentation"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Applis récentes"</string>
-    <string name="lockscreen_label" msgid="648347953557887087">"Écran verrouillage"</string>
+    <string name="lockscreen_label" msgid="648347953557887087">"Écran de verrouillage"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"Paramètres rapides"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Notifications"</string>
     <string name="screenshot_label" msgid="863978141223970162">"Capture d\'écran"</string>
@@ -24,10 +21,10 @@
     <string name="previous_button_content_description" msgid="840869171117765966">"Aller à l\'écran précédent"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Aller à l\'écran suivant"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"Le menu Accessibilité propose un grand espace à l\'écran à l\'aide duquel vous pouvez contrôler votre appareil. Utilisez-le pour verrouiller votre appareil, régler le volume et la luminosité, prendre des captures d\'écran et plus."</string>
-    <string name="accessibility_menu_summary" msgid="340071398148208130">"Contrôlez l\'appareil à l\'aide d\'un menu de grande taille"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Paramètres du menu d\'accessibilité"</string>
+    <string name="accessibility_menu_summary" msgid="340071398148208130">"contrôler l\'appareil à l\'aide d\'un menu de grande taille"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Paramètres du menu Accessibilité"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Boutons de grande taille"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Augmenter la taille des boutons du menu d\'accessibilité"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Augmenter la taille des boutons du menu Accessibilité"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Aide"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Luminosité : <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume de la musique : <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr/strings.xml
index 774210d..10c6169 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu d\'accessibilité"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Le menu d\'accessibilité s\'affiche en grand sur votre écran pour vous permettre de contrôler votre appareil. Vous pouvez verrouiller votre appareil, ajuster le volume et la luminosité, réaliser des captures d\'écran, et plus encore."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Accessibilité"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Commandes de volume"</string>
     <string name="power_label" msgid="7699720321491287839">"Marche/Arrêt"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Options du bouton Marche/Arrêt"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Applis récentes"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-gl/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-gl/strings.xml
index 4d6656b..5547d63 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-gl/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-gl/strings.xml
@@ -2,13 +2,10 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menú de accesibilidade"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"O menú de accesibilidade é un panel grande que aparece na pantalla co que podes controlar o dispositivo. Permíteche realizar varias accións, entre elas, bloquear o dispositivo, controlar o volume, axustar o brillo e facer capturas de pantalla."</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"O menú de accesibilidade é un panel grande que aparece na pantalla co que podes controlar o dispositivo. Permíteche realizar varias accións, como bloquear o dispositivo, controlar o volume, axustar o brillo e facer capturas de pantalla."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Asistente"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Asistente"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Accesibilidade (configuración)"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Controis de volume"</string>
     <string name="power_label" msgid="7699720321491287839">"Acender"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opcións de acendido"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Aplicacións recentes"</string>
@@ -25,7 +22,7 @@
     <string name="next_button_content_description" msgid="6810058269847364406">"Ir á seguinte pantalla"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"O menú de accesibilidade é un panel grande que aparece na pantalla e permite controlar o dispositivo. Permíteche realizar varias accións, como bloquear o dispositivo, controlar o volume, axustar o brillo e facer capturas de pantalla."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Controla o dispositivo a través dun menú grande"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Configuración do menú de accesibilidade"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Axustes do menú de accesibilidade"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botóns grandes"</string>
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumenta o tamaño dos botóns do menú de accesibilidade"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Axuda"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-gu/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-gu/strings.xml
index adada82..5e0bec5 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-gu/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-gu/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"ઍક્સેસિબિલિટી મેનૂ"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"ઍક્સેસિબિલિટી મેનૂ તમારા ડિવાઇસને નિયંત્રિત કરવા માટે મોટું ઑન-સ્ક્રીન મેનૂ પૂરું પાડે છે. તમે તમારા ડિવાઇસને લૉક કરી શકો છો, વૉલ્યૂમ અને બ્રાઇટનેસ નિયંત્રિત કરી શકો છો, સ્ક્રીનશૉટ લઈ શકો છો અને બીજું ઘણું બધું કરી શકો છો."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"ઍક્સેસિબિલિટી સેટિંગ"</string>
-    <string name="volume_label" msgid="3682221827627150574">"વૉલ્યૂમ"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"વૉલ્યૂમ નિયંત્રણો"</string>
     <string name="power_label" msgid="7699720321491287839">"પાવર"</string>
     <string name="power_utterance" msgid="7444296686402104807">"પાવર વિકલ્પો"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"તાજેતરની ઍપ"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hi/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hi/strings.xml
index ee55895..1cb9b5e 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hi/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hi/strings.xml
@@ -6,8 +6,6 @@
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"सुलभता सेटिंग"</string>
-    <string name="volume_label" msgid="3682221827627150574">"आवाज़"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"आवाज़ कम या ज़्यादा करने का बटन"</string>
     <string name="power_label" msgid="7699720321491287839">"पावर बटन"</string>
     <string name="power_utterance" msgid="7444296686402104807">"पावर बटन के विकल्प"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"हाल में इस्तेमाल किए गए ऐप्लिकेशन"</string>
@@ -26,7 +24,7 @@
     <string name="accessibility_menu_summary" msgid="340071398148208130">"बड़े मेन्यू की मदद से डिवाइस को कंट्रोल करें"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"सुलभता मेन्यू सेटिंग"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"बड़े बटन"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"सुलभता मेन्यू के बटनाें का आकार बढ़ाएं"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"सुलभता मेन्यू के बटनाें का साइज़ बढ़ाएं"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"सहायता"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"स्क्रीन की रोशनी <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"संगीत की आवाज़ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hr/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hr/strings.xml
index 0be6f75..1ae3213 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hr/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hr/strings.xml
@@ -2,12 +2,10 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Izbornik pristupačnosti"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Izbornik pristupačnosti pruža velik izbornik na zaslonu u svrhu upravljanja uređajem. Možete zaključati uređaj, upravljati glasnoćom i svjetlinom, izrađivati snimke zaslona i drugo."</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Izbornik pristupačnosti veliki je zaslonski izbornik koji vam omogućuje upravljanje uređajem. Putem ovog izbornika možete zaključati uređaj, upravljati glasnoćom i svjetlinom, izrađivati snimke zaslona i drugo."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Asistent"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Asistent"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Postavke pristupačnosti"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Glasnoća"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Kontrole za glasnoću"</string>
     <string name="power_label" msgid="7699720321491287839">"Napajanje"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opcije napajanja"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Nedavne aplikacije"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hu/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hu/strings.xml
index 9dce8ae..978deaa 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hu/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hu/strings.xml
@@ -4,15 +4,12 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Kisegítő lehetőségek menüje"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"A Kisegítő lehetőségek menüje az eszköz vezérlésére szolgáló nagyméretű, képernyőn megjelenő menü. Lezárhatja vele az eszközt, szabályozhatja a hang- és a fényerőt, képernyőképeket készíthet, és egyebekre is használhatja."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Segéd"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Segéd"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Kisegítő lehetőségek beállításai"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Hangerő"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Hangerő-szabályozó"</string>
     <string name="power_label" msgid="7699720321491287839">"Bekapcsológomb"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Bekapcsológomb beállításai"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Legutóbbi alkalmazások"</string>
-    <string name="lockscreen_label" msgid="648347953557887087">"Lezárási képernyő"</string>
+    <string name="lockscreen_label" msgid="648347953557887087">"Képernyő lezárása"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"Gyorsbeállítások"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Értesítések"</string>
     <string name="screenshot_label" msgid="863978141223970162">"Képernyőkép"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hy/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hy/strings.xml
index 52d5d0e3..135d443 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-hy/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-hy/strings.xml
@@ -4,14 +4,11 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Հատուկ գործառույթների ընտրացանկ"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Հատուկ գործառույթների մեծ ընտրացանկը նախատեսված է ձեր սարքը կառավարելու համար։ Դուք կարող եք կողպել ձեր հեռախոսը, կարգավորել պայծառությունը և ձայնի ուժգնությունը, սքրինշոթներ անել և այլն։"</string>
     <string name="assistant_label" msgid="6796392082252272356">"Օգնական"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Օգնական"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Հատուկ գործառույթների կարգավորումներ"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Ձայն"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Ձայնի ուժգնության կառավարներ"</string>
     <string name="power_label" msgid="7699720321491287839">"Սնուցման կոճակ"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Սնուցման կոճակի ընտրանքներ"</string>
-    <string name="recent_apps_label" msgid="6583276995616385847">"Վերջին օգտագործած հավելվածները"</string>
+    <string name="recent_apps_label" msgid="6583276995616385847">"Վերջին հավելվածներ"</string>
     <string name="lockscreen_label" msgid="648347953557887087">"Կողպէկրան"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"Արագ կարգավորումներ"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Ծանուցումներ"</string>
@@ -20,7 +17,7 @@
     <string name="volume_up_label" msgid="8592766918780362870">"Բարձրացնել ձայնը"</string>
     <string name="volume_down_label" msgid="8574981863656447346">"Իջեցնել ձայնը"</string>
     <string name="brightness_up_label" msgid="8010753822854544846">"Ավելացնել պայծառությունը"</string>
-    <string name="brightness_down_label" msgid="7115662941913272072">"Պակասեցնել պայծառությունը"</string>
+    <string name="brightness_down_label" msgid="7115662941913272072">"Նվազեցնել պայծառությունը"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Անցնել նախորդ էկրան"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Անցնել հաջորդ էկրան"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"Հատուկ գործառույթների մեծ ընտրացանկը նախատեսված է ձեր սարքը կառավարելու համար: Դուք կարող եք կողպել ձեր հեռախոսը, կարգավորել պայծառությունը և ձայնի ուժգնությունը, սքրինշոթներ անել և այլն։"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-in/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-in/strings.xml
index d58cf89..5bb5e40 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-in/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-in/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu Aksesibilitas"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menu Aksesibilitas menyediakan menu di layar dengan ukuran besar untuk mengontrol perangkat Anda. Anda dapat mengunci perangkat, mengontrol volume dan kecerahan, mengambil screenshot, dan banyak lagi."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Asisten"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Asisten"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Setelan Aksesibilitas"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Kontrol volume"</string>
     <string name="power_label" msgid="7699720321491287839">"Power"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opsi power"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Aplikasi terbaru"</string>
@@ -19,8 +16,8 @@
     <string name="screenshot_utterance" msgid="1430760563401895074">"Ambil screenshot"</string>
     <string name="volume_up_label" msgid="8592766918780362870">"Naikkan volume"</string>
     <string name="volume_down_label" msgid="8574981863656447346">"Turunkan volume"</string>
-    <string name="brightness_up_label" msgid="8010753822854544846">"Tingkatkan kecerahan"</string>
-    <string name="brightness_down_label" msgid="7115662941913272072">"Kurangi kecerahan"</string>
+    <string name="brightness_up_label" msgid="8010753822854544846">"Naikkan kecerahan"</string>
+    <string name="brightness_down_label" msgid="7115662941913272072">"Turunkan kecerahan"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Buka layar sebelumnya"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Buka layar berikutnya"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"Menu Aksesibilitas menyediakan menu di layar dengan ukuran besar untuk mengontrol perangkat Anda. Anda dapat mengunci perangkat, mengontrol volume dan kecerahan, mengambil screenshot, dan banyak lagi."</string>
@@ -29,6 +26,6 @@
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Tombol besar"</string>
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Perbesar ukuran Tombol Menu Aksesibilitas"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Bantuan"</string>
-    <string name="brightness_percentage_label" msgid="7391554573977867369">"Kecerahan <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume musik <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="brightness_percentage_label" msgid="7391554573977867369">"Kecerahan <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume musik <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-is/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-is/strings.xml
index 2a803c1..71047ed 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-is/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-is/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Aðgengisvalmynd"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Aðgengisvalmyndin er stór valmynd sem birtist á skjánum sem má nota til að stjórna tækinu. Þú getur læst tækinu, stjórnað hljóðstyrk og birtustigi, tekið skjámyndir og fleira."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Hjálpari"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Hjálpari"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Aðgengisstillingar"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Hljóðstyrkur"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Stýringar hljóðstyrks"</string>
     <string name="power_label" msgid="7699720321491287839">"Orka"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Orkuvalkostir"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Nýleg forrit"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-it/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-it/strings.xml
index cef3677..ef9e4a5 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-it/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-it/strings.xml
@@ -1,13 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu Accessibilità"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Il Menu Accessibilità mostra sullo schermo un menu di grandi dimensioni per permetterti di controllare il dispositivo. Puoi bloccare il dispositivo, regolare il volume e la luminosità, acquisire screenshot e altro ancora."</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"menu Accessibilità"</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Il menu Accessibilità mostra sullo schermo un menu di grandi dimensioni per permetterti di controllare il dispositivo. Puoi bloccare il dispositivo, regolare il volume e la luminosità, acquisire screenshot e altro ancora."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistente"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistente"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Impostazioni di accessibilità"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Controlli del volume"</string>
     <string name="power_label" msgid="7699720321491287839">"Accensione"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opzioni di accensione"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"App recenti"</string>
@@ -22,12 +20,12 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"Diminuisci luminosità"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Vai alla schermata precedente"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Vai alla schermata successiva"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"Il Menu Accessibilità mostra sullo schermo un menu di grandi dimensioni per permetterti di controllare il dispositivo. Puoi bloccare il dispositivo, regolare il volume e la luminosità, acquisire screenshot e altro ancora."</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"Il menu Accessibilità mostra sullo schermo un menu di grandi dimensioni per permetterti di controllare il dispositivo. Puoi bloccare il dispositivo, regolare il volume e la luminosità, acquisire screenshot e altro ancora."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Controlla il dispositivo tramite un menu di grandi dimensioni"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Impostazioni del menu Accessibilità"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Pulsanti grandi"</string>
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumenta le dimensioni dei pulsanti del menu Accessibilità"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Guida"</string>
-    <string name="brightness_percentage_label" msgid="7391554573977867369">"Luminosità: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume musica: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="brightness_percentage_label" msgid="7391554573977867369">"Luminosità: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume musica: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-iw/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-iw/strings.xml
index 6335e96..7072b34 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-iw/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-iw/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"תפריט נגישות"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"תפריט הנגישות הוא תפריט גדול שמופיע במסך ומאפשר לשלוט במכשיר. אפשר לנעול את המכשיר, לשלוט בעוצמת הקול ובבהירות, לצלם צילומי מסך ועוד."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"הגדרות נגישות"</string>
-    <string name="volume_label" msgid="3682221827627150574">"עוצמת הקול"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"שליטה בעוצמת הקול"</string>
     <string name="power_label" msgid="7699720321491287839">"הפעלה"</string>
     <string name="power_utterance" msgid="7444296686402104807">"אפשרויות הפעלה"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"אפליקציות אחרונות"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ja/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ja/strings.xml
index d5ef005..cc6638b 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ja/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ja/strings.xml
@@ -2,12 +2,10 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"ユーザー補助機能メニュー"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"ユーザー補助メニューは、デバイスを操作するための画面上の大きなメニューです。デバイスのロック、音量や明るさの調節、スクリーンショットの撮影などを行えます。"</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"ユーザー補助メニューは、デバイスを操作するために画面上に大きく表示されるメニューです。デバイスのロック、音量や明るさの調節、スクリーンショットの撮影などを行えます。"</string>
     <string name="assistant_label" msgid="6796392082252272356">"アシスタント"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"アシスタント"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"ユーザー補助機能の設定"</string>
-    <string name="volume_label" msgid="3682221827627150574">"音量"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"音量を調節"</string>
     <string name="power_label" msgid="7699720321491287839">"電源"</string>
     <string name="power_utterance" msgid="7444296686402104807">"電源オプション"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"最近使ったアプリ"</string>
@@ -22,8 +20,8 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"明るさを下げる"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"前の画面に移動"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"次の画面に移動"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"ユーザー補助メニューは、デバイスを操作するための画面上の大きなメニューです。デバイスのロック、音量や明るさの調節、スクリーンショットの撮影などを行えます。"</string>
-    <string name="accessibility_menu_summary" msgid="340071398148208130">"大きなメニューでデバイスを操作します"</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"ユーザー補助メニューは、デバイスを操作するために画面上に大きく表示されるメニューです。デバイスのロック、音量や明るさの調節、スクリーンショットの撮影などを行えます。"</string>
+    <string name="accessibility_menu_summary" msgid="340071398148208130">"大きく表示されるメニューでデバイスを操作します"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ユーザー補助機能メニューの設定"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"大きいボタン"</string>
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ユーザー補助機能メニューのボタンを大きくする"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ka/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ka/strings.xml
index 3ba5adc..62ae27b 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ka/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ka/strings.xml
@@ -6,8 +6,6 @@
     <string name="assistant_label" msgid="6796392082252272356">"ასისტენტი"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"ასისტენტი"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"მარტივი წვდომის პარამეტრები"</string>
-    <string name="volume_label" msgid="3682221827627150574">"ხმა"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"ხმის მართვის საშუალებები"</string>
     <string name="power_label" msgid="7699720321491287839">"ელკვება"</string>
     <string name="power_utterance" msgid="7444296686402104807">"ელკვების ვარიანტები"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"ბოლოდროინდელი აპები"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-kk/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-kk/strings.xml
index b7fbaa8..68f3fae 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-kk/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-kk/strings.xml
@@ -2,16 +2,13 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Арнайы мүмкіндіктер мәзірі"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Арнайы мүмкіндіктер мәзірінде құрылғыны басқаруға арналған үлкейтілген экран мәзірі бар. Ол арқылы құрылғыны құлыптай, дыбыс деңгейі мен түс ашықтығын басқара, скриншот түсіре және т.б. әрекеттерді орындай аласыз."</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Арнайы мүмкіндіктер мәзірі – экранда үлкейтіліп берілген мәзір. Ол арқылы құрылғыны құлыптайсыз, дыбыс деңгейі мен түс ашықтығын басқарасыз, скриншот түсіресіз және т.б. әрекеттерді орындай аласыз."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Арнайы мүмкіндіктер параметрлері"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Дыбыс деңгейі"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Дыбыс деңгейін басқару элементтері"</string>
     <string name="power_label" msgid="7699720321491287839">"Қуат түймесі"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Қуат түймесінің опциялары"</string>
-    <string name="recent_apps_label" msgid="6583276995616385847">"Соңғы пайдаланылған қолданбалар"</string>
+    <string name="recent_apps_label" msgid="6583276995616385847">"Соңғы қолданбалар"</string>
     <string name="lockscreen_label" msgid="648347953557887087">"Құлып экраны"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"Жылдам параметрлер"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Хабарландырулар"</string>
@@ -27,8 +24,8 @@
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Құрылғыны үлкейтілген экран мәзірі арқылы басқару"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Арнайы мүмкіндіктер мәзірі параметрлері"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Үлкен түймелер"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"\"Арнайы мүмкіндіктер\" мәзірі түймелерін үлкейту"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Арнайы мүмкіндіктер мәзірінің түймелерін үлкейту"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Анықтама"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Жарықтығы: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"Музыканың дыбыс қаттылығы: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"Музыканың дыбыс деңгейі: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-km/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-km/strings.xml
index 6bd1274..e091dd9 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-km/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-km/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"ម៉ឺនុយ​ភាពងាយស្រួល"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"ម៉ឺនុយភាពងាយស្រួលផ្ដល់ម៉ឺនុយធំនៅលើអេក្រង់ ដើម្បីគ្រប់គ្រងឧបករណ៍របស់អ្នក។ អ្នកអាច​ចាក់សោឧបករណ៍​របស់អ្នក គ្រប់គ្រងកម្រិតសំឡេងនិងពន្លឺ ថតរូបអេក្រង់ និង​អ្វីៗច្រើនទៀត។"</string>
     <string name="assistant_label" msgid="6796392082252272356">"ជំនួយការ"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Google Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"ការកំណត់​ភាព​ងាយស្រួល"</string>
-    <string name="volume_label" msgid="3682221827627150574">"កម្រិតសំឡេង"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"ការគ្រប់គ្រង​កម្រិត​សំឡេង"</string>
     <string name="power_label" msgid="7699720321491287839">"ថាមពល"</string>
     <string name="power_utterance" msgid="7444296686402104807">"ជម្រើស​ថាមពល"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"កម្មវិធី​ថ្មីៗ"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-kn/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-kn/strings.xml
index 627cfc1..5d1f722 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-kn/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-kn/strings.xml
@@ -1,18 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"ಪ್ರವೇಶಿಸುವಿಕೆ ಮೆನು"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ನಿಯಂತ್ರಿಸುವುದಕ್ಕಾಗಿ ಪ್ರವೇಶಿಸುವಿಕೆ ಮೆನು ದೊಡ್ಡ ಸ್ಕ್ರೀನ್ ಮೆನುವನ್ನು ಒದಗಿಸುತ್ತದೆ. ನೀವು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಬಹುದು, ವಾಲ್ಯೂಮ್ ಮತ್ತು ಪ್ರಖರತೆಯನ್ನು ನಿಯಂತ್ರಿಸಬಹುದು, ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನವನ್ನು ಮಾಡಬಹುದು."</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಮೆನು"</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ನಿಯಂತ್ರಿಸುವುದಕ್ಕಾಗಿ ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಮೆನು ದೊಡ್ಡ ಸ್ಕ್ರೀನ್ ಮೆನುವನ್ನು ಒದಗಿಸುತ್ತದೆ. ನೀವು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಬಹುದು, ವಾಲ್ಯೂಮ್ ಮತ್ತು ಪ್ರಖರತೆಯನ್ನು ನಿಯಂತ್ರಿಸಬಹುದು, ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನವನ್ನು ಮಾಡಬಹುದು."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
-    <string name="a11y_settings_label" msgid="3977714687248445050">"ಪ್ರವೇಶಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
-    <string name="volume_label" msgid="3682221827627150574">"ಧ್ವನಿಯ ಶಕ್ತಿ"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"ಧ್ವನಿಯ ಶಕ್ತಿಯ ನಿಯಂತ್ರಕಗಳು"</string>
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="power_label" msgid="7699720321491287839">"ಪವರ್ ಬಟನ್‌"</string>
     <string name="power_utterance" msgid="7444296686402104807">"ಪವರ್ ಆಯ್ಕೆಗಳು"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು"</string>
-    <string name="lockscreen_label" msgid="648347953557887087">"ಲಾಕ್ ಪರದೆ"</string>
+    <string name="lockscreen_label" msgid="648347953557887087">"ಲಾಕ್ ಸ್ಕ್ರೀನ್‌"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್‍ಗಳು"</string>
     <string name="notifications_label" msgid="6829741046963013567">"ಅಧಿಸೂಚನೆಗಳು"</string>
     <string name="screenshot_label" msgid="863978141223970162">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್"</string>
@@ -23,12 +20,12 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"ಪ್ರಖರತೆ ಕಡಿಮೆ ಮಾಡಿ"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"ಹಿಂದಿನ ಸ್ಕ್ರೀನ್‌ಗೆ ಹೋಗಿ"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"ಮುಂದಿನ ಸ್ಕ್ರೀನ್‌ಗೆ ಹೋಗಿ"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಲು ಪ್ರವೇಶಿಸುವಿಕೆ ಮೆನು ದೊಡ್ಡ ಸ್ಕ್ರೀನ್ ಮೆನುವನ್ನು ಒದಗಿಸುತ್ತದೆ. ನೀವು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಬಹುದು, ವಾಲ್ಯೂಮ್ ಮತ್ತು ಪ್ರಖರತೆಯನ್ನು ನಿಯಂತ್ರಿಸಬಹುದು, ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನದನ್ನು ಮಾಡಬಹುದು."</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಲು ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಮೆನು ದೊಡ್ಡ ಸ್ಕ್ರೀನ್ ಮೆನುವನ್ನು ಒದಗಿಸುತ್ತದೆ. ನೀವು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಬಹುದು, ವಾಲ್ಯೂಮ್ ಮತ್ತು ಪ್ರಖರತೆಯನ್ನು ನಿಯಂತ್ರಿಸಬಹುದು, ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನದನ್ನು ಮಾಡಬಹುದು."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"ದೊಡ್ಡ ಮೆನುವಿನ ಮೂಲಕ ಸಾಧನವನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ಪ್ರವೇಶಿಸುವಿಕೆ ಮೆನು ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಮೆನು ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ದೊಡ್ಡ ಬಟನ್‌ಗಳು"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ಪ್ರವೇಶಿಸುವಿಕೆ ಮೆನು ಬಟನ್‌ಗಳ ಗಾತ್ರವನ್ನು ಹೆಚ್ಚಿಸಿ"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಮೆನು ಬಟನ್‌ಗಳ ಗಾತ್ರವನ್ನು ಹೆಚ್ಚಿಸಿ"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"ಸಹಾಯ"</string>
-    <string name="brightness_percentage_label" msgid="7391554573977867369">"ಪ್ರಕಾಶಮಾನ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="brightness_percentage_label" msgid="7391554573977867369">"ಪ್ರಖರತೆ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"ಸಂಗೀತ ವಾಲ್ಯೂಮ್‌ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ko/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ko/strings.xml
index f2495f0..b06e432 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ko/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ko/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"접근성 메뉴"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"접근성 메뉴를 사용하면 화면에 크게 표시되는 메뉴로 기기를 제어할 수 있습니다. 기기 잠금, 볼륨 및 밝기 조절, 스크린샷 찍기 등의 작업이 지원됩니다."</string>
     <string name="assistant_label" msgid="6796392082252272356">"어시스턴트"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"어시스턴트"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"접근성 설정"</string>
-    <string name="volume_label" msgid="3682221827627150574">"볼륨"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"볼륨 조정"</string>
     <string name="power_label" msgid="7699720321491287839">"전원"</string>
     <string name="power_utterance" msgid="7444296686402104807">"전원 옵션"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"최근 앱"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ky/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ky/strings.xml
index c376cf4..fa8b587 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ky/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ky/strings.xml
@@ -4,22 +4,19 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Атайын мүмкүнчүлүктөр менюсу"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Атайын мүмкүнчүлүктөр менюсу аркылуу түзмөгүңүздү кулпулап, үнүн катуулатып/акырындатып, экрандын жарык деңгээлин тууралап, скриншот тартып жана башка нерселерди жасай аласыз."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Жардамчы"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Жардамчы"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Атайын мүмкүнчүлүктөрдүн параметрлери"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Үндүн катуулугу"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Үндү башкаруу элементтери"</string>
     <string name="power_label" msgid="7699720321491287839">"Кубат"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Кубат параметрлери"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Акыркы колдонмолор"</string>
     <string name="lockscreen_label" msgid="648347953557887087">"Кулпуланган экран"</string>
-    <string name="quick_settings_label" msgid="2999117381487601865">"Ыкчам жөндөөлөр"</string>
+    <string name="quick_settings_label" msgid="2999117381487601865">"Ыкчам параметрлер"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Билдирмелер"</string>
     <string name="screenshot_label" msgid="863978141223970162">"Скриншот"</string>
     <string name="screenshot_utterance" msgid="1430760563401895074">"Скриншот тартып алуу"</string>
     <string name="volume_up_label" msgid="8592766918780362870">"Катуулатуу"</string>
     <string name="volume_down_label" msgid="8574981863656447346">"Акырындатуу"</string>
-    <string name="brightness_up_label" msgid="8010753822854544846">"Жарыктыгын көбөйтүү"</string>
+    <string name="brightness_up_label" msgid="8010753822854544846">"Жарыгыраак"</string>
     <string name="brightness_down_label" msgid="7115662941913272072">"Күңүртүрөөк"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Мурунку экранга өтүү"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Кийинки экранга өтүү"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-lo/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-lo/strings.xml
index 85891a9..4032565 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-lo/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-lo/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"​ເມ​ນູ​ການ​ຊ່ວຍ​ເຂົ້າ​ເຖິງ"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"ເມນູການຊ່ວຍເຂົ້າເຖິງຈະສະໜອງເມນູຢູ່ໜ້າຈໍຂະໜາດໃຫຍ່ເພື່ອຄວບຄຸມອຸປະກອນຂອງທ່ານ. ທ່ານສາມາດລັອກອຸປະກອນຂອງທ່ານ, ຄວບຄຸມລະດັບສຽງ ແລະ ຄວາມສະຫວ່າງ, ຖ່າຍຮູບໜ້າຈໍ ແລະ ອື່ນໆໄດ້."</string>
     <string name="assistant_label" msgid="6796392082252272356">"ຜູ້ຊ່ວຍ"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"ຜູ້ຊ່ວຍ"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"ການຕັ້ງຄ່າການຊ່ວຍເຂົ້າເຖິງ"</string>
-    <string name="volume_label" msgid="3682221827627150574">"ລະດັບສຽງ"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"ຕົວຄວບຄຸມລະດັບສຽງ"</string>
     <string name="power_label" msgid="7699720321491287839">"ພະລັງງານ"</string>
     <string name="power_utterance" msgid="7444296686402104807">"ຕົວເລືອກພະລັງງານ"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"ແອັບຫຼ້າສຸດ"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-lt/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-lt/strings.xml
index b4d804c..11d1ffa 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-lt/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-lt/strings.xml
@@ -6,8 +6,6 @@
     <string name="assistant_label" msgid="6796392082252272356">"Padėjėjas"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Padėjėjas"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Pritaikymo neįgaliesiems nustatymai"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Garsumas"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Garsumo valdikliai"</string>
     <string name="power_label" msgid="7699720321491287839">"Maitinimas"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Maitinimo parinktys"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Naujausios programos"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-lv/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-lv/strings.xml
index a40b525..4a0c9e6 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-lv/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-lv/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Pieejamības izvēlne"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Pieejamības izvēlne ir liela ekrāna izvēlne, ar ko varat kontrolēt ierīci. Varat bloķēt ierīci, kontrolēt skaļumu un spilgtumu, veidot ekrānuzņēmumus un paveikt daudz ko citu."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Asistents"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Asistents"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Pieejamības iestatījumi"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Skaļums"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Skaļuma vadīklas"</string>
     <string name="power_label" msgid="7699720321491287839">"Barošana"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Barošanas opcijas"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Pēdējās izmantotās lietotnes"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-mk/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-mk/strings.xml
index 4a710cc..d026759 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-mk/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-mk/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Мени за пристапност"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"„Менито за пристапност“ ви овозможува да го контролирате уредот преку големо мени на екранот. Може да го заклучите уредот, да ги контролирате јачината на звукот и осветленоста, да правите слики од екранот и друго."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Помошник"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Помошник"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Пристапност"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Јачина на звук"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Контроли за јачина на звук"</string>
     <string name="power_label" msgid="7699720321491287839">"Напојување"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Опции за напојување"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Неодамнешни апликации"</string>
@@ -19,8 +16,8 @@
     <string name="screenshot_utterance" msgid="1430760563401895074">"Направи слика од екранот"</string>
     <string name="volume_up_label" msgid="8592766918780362870">"Зголеми звук"</string>
     <string name="volume_down_label" msgid="8574981863656447346">"Намали звук"</string>
-    <string name="brightness_up_label" msgid="8010753822854544846">"Осветлете"</string>
-    <string name="brightness_down_label" msgid="7115662941913272072">"Затемнете"</string>
+    <string name="brightness_up_label" msgid="8010753822854544846">"Осветли"</string>
+    <string name="brightness_down_label" msgid="7115662941913272072">"Затемни"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Оди на претходниот екран"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Оди на следниот екран"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"„Менито за пристапност“ ви овозможува да го контролирате уредот преку големо мени на екранот. Може да го заклучите уредот, да ги контролирате јачината на звукот и осветленоста, да правите слики од екранот и друго."</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ml/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ml/strings.xml
index 38471e1..00e0a0f 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ml/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ml/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"ഉപയോഗസഹായി മെനു"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നതിന്, ഉപയോഗസഹായി മെനു വലിയൊരു ഓൺ-സ്ക്രീൻ മെനു നൽകുന്നു. ഉപകരണം ലോക്ക് ചെയ്യാനും ശബ്‌ദവും തെളിച്ചവും നിയന്ത്രിക്കാനും സ്‌ക്രീൻ ഷോട്ടുകൾ എടുക്കാനും മറ്റും നിങ്ങൾക്ക് കഴിയും."</string>
     <string name="assistant_label" msgid="6796392082252272356">"അസിസ്റ്റന്റ്"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"പ്രവേശനക്ഷമത ക്രമീകരണം"</string>
-    <string name="volume_label" msgid="3682221827627150574">"വോളിയം"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"വോളിയം നിയന്ത്രണങ്ങൾ"</string>
     <string name="power_label" msgid="7699720321491287839">"പവർ"</string>
     <string name="power_utterance" msgid="7444296686402104807">"പവർ ഓപ്ഷനുകൾ"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"സമീപകാല ആപ്പുകൾ"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-mn/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-mn/strings.xml
index 7c54d55..7b64116 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-mn/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-mn/strings.xml
@@ -4,18 +4,15 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Хандалтын цэс"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Хандалтын цэс нь танд төхөөрөмжөө том дэлгэцийн цэсээр хянах боломжийг олгоно. Та төхөөрөмжөө түгжих, дууны түвшин болон гэрэлтүүлгийг хянах, дэлгэцийн агшин авах болон бусад үйлдлийг хийж болно."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Туслах"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
-    <string name="a11y_settings_label" msgid="3977714687248445050">"Хүртээмжийн тохиргоо"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Түвшин"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Түвшний хяналт"</string>
+    <string name="assistant_utterance" msgid="65509599221141377">"Туслах"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"Хандалтын тохиргоо"</string>
     <string name="power_label" msgid="7699720321491287839">"Асаах/унтраах"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Асаах/унтраах сонголт"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Саяхны апп"</string>
     <string name="lockscreen_label" msgid="648347953557887087">"Түгжигдсэн дэлгэц"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"Шуурхай тохиргоо"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Мэдэгдэл"</string>
-    <string name="screenshot_label" msgid="863978141223970162">"Дэлгэцний зургийг дарах"</string>
+    <string name="screenshot_label" msgid="863978141223970162">"Дэлгэцийн агшин"</string>
     <string name="screenshot_utterance" msgid="1430760563401895074">"Дэлгэцний зургийг дарах"</string>
     <string name="volume_up_label" msgid="8592766918780362870">"Дууны түвшнийг нэмэх"</string>
     <string name="volume_down_label" msgid="8574981863656447346">"Дууны түвшнийг багасгах"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-mr/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-mr/strings.xml
index 4497e9c..8220749 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-mr/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-mr/strings.xml
@@ -6,8 +6,6 @@
     <string name="assistant_label" msgid="6796392082252272356">"असिस्टंट"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"अ‍ॅक्सेसिबिलिटी सेटिंग्ज"</string>
-    <string name="volume_label" msgid="3682221827627150574">"व्हॉल्यूम"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"व्हॉल्यूम नियंत्रणे"</string>
     <string name="power_label" msgid="7699720321491287839">"पॉवर"</string>
     <string name="power_utterance" msgid="7444296686402104807">"पॉवर पर्याय"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"अलीकडील अ‍ॅप्स"</string>
@@ -19,7 +17,7 @@
     <string name="volume_up_label" msgid="8592766918780362870">"व्‍हॉल्‍यूम वाढवा"</string>
     <string name="volume_down_label" msgid="8574981863656447346">"व्‍हॉल्‍यूम कमी करा"</string>
     <string name="brightness_up_label" msgid="8010753822854544846">"ब्राइटनेस वाढवा"</string>
-    <string name="brightness_down_label" msgid="7115662941913272072">"कमी ब्राइटनेस"</string>
+    <string name="brightness_down_label" msgid="7115662941913272072">"ब्राइटनेस कमी करा"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"मागील स्क्रीनवर जा"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"पुढील स्क्रीनवर जा"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"तुमचे डिव्हाइस नियंत्रित करण्यासाठी अ‍ॅक्सेसिबिलिटी मेनू मोठा स्क्रीनवरील मेनू पुरवतो. तुम्ही तुमचे डिव्हाइस लॉक करणे, व्हॉल्यूम आणि ब्राइटनेस नियंत्रित करणे, स्क्रीनशॉट घेणे आणि आणखी बरेच काही करू शकता."</string>
@@ -29,5 +27,5 @@
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"अ‍ॅक्सेसिबिलिटी मेनू बटणांचा आकार वाढवा"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"मदत"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"ब्राइटनेस <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"गाण्याचा व्हॉल्यूम <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"संगीताचा व्हॉल्यूम <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ms/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ms/strings.xml
index 64a3151..9c1ea75d 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ms/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ms/strings.xml
@@ -2,12 +2,10 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu Kebolehaksesan"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menu Kebolehcapaian menyediakan menu pada skrin yang besar untuk mengawal peranti anda. Anda boleh mengunci peranti anda, mengawal kelantangan dan kecerahan, mengambil tangkapan skrin dan banyak lagi."</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menu Kebolehaksesan menyediakan menu pada skrin yang besar untuk mengawal peranti anda. Anda boleh mengunci peranti anda, mengawal kelantangan dan kecerahan, mengambil tangkapan skrin dan banyak lagi."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Tetapan Kebolehaksesan"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Kelantangan"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Kawalan kelantangan"</string>
     <string name="power_label" msgid="7699720321491287839">"Kuasa"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Pilihan kuasa"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Apl terbaharu"</string>
@@ -22,7 +20,7 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"Kurangkan kecerahan"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Pergi ke skrin sebelumnya"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Pergi ke skrin seterusnya"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"Menu Kebolehcapaian menyediakan menu pada skrin yang besar untuk mengawal peranti anda. Anda boleh mengunci peranti anda, mengawal kelantangan dan kecerahan, mengambil tangkapan skrin dan pelbagai lagi."</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"Menu Kebolehaksesan menyediakan menu pada skrin yang besar untuk mengawal peranti anda. Anda boleh mengunci peranti anda, mengawal kelantangan dan kecerahan, mengambil tangkapan skrin dan pelbagai lagi."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Kawal peranti melalui menu besar"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Tetapan Menu Kebolehaksesan"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Butang besar"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-my/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-my/strings.xml
index daeb106..dacd68a 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-my/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-my/strings.xml
@@ -5,9 +5,7 @@
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"‘အများသုံးနိုင်မှု မီနူး’ တွင် သင့်စက်ပစ္စည်းကို စီမံရန် ကြီးမားသည့်ဖန်သားပြင်မီနူး ပါဝင်သည်။ စက်ပစ္စည်းလော့ခ်ချခြင်း၊ အသံအတိုးအကျယ်နှင့် အလင်းအမှောင် ထိန်းချုပ်ခြင်း၊ ဖန်သားပြင်ဓာတ်ပုံရိုက်ခြင်း စသည်တို့ ပြုလုပ်နိုင်သည်။"</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
-    <string name="a11y_settings_label" msgid="3977714687248445050">"အများသုံးစွဲနိုင်မှု ဆက်တင်များ"</string>
-    <string name="volume_label" msgid="3682221827627150574">"အသံအတိုးအကျယ်"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"အသံအတိုးအကျယ် ခလုတ်များ"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"အများသုံးနိုင်မှု ဆက်တင်များ"</string>
     <string name="power_label" msgid="7699720321491287839">"ပါဝါခလုတ်"</string>
     <string name="power_utterance" msgid="7444296686402104807">"ပါဝါ ရွေးစရာများ"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"လတ်တလောသုံး အက်ပ်များ"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-nb/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-nb/strings.xml
index ab4686a..a3e7ab0 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-nb/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-nb/strings.xml
@@ -2,13 +2,10 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Tilgjengelighetsmeny"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Med Tilgjengelighet-menyen får du en stor meny på skjermen for å kontrollere enheten. Du kan låse enheten, kontrollere volum og lysstyrke, ta skjermdumper med mer."</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Med tilgjengelighetsmenyen får du en stor meny på skjermen for å kontrollere enheten. Du kan låse enheten, kontrollere volum og lysstyrke, ta skjermdumper med mer."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistent"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Tilgjengelighetsinnstillinger"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volum"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Volumkontroller"</string>
     <string name="power_label" msgid="7699720321491287839">"Av/på"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Av/på-alternativer"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Nylige apper"</string>
@@ -23,7 +20,7 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"Lysstyrke ned"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Gå til forrige skjerm"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Gå til neste skjerm"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"Med Tilgjengelighet-menyen får du en stor meny på skjermen for å kontrollere enheten. Du kan låse enheten, kontrollere volum og lysstyrke, ta skjermdumper med mer."</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"Med tilgjengelighetsmenyen får du en stor meny på skjermen for å kontrollere enheten. Du kan låse enheten, kontrollere volum og lysstyrke, ta skjermdumper med mer."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Kontroller enheten med en stor meny"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Innstillinger for Tilgjengelighetsmeny"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Store knapper"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ne/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ne/strings.xml
index 82b6285..10e36b8 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ne/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ne/strings.xml
@@ -4,14 +4,11 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"एक्सेसिबिलिटी मेनु"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"तपाईं आफ्नो डिभाइस नियन्त्रण गर्न एक्सेसिबिलिटी मेनुमा गई ठुलो अन स्क्रिन मेनु खोल्न सक्नुहुन्छ। तपाईं आफ्नो डिभाइस लक गर्न, भोल्युम र चमक नियन्त्रण गर्न, स्क्रिनसटहरू लिन र थप कार्यहरू गर्न सक्नुहुन्छ।"</string>
     <string name="assistant_label" msgid="6796392082252272356">"सहायक"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
-    <string name="a11y_settings_label" msgid="3977714687248445050">"पहुँचसम्बन्धी सेटिङहरू"</string>
-    <string name="volume_label" msgid="3682221827627150574">"भोल्युम"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"भोल्युमका नियन्त्रणहरू"</string>
+    <string name="assistant_utterance" msgid="65509599221141377">"सहायक"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"एक्सेसिबिलिटी सेटिङ"</string>
     <string name="power_label" msgid="7699720321491287839">"पावर बटन"</string>
     <string name="power_utterance" msgid="7444296686402104807">"पावर बटनका विकल्पहरू"</string>
-    <string name="recent_apps_label" msgid="6583276995616385847">"हालका एपहरू"</string>
+    <string name="recent_apps_label" msgid="6583276995616385847">"हालै चलाइएका एप"</string>
     <string name="lockscreen_label" msgid="648347953557887087">"लक स्क्रिन"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"द्रुत सेटिङहरू"</string>
     <string name="notifications_label" msgid="6829741046963013567">"सूचनाहरू"</string>
@@ -25,9 +22,9 @@
     <string name="next_button_content_description" msgid="6810058269847364406">"अर्को स्क्रिनमा जानुहोस्"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"तपाईं आफ्नो डिभाइस नियन्त्रण गर्न एक्सेसिबिलिटी मेनुमा गई ठुलो अन स्क्रिन मेनु खोल्न सक्नुहुन्छ। तपाईं आफ्नो डिभाइस लक गर्न, भोल्युम र चमक नियन्त्रण गर्न, स्क्रिनसटहरू लिन र थप कार्यहरू गर्न सक्नुहुन्छ।"</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"ठुलो मेनुको सहायताले डिभाइस नियन्त्रण गर्नुहोस्"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"पहुँचसम्बन्धी मेनुका सेटिङहरू"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"एक्सेसिबिलिटी मेनुसम्बन्धी सेटिङ"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ठूला बटनहरू"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Accessibility मेनुका बटनहरूको आकार बढाउनुहोस्"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"एक्सेसिबिलिटी मेनुका बटनहरूको आकार बढाउनुहोस्"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"मद्दत"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"चमक <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"सङ्गीतको भोल्युम <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-nl/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-nl/strings.xml
index 1ddf6cf..a8d6a0b 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-nl/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-nl/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Toegankelijkheids­menu"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Het toegankelijkheidsmenu is een groot menu op het scherm waarmee je je apparaat kunt bedienen. Je kunt onder meer je apparaat vergrendelen, het volume en de helderheid beheren en screenshots maken."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistent"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Instellingen voor toegankelijkheid"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Volumebediening"</string>
     <string name="power_label" msgid="7699720321491287839">"Voeding"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Voedingsopties"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Recente apps"</string>
@@ -23,11 +20,11 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"Helderheid verlagen"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Ga naar vorig scherm"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Ga naar volgend scherm"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"Het toegankelijkheidsmenu is een groot menu op het scherm waarmee je je apparaat kunt bedienen. Je kunt onder meer je apparaat vergrendelen, het volume en de helderheid beheren en screenshots maken."</string>
-    <string name="accessibility_menu_summary" msgid="340071398148208130">"Apparaat bedienen via groot menu"</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"Het toegankelijkheidsmenu is een groot menu op het scherm waarmee je je apparaat kunt bedienen. Je kunt onder meer je apparaat vergrendelen, het volume en de helderheid aanpassen en screenshots maken."</string>
+    <string name="accessibility_menu_summary" msgid="340071398148208130">"Bedien apparaat via groot menu"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Instellingen toegankelijkheidsmenu"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Grote knoppen"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Knoppen in het toegankelijkheidsmenu vergroten"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Vergroot knoppen in het toegankelijkheidsmenu"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Hulp"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Helderheid <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Muziekvolume <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-or/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-or/strings.xml
index dd46ae4..ba22596 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-or/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-or/strings.xml
@@ -4,31 +4,28 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"ଆକ୍ସେସିବିଲିଟୀ ମେନୁ"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"ଆପଣଙ୍କ ଡିଭାଇସକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଆକ୍ସେସିବିଲିଟୀ ମେନୁ ଏକ ବଡ଼ ଅନ-ସ୍କ୍ରିନ ମେନୁ ପ୍ରଦାନ କରେ। ଆପଣ ଆପଣଙ୍କ ଡିଭାଇସକୁ ଲକ କରିପାରିବେ, ଭଲ୍ୟୁମ ଓ ଉଜ୍ଜ୍ୱଳତାକୁ ନିୟନ୍ତ୍ରଣ କରିପାରିବେ, ସ୍କ୍ରିନସଟ ନେଇପାରିବେ ଏବଂ ଆହୁରି ଅନେକ କିଛି କରିପାରିବେ।"</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"ଆକ୍ସେସିବିଲିଟୀ ସେଟିଂସ"</string>
-    <string name="volume_label" msgid="3682221827627150574">"ଭଲ୍ୟୁମ୍"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"ଭଲ୍ୟୁମ୍ କଣ୍ଟ୍ରୋଲ୍"</string>
     <string name="power_label" msgid="7699720321491287839">"ପାୱର୍"</string>
     <string name="power_utterance" msgid="7444296686402104807">"ପାୱର୍ ବିକଳ୍ପ"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"ବର୍ତ୍ତମାନର ଆପ୍‌"</string>
     <string name="lockscreen_label" msgid="648347953557887087">"ସ୍କ୍ରୀନ୍‌ ଲକ୍ କରନ୍ତୁ"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"କ୍ୱିକ ସେଟିଂସ"</string>
     <string name="notifications_label" msgid="6829741046963013567">"ବିଜ୍ଞପ୍ତି"</string>
-    <string name="screenshot_label" msgid="863978141223970162">"ସ୍କ୍ରିନସଟ୍‌"</string>
+    <string name="screenshot_label" msgid="863978141223970162">"ସ୍କ୍ରିନସଟ"</string>
     <string name="screenshot_utterance" msgid="1430760563401895074">"ସ୍କ୍ରୀନଶଟ୍‌ ନିଅନ୍ତୁ"</string>
     <string name="volume_up_label" msgid="8592766918780362870">"ଭଲ୍ୟୁମ୍ ବଢ଼ାନ୍ତୁ"</string>
     <string name="volume_down_label" msgid="8574981863656447346">"ଭଲ୍ୟୁମ୍ କମାନ୍ତୁ"</string>
     <string name="brightness_up_label" msgid="8010753822854544846">"ଉଜ୍ଜ୍ୱଳତା ବଢ଼ାନ୍ତୁ"</string>
-    <string name="brightness_down_label" msgid="7115662941913272072">"ଉଜ୍ଜ୍ୱଳତା କମ୍ କରନ୍ତୁ"</string>
+    <string name="brightness_down_label" msgid="7115662941913272072">"ଉଜ୍ଜ୍ୱଳତା କମ କରନ୍ତୁ"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"ପୂର୍ବବର୍ତ୍ତୀ ସ୍କ୍ରିନ୍‍କୁ ଯାଆନ୍ତୁ"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"ପରବର୍ତ୍ତୀ ସ୍କ୍ରିନ୍‍କୁ ଯାଆନ୍ତୁ"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"ଆପଣଙ୍କ ଡିଭାଇସକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଆକ୍ସେସିବିଲିଟୀ ମେନୁ ଏକ ବଡ଼ ଅନ-ସ୍କ୍ରିନ ମେନୁ ପ୍ରଦାନ କରେ। ଆପଣ ଆପଣଙ୍କ ଡିଭାଇସକୁ ଲକ କରିପାରିବେ, ଭଲ୍ୟୁମ ଓ ଉଜ୍ଜ୍ୱଳତାକୁ ନିୟନ୍ତ୍ରଣ କରିପାରିବେ, ସ୍କ୍ରିନସଟ ନେଇପାରିବେ ଏବଂ ଆହୁରି ଅନେକ କିଛି କରିପାରିବେ।"</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"ବଡ଼ ମେନୁ ମାଧ୍ୟମରେ ଡିଭାଇସକୁ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ଆକ୍ସେସିବିଲିଟୀ ମେନୁ ସେଟିଂସ"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ବଡ଼ ବଟନ୍"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ଆକ୍ସେସିବିଲିଟୀ ମେନୁ ବଟନ୍‌ର ଆକାର ବଢ଼ାନ୍ତୁ"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ଆକ୍ସେସିବିଲିଟୀ ମେନୁ ବଟନର ଆକାର ବଢ଼ାନ୍ତୁ"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"ସାହାଯ୍ୟ"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"ଉଜ୍ଜ୍ୱଳତା <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"ସଙ୍ଗୀତର ଭଲ୍ୟୁମ୍ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"ମ୍ୟୁଜିକର ଭଲ୍ୟୁମ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pa/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pa/strings.xml
index 4ff57c0..31fab24 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pa/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pa/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"ਪਹੁੰਚਯੋਗਤਾ ਮੀਨੂ"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਪਹੁੰਚਯੋਗਤਾ ਮੀਨੂ ਇੱਕ ਵੱਡਾ ਆਨ-ਸਕ੍ਰੀਨ ਮੀਨੂ ਮੁਹੱਈਆ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਲਾਕ ਕਰ ਸਕਦੇ ਹੋ, ਅਵਾਜ਼ ਅਤੇ ਚਮਕ ਨੂੰ ਕੰਟਰੋਲ ਕਰ ਸਕਦੇ ਹੋ, ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈ ਸਕਦੇ ਹੋ ਅਤੇ ਹੋਰ ਵੀ ਬਹੁਤ ਕੁਝ।"</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"ਪਹੁੰਚਯੋਗਤਾ ਸੈਟਿੰਗਾਂ"</string>
-    <string name="volume_label" msgid="3682221827627150574">"ਅਵਾਜ਼"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"ਵੌਲਿਊਮ ਕੰਟਰੋਲ"</string>
     <string name="power_label" msgid="7699720321491287839">"ਪਾਵਰ"</string>
     <string name="power_utterance" msgid="7444296686402104807">"ਪਾਵਰ ਵਿਕਲਪ"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"ਹਾਲੀਆ ਐਪਾਂ"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pl/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pl/strings.xml
index 829ab47..69a0834 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pl/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pl/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu ułatwień dostępu"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menu ułatwień dostępu to duże menu ekranowe, które umożliwia obsługę urządzenia. Możesz zablokować urządzenie, zwiększyć lub zmniejszyć głośność oraz jasność, zrobić zrzut ekranu i wykonać inne działania."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Asystent"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Asystent"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Ustawienia ułatwień dostępu"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Głośność"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Przyciski sterowania głośnością"</string>
     <string name="power_label" msgid="7699720321491287839">"Zasilanie"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opcje przycisku zasilania"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Ostatnie aplikacje"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rBR/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rBR/strings.xml
index 37f0980..160d310 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rBR/strings.xml
@@ -2,12 +2,10 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu de acessibilidade"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"\"Acessibilidade\" é um grande menu mostrado na tela para controlar seu dispositivo. Você pode bloquear o dispositivo, controlar o volume e o brilho, fazer capturas de tela e muito mais."</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"\"Acessibilidade\" é um menu grande mostrado na tela para controlar seu dispositivo. Você pode bloquear o dispositivo, controlar o volume e o brilho, fazer capturas de tela e muito mais."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistente"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Google Assistente"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Configurações de acessibilidade"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Controles de volume"</string>
     <string name="power_label" msgid="7699720321491287839">"Liga/desliga"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opções do botão liga/desliga"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Apps recentes"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rPT/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rPT/strings.xml
index da61be6..44aff75 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt-rPT/strings.xml
@@ -6,8 +6,6 @@
     <string name="assistant_label" msgid="6796392082252272356">"Assistente"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistente"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Definições de acessibilidade"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Controlos do volume"</string>
     <string name="power_label" msgid="7699720321491287839">"Ligar/desligar"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opções para ligar/desligar"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Apps recentes"</string>
@@ -26,7 +24,7 @@
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Controle o dispositivo através do menu grande"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Definições do menu Acessibilidade"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Botões grandes"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumentar o tamanho dos botões do menu de acessibilidade"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Aumentar o tamanho dos botões do menu Acessibilidade"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Ajuda"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Brilho: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Volume da música: <xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt/strings.xml
index 37f0980..160d310 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-pt/strings.xml
@@ -2,12 +2,10 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu de acessibilidade"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"\"Acessibilidade\" é um grande menu mostrado na tela para controlar seu dispositivo. Você pode bloquear o dispositivo, controlar o volume e o brilho, fazer capturas de tela e muito mais."</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"\"Acessibilidade\" é um menu grande mostrado na tela para controlar seu dispositivo. Você pode bloquear o dispositivo, controlar o volume e o brilho, fazer capturas de tela e muito mais."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistente"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Google Assistente"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Configurações de acessibilidade"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Controles de volume"</string>
     <string name="power_label" msgid="7699720321491287839">"Liga/desliga"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opções do botão liga/desliga"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Apps recentes"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ro/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ro/strings.xml
index 77b4318..6edbb77 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ro/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ro/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Meniul Accesibilitate"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Meniul Accesibilitate este un meniu mare afișat pe ecran, cu ajutorul căruia îți controlezi dispozitivul. Poți să blochezi dispozitivul, să ajustezi volumul și luminozitatea, să faci capturi de ecran și multe altele."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Asistent"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Asistent"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Setări de accesibilitate"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volum"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Comenzi pentru volum"</string>
     <string name="power_label" msgid="7699720321491287839">"Alimentare"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opțiuni pentru alimentare"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Aplicații recente"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ru/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ru/strings.xml
index 1e9ec49..7614fb5 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ru/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ru/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Меню спец. возможностей"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"С помощью большого экранного меню специальных возможностей можно блокировать устройство, регулировать громкость звука и яркость экрана, делать скриншоты и выполнять другие действия."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Ассистент"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
-    <string name="a11y_settings_label" msgid="3977714687248445050">"Настройки специальных возможностей"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Громкость"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Кнопки регулировки громкости"</string>
+    <string name="assistant_utterance" msgid="65509599221141377">"Ассистент"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"Настройки спец. возможностей"</string>
     <string name="power_label" msgid="7699720321491287839">"Кнопка питания"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Настройки кнопки питания"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Недавние приложения"</string>
@@ -25,7 +22,7 @@
     <string name="next_button_content_description" msgid="6810058269847364406">"Перейти на следующий экран"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"С помощью большого экранного меню специальных возможностей можно блокировать устройство, регулировать громкость звука и яркость экрана, делать скриншоты и выполнять другие действия."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Управление устройством с помощью большого меню"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Настройки меню специальных возможностей"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Настройки меню спец. возможностей"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Увеличить кнопки"</string>
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Увеличить размер кнопок в меню специальных возможностей"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Справка"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-si/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-si/strings.xml
index ecd4c16..10573df 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-si/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-si/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"ප්‍රවේශ්‍යතා මෙනුව"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"ප්‍රවේශ්‍යතා මෙනුව ඔබගේ උපාංගය පාලනය කිරීම සඳහා විශාල තිරය මත මෙනුවක් සපයයි. ඔබට ඔබගේ උපාංගය අගුලු හැරීමට, හඬ පරිමාව සහ දීප්තිය පාලනය කිරීමට, තිර රූ ගැනීමට සහ තවත් දේ කිරීමට හැකිය."</string>
     <string name="assistant_label" msgid="6796392082252272356">"සහායක"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"සහායක"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"ප්‍රවේශ්‍යතා සැකසීම්"</string>
-    <string name="volume_label" msgid="3682221827627150574">"ශබ්දය"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"හඬ පරිමා පාලන"</string>
     <string name="power_label" msgid="7699720321491287839">"බලය"</string>
     <string name="power_utterance" msgid="7444296686402104807">"බලය විකල්ප"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"මෑත යෙදුම්"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml
index a8c8a89..c4bf89a 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml
@@ -2,17 +2,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Ponuka dostupnosti"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Ponuka dostupnosti spustí na obrazovke telefónu veľkú ponuku, pomocou ktorej môžete ovládať svoje zariadenie. Môžete ho uzamknúť, ovládať hlasitosť a jas, vytvárať snímky obrazovky a mnoho ďalšieho."</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Ponukou dostupnosti sa rozumie veľká ponuka na obrazovke, pomocou ktorej môžete ovládať zariadenie. Môžete ho uzamknúť, ovládať hlasitosť a jas, vytvárať snímky obrazovky a mnoho ďalšieho."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Asistent"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Asistent"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Nastavenia dostupnosti"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Hlasitosť"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Ovládanie hlasitosti"</string>
     <string name="power_label" msgid="7699720321491287839">"Vypínač"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Možnosti vypínača"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Nedávne aplikácie"</string>
-    <string name="lockscreen_label" msgid="648347953557887087">"Uzamknutá obrazovka"</string>
+    <string name="lockscreen_label" msgid="648347953557887087">"Zamknúť obrazovku"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"Rýchle nastavenia"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Upozornenia"</string>
     <string name="screenshot_label" msgid="863978141223970162">"Snímka obrazovky"</string>
@@ -25,9 +22,9 @@
     <string name="next_button_content_description" msgid="6810058269847364406">"Prejsť na ďalšiu obrazovku"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"Ponuka dostupnosti spustí na obrazovke telefónu veľkú ponuku, pomocou ktorej môžete ovládať svoje zariadenie. Môžete ho uzamknúť, ovládať hlasitosť a jas, vytvárať snímky obrazovky a mnoho ďalšieho."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Ovládajte zariadenie pomocou veľkej ponuky"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Nastavenia ponuky Dostupnosť"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Nastavenia ponuky dostupnosti"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Veľké tlačidlá"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Zväčšiť tlačidlá ponuky Dostupnosť"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Zväčšiť tlačidlá ponuky dostupnosti"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Pomocník"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Jas: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Hlasitosť hudby: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sl/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sl/strings.xml
index aaa576d..c4f1b0f 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sl/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sl/strings.xml
@@ -1,14 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Meni s funkcijami za ljudi s posebnimi potrebami"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Meni s funkcijami za ljudi s posebnimi potrebami je velik zaslonski meni za upravljanje naprave. V njem lahko zaklenete napravo, nastavljate glasnost in svetlost, zajamete posnetke zaslona in drugo."</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Meni za dostopnost"</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Meni za dostopnost je velik zaslonski meni za upravljanje naprave. V njem lahko zaklenete napravo, nastavljate glasnost in svetlost, zajamete posnetke zaslona in drugo."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Pomočnik"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
-    <string name="a11y_settings_label" msgid="3977714687248445050">"Nastavitve funkcij za ljudi s posebnimi potrebami"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Glasnost"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Kontrolniki za glasnost"</string>
+    <string name="assistant_utterance" msgid="65509599221141377">"Pomočnik"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"Nastavitve dostopnosti"</string>
     <string name="power_label" msgid="7699720321491287839">"Vklop"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Možnosti gumba za vklop"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Nedavne aplikacije"</string>
@@ -23,11 +20,11 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"Zmanjšanje svetlosti"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Na prejšnji zaslon"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Na naslednji zaslon"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"Meni s funkcijami za ljudi s posebnimi potrebami je velik zaslonski meni za upravljanje naprave. V njem lahko zaklenete napravo, nastavljate glasnost in svetlost, zajamete posnetke zaslona in drugo."</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"Meni za dostopnost je velik zaslonski meni za upravljanje naprave. V njem lahko zaklenete napravo, nastavljate glasnost in svetlost, zajamete posnetke zaslona in drugo."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Upravljanje naprave prek velikega menija"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Nastavitve menija s funkcijami za ljudi s posebnimi potrebami"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Nastavitve menija za dostopnost"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Veliki gumbi"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Povečanje velikosti gumbov menija s funkcijami za ljudi s posebnimi potrebami"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Povečanje velikosti gumbov menija za dostopnost"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Pomoč"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Svetlost <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Glasnost glasbe <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sq/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sq/strings.xml
index 2dfe2e7..d8141da 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sq/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sq/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menyja e qasshmërisë"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"\"Menyja e qasshmërisë\" ofron një meny të madhe në ekran për të kontrolluar pajisjen tënde. Mund të kyçësh pajisjen, të kontrollosh volumin dhe ndriçimin, të nxjerrësh pamje ekrani dhe të tjera."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Asistenti"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Asistenti"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Cilësimet e qasshmërisë"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volumi"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Kontrollet e volumit"</string>
     <string name="power_label" msgid="7699720321491287839">"Energjia"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Opsionet e energjisë"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Aplikacionet e fundit"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sr/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sr/strings.xml
index 6538c43..e27447f 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sr/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sr/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Мени Приступачност"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Мени Приступачност пружа велики мени на екрану за контролу уређаја. Можете да закључате уређај, контролишете јачину звука и осветљеност, правите снимке екрана и друго."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Помоћник"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Помоћник"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Подешавања приступачности"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Јачина звука"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Контроле јачине звука"</string>
     <string name="power_label" msgid="7699720321491287839">"Напајање"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Опције напајања"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Недавне апликације"</string>
@@ -30,5 +27,5 @@
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Повећајте величину дугмади у менију за приступачност"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Помоћ"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Осветљеност: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"Јачина звука музике: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"Јачина музике: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sv/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sv/strings.xml
index 2e7a496..ef69667 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sv/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sv/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Tillgänglighetsmenyn"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Tillgänglighetsmenyn är en stor meny på skärmen som du kan styra enheten med. Du kan låsa enheten, ställa in volym och ljusstyrka, ta skärmbilder och annat."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
-    <string name="a11y_settings_label" msgid="3977714687248445050">"Tillgänglighetsinställningar"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volym"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Volymkontroller"</string>
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistent"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"Tillgänglighets­inställningar"</string>
     <string name="power_label" msgid="7699720321491287839">"Styrka"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Strömalternativ"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Senaste apparna"</string>
@@ -24,7 +21,7 @@
     <string name="previous_button_content_description" msgid="840869171117765966">"Tillbaka till föregående skärm"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Fortsätt till nästa skärm"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"Tillgänglighetsmenyn är en stor meny på skärmen som du kan styra enheten med. Du kan låsa enheten, ställa in volym och ljusstyrka, ta skärmbilder och annat."</string>
-    <string name="accessibility_menu_summary" msgid="340071398148208130">"Styra enheten via en stor meny"</string>
+    <string name="accessibility_menu_summary" msgid="340071398148208130">"Styr enheten via en stor meny"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Inställningar för tillgänglighetsmenyn"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Stora knappar"</string>
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Öka knapparnas storlek i tillgänglighetsmenyn"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sw/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sw/strings.xml
index c7a52ae..b8eef85 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sw/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sw/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menyu ya Ufikivu"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menyu ya Ufikivu huonyesha menyu pana iliyo kwenye skrini ili udhibiti kifaa chako. Unaweza kufunga kifaa chako, kudhibiti sauti na ung\'avu, kupiga picha ya skrini na zaidi."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Mratibu"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Programu ya Mratibu"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Mipangilio ya Ufikivu"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Sauti"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Vidhibiti vya sauti"</string>
     <string name="power_label" msgid="7699720321491287839">"Nishati"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Chaguo za kuwasha"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Programu za hivi karibuni"</string>
@@ -20,7 +17,7 @@
     <string name="volume_up_label" msgid="8592766918780362870">"Ongeza sauti"</string>
     <string name="volume_down_label" msgid="8574981863656447346">"Punguza sauti"</string>
     <string name="brightness_up_label" msgid="8010753822854544846">"Ongeza ung\'aavu"</string>
-    <string name="brightness_down_label" msgid="7115662941913272072">"Punguza ung`aavu"</string>
+    <string name="brightness_down_label" msgid="7115662941913272072">"Punguza ung\'aavu"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Nenda kwenye skrini iliyotangulia"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Nenda kwenye skrini inayofuata"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"Menyu ya Ufikivu huonyesha menyu pana iliyo kwenye skrini ili udhibiti kifaa chako. Unaweza kufunga kifaa chako, kudhibiti sauti na ung\'avu, kupiga picha ya skrini na zaidi."</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ta/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ta/strings.xml
index 0172b5b..57bbc52 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ta/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ta/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"அணுகல்தன்மை மெனு"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"அணுகல்தன்மை மெனுவானது உங்கள் சாதனத்தைக் கட்டுப்படுத்துவதற்கு, திரையில் தோன்றும் பெரிய மெனுவை வழங்குகிறது. சாதனத்தைப் பூட்டுதல், ஒலியளவையும் ஒளிர்வையும் மாற்றுதல், ஸ்கிரீன்ஷாட்களை எடுத்தல் போன்ற பலவற்றைச் செய்யலாம்."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"அசிஸ்டண்ட்"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"அணுகல்தன்மை அமைப்புகள்"</string>
-    <string name="volume_label" msgid="3682221827627150574">"ஒலியளவு"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"ஒலியளவுக் கட்டுப்பாடுகள்"</string>
     <string name="power_label" msgid="7699720321491287839">"பவர் பட்டன்"</string>
     <string name="power_utterance" msgid="7444296686402104807">"பவர் பட்டன் விருப்பங்கள்"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"சமீபத்திய ஆப்ஸ்"</string>
@@ -17,9 +14,9 @@
     <string name="notifications_label" msgid="6829741046963013567">"அறிவிப்புகள்"</string>
     <string name="screenshot_label" msgid="863978141223970162">"ஸ்கிரீன்ஷாட்"</string>
     <string name="screenshot_utterance" msgid="1430760563401895074">"ஸ்கிரீன் ஷாட்டை எடுக்கும் பட்டன்"</string>
-    <string name="volume_up_label" msgid="8592766918780362870">"ஒலியளவை அதிகரிப்பதற்கான பட்டன்"</string>
+    <string name="volume_up_label" msgid="8592766918780362870">"ஒலியளவை அதிகரிக்கும்"</string>
     <string name="volume_down_label" msgid="8574981863656447346">"ஒலியளவைக் குறைக்கும்"</string>
-    <string name="brightness_up_label" msgid="8010753822854544846">"ஒளிர்வை அதிகரிப்பதற்கான பட்டன்"</string>
+    <string name="brightness_up_label" msgid="8010753822854544846">"ஒளிர்வை அதிகரிக்கும்"</string>
     <string name="brightness_down_label" msgid="7115662941913272072">"ஒளிர்வைக் குறைக்கும்"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"முந்தைய திரைக்குச் செல்வதற்கான பட்டன்"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"அடுத்த திரைக்குச் செல்வதற்கான பட்டன்"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-te/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-te/strings.xml
index 54b10f1..827e6de 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-te/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-te/strings.xml
@@ -2,13 +2,10 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"యాక్సెసిబిలిటీ మెనూ"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"మీ పరికరాన్ని కంట్రోల్ చేయడానికి యాక్సెసిబిలిటీ మెనూ, స్క్రీన్‌పై పెద్ద మెనూను అందిస్తుంది. మీరు మీ పరికరాన్ని లాక్ చేయవచ్చు, వాల్యూమ్ మరియు ప్రకాశాన్ని కంట్రోల్ చేయవచ్చు, స్క్రీన్‌షాట్‌లు తీసుకోవచ్చు, మరిన్ని చేయవచ్చు."</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"మీ పరికరాన్ని కంట్రోల్ చేయడానికి యాక్సెసిబిలిటీ మెనూ, స్క్రీన్‌పై పెద్ద మెనూను అందిస్తుంది. మీరు మీ పరికరాన్ని లాక్ చేయవచ్చు, వాల్యూమ్‌ను, బ్రైట్‌నెస్‌ను కంట్రోల్ చేయవచ్చు, స్క్రీన్‌షాట్‌లు తీసుకోవచ్చు, మరిన్ని చేయవచ్చు."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
-    <string name="a11y_settings_label" msgid="3977714687248445050">"యాక్సెస్ సామర్థ్య సెట్టింగ్‌లు"</string>
-    <string name="volume_label" msgid="3682221827627150574">"వాల్యూమ్"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"వాల్యూమ్ నియంత్రణలు"</string>
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"యాక్సెసిబిలిటీ సెట్టింగ్‌లు"</string>
     <string name="power_label" msgid="7699720321491287839">"పవర్"</string>
     <string name="power_utterance" msgid="7444296686402104807">"పవర్ ఎంపికలు"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"ఇటీవలి యాప్‌లు"</string>
@@ -17,18 +14,18 @@
     <string name="notifications_label" msgid="6829741046963013567">"నోటిఫికేషన్‌లు"</string>
     <string name="screenshot_label" msgid="863978141223970162">"స్క్రీన్‌షాట్"</string>
     <string name="screenshot_utterance" msgid="1430760563401895074">"స్క్రీన్‌షాట్‌ని తీయండి"</string>
-    <string name="volume_up_label" msgid="8592766918780362870">"వాల్యూమ్ పెంచు"</string>
-    <string name="volume_down_label" msgid="8574981863656447346">"వాల్యూమ్ తగ్గించు"</string>
-    <string name="brightness_up_label" msgid="8010753822854544846">"ప్రకాశాన్ని పెంచుతుంది"</string>
-    <string name="brightness_down_label" msgid="7115662941913272072">"ప్రకాశాన్ని తగ్గిస్తుంది"</string>
+    <string name="volume_up_label" msgid="8592766918780362870">"వాల్యూమ్ పెంచండి"</string>
+    <string name="volume_down_label" msgid="8574981863656447346">"వాల్యూమ్ తగ్గించండి"</string>
+    <string name="brightness_up_label" msgid="8010753822854544846">"బ్రైట్‌నెస్‌ను పెంచండి"</string>
+    <string name="brightness_down_label" msgid="7115662941913272072">"బ్రైట్‌నెస్‌ను తగ్గించండి"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"మునుపటి స్క్రీన్‌కు వెళ్లండి"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"తదుపరి స్క్రీన్‌కు వెళ్లండి"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"మీ పరికరాన్ని నియంత్రించడానికి యాక్సెసిబిలిటీ మెనూ, స్క్రీన్‌పై పెద్ద మెనూను అందిస్తుంది. మీరు మీ పరికరాన్ని లాక్ చేయవచ్చు, వాల్యూమ్ మరియు ప్రకాశాన్ని నియంత్రించవచ్చు, స్క్రీన్‌షాట్‌లు తీసుకోవచ్చు, మరిన్ని చేయవచ్చు."</string>
-    <string name="accessibility_menu_summary" msgid="340071398148208130">"పెద్ద మెనూ ద్వారా పరికరాన్ని నియంత్రించండి"</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"మీ పరికరాన్ని కంట్రోల్ చేయడానికి యాక్సెసిబిలిటీ మెనూ, స్క్రీన్‌పై పెద్ద మెనూను అందిస్తుంది. మీరు మీ పరికరాన్ని లాక్ చేయవచ్చు, వాల్యూమ్‌ను, బ్రైట్‌నెస్‌ను కంట్రోల్ చేయవచ్చు, స్క్రీన్‌షాట్‌లు తీసుకోవచ్చు, మరిన్ని చేయవచ్చు."</string>
+    <string name="accessibility_menu_summary" msgid="340071398148208130">"పెద్ద మెనూ ద్వారా పరికరాన్ని కంట్రోల్ చేయండి"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"యాక్సెసిబిలిటీ మెనూ సెట్టింగ్‌లు"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"పెద్ద బటన్‌లు"</string>
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"యాక్సెసిబిలిటీ మెనూ బటన్‌ల సైజ్‌ పెంచుతుంది"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"సహాయం"</string>
-    <string name="brightness_percentage_label" msgid="7391554573977867369">"ప్రకాశం <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
-    <string name="music_volume_percentage_label" msgid="398635599662604706">"సంగీతం వాల్యూమ్ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="brightness_percentage_label" msgid="7391554573977867369">"బ్రైట్‌నెస్ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
+    <string name="music_volume_percentage_label" msgid="398635599662604706">"మ్యూజిక్ వాల్యూమ్ <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
 </resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-th/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-th/strings.xml
index 5748b5c..29581a9 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-th/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-th/strings.xml
@@ -6,8 +6,6 @@
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"การตั้งค่าการช่วยเหลือพิเศษ"</string>
-    <string name="volume_label" msgid="3682221827627150574">"ระดับเสียง"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"การควบคุมเสียง"</string>
     <string name="power_label" msgid="7699720321491287839">"เปิด/ปิด"</string>
     <string name="power_utterance" msgid="7444296686402104807">"ตัวเลือกสำหรับการเปิด/ปิด"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"แอปล่าสุด"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-tl/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-tl/strings.xml
index ed1269b..4a5833f 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-tl/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-tl/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu ng Accessibility"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Nagbibigay ang Menu ng Accessibility ng malaking menu sa screen para sa pagkontrol sa iyong device. Magagawa mong i-lock ang iyong device, kontrolin ang volume at liwanag, kumuha ng mga screenshot, at higit pa."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Mga Setting ng Accessibility"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Volume"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Mga kontrol ng volume"</string>
     <string name="power_label" msgid="7699720321491287839">"Power"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Mga opsyon sa power"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Mga kamakailang app"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-tr/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-tr/strings.xml
index 76a6ec7..38cc395 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-tr/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-tr/strings.xml
@@ -1,14 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Erişilebilirlik Menüsü"</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Erişilebilirlik menüsü"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Erişilebilirlik menüsü, cihazınızı kontrol etmeniz için geniş bir ekran menüsü sağlar. Cihazınızı kilitleyebilir, ses düzeyini ve parlaklığı kontrol edebilir, ekran görüntüsü alabilir ve daha fazlasını yapabilirsiniz."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Asistan"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Asistan"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Erişebilirlik Ayarları"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Ses düzeyi"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Ses denetimleri"</string>
     <string name="power_label" msgid="7699720321491287839">"Güç"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Güç seçenekleri"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Son uygulamalar"</string>
@@ -27,7 +24,7 @@
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Cihazı geniş menüyle kontrol edin"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Erişilebilirlik Menüsü Ayarları"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Büyük düğmeler"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Erişilebilirlik Menüsündeki Düğmelerin boyutunu artır"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Erişilebilirlik menüsündeki düğmelerin boyutunu artır"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Yardım"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Parlaklık %%<xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Müzik ses düzeyi %%<xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-uk/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-uk/strings.xml
index 970ba21..ee02b4a 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-uk/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-uk/strings.xml
@@ -1,18 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Меню спеціальних можливостей"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"За допомогою великого екранного меню спеціальних можливостей можна заблокувати пристрій, змінювати гучність і яскравість, робити знімки екрана та багато іншого."</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Меню функцій доступності"</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"За допомогою великого екранного меню функцій доступності можна блокувати пристрій, змінювати гучність і яскравість, робити знімки екрана й багато іншого."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Асистент"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
-    <string name="a11y_settings_label" msgid="3977714687248445050">"Налаштування спеціальніх можливостей"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Гучність"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Регулятори гучності"</string>
+    <string name="assistant_utterance" msgid="65509599221141377">"Асистент"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"Налаштування функцій доступності"</string>
     <string name="power_label" msgid="7699720321491287839">"Живлення"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Опції живлення"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Нещодавні додатки"</string>
-    <string name="lockscreen_label" msgid="648347953557887087">"Заблокований екран"</string>
+    <string name="lockscreen_label" msgid="648347953557887087">"Блокування екрана"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"Швидкі налаштування"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Сповіщення"</string>
     <string name="screenshot_label" msgid="863978141223970162">"Знімок екрана"</string>
@@ -23,11 +20,11 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"Зменшити яскравість"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Перейти на попередній екран"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Перейти на наступний екран"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"За допомогою великого екранного меню спеціальних можливостей можна заблокувати пристрій, змінювати гучність і яскравість, робити знімки екрана та багато іншого."</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"За допомогою великого екранного меню функцій доступності можна блокувати пристрій, змінювати гучність і яскравість, робити знімки екрана й багато іншого."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Керування пристроєм за допомогою великого меню"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Налаштування \"Меню спеціальних можливостей\""</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Налаштування меню функцій доступності"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Великі кнопки"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Збільшити розмір кнопок меню спеціальних можливостей"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Збільшити розмір кнопок у меню функцій доступності"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Довідка"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Яскравість: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Гучність музики: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ur/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ur/strings.xml
index b1f2f3b..620163e 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-ur/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-ur/strings.xml
@@ -1,14 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"ایکسیسبیلٹی مینو"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"اپنے آلے کو کنٹرول کرنے کے لیے ایکسیسبیلٹی مینو ایک بڑا آن اسکرین مینو فراہم کرتا ہے۔ آپ اپنا آلہ مقفل، والیوم اور چمک کو کنٹرول، اسکرین شاٹ لینے کے ساتھ اور مزید بہت کچھ کر سکتے ہیں۔"</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"ایکسیسبیلٹی مینیو"</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"اپنے آلے کو کنٹرول کرنے کے لیے ایکسیسبیلٹی مینیو ایک بڑا آن اسکرین مینیو فراہم کرتا ہے۔ آپ اپنا آلہ مقفل، والیوم اور چمک کو کنٹرول، اسکرین شاٹ لینے کے ساتھ اور مزید بہت کچھ کر سکتے ہیں۔"</string>
     <string name="assistant_label" msgid="6796392082252272356">"اسسٹنٹ"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"اسسٹنٹ"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"ایکسیسبیلٹی ترتیبات"</string>
-    <string name="volume_label" msgid="3682221827627150574">"والیوم"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"والیوم کے کنٹرولز"</string>
     <string name="power_label" msgid="7699720321491287839">"پاور"</string>
     <string name="power_utterance" msgid="7444296686402104807">"پاور کے اختیارات"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"حالیہ ایپس"</string>
@@ -23,11 +20,11 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"چمک کم کرنے کا بٹن"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"پچھلی اسکرین پر جائیں"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"اگلی اسکرین پر جائیں"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"اپنے آلے کو کنٹرول کرنے کے لیے ایکسیسبیلٹی مینو ایک بڑا آن اسکرین مینو فراہم کرتا ہے۔ آپ اپنا آلہ مقفل، والیوم اور چمک کو کنٹرول، اسکرین شاٹ لینے کے ساتھ اور مزید بہت کچھ کر سکتے ہیں۔"</string>
-    <string name="accessibility_menu_summary" msgid="340071398148208130">"بڑے مینو کے ذریعے آلہ کنٹرول کریں"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ایکسیسبیلٹی مینو کی ترتیبات"</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"اپنے آلے کو کنٹرول کرنے کے لیے ایکسیسبیلٹی مینیو ایک بڑا آن اسکرین مینیو فراہم کرتا ہے۔ آپ اپنا آلہ مقفل، والیوم اور چمک کو کنٹرول، اسکرین شاٹ لینے کے ساتھ اور مزید بہت کچھ کر سکتے ہیں۔"</string>
+    <string name="accessibility_menu_summary" msgid="340071398148208130">"بڑے مینیو کے ذریعے آلہ کنٹرول کریں"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"ایکسیسبیلٹی مینیو کی ترتیبات"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"بڑے بٹنز"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ایکسیسبیلٹی مینو بٹنز کا سائز بڑھائیں"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"ایکسیسبیلٹی مینیو بٹنز کا سائز بڑھائیں"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"مدد"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"چمک %% <xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"موسیقی کا والیوم %% <xliff:g id="PERCENTAGE">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-uz/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-uz/strings.xml
index 63af1b1..b10c953 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-uz/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-uz/strings.xml
@@ -1,17 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Maxsus imkoniyatlar menyusi"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Maxsus imkoniyatlar menyusi telefoningizni boshqarish uchun katta menyuni taqdim etadi. Bu menyu orqali telefonni qulflash, ovoz balandligi va yorqinlikni boshqarish, skrinshotlar olish kabi amallarni bajarish mumkin."</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Qulayliklar menyusi"</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Qulayliklar menyusi telefoningizni boshqarish uchun katta menyuni taqdim etadi. Bu menyu orqali telefonni qulflash, ovoz balandligi va yorqinlikni boshqarish, skrinshotlar olish kabi amallarni bajarish mumkin."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
-    <string name="a11y_settings_label" msgid="3977714687248445050">"Maxsus imkoniyatlar sozlamalari"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Tovush balandligi"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Tovush balandligi tugmalari"</string>
+    <string name="assistant_utterance" msgid="65509599221141377">"Assistent"</string>
+    <string name="a11y_settings_label" msgid="3977714687248445050">"Qulayliklar sozlamalari"</string>
     <string name="power_label" msgid="7699720321491287839">"Quvvat"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Quvvat parametrlari"</string>
-    <string name="recent_apps_label" msgid="6583276995616385847">"Yaqinda ishlatilgan ilovalar"</string>
+    <string name="recent_apps_label" msgid="6583276995616385847">"Oxirgi ilovalar"</string>
     <string name="lockscreen_label" msgid="648347953557887087">"Ekran qulfi"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"Tezkor sozlamalar"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Bildirishnomalar"</string>
@@ -23,11 +20,11 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"Yorqinlikni pasaytirish"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Avvalgi ekranni ochish"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Keyingi ekranni ochish"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"Maxsus imkoniyatlar menyusi telefoningizni boshqarish uchun katta menyuni taqdim etadi. Bu menyu orqali telefonni qulflash, ovoz balandligi va yorqinlikni boshqarish, skrinshotlar olish kabi amallarni bajarish mumkin."</string>
-    <string name="accessibility_menu_summary" msgid="340071398148208130">"Katta menyu orqali qurilmani boshqarish"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Maxsus imkoniyatlar menyusi sozlamalari"</string>
-    <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Katta tugmalar"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Maxsus imkoniyatlar menyusi tugmalarini kattalashtirish"</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"Qulayliklar menyusi telefoningizni boshqarish uchun katta menyuni taqdim etadi. Bu menyu orqali telefonni qulflash, ovoz balandligi va yorqinlikni boshqarish, skrinshotlar olish kabi amallarni bajarish mumkin."</string>
+    <string name="accessibility_menu_summary" msgid="340071398148208130">"Qurilmani yirik menyu orqali boshqarish"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Qulayliklar menyusi sozlamalari"</string>
+    <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Yirik tugmalar"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Qulayliklar menyusi tugmalarini kattalashtirish"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Yordam"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Yorqinlik: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Musiqa tovushi balandligi: <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-vi/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-vi/strings.xml
index e22a9ab..f0112262 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-vi/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-vi/strings.xml
@@ -2,13 +2,10 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Trình đơn hỗ trợ tiếp cận"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Menu Hỗ trợ tiếp cận cung cấp một trình đơn lớn trên màn hình dùng để điều khiển thiết bị. Bạn có thể khóa thiết bị, điều chỉnh âm lượng và độ sáng, chụp ảnh màn hình và nhiều chức năng khác."</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"Trình đơn hỗ trợ tiếp cận cung cấp một trình đơn lớn trên màn hình dùng để điều khiển thiết bị. Bạn có thể khóa thiết bị, điều chỉnh âm lượng và độ sáng, chụp ảnh màn hình và thực hiện nhiều chức năng khác."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Trợ lý"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Trợ lý"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Cài đặt hỗ trợ tiếp cận"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Âm lượng"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Điều khiển âm lượng"</string>
     <string name="power_label" msgid="7699720321491287839">"Nguồn"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Tùy chọn nút Nguồn"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"Ứng dụng gần đây"</string>
@@ -23,11 +20,11 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"Giảm độ sáng"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Chuyển đến màn hình trước"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Chuyển đến màn hình tiếp theo"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"Menu Hỗ trợ tiếp cận cung cấp một trình đơn lớn trên màn hình dùng để điều khiển thiết bị. Bạn có thể khóa thiết bị, điều chỉnh âm lượng và độ sáng, chụp ảnh màn hình và nhiều việc khác."</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"Trình đơn hỗ trợ tiếp cận cung cấp một trình đơn lớn trên màn hình dùng để điều khiển thiết bị. Bạn có thể khóa thiết bị, điều chỉnh âm lượng và độ sáng, chụp ảnh màn hình và thực hiện nhiều chức năng khác."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Điều khiển thiết bị qua trình đơn lớn"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Cài đặt Trình đơn Hỗ trợ tiếp cận"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Cài đặt Trình đơn hỗ trợ tiếp cận"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Nút lớn"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Tăng kích thước của các nút trong Trình đơn Hỗ trợ tiếp cận"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Tăng kích thước của các nút trong Trình đơn hỗ trợ tiếp cận"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Trợ giúp"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"Độ sáng <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"Âm lượng nhạc <xliff:g id="PERCENTAGE">%1$s</xliff:g> %%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rCN/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rCN/strings.xml
index e34f8d5..c896c77 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rCN/strings.xml
@@ -2,13 +2,10 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"无障碍功能菜单"</string>
-    <string name="accessibility_menu_intro" msgid="3164193281544042394">"无障碍功能菜单可在屏幕上提供一个大号的菜单,供您控制设备,比如锁定设备、控制音量和亮度、截取屏幕快照等。"</string>
+    <string name="accessibility_menu_intro" msgid="3164193281544042394">"无障碍功能菜单是一个放大的菜单,方便您通过屏幕控制设备,完成锁屏、控制音量和亮度、截图等操作。"</string>
     <string name="assistant_label" msgid="6796392082252272356">"Google 助理"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Google 助理"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"无障碍设置"</string>
-    <string name="volume_label" msgid="3682221827627150574">"音量"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"音量控件"</string>
     <string name="power_label" msgid="7699720321491287839">"电源"</string>
     <string name="power_utterance" msgid="7444296686402104807">"电源选项"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"最近用过的应用"</string>
@@ -23,11 +20,11 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"调低亮度"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"转到上一个屏幕"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"转到下一个屏幕"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"无障碍功能菜单可在屏幕上提供一个大号的菜单,供您控制设备,比如锁定设备、控制音量和亮度、截取屏幕快照等。"</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"无障碍功能菜单是一个放大的菜单,方便您通过屏幕控制设备,完成锁屏、控制音量和亮度、截图等操作。"</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"使用大菜单控制设备"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"无障碍功能菜单设置"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"大按钮"</string>
-    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"增大无障碍功能菜单按钮的大小"</string>
+    <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"放大无障碍功能菜单按钮"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"帮助"</string>
     <string name="brightness_percentage_label" msgid="7391554573977867369">"亮度:<xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
     <string name="music_volume_percentage_label" msgid="398635599662604706">"音乐音量:<xliff:g id="PERCENTAGE">%1$s</xliff:g>%%"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rHK/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rHK/strings.xml
index e08e52f3..9f4033c 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rHK/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"無障礙功能選單"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"「無障礙功能選單」是螢幕上的大型選單,用來控制裝置,方便您鎖定裝置、控制音量和亮度、擷取螢幕畫面及執行其他功能。"</string>
     <string name="assistant_label" msgid="6796392082252272356">"Google 助理"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Google 助理"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"無障礙功能設定"</string>
-    <string name="volume_label" msgid="3682221827627150574">"音量"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"音量控制項"</string>
     <string name="power_label" msgid="7699720321491287839">"電源"</string>
     <string name="power_utterance" msgid="7444296686402104807">"電源選項"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"最近使用的應用程式"</string>
@@ -23,7 +20,7 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"調暗亮度"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"前往上一個畫面"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"前往下一個畫面"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"「無障礙功能選單」是螢幕上的大型選單,用來控制裝置,方便您鎖定裝置、控制音量和亮度、擷取螢幕畫面及執行其他功能。"</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"「無障礙功能選單」是螢幕上的大型選單,用來控制裝置,方便您鎖定裝置、控制音量和亮度、擷取螢幕截圖及執行其他功能。"</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"透過大型選單控制裝置"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"無障礙功能選單設定"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"大按鈕"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rTW/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rTW/strings.xml
index a6dfe71..40c961c 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rTW/strings.xml
@@ -4,11 +4,8 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"無障礙選單"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"無障礙工具選單是螢幕上的大型選單,可用來操控裝置,方便你鎖定裝置、控制音量和亮度、擷取螢幕畫面,以及執行其他功能。"</string>
     <string name="assistant_label" msgid="6796392082252272356">"Google 助理"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"Google 助理"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"無障礙設定"</string>
-    <string name="volume_label" msgid="3682221827627150574">"音量"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"音量控制項"</string>
     <string name="power_label" msgid="7699720321491287839">"電源"</string>
     <string name="power_utterance" msgid="7444296686402104807">"電源選項"</string>
     <string name="recent_apps_label" msgid="6583276995616385847">"最近使用的應用程式"</string>
@@ -23,7 +20,7 @@
     <string name="brightness_down_label" msgid="7115662941913272072">"調低亮度"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"返回上一個畫面"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"前往下一個畫面"</string>
-    <string name="accessibility_menu_description" msgid="4458354794093858297">"無障礙工具選單是螢幕上的大型選單,可用來操控裝置,方便你鎖定裝置、控制音量和亮度、擷取螢幕畫面,以及執行其他功能。"</string>
+    <string name="accessibility_menu_description" msgid="4458354794093858297">"無障礙選單是一種顯示在螢幕上的大型選單,可用來操控裝置的各項功能,方便你鎖定裝置、調整音量和亮度、擷取螢幕畫面,以及執行其他功能。"</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"透過大型選單操控裝置"</string>
     <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"無障礙選單設定"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"大型按鈕"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zu/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zu/strings.xml
index bf70957..2b92ab1 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zu/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zu/strings.xml
@@ -4,14 +4,11 @@
     <string name="accessibility_menu_service_name" msgid="730136711554740131">"Imenyu yokufinyeleleka"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Imenyu yokufinyelela inikezela ngemenyu enkulu esesikrinini ukuze ulawule idivayisi yakho. Ungakhiya idivayisi yakho, ulawule ivolumu nokukhanya, uthathe izithombe-skrini, nokuningi."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Umsizi"</string>
-    <!-- no translation found for assistant_utterance (65509599221141377) -->
-    <skip />
+    <string name="assistant_utterance" msgid="65509599221141377">"I-Assistant"</string>
     <string name="a11y_settings_label" msgid="3977714687248445050">"Izilungiselelo zokufinyelela"</string>
-    <string name="volume_label" msgid="3682221827627150574">"Ivolumu"</string>
-    <string name="volume_utterance" msgid="408291570329066290">"Izilawuli zevolumu"</string>
     <string name="power_label" msgid="7699720321491287839">"Amandla"</string>
     <string name="power_utterance" msgid="7444296686402104807">"Izinketho zamandla"</string>
-    <string name="recent_apps_label" msgid="6583276995616385847">"Izinhlelo zokusebenza zakamuva"</string>
+    <string name="recent_apps_label" msgid="6583276995616385847">"Ama-app akamuva"</string>
     <string name="lockscreen_label" msgid="648347953557887087">"Khiya isikrini"</string>
     <string name="quick_settings_label" msgid="2999117381487601865">"Izilungiselelo ezisheshayo"</string>
     <string name="notifications_label" msgid="6829741046963013567">"Izaziso"</string>
@@ -19,13 +16,13 @@
     <string name="screenshot_utterance" msgid="1430760563401895074">"Thatha isithombe-skrini"</string>
     <string name="volume_up_label" msgid="8592766918780362870">"Ivolumu phezulu"</string>
     <string name="volume_down_label" msgid="8574981863656447346">"Ivolumu iphansi"</string>
-    <string name="brightness_up_label" msgid="8010753822854544846">"Ukukhanya kuphezulu"</string>
-    <string name="brightness_down_label" msgid="7115662941913272072">"Ukukhanya kuphansi"</string>
+    <string name="brightness_up_label" msgid="8010753822854544846">"Ukukhanya kunyukile"</string>
+    <string name="brightness_down_label" msgid="7115662941913272072">"Ukukhanya kwehlile"</string>
     <string name="previous_button_content_description" msgid="840869171117765966">"Hamba kusikrini sangaphambilini"</string>
     <string name="next_button_content_description" msgid="6810058269847364406">"Iya kusikrini esilandelayo"</string>
     <string name="accessibility_menu_description" msgid="4458354794093858297">"Imenyu yokufinyelela inikezela ngemenyu enkulu esesikrinini ukuze ulawule idivayisi yakho. Ungakhiya idivayisi yakho, ulawule ivolumu nokukhanya, uthathe izithombe-skrini, nokuningi."</string>
     <string name="accessibility_menu_summary" msgid="340071398148208130">"Lawula idivayisi ngemenyu enkulu"</string>
-    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Izilungiselelo zemenyu yokufinyelela"</string>
+    <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Amasethingi Emenyu Yokufinyeleleka"</string>
     <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Izinkinobho ezinkulu"</string>
     <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Khulisa usayizi wezinkinobho zemenyu yokufinyelela"</string>
     <string name="pref_help_title" msgid="6871558837025010641">"Usizo"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/activity/A11yMenuSettingsActivity.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/activity/A11yMenuSettingsActivity.java
index 4b6f9a4..02d279f 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/activity/A11yMenuSettingsActivity.java
+++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/activity/A11yMenuSettingsActivity.java
@@ -24,7 +24,9 @@
 import android.os.Bundle;
 import android.provider.Browser;
 import android.provider.Settings;
+import android.view.View;
 
+import androidx.annotation.Nullable;
 import androidx.fragment.app.FragmentActivity;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceFragmentCompat;
@@ -56,6 +58,13 @@
             initializeHelpAndFeedbackPreference();
         }
 
+        @Override
+        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+            super.onViewCreated(view, savedInstanceState);
+            view.setLayoutDirection(
+                    view.getResources().getConfiguration().getLayoutDirection());
+        }
+
         /**
          * Returns large buttons settings state.
          *
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java
index a25790a..5b7bbe8 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java
+++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java
@@ -194,13 +194,15 @@
     /** Updates a11y menu layout position by configuring layout params. */
     private void updateLayoutPosition() {
         final Display display = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
-        final int orientation = mService.getResources().getConfiguration().orientation;
+        final Configuration configuration = mService.getResources().getConfiguration();
+        final int orientation = configuration.orientation;
         if (display != null && orientation == Configuration.ORIENTATION_LANDSCAPE) {
+            final boolean ltr = configuration.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
             switch (display.getRotation()) {
-                case Surface.ROTATION_90:
+                case Surface.ROTATION_0:
                 case Surface.ROTATION_180:
                     mLayoutParameter.gravity =
-                            Gravity.END | Gravity.BOTTOM
+                            (ltr ? Gravity.END : Gravity.START) | Gravity.BOTTOM
                                     | Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL;
                     mLayoutParameter.width = WindowManager.LayoutParams.WRAP_CONTENT;
                     mLayoutParameter.height = WindowManager.LayoutParams.MATCH_PARENT;
@@ -208,10 +210,10 @@
                     mLayoutParameter.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
                     mLayout.setBackgroundResource(R.drawable.shadow_90deg);
                     break;
-                case Surface.ROTATION_0:
+                case Surface.ROTATION_90:
                 case Surface.ROTATION_270:
                     mLayoutParameter.gravity =
-                            Gravity.START | Gravity.BOTTOM
+                            (ltr ? Gravity.START : Gravity.END) | Gravity.BOTTOM
                                     | Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL;
                     mLayoutParameter.width = WindowManager.LayoutParams.WRAP_CONTENT;
                     mLayoutParameter.height = WindowManager.LayoutParams.MATCH_PARENT;
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/RemoteTransitionAdapter.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/RemoteTransitionAdapter.kt
index 03e1e66..197b217 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/RemoteTransitionAdapter.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/RemoteTransitionAdapter.kt
@@ -384,8 +384,15 @@
         }
 
         @JvmStatic
-        fun adaptRemoteAnimation(adapter: RemoteAnimationAdapter): RemoteTransition {
-            return RemoteTransition(adaptRemoteRunner(adapter.runner), adapter.callingApplication)
+        fun adaptRemoteAnimation(
+            adapter: RemoteAnimationAdapter,
+            debugName: String
+        ): RemoteTransition {
+            return RemoteTransition(
+                adaptRemoteRunner(adapter.runner),
+                adapter.callingApplication,
+                debugName
+            )
         }
     }
 
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt
index e73afe7..a7e95b5 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt
@@ -33,6 +33,7 @@
 import com.android.systemui.plugins.PluginListener
 import com.android.systemui.plugins.PluginManager
 import com.android.systemui.util.Assert
+import java.util.concurrent.ConcurrentHashMap
 import java.util.concurrent.atomic.AtomicBoolean
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
@@ -41,6 +42,18 @@
 private const val DEBUG = true
 private val KEY_TIMESTAMP = "appliedTimestamp"
 
+private fun <TKey, TVal> ConcurrentHashMap<TKey, TVal>.concurrentGetOrPut(
+    key: TKey,
+    value: TVal,
+    onNew: () -> Unit
+): TVal {
+    val result = this.putIfAbsent(key, value)
+    if (result == null) {
+        onNew()
+    }
+    return result ?: value
+}
+
 /** ClockRegistry aggregates providers and plugins */
 open class ClockRegistry(
     val context: Context,
@@ -64,7 +77,7 @@
         fun onAvailableClocksChanged() {}
     }
 
-    private val availableClocks = mutableMapOf<ClockId, ClockInfo>()
+    private val availableClocks = ConcurrentHashMap<ClockId, ClockInfo>()
     private val clockChangeListeners = mutableListOf<ClockChangeListener>()
     private val settingObserver =
         object : ContentObserver(null) {
@@ -92,18 +105,12 @@
                 var isClockListChanged = false
                 for (clock in plugin.getClocks()) {
                     val id = clock.clockId
-                    var isNew = false
                     val info =
-                        availableClocks.getOrPut(id) {
-                            isNew = true
-                            ClockInfo(clock, plugin, manager)
+                        availableClocks.concurrentGetOrPut(id, ClockInfo(clock, plugin, manager)) {
+                            isClockListChanged = true
+                            onConnected(id)
                         }
 
-                    if (isNew) {
-                        isClockListChanged = true
-                        onConnected(id)
-                    }
-
                     if (manager != info.manager) {
                         Log.e(
                             TAG,
@@ -254,10 +261,8 @@
             return
         }
 
-        android.util.Log.e("HAWK", "triggerOnCurrentClockChanged")
         scope.launch(mainDispatcher) {
             assertMainThread()
-            android.util.Log.e("HAWK", "isClockChanged")
             isClockChanged.set(false)
             clockChangeListeners.forEach { it.onCurrentClockChanged() }
         }
@@ -270,10 +275,8 @@
             return
         }
 
-        android.util.Log.e("HAWK", "triggerOnAvailableClocksChanged")
         scope.launch(mainDispatcher) {
             assertMainThread()
-            android.util.Log.e("HAWK", "isClockListChanged")
             isClockListChanged.set(false)
             clockChangeListeners.forEach { it.onAvailableClocksChanged() }
         }
@@ -356,7 +359,7 @@
     }
 
     private var isVerifying = AtomicBoolean(false)
-    private fun verifyLoadedProviders() {
+    fun verifyLoadedProviders() {
         val shouldSchedule = isVerifying.compareAndSet(false, true)
         if (!shouldSchedule) {
             return
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
index 4df7a44..3ec3b5c 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
@@ -25,8 +25,10 @@
 import androidx.annotation.VisibleForTesting
 import com.android.systemui.customization.R
 import com.android.systemui.plugins.ClockAnimations
+import com.android.systemui.plugins.ClockConfig
 import com.android.systemui.plugins.ClockController
 import com.android.systemui.plugins.ClockEvents
+import com.android.systemui.plugins.ClockFaceConfig
 import com.android.systemui.plugins.ClockFaceController
 import com.android.systemui.plugins.ClockFaceEvents
 import com.android.systemui.plugins.ClockSettings
@@ -63,6 +65,8 @@
     override lateinit var animations: DefaultClockAnimations
         private set
 
+    override val config = ClockConfig(hasCustomPositionUpdatedAnimation = true)
+
     init {
         val parent = FrameLayout(ctx)
         smallClock =
@@ -103,6 +107,8 @@
         private var isRegionDark = false
         protected var targetRegion: Rect? = null
 
+        override val config = ClockFaceConfig()
+
         override var logBuffer: LogBuffer?
             get() = view.logBuffer
             set(value) {
@@ -254,9 +260,6 @@
         override fun onPositionUpdated(fromRect: Rect, toRect: Rect, fraction: Float) {
             largeClock.moveForSplitShade(fromRect, toRect, fraction)
         }
-
-        override val hasCustomPositionUpdatedAnimation: Boolean
-            get() = true
     }
 
     class AnimationState(
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt b/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt
index db88b59..204bac8 100644
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt
+++ b/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt
@@ -23,6 +23,8 @@
 import com.android.internal.graphics.cam.Cam
 import com.android.internal.graphics.cam.CamUtils
 import kotlin.math.absoluteValue
+import kotlin.math.max
+import kotlin.math.min
 import kotlin.math.roundToInt
 
 const val TAG = "ColorScheme"
@@ -35,12 +37,12 @@
     fun get(sourceColor: Cam): Double
 
     /**
-     * Given a hue, and a mapping of hues to hue rotations, find which hues in the mapping the
-     * hue fall betweens, and use the hue rotation of the lower hue.
+     * Given a hue, and a mapping of hues to hue rotations, find which hues in the mapping the hue
+     * fall betweens, and use the hue rotation of the lower hue.
      *
      * @param sourceHue hue of source color
-     * @param hueAndRotations list of pairs, where the first item in a pair is a hue, and the
-     *    second item in the pair is a hue rotation that should be applied
+     * @param hueAndRotations list of pairs, where the first item in a pair is a hue, and the second
+     *   item in the pair is a hue rotation that should be applied
      */
     fun getHueRotation(sourceHue: Float, hueAndRotations: List<Pair<Int, Int>>): Double {
         val sanitizedSourceHue = (if (sourceHue < 0 || sourceHue >= 360) 0 else sourceHue).toFloat()
@@ -48,8 +50,9 @@
             val thisHue = hueAndRotations[i].first.toFloat()
             val nextHue = hueAndRotations[i + 1].first.toFloat()
             if (thisHue <= sanitizedSourceHue && sanitizedSourceHue < nextHue) {
-                return ColorScheme.wrapDegreesDouble(sanitizedSourceHue.toDouble() +
-                        hueAndRotations[i].second)
+                return ColorScheme.wrapDegreesDouble(
+                    sanitizedSourceHue.toDouble() + hueAndRotations[i].second
+                )
             }
         }
 
@@ -78,8 +81,18 @@
 }
 
 internal class HueVibrantSecondary() : Hue {
-    val hueToRotations = listOf(Pair(0, 18), Pair(41, 15), Pair(61, 10), Pair(101, 12),
-            Pair(131, 15), Pair(181, 18), Pair(251, 15), Pair(301, 12), Pair(360, 12))
+    val hueToRotations =
+        listOf(
+            Pair(0, 18),
+            Pair(41, 15),
+            Pair(61, 10),
+            Pair(101, 12),
+            Pair(131, 15),
+            Pair(181, 18),
+            Pair(251, 15),
+            Pair(301, 12),
+            Pair(360, 12)
+        )
 
     override fun get(sourceColor: Cam): Double {
         return getHueRotation(sourceColor.hue, hueToRotations)
@@ -87,8 +100,18 @@
 }
 
 internal class HueVibrantTertiary() : Hue {
-    val hueToRotations = listOf(Pair(0, 35), Pair(41, 30), Pair(61, 20), Pair(101, 25),
-            Pair(131, 30), Pair(181, 35), Pair(251, 30), Pair(301, 25), Pair(360, 25))
+    val hueToRotations =
+        listOf(
+            Pair(0, 35),
+            Pair(41, 30),
+            Pair(61, 20),
+            Pair(101, 25),
+            Pair(131, 30),
+            Pair(181, 35),
+            Pair(251, 30),
+            Pair(301, 25),
+            Pair(360, 25)
+        )
 
     override fun get(sourceColor: Cam): Double {
         return getHueRotation(sourceColor.hue, hueToRotations)
@@ -96,8 +119,18 @@
 }
 
 internal class HueExpressiveSecondary() : Hue {
-    val hueToRotations = listOf(Pair(0, 45), Pair(21, 95), Pair(51, 45), Pair(121, 20),
-            Pair(151, 45), Pair(191, 90), Pair(271, 45), Pair(321, 45), Pair(360, 45))
+    val hueToRotations =
+        listOf(
+            Pair(0, 45),
+            Pair(21, 95),
+            Pair(51, 45),
+            Pair(121, 20),
+            Pair(151, 45),
+            Pair(191, 90),
+            Pair(271, 45),
+            Pair(321, 45),
+            Pair(360, 45)
+        )
 
     override fun get(sourceColor: Cam): Double {
         return getHueRotation(sourceColor.hue, hueToRotations)
@@ -105,8 +138,18 @@
 }
 
 internal class HueExpressiveTertiary() : Hue {
-    val hueToRotations = listOf(Pair(0, 120), Pair(21, 120), Pair(51, 20), Pair(121, 45),
-            Pair(151, 20), Pair(191, 15), Pair(271, 20), Pair(321, 120), Pair(360, 120))
+    val hueToRotations =
+        listOf(
+            Pair(0, 120),
+            Pair(21, 120),
+            Pair(51, 20),
+            Pair(121, 45),
+            Pair(151, 20),
+            Pair(191, 15),
+            Pair(271, 20),
+            Pair(321, 120),
+            Pair(360, 120)
+        )
 
     override fun get(sourceColor: Cam): Double {
         return getHueRotation(sourceColor.hue, hueToRotations)
@@ -115,13 +158,18 @@
 
 internal interface Chroma {
     fun get(sourceColor: Cam): Double
+
+    companion object {
+        val MAX_VALUE = 120.0
+        val MIN_VALUE = 0.0
+    }
 }
 
 internal class ChromaMaxOut : Chroma {
     override fun get(sourceColor: Cam): Double {
         // Intentionally high. Gamut mapping from impossible HCT to sRGB will ensure that
         // the maximum chroma is reached, even if lower than this constant.
-        return 130.0
+        return Chroma.MAX_VALUE + 10.0
     }
 }
 
@@ -131,6 +179,23 @@
     }
 }
 
+internal class ChromaAdd(val amount: Double) : Chroma {
+    override fun get(sourceColor: Cam): Double {
+        return sourceColor.chroma + amount
+    }
+}
+
+internal class ChromaBound(
+    val baseChroma: Chroma,
+    val minVal: Double,
+    val maxVal: Double,
+) : Chroma {
+    override fun get(sourceColor: Cam): Double {
+        val result = baseChroma.get(sourceColor)
+        return min(max(result, minVal), maxVal)
+    }
+}
+
 internal class ChromaConstant(val chroma: Double) : Chroma {
     override fun get(sourceColor: Cam): Double {
         return chroma
@@ -149,109 +214,173 @@
         val chroma = chroma.get(sourceColor)
         return Shades.of(hue.toFloat(), chroma.toFloat()).toList()
     }
+
+    fun getAtTone(sourceColor: Cam, tone: Float): Int {
+        val hue = hue.get(sourceColor)
+        val chroma = chroma.get(sourceColor)
+        return ColorUtils.CAMToColor(hue.toFloat(), chroma.toFloat(), (1000f - tone) / 10f)
+    }
 }
 
 internal class CoreSpec(
-        val a1: TonalSpec,
-        val a2: TonalSpec,
-        val a3: TonalSpec,
-        val n1: TonalSpec,
-        val n2: TonalSpec
+    val a1: TonalSpec,
+    val a2: TonalSpec,
+    val a3: TonalSpec,
+    val n1: TonalSpec,
+    val n2: TonalSpec
 )
 
 enum class Style(internal val coreSpec: CoreSpec) {
-    SPRITZ(CoreSpec(
+    SPRITZ(
+        CoreSpec(
             a1 = TonalSpec(HueSource(), ChromaConstant(12.0)),
             a2 = TonalSpec(HueSource(), ChromaConstant(8.0)),
             a3 = TonalSpec(HueSource(), ChromaConstant(16.0)),
             n1 = TonalSpec(HueSource(), ChromaConstant(2.0)),
             n2 = TonalSpec(HueSource(), ChromaConstant(2.0))
-    )),
-    TONAL_SPOT(CoreSpec(
+        )
+    ),
+    TONAL_SPOT(
+        CoreSpec(
             a1 = TonalSpec(HueSource(), ChromaConstant(36.0)),
             a2 = TonalSpec(HueSource(), ChromaConstant(16.0)),
             a3 = TonalSpec(HueAdd(60.0), ChromaConstant(24.0)),
             n1 = TonalSpec(HueSource(), ChromaConstant(6.0)),
             n2 = TonalSpec(HueSource(), ChromaConstant(8.0))
-    )),
-    VIBRANT(CoreSpec(
+        )
+    ),
+    VIBRANT(
+        CoreSpec(
             a1 = TonalSpec(HueSource(), ChromaMaxOut()),
             a2 = TonalSpec(HueVibrantSecondary(), ChromaConstant(24.0)),
             a3 = TonalSpec(HueVibrantTertiary(), ChromaConstant(32.0)),
             n1 = TonalSpec(HueSource(), ChromaConstant(10.0)),
             n2 = TonalSpec(HueSource(), ChromaConstant(12.0))
-    )),
-    EXPRESSIVE(CoreSpec(
+        )
+    ),
+    EXPRESSIVE(
+        CoreSpec(
             a1 = TonalSpec(HueAdd(240.0), ChromaConstant(40.0)),
             a2 = TonalSpec(HueExpressiveSecondary(), ChromaConstant(24.0)),
             a3 = TonalSpec(HueExpressiveTertiary(), ChromaConstant(32.0)),
             n1 = TonalSpec(HueAdd(15.0), ChromaConstant(8.0)),
             n2 = TonalSpec(HueAdd(15.0), ChromaConstant(12.0))
-    )),
-    RAINBOW(CoreSpec(
+        )
+    ),
+    RAINBOW(
+        CoreSpec(
             a1 = TonalSpec(HueSource(), ChromaConstant(48.0)),
             a2 = TonalSpec(HueSource(), ChromaConstant(16.0)),
             a3 = TonalSpec(HueAdd(60.0), ChromaConstant(24.0)),
             n1 = TonalSpec(HueSource(), ChromaConstant(0.0)),
             n2 = TonalSpec(HueSource(), ChromaConstant(0.0))
-    )),
-    FRUIT_SALAD(CoreSpec(
+        )
+    ),
+    FRUIT_SALAD(
+        CoreSpec(
             a1 = TonalSpec(HueSubtract(50.0), ChromaConstant(48.0)),
             a2 = TonalSpec(HueSubtract(50.0), ChromaConstant(36.0)),
             a3 = TonalSpec(HueSource(), ChromaConstant(36.0)),
             n1 = TonalSpec(HueSource(), ChromaConstant(10.0)),
             n2 = TonalSpec(HueSource(), ChromaConstant(16.0))
-    )),
-    CONTENT(CoreSpec(
+        )
+    ),
+    CONTENT(
+        CoreSpec(
             a1 = TonalSpec(HueSource(), ChromaSource()),
             a2 = TonalSpec(HueSource(), ChromaMultiple(0.33)),
             a3 = TonalSpec(HueSource(), ChromaMultiple(0.66)),
             n1 = TonalSpec(HueSource(), ChromaMultiple(0.0833)),
             n2 = TonalSpec(HueSource(), ChromaMultiple(0.1666))
-    )),
-    MONOCHROMATIC(CoreSpec(
+        )
+    ),
+    MONOCHROMATIC(
+        CoreSpec(
             a1 = TonalSpec(HueSource(), ChromaConstant(.0)),
             a2 = TonalSpec(HueSource(), ChromaConstant(.0)),
             a3 = TonalSpec(HueSource(), ChromaConstant(.0)),
             n1 = TonalSpec(HueSource(), ChromaConstant(.0)),
             n2 = TonalSpec(HueSource(), ChromaConstant(.0))
-    )),
+        )
+    ),
+    CLOCK(
+        CoreSpec(
+            a1 = TonalSpec(HueSource(), ChromaBound(ChromaSource(), 20.0, Chroma.MAX_VALUE)),
+            a2 = TonalSpec(HueAdd(10.0), ChromaBound(ChromaMultiple(0.85), 17.0, 40.0)),
+            a3 = TonalSpec(HueAdd(20.0), ChromaBound(ChromaAdd(20.0), 50.0, Chroma.MAX_VALUE)),
+
+            // Not Used
+            n1 = TonalSpec(HueSource(), ChromaConstant(0.0)),
+            n2 = TonalSpec(HueSource(), ChromaConstant(0.0))
+        )
+    ),
+    CLOCK_VIBRANT(
+        CoreSpec(
+            a1 = TonalSpec(HueSource(), ChromaBound(ChromaSource(), 30.0, Chroma.MAX_VALUE)),
+            a2 = TonalSpec(HueAdd(20.0), ChromaBound(ChromaSource(), 30.0, Chroma.MAX_VALUE)),
+            a3 = TonalSpec(HueAdd(60.0), ChromaBound(ChromaSource(), 30.0, Chroma.MAX_VALUE)),
+
+            // Not Used
+            n1 = TonalSpec(HueSource(), ChromaConstant(0.0)),
+            n2 = TonalSpec(HueSource(), ChromaConstant(0.0))
+        )
+    )
 }
 
-class TonalPalette {
-    val shadeKeys = listOf(10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000)
-    val allShades: List<Int>
-    val allShadesMapped: Map<Int, Int>
+class TonalPalette
+internal constructor(
+    private val spec: TonalSpec,
+    seedColor: Int,
+) {
+    val seedCam: Cam = Cam.fromInt(seedColor)
+    val allShades: List<Int> = spec.shades(seedCam)
+    val allShadesMapped: Map<Int, Int> = SHADE_KEYS.zip(allShades).toMap()
     val baseColor: Int
 
-    internal constructor(spec: TonalSpec, seedColor: Int) {
-        val seedCam = Cam.fromInt(seedColor)
-        allShades = spec.shades(seedCam)
-        allShadesMapped = shadeKeys.zip(allShades).toMap()
-
+    init {
         val h = spec.hue.get(seedCam).toFloat()
         val c = spec.chroma.get(seedCam).toFloat()
         baseColor = ColorUtils.CAMToColor(h, c, CamUtils.lstarFromInt(seedColor))
     }
 
-    val s10: Int get() = this.allShades[0]
-    val s50: Int get() = this.allShades[1]
-    val s100: Int get() = this.allShades[2]
-    val s200: Int get() = this.allShades[3]
-    val s300: Int get() = this.allShades[4]
-    val s400: Int get() = this.allShades[5]
-    val s500: Int get() = this.allShades[6]
-    val s600: Int get() = this.allShades[7]
-    val s700: Int get() = this.allShades[8]
-    val s800: Int get() = this.allShades[9]
-    val s900: Int get() = this.allShades[10]
-    val s1000: Int get() = this.allShades[11]
+    // Dynamically computed tones across the full range from 0 to 1000
+    fun getAtTone(tone: Float) = spec.getAtTone(seedCam, tone)
+
+    // Predefined & precomputed tones
+    val s10: Int
+        get() = this.allShades[0]
+    val s50: Int
+        get() = this.allShades[1]
+    val s100: Int
+        get() = this.allShades[2]
+    val s200: Int
+        get() = this.allShades[3]
+    val s300: Int
+        get() = this.allShades[4]
+    val s400: Int
+        get() = this.allShades[5]
+    val s500: Int
+        get() = this.allShades[6]
+    val s600: Int
+        get() = this.allShades[7]
+    val s700: Int
+        get() = this.allShades[8]
+    val s800: Int
+        get() = this.allShades[9]
+    val s900: Int
+        get() = this.allShades[10]
+    val s1000: Int
+        get() = this.allShades[11]
+
+    companion object {
+        val SHADE_KEYS = listOf(10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000)
+    }
 }
 
 class ColorScheme(
-        @ColorInt val seed: Int,
-        val darkTheme: Boolean,
-        val style: Style = Style.TONAL_SPOT
+    @ColorInt val seed: Int,
+    val darkTheme: Boolean,
+    val style: Style = Style.TONAL_SPOT
 ) {
 
     val accent1: TonalPalette
@@ -260,16 +389,14 @@
     val neutral1: TonalPalette
     val neutral2: TonalPalette
 
-    constructor(@ColorInt seed: Int, darkTheme: Boolean) :
-            this(seed, darkTheme, Style.TONAL_SPOT)
+    constructor(@ColorInt seed: Int, darkTheme: Boolean) : this(seed, darkTheme, Style.TONAL_SPOT)
 
     @JvmOverloads
     constructor(
-            wallpaperColors: WallpaperColors,
-            darkTheme: Boolean,
-            style: Style = Style.TONAL_SPOT
-    ) :
-            this(getSeedColor(wallpaperColors, style != Style.CONTENT), darkTheme, style)
+        wallpaperColors: WallpaperColors,
+        darkTheme: Boolean,
+        style: Style = Style.TONAL_SPOT
+    ) : this(getSeedColor(wallpaperColors, style != Style.CONTENT), darkTheme, style)
 
     val allHues: List<TonalPalette>
         get() {
@@ -301,13 +428,14 @@
 
     init {
         val proposedSeedCam = Cam.fromInt(seed)
-        val seedArgb = if (seed == Color.TRANSPARENT) {
-            GOOGLE_BLUE
-        } else if (style != Style.CONTENT && proposedSeedCam.chroma < 5) {
-            GOOGLE_BLUE
-        } else {
-            seed
-        }
+        val seedArgb =
+            if (seed == Color.TRANSPARENT) {
+                GOOGLE_BLUE
+            } else if (style != Style.CONTENT && proposedSeedCam.chroma < 5) {
+                GOOGLE_BLUE
+            } else {
+                seed
+            }
 
         accent1 = TonalPalette(style.coreSpec.a1, seedArgb)
         accent2 = TonalPalette(style.coreSpec.a2, seedArgb)
@@ -316,19 +444,23 @@
         neutral2 = TonalPalette(style.coreSpec.n2, seedArgb)
     }
 
-    val shadeCount get() = this.accent1.allShades.size
+    val shadeCount
+        get() = this.accent1.allShades.size
+
+    val seedTone: Float
+        get() = 1000f - CamUtils.lstarFromInt(seed) * 10f
 
     override fun toString(): String {
         return "ColorScheme {\n" +
-                "  seed color: ${stringForColor(seed)}\n" +
-                "  style: $style\n" +
-                "  palettes: \n" +
-                "  ${humanReadable("PRIMARY", accent1.allShades)}\n" +
-                "  ${humanReadable("SECONDARY", accent2.allShades)}\n" +
-                "  ${humanReadable("TERTIARY", accent3.allShades)}\n" +
-                "  ${humanReadable("NEUTRAL", neutral1.allShades)}\n" +
-                "  ${humanReadable("NEUTRAL VARIANT", neutral2.allShades)}\n" +
-                "}"
+            "  seed color: ${stringForColor(seed)}\n" +
+            "  style: $style\n" +
+            "  palettes: \n" +
+            "  ${humanReadable("PRIMARY", accent1.allShades)}\n" +
+            "  ${humanReadable("SECONDARY", accent2.allShades)}\n" +
+            "  ${humanReadable("TERTIARY", accent3.allShades)}\n" +
+            "  ${humanReadable("NEUTRAL", neutral1.allShades)}\n" +
+            "  ${humanReadable("NEUTRAL VARIANT", neutral2.allShades)}\n" +
+            "}"
     }
 
     companion object {
@@ -356,8 +488,8 @@
         @JvmStatic
         @JvmOverloads
         fun getSeedColors(wallpaperColors: WallpaperColors, filter: Boolean = true): List<Int> {
-            val totalPopulation = wallpaperColors.allColors.values.reduce { a, b -> a + b }
-                    .toDouble()
+            val totalPopulation =
+                wallpaperColors.allColors.values.reduce { a, b -> a + b }.toDouble()
             val totalPopulationMeaningless = (totalPopulation == 0.0)
             if (totalPopulationMeaningless) {
                 // WallpaperColors with a population of 0 indicate the colors didn't come from
@@ -365,51 +497,56 @@
                 // secondary/tertiary colors.
                 //
                 // In this case, the colors are usually from a Live Wallpaper.
-                val distinctColors = wallpaperColors.mainColors.map {
-                    it.toArgb()
-                }.distinct().filter {
-                    if (!filter) {
-                        true
-                    } else {
-                        Cam.fromInt(it).chroma >= MIN_CHROMA
-                    }
-                }.toList()
+                val distinctColors =
+                    wallpaperColors.mainColors
+                        .map { it.toArgb() }
+                        .distinct()
+                        .filter {
+                            if (!filter) {
+                                true
+                            } else {
+                                Cam.fromInt(it).chroma >= MIN_CHROMA
+                            }
+                        }
+                        .toList()
                 if (distinctColors.isEmpty()) {
                     return listOf(GOOGLE_BLUE)
                 }
                 return distinctColors
             }
 
-            val intToProportion = wallpaperColors.allColors.mapValues {
-                it.value.toDouble() / totalPopulation
-            }
+            val intToProportion =
+                wallpaperColors.allColors.mapValues { it.value.toDouble() / totalPopulation }
             val intToCam = wallpaperColors.allColors.mapValues { Cam.fromInt(it.key) }
 
             // Get an array with 360 slots. A slot contains the percentage of colors with that hue.
             val hueProportions = huePopulations(intToCam, intToProportion, filter)
             // Map each color to the percentage of the image with its hue.
-            val intToHueProportion = wallpaperColors.allColors.mapValues {
-                val cam = intToCam[it.key]!!
-                val hue = cam.hue.roundToInt()
-                var proportion = 0.0
-                for (i in hue - 15..hue + 15) {
-                    proportion += hueProportions[wrapDegrees(i)]
+            val intToHueProportion =
+                wallpaperColors.allColors.mapValues {
+                    val cam = intToCam[it.key]!!
+                    val hue = cam.hue.roundToInt()
+                    var proportion = 0.0
+                    for (i in hue - 15..hue + 15) {
+                        proportion += hueProportions[wrapDegrees(i)]
+                    }
+                    proportion
                 }
-                proportion
-            }
             // Remove any inappropriate seed colors. For example, low chroma colors look grayscale
             // raising their chroma will turn them to a much louder color that may not have been
             // in the image.
-            val filteredIntToCam = if (!filter) intToCam else (intToCam.filter {
-                val cam = it.value
-                val proportion = intToHueProportion[it.key]!!
-                cam.chroma >= MIN_CHROMA &&
-                        (totalPopulationMeaningless || proportion > 0.01)
-            })
+            val filteredIntToCam =
+                if (!filter) intToCam
+                else
+                    (intToCam.filter {
+                        val cam = it.value
+                        val proportion = intToHueProportion[it.key]!!
+                        cam.chroma >= MIN_CHROMA &&
+                            (totalPopulationMeaningless || proportion > 0.01)
+                    })
             // Sort the colors by score, from high to low.
-            val intToScoreIntermediate = filteredIntToCam.mapValues {
-                score(it.value, intToHueProportion[it.key]!!)
-            }
+            val intToScoreIntermediate =
+                filteredIntToCam.mapValues { score(it.value, intToHueProportion[it.key]!!) }
             val intToScore = intToScoreIntermediate.entries.toMutableList()
             intToScore.sortByDescending { it.value }
 
@@ -423,11 +560,12 @@
                 seeds.clear()
                 for (entry in intToScore) {
                     val int = entry.key
-                    val existingSeedNearby = seeds.find {
-                        val hueA = intToCam[int]!!.hue
-                        val hueB = intToCam[it]!!.hue
-                        hueDiff(hueA, hueB) < i
-                    } != null
+                    val existingSeedNearby =
+                        seeds.find {
+                            val hueA = intToCam[int]!!.hue
+                            val hueB = intToCam[it]!!.hue
+                            hueDiff(hueA, hueB) < i
+                        } != null
                     if (existingSeedNearby) {
                         continue
                     }
@@ -489,22 +627,22 @@
         }
 
         private fun humanReadable(paletteName: String, colors: List<Int>): String {
-            return "$paletteName\n" + colors.map {
-                stringForColor(it)
-            }.joinToString(separator = "\n") { it }
+            return "$paletteName\n" +
+                colors.map { stringForColor(it) }.joinToString(separator = "\n") { it }
         }
 
         private fun score(cam: Cam, proportion: Double): Double {
             val proportionScore = 0.7 * 100.0 * proportion
-            val chromaScore = if (cam.chroma < ACCENT1_CHROMA) 0.1 * (cam.chroma - ACCENT1_CHROMA)
-            else 0.3 * (cam.chroma - ACCENT1_CHROMA)
+            val chromaScore =
+                if (cam.chroma < ACCENT1_CHROMA) 0.1 * (cam.chroma - ACCENT1_CHROMA)
+                else 0.3 * (cam.chroma - ACCENT1_CHROMA)
             return chromaScore + proportionScore
         }
 
         private fun huePopulations(
-                camByColor: Map<Int, Cam>,
-                populationByColor: Map<Int, Double>,
-                filter: Boolean = true
+            camByColor: Map<Int, Cam>,
+            populationByColor: Map<Int, Double>,
+            filter: Boolean = true
         ): List<Double> {
             val huePopulation = List(size = 360, init = { 0.0 }).toMutableList()
 
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt
index 0080517..322fc77 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt
@@ -63,6 +63,9 @@
     /** A large version of the clock, appropriate when a bigger viewport is available */
     val largeClock: ClockFaceController
 
+    /** Determines the way the hosting app should behave when rendering either clock face */
+    val config: ClockConfig
+
     /** Events that clocks may need to respond to */
     val events: ClockEvents
 
@@ -91,6 +94,9 @@
     /** View that renders the clock face */
     val view: View
 
+    /** Determines the way the hosting app should behave when rendering this clock face */
+    val config: ClockFaceConfig
+
     /** Events specific to this clock face */
     val events: ClockFaceEvents
 
@@ -141,14 +147,6 @@
      * 0.0 -> clock is scaled down in the shade; previewRatio is previewSize / screenSize
      */
     fun onPickerCarouselSwiping(swipingFraction: Float, previewRatio: Float) {}
-
-    /**
-     * Whether this clock has a custom position update animation. If true, the keyguard will call
-     * `onPositionUpdated` to notify the clock of a position update animation. If false, a default
-     * animation will be used (e.g. a simple translation).
-     */
-    val hasCustomPositionUpdatedAnimation
-        get() = false
 }
 
 /** Events that have specific data about the related face */
@@ -156,16 +154,12 @@
     /** Call every time tick */
     fun onTimeTick() {}
 
-    /** Expected interval between calls to onTimeTick. Can always reduce to PER_MINUTE in AOD. */
-    val tickRate: ClockTickRate
-        get() = ClockTickRate.PER_MINUTE
-
-    /** Call to check whether the clock consumes weather data */
-    val hasCustomWeatherDataDisplay: Boolean
-        get() = false
-
-    /** Region Darkness specific to the clock face */
-    fun onRegionDarknessChanged(isDark: Boolean) {}
+    /**
+     * Region Darkness specific to the clock face.
+     * - isRegionDark = dark theme -> clock should be light
+     * - !isRegionDark = light theme -> clock should be dark
+     */
+    fun onRegionDarknessChanged(isRegionDark: Boolean) {}
 
     /**
      * Call whenever font settings change. Pass in a target font size in pixels. The specific clock
@@ -196,6 +190,28 @@
     val name: String,
 )
 
+/** Render configuration for the full clock. Modifies the way systemUI behaves with this clock. */
+data class ClockConfig(
+    /**
+     * Whether this clock has a custom position update animation. If true, the keyguard will call
+     * `onPositionUpdated` to notify the clock of a position update animation. If false, a default
+     * animation will be used (e.g. a simple translation).
+     */
+    val hasCustomPositionUpdatedAnimation: Boolean = false,
+
+    /** True if the clock will react to tone changes in the seed color. */
+    val isReactiveToTone: Boolean = true,
+)
+
+/** Render configuration options for a clock face. Modifies the way SystemUI behaves. */
+data class ClockFaceConfig(
+    /** Expected interval between calls to onTimeTick. Can always reduce to PER_MINUTE in AOD. */
+    val tickRate: ClockTickRate = ClockTickRate.PER_MINUTE,
+
+    /** Call to check whether the clock consumes weather data */
+    val hasCustomWeatherDataDisplay: Boolean = false,
+)
+
 /** Structure for keeping clock-specific settings */
 @Keep
 data class ClockSettings(
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
index b49afee..4b94707 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
@@ -28,9 +28,10 @@
     <FrameLayout
         android:id="@+id/lockscreen_clock_view"
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_height="@dimen/small_clock_height"
         android:layout_alignParentStart="true"
         android:layout_alignParentTop="true"
+        android:clipChildren="false"
         android:paddingStart="@dimen/clock_padding_start"
         android:visibility="invisible" />
     <FrameLayout
diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml
index 9c8907f..526b654 100644
--- a/packages/SystemUI/res-keyguard/values-af/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-af/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Voer jou PIN in"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Voer jou patroon in"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Voer jou wagwoord in"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ongeldige kaart."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Gelaai"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laai tans draadloos"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Die e-SIM kan weens \'n fout nie gedeaktiveer word nie."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Verkeerde patroon"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Verkeerde wagwoord"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Verkeerde PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Probeer weer oor # sekonde.}other{Probeer weer oor # sekondes.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Voer SIM se PIN in."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Voer SIM se PIN vir \"<xliff:g id="CARRIER">%1$s</xliff:g>\" in."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM-PUK-bewerking het misluk!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Wissel invoermetode"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Vliegtuigmodus"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Patroon word vereis nadat toestel herbegin het"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN word vereis nadat toestel herbegin het"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Wagwoord word vereis nadat toestel herbegin het"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Gebruik eerder ’n patroon vir bykomende sekuriteit"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Gebruik eerder ’n PIN vir bykomende sekuriteit"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Gebruik eerder ’n wagwoord vir bykomende sekuriteit"</string>
diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml
index 4129f07..ae7e1f9 100644
--- a/packages/SystemUI/res-keyguard/values-am/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-am/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"የእርስዎን ፒን ያስገቡ"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"ሥርዓተ-ጥለትዎን ያስገቡ"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"ይለፍ ቃልዎን ያስገቡ"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ልክ ያልሆነ ካርድ።"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"ባትሪ ሞልቷል"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • በገመድ አልባ ኃይል በመሙላት ላይ"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"በአንድ ስህተት ምክንያት eSIM ሊሰናከል አልቻለም።"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"አስገባ"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"የተሳሳተ ሥርዓተ ጥለት"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"የተሳሳተ የይለፍ ቃል"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"የተሳሳተ ፒን"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{በ# ሰከንድ ውስጥ እንደገና ይሞክሩ።}one{በ# ሰከንድ ውስጥ እንደገና ይሞክሩ።}other{በ# ሰከንዶች ውስጥ እንደገና ይሞክሩ።}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"የሲም ፒን ያስገቡ።"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"የ«<xliff:g id="CARRIER">%1$s</xliff:g>» ሲም ፒን ያስገቡ።"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"የሲም PUK ክወና አልተሳካም!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"የግቤት ስልት ቀይር"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"የአውሮፕላን ሁነታ"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"መሣሪያ ዳግም ከጀመረ በኋላ ሥርዓተ ጥለት ያስፈልጋል"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"መሣሪያ ዳግም ከተነሳ በኋላ ፒን ያስፈልጋል"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"መሣሪያ ዳግም ከጀመረ በኋላ የይለፍ ቃል ያስፈልጋል"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ለተጨማሪ ደህንነት በምትኩ ስርዓተ ጥለት ይጠቀሙ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ለተጨማሪ ደህንነት በምትኩ ፒን ይጠቀሙ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ለተጨማሪ ደህንነት በምትኩ የይለፍ ቃል ይጠቀሙ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index b340d56..7720357 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"‏أدخل رقم التعريف الشخصي (PIN)"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"أدخل النقش"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"أدخل كلمة المرور"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"بطاقة غير صالحة."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"تم الشحن"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • جارٍ الشحن لاسلكيًا"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"‏يتعذّر إيقاف eSIM بسبب خطأ."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"النقش غير صحيح."</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"كلمة مرور غير صحيحة"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"رقم تعريف شخصي خاطئ"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{أعِد المحاولة خلال ثانية واحدة.}zero{أعِد المحاولة خلال # ثانية.}two{أعِد المحاولة خلال ثانيتين.}few{أعِد المحاولة خلال # ثوانٍ.}many{أعِد المحاولة خلال # ثانية.}other{أعِد المحاولة خلال # ثانية.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"‏أدخل رقم التعريف الشخصي لشريحة SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"‏أدخل رقم التعريف الشخصي لشريحة SIM التابعة للمشغّل \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"‏تعذّر إتمام عملية PUK لشريحة SIM"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"تبديل أسلوب الإدخال"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"وضع الطيران"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"يجب رسم النقش بعد إعادة تشغيل الجهاز"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"يجب إدخال رقم التعريف الشخصي بعد إعادة تشغيل الجهاز"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"يجب إدخال كلمة المرور بعد إعادة تشغيل الجهاز"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"لمزيد من الأمان، استخدِم النقش بدلاً من ذلك."</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"لمزيد من الأمان، أدخِل رقم التعريف الشخصي بدلاً من ذلك."</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"لمزيد من الأمان، أدخِل كلمة المرور بدلاً من ذلك."</string>
diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml
index cb446b9..4991d62 100644
--- a/packages/SystemUI/res-keyguard/values-as/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-as/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"আপোনাৰ পিন দিয়ক"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"আপোনাৰ আৰ্হি দিয়ক"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"আপোনাৰ পাছৱর্ড দিয়ক"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ব্যৱহাৰৰ অযোগ্য ছিম কাৰ্ড"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"চ্চার্জ কৰা হ’ল"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • বেতাঁৰৰ জৰিয়তে চাৰ্জ কৰি থকা হৈছে"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"এটা আসোঁৱাহৰ কাৰণে ই-ছিম অক্ষম কৰিব পৰা নাযায়।"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"এণ্টাৰ বুটাম"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"ভুল আৰ্হি"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"ভুল পাছৱৰ্ড"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"ভুল পিন"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{১ ছেকেণ্ডত আকৌ চেষ্টা কৰক।}one{# ছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।}other{# ছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"ছিমৰ পিন দিয়ক।"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"ৰ ছিমৰ পিন দিয়ক।"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"ছিম PUKৰ জৰিয়তে আনলক কৰিব পৰা নগ\'ল!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ইনপুট পদ্ধতি সলনি কৰক"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"এয়াৰপ্লে’ন ম’ড"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পাছত আৰ্হি দিয়াটো বাধ্যতামূলক"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পাছত পিন দিয়াটো বাধ্যতামূলক"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পাছত পাছৱৰ্ড দিয়াটো বাধ্যতামূলক"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"অতিৰিক্ত সুৰক্ষাৰ বাবে, ইয়াৰ পৰিৱৰ্তে আৰ্হি ব্যৱহাৰ কৰক"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"অতিৰিক্ত সুৰক্ষাৰ বাবে, ইয়াৰ পৰিৱৰ্তে পিন ব্যৱহাৰ কৰক"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"অতিৰিক্ত সুৰক্ষাৰ বাবে, ইয়াৰ পৰিৱৰ্তে পাছৱৰ্ড ব্যৱহাৰ কৰক"</string>
diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml
index 4339169..6861f6a 100644
--- a/packages/SystemUI/res-keyguard/values-az/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-az/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"PIN kodu daxil edin"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Modeli daxil edin"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Şifrənizi daxil edin"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Yanlış Kart."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Enerji yığılıb"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Simsiz şəkildə batareya yığır"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"eSIM xəta səbəbi ilə deaktiv edilmədi."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Daxil edin"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Yanlış model"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Yanlış parol"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Yanlış PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# saniyə sonra yenidən cəhd edin.}other{# saniyə sonra yenidən cəhd edin.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN\'ni daxil edin."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" üçün SIM PIN\'ni daxil edin."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK əməliyyatı alınmadı!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Daxiletmə metoduna keçin"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Təyyarə rejimi"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Cihaz yenidən başladıqdan sonra model tələb olunur"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Cihaz yeniden başladıqdan sonra PIN tələb olunur"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Cihaz yeniden başladıqdan sonra parol tələb olunur"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Əlavə təhlükəsizlik üçün modeldən istifadə edin"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Əlavə təhlükəsizlik üçün PIN istifadə edin"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Əlavə təhlükəsizlik üçün paroldan istifadə edin"</string>
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index 90a5a20..1b93803 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Unesite PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Unesite šablon"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Unesite lozinku"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Nevažeća kartica."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Napunjena je"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Bežično punjenje"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"eSIM ne može da se onemogući zbog greške."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Pogrešan šablon"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Pogrešna lozinka"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Pogrešan PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Probajte ponovo za # sekundu.}one{Probajte ponovo za # sekundu.}few{Probajte ponovo za # sekunde.}other{Probajte ponovo za # sekundi.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Unesite PIN za SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Unesite PIN za SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Radnja sa PUK kodom za SIM nije uspela!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Promeni metod unosa"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Režim rada u avionu"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Treba da unesete šablon kada se uređaj ponovo pokrene"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Treba da unesete PIN kada se uređaj ponovo pokrene"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Treba da unesete lozinku kada se uređaj ponovo pokrene"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Za dodatnu bezbednost koristite šablon"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Za dodatnu bezbednost koristite PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Za dodatnu bezbednost koristite lozinku"</string>
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index 8127353..98d2863 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Увядзіце PIN-код"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Увядзіце ўзор разблакіроўкі"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Увядзіце пароль"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Несапраўдная картка."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Зараджаны"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ідзе бесправадная зарадка"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Немагчыма адключыць eSIM-карту з-за памылкі."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Увесці"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Няправільны ўзор разблакіроўкі"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Няправільны пароль"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Няправільны PIN-код"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Паўтарыце спробу праз # секунду.}one{Паўтарыце спробу праз # секунду.}few{Паўтарыце спробу праз # секунды.}many{Паўтарыце спробу праз # секунд.}other{Паўтарыце спробу праз # секунды.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Увядзіце PIN-код SIM-карты."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Увядзіце PIN-код SIM-карты для \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Разблакіраваць SIM-карту PUK-кодам не атрымалася!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Пераключэнне рэжыму ўводу"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Рэжым палёту"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Пасля перазапуску прылады патрабуецца ўзор"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Пасля перазапуску прылады патрабуецца PIN-код"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Пасля перазапуску прылады патрабуецца пароль"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"У мэтах дадатковай бяспекі скарыстайце ўзор разблакіроўкі"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"У мэтах дадатковай бяспекі скарыстайце PIN-код"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"У мэтах дадатковай бяспекі скарыстайце пароль"</string>
diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml
index 3302189..7a2f5e9 100644
--- a/packages/SystemUI/res-keyguard/values-bg/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Въведете ПИН кода си"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Въведете фигурата си"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Въведете паролата си"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Картата е невалидна."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Заредена"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Зарежда се безжично"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Електронната SIM карта не може да бъде деактивирана поради грешка."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"„Enter“"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Грешна фигура"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Грешна парола"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Грешен ПИН код"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Опитайте отново след # секунда.}other{Опитайте отново след # секунди.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Въведете ПИН кода за SIM картата."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Въведете ПИН кода на SIM картата за „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Операцията с PUK кода за SIM картата не бе успешна!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Превключване на метода на въвеждане"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Самолет. режим"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"След рестартиране на устройството се изисква фигура"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"След рестартиране на устройството се изисква ПИН код"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"След рестартиране на устройството се изисква парола"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"За допълнителна сигурност използвайте фигура вместо това"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"За допълнителна сигурност използвайте ПИН код вместо това"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"За допълнителна сигурност използвайте парола вместо това"</string>
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index 414eb51..1d9bc2d 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"পিন লিখুন"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"প্যাটার্ন আঁকুন"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"পাসওয়ার্ড লিখুন"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ভুল কার্ড।"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"চার্জ হয়েছে"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ওয়্যারলেস পদ্ধতিতে চার্জ হচ্ছে"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"একটি সমস্যার কারণে ই-সিমটি বন্ধ করা যাচ্ছে না।"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"এন্টার"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"ভুল প্যাটার্ন"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"ভুল পাসওয়ার্ড"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"ভুল পিন"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# সেকেন্ডের মধ্যে আবার চেষ্টা করুন।}one{# সেকেন্ডের মধ্যে আবার চেষ্টা করুন।}other{# সেকেন্ডের মধ্যে আবার চেষ্টা করুন।}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"সিমের পিন লিখুন।"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" এর জন্য সিমের পিন লিখুন।"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"সিম PUK দিয়ে আনলক করা যায়নি!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ইনপুট পদ্ধতি পরিবর্তন করুন"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"বিমান মোড"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ডিভাইসটি পুনরায় চালু হওয়ার পর প্যাটার্নের প্রয়োজন হবে"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ডিভাইসটি পুনরায় চালু হওয়ার পর পিন প্রয়োজন হবে"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ডিভাইসটি পুনরায় চালু হওয়ার পর পাসওয়ার্ডের প্রয়োজন হবে"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"অতিরিক্ত সুরক্ষার জন্য, এর বদলে প্যাটার্ন ব্যবহার করুন"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"অতিরিক্ত সুরক্ষার জন্য, এর বদলে পিন ব্যবহার করুন"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"অতিরিক্ত সুরক্ষার জন্য, এর বদলে পাসওয়ার্ড ব্যবহার করুন"</string>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index 8b9eda2..6ae7b18 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Unesite svoj PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Unesite uzorak"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Unesite lozinku"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Nevažeća kartica."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Napunjeno"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Bežično punjenje"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"eSIM nije moguće onemogućiti zbog greške."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Pogrešan uzorak"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Pogrešna lozinka"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Pogrešan PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Pokušajte ponovo za # s.}one{Pokušajte ponovo za # s.}few{Pokušajte ponovo za # s.}other{Pokušajte ponovo za # s.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Unesite PIN SIM kartice."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Unesite PIN SIM kartice operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Korištenje PUK-a za SIM nije uspjelo!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Promjena načina unosa"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Način rada u avionu"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Potreban je uzorak nakon što se uređaj ponovo pokrene"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Potreban je PIN nakon što se uređaj ponovo pokrene"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Potrebna je lozinka nakon što se uređaj ponovo pokrene"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Radi dodatne zaštite, umjesto toga koristite uzorak"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Radi dodatne zaštite, umjesto toga koristite PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Radi dodatne zašitite, umjesto toga koristite lozinku"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index 7dac29d..eefd491 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Introdueix el PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Introdueix el patró"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Introdueix la contrasenya"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"La targeta no és vàlida."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Bateria carregada"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • S\'està carregant sense fil"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"S\'ha produït un error i no es pot desactivar l\'eSIM."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Retorn"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Patró incorrecte"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Contrasenya incorrecta"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"El PIN no és correcte"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Torna-ho a provar d\'aquí a # segon.}many{Torna-ho a provar d\'aquí a # segons.}other{Torna-ho a provar d\'aquí a # segons.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Introdueix el PIN de la SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Introdueix el PIN de la SIM de: <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"No s\'ha pogut desbloquejar la SIM amb el codi PUK."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Canvia el mètode d\'introducció"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Mode d\'avió"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Cal introduir el patró quan es reinicia el dispositiu"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Cal introduir el PIN quan es reinicia el dispositiu"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Cal introduir la contrasenya quan es reinicia el dispositiu"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Per a més seguretat, utilitza el patró"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Per a més seguretat, utilitza el PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Per a més seguretat, utilitza la contrasenya"</string>
diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml
index fcd3231..c3de04d 100644
--- a/packages/SystemUI/res-keyguard/values-cs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Zadejte PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Zadejte gesto"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Zadejte heslo"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Neplatná karta."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Nabito"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Bezdrátové nabíjení"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"eSIM kartu kvůli chybě nelze deaktivovat."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Nesprávné gesto"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Špatné heslo"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Nesprávný kód PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Zkuste to znovu za # sekundu.}few{Zkuste to znovu za # sekundy.}many{Zkuste to znovu za # sekundy.}other{Zkuste to znovu za # sekund.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Zadejte kód PIN SIM karty."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Zadejte kód PIN SIM karty <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Operace pomocí kódu PUK SIM karty se nezdařila."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Přepnout metodu zadávání"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Režim Letadlo"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Po restartování zařízení je vyžadováno gesto"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Po restartování zařízení je vyžadován kód PIN"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Po restartování zařízení je vyžadováno heslo"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Z bezpečnostních důvodů raději použijte gesto"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Z bezpečnostních důvodů raději použijte PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Z bezpečnostních důvodů raději použijte heslo"</string>
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index e0cc87d..a453bb5 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Angiv din pinkode"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Angiv dit mønster"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Angiv din adgangskode"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ugyldigt kort."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Opladet"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Trådløs opladning"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"eSIM kan ikke deaktiveres på grund af en fejl."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Forkert mønster"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Forkert adgangskode"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Forkert pinkode"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Prøv igen om # sekund.}one{Prøv igen om # sekund.}other{Prøv igen om # sekunder.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Angiv pinkoden til SIM-kortet."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Angiv pinkoden til SIM-kortet fra \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"PUK-koden til SIM-kortet blev afvist"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Skift indtastningsmetode"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Flytilstand"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Du skal angive et mønster, når du har genstartet enheden"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Der skal angives en pinkode efter genstart af enheden"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Der skal angives en adgangskode efter genstart af enheden"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Øg sikkerheden ved at bruge dit oplåsningsmønter i stedet"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Øg sikkerheden ved at bruge din pinkode i stedet"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Øg sikkerheden ved at bruge din adgangskode i stedet"</string>
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index 9c7fab5..4e168e4 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Gib deine PIN ein"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Muster eingeben"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Passwort eingeben"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ungültige Karte."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Aufgeladen"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Kabelloses Laden"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Die eSim kann aufgrund eines Fehlers nicht deaktiviert werden."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Eingabe"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Falsches Muster"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Falsches Passwort"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Falsche PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{In # Sekunde noch einmal versuchen.}other{In # Sekunden noch einmal versuchen.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Gib die SIM-PIN ein"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Gib die SIM-PIN für \"<xliff:g id="CARRIER">%1$s</xliff:g>\" ein."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Fehler beim Entsperren der SIM-Karte mithilfe des PUK-Codes."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Eingabemethode wechseln"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Flugmodus"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Nach dem Neustart des Geräts ist die Eingabe des Musters erforderlich"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Nach dem Neustart des Geräts ist die Eingabe der PIN erforderlich"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Nach dem Neustart des Geräts ist die Eingabe des Passworts erforderlich"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Verwende für mehr Sicherheit stattdessen dein Muster"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Verwende für mehr Sicherheit stattdessen deine PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Verwende für mehr Sicherheit stattdessen dein Passwort"</string>
diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml
index 0518885..069cb50 100644
--- a/packages/SystemUI/res-keyguard/values-el/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-el/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Εισαγάγετε τον αριθμό PIN σας"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Εισαγάγετε το μοτίβο σας"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Εισαγάγετε κωδικό πρόσβασης"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Μη έγκυρη κάρτα."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Φορτίστηκε"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ασύρματη φόρτιση"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Δεν είναι δυνατή η απενεργοποίηση της eSIM, εξαιτίας κάποιου σφάλματος."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Λανθασμένο μοτίβο"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Λανθασμένος κωδικός πρόσβασης"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Λανθασμένο PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Δοκιμάστε ξανά σε # δευτερόλεπτο.}other{Δοκιμάστε ξανά σε # δευτερόλεπτα.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Εισαγωγή αριθμού PIN κάρτας SIM"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Εισαγάγετε τον αριθμό PIN της κάρτας SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Αποτυχία λειτουργίας κωδικού PUK κάρτας SIM!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Εναλλαγή μεθόδου εισαγωγής"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Λειτουργία πτήσης"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Απαιτείται μοτίβο μετά από την επανεκκίνηση της συσκευής"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Απαιτείται PIN μετά από την επανεκκίνηση της συσκευής"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Απαιτείται κωδικός πρόσβασης μετά από την επανεκκίνηση της συσκευής"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Για πρόσθετη ασφάλεια, χρησιμοποιήστε εναλλακτικά μοτίβο"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Για πρόσθετη ασφάλεια, χρησιμοποιήστε εναλλακτικά PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Για πρόσθετη ασφάλεια, χρησιμοποιήστε εναλλακτικά κωδικό πρόσβασης"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
index 9df8586..389f94f 100644
--- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Enter your PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Enter your pattern"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Enter your password"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Invalid card."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Charged"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging wirelessly"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"The eSIM can’t be disabled due to an error."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Wrong pattern"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Wrong password"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Wrong PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Try again in # second.}other{Try again in # seconds.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Enter SIM PIN."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK operation failed!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Switch input method"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Aeroplane mode"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pattern required after device restarts"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN required after device restarts"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Password required after device restarts"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"For additional security, use pattern instead"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"For additional security, use PIN instead"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"For additional security, use password instead"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
index d6d4b48..e134d9e 100644
--- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
@@ -21,8 +21,11 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Enter your PIN"</string>
+    <string name="keyguard_enter_pin" msgid="8114529922480276834">"Enter PIN"</string>
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Enter your pattern"</string>
+    <string name="keyguard_enter_pattern" msgid="7616595160901084119">"Draw pattern"</string>
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Enter your password"</string>
+    <string name="keyguard_enter_password" msgid="6483623792371009758">"Enter password"</string>
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Invalid Card."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Charged"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging wirelessly"</string>
@@ -52,8 +55,38 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"The eSIM can’t be disabled due to an error."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Wrong pattern"</string>
+    <string name="kg_wrong_pattern_try_again" msgid="3603524940234151881">"Wrong pattern. Try again."</string>
     <string name="kg_wrong_password" msgid="4143127991071670512">"Wrong password"</string>
+    <string name="kg_wrong_password_try_again" msgid="6602878676125765920">"Wrong password. Try again."</string>
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Wrong PIN"</string>
+    <string name="kg_wrong_pin_try_again" msgid="3129729383303430190">"Wrong PIN. Try again."</string>
+    <string name="kg_wrong_input_try_fp_suggestion" msgid="3143861542242024833">"Or unlock with fingerprint"</string>
+    <string name="kg_fp_not_recognized" msgid="5183108260932029241">"Fingerprint not recognized"</string>
+    <string name="bouncer_face_not_recognized" msgid="1666128054475597485">"Face not recognized"</string>
+    <string name="kg_bio_try_again_or_pin" msgid="4752168242723808390">"Try again or enter PIN"</string>
+    <string name="kg_bio_try_again_or_password" msgid="1473132729225398039">"Try again or enter password"</string>
+    <string name="kg_bio_try_again_or_pattern" msgid="4867893307468801501">"Try again or draw pattern"</string>
+    <string name="kg_bio_too_many_attempts_pin" msgid="5850845723433047605">"PIN is required after too many attempts"</string>
+    <string name="kg_bio_too_many_attempts_password" msgid="5551690347827728042">"Password is required after too many attempts"</string>
+    <string name="kg_bio_too_many_attempts_pattern" msgid="736884689355181602">"Pattern is required after too many attempts"</string>
+    <string name="kg_unlock_with_pin_or_fp" msgid="5635161174698729890">"Unlock with PIN or fingerprint"</string>
+    <string name="kg_unlock_with_password_or_fp" msgid="2251295907826814237">"Unlock with password or fingerprint"</string>
+    <string name="kg_unlock_with_pattern_or_fp" msgid="2391870539909135046">"Unlock with pattern or fingerprint"</string>
+    <string name="kg_prompt_after_dpm_lock" msgid="6002804765868345917">"For added security, device was locked by work policy"</string>
+    <string name="kg_prompt_after_user_lockdown_pin" msgid="5374732179740050373">"PIN is required after lockdown"</string>
+    <string name="kg_prompt_after_user_lockdown_password" msgid="9097968458291129795">"Password is required after lockdown"</string>
+    <string name="kg_prompt_after_user_lockdown_pattern" msgid="215072203613597906">"Pattern is required after lockdown"</string>
+    <string name="kg_prompt_unattended_update" msgid="8223448855578632202">"Update will install during inactive hours"</string>
+    <string name="kg_prompt_pin_auth_timeout" msgid="5868644725126275245">"Added security required. PIN not used for a while."</string>
+    <string name="kg_prompt_password_auth_timeout" msgid="5809110458491920871">"Added security required. Password not used for a while."</string>
+    <string name="kg_prompt_pattern_auth_timeout" msgid="1860605401869262178">"Added security required. Pattern not used for a while."</string>
+    <string name="kg_prompt_auth_timeout" msgid="6620679830980315048">"Added security required. Device wasn’t unlocked for a while."</string>
+    <string name="kg_face_locked_out" msgid="2751559491287575">"Can’t unlock with face. Too many attempts."</string>
+    <string name="kg_fp_locked_out" msgid="6228277682396768830">"Can’t unlock with fingerprint. Too many attempts."</string>
+    <string name="kg_trust_agent_disabled" msgid="5400691179958727891">"Trust agent is unavailable"</string>
+    <string name="kg_primary_auth_locked_out_pin" msgid="5492230176361601475">"Too many attempts with incorrect PIN"</string>
+    <string name="kg_primary_auth_locked_out_pattern" msgid="8266214607346180952">"Too many attempts with incorrect pattern"</string>
+    <string name="kg_primary_auth_locked_out_password" msgid="6170245108400198659">"Too many attempts with incorrect password"</string>
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Try again in # second.}other{Try again in # seconds.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Enter SIM PIN."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Enter SIM PIN for \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +109,9 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK operation failed!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Switch input method"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Airplane mode"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pattern required after device restarts"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN required after device restarts"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Password required after device restarts"</string>
+    <string name="kg_prompt_reason_restart_pattern" msgid="3321211830602827742">"Pattern is required after device restarts"</string>
+    <string name="kg_prompt_reason_restart_pin" msgid="2672166323886110512">"PIN is required after device restarts"</string>
+    <string name="kg_prompt_reason_restart_password" msgid="3967993994418885887">"Password is required after device restarts"</string>
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"For additional security, use pattern instead"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"For additional security, use PIN instead"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"For additional security, use password instead"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
index 9df8586..389f94f 100644
--- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Enter your PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Enter your pattern"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Enter your password"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Invalid card."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Charged"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging wirelessly"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"The eSIM can’t be disabled due to an error."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Wrong pattern"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Wrong password"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Wrong PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Try again in # second.}other{Try again in # seconds.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Enter SIM PIN."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK operation failed!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Switch input method"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Aeroplane mode"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pattern required after device restarts"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN required after device restarts"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Password required after device restarts"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"For additional security, use pattern instead"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"For additional security, use PIN instead"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"For additional security, use password instead"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
index 9df8586..389f94f 100644
--- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Enter your PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Enter your pattern"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Enter your password"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Invalid card."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Charged"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging wirelessly"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"The eSIM can’t be disabled due to an error."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Wrong pattern"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Wrong password"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Wrong PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Try again in # second.}other{Try again in # seconds.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Enter SIM PIN."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK operation failed!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Switch input method"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Aeroplane mode"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pattern required after device restarts"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN required after device restarts"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Password required after device restarts"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"For additional security, use pattern instead"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"For additional security, use PIN instead"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"For additional security, use password instead"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
index 566c8b0..ff9d4f3 100644
--- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
@@ -21,8 +21,11 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎‏‎‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎Enter your PIN‎‏‎‎‏‎"</string>
+    <string name="keyguard_enter_pin" msgid="8114529922480276834">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎Enter PIN‎‏‎‎‏‎"</string>
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‎Enter your pattern‎‏‎‎‏‎"</string>
+    <string name="keyguard_enter_pattern" msgid="7616595160901084119">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‎‏‏‏‎Draw pattern‎‏‎‎‏‎"</string>
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‎‎‎‏‏‎‏‎Enter your password‎‏‎‎‏‎"</string>
+    <string name="keyguard_enter_password" msgid="6483623792371009758">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎Enter password‎‏‎‎‏‎"</string>
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‏‏‎‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎Invalid Card.‎‏‎‎‏‎"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‎‎‎‎‏‎‏‎‎‏‏‎‎‎‏‏‎‎‎‎‎‏‏‎Charged‎‏‎‎‏‎"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‎‎‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‎‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="PERCENTAGE">%s</xliff:g>‎‏‎‎‏‏‏‎ • Charging wirelessly‎‏‎‎‏‎"</string>
@@ -52,8 +55,38 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‎‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‎‏‏‎‎‏‎‎‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‏‏‏‏‏‎The eSIM can’t be disabled due to an error.‎‏‎‎‏‎"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‎‎‎‏‎‏‏‎‎Enter‎‏‎‎‏‎"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎‏‏‏‏‎‎‎‎‎‎‎‏‎‏‎‎‏‏‏‎‏‎‎Wrong pattern‎‏‎‎‏‎"</string>
+    <string name="kg_wrong_pattern_try_again" msgid="3603524940234151881">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‎‏‎Wrong pattern. Try again.‎‏‎‎‏‎"</string>
     <string name="kg_wrong_password" msgid="4143127991071670512">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎Wrong password‎‏‎‎‏‎"</string>
+    <string name="kg_wrong_password_try_again" msgid="6602878676125765920">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‏‏‎‏‎‎‏‎‏‎‎‎‏‎‎‏‎‎‎‎‎‎Wrong password. Try again.‎‏‎‎‏‎"</string>
     <string name="kg_wrong_pin" msgid="4160978845968732624">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‎Wrong PIN‎‏‎‎‏‎"</string>
+    <string name="kg_wrong_pin_try_again" msgid="3129729383303430190">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‎‎‏‎‏‎‏‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‎‏‎‎‎‎‎‎‎‎‏‎‏‏‏‎‎Wrong PIN. Try again.‎‏‎‎‏‎"</string>
+    <string name="kg_wrong_input_try_fp_suggestion" msgid="3143861542242024833">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎Or unlock with fingerprint‎‏‎‎‏‎"</string>
+    <string name="kg_fp_not_recognized" msgid="5183108260932029241">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‎‏‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‎‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‎‏‏‏‎‎‏‎Fingerprint not recognized‎‏‎‎‏‎"</string>
+    <string name="bouncer_face_not_recognized" msgid="1666128054475597485">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‎‏‎‏‎‎‏‎‏‎‎‏‏‎‏‎‏‎‏‏‎‏‎Face not recognized‎‏‎‎‏‎"</string>
+    <string name="kg_bio_try_again_or_pin" msgid="4752168242723808390">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‎‎Try again or enter PIN‎‏‎‎‏‎"</string>
+    <string name="kg_bio_try_again_or_password" msgid="1473132729225398039">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‎‎‏‎‏‏‏‎Try again or enter password‎‏‎‎‏‎"</string>
+    <string name="kg_bio_try_again_or_pattern" msgid="4867893307468801501">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‎‏‏‏‏‎‎‏‎‏‏‏‎‏‏‏‎‏‎Try again or draw pattern‎‏‎‎‏‎"</string>
+    <string name="kg_bio_too_many_attempts_pin" msgid="5850845723433047605">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‏‎‏‎PIN is required after too many attempts‎‏‎‎‏‎"</string>
+    <string name="kg_bio_too_many_attempts_password" msgid="5551690347827728042">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‎‏‎‏‎‏‎‎Password is required after too many attempts‎‏‎‎‏‎"</string>
+    <string name="kg_bio_too_many_attempts_pattern" msgid="736884689355181602">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‏‎‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‎‎‎‏‎‎‎‏‎‎Pattern is required after too many attempts‎‏‎‎‏‎"</string>
+    <string name="kg_unlock_with_pin_or_fp" msgid="5635161174698729890">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‎‎‏‎‎Unlock with PIN or fingerprint‎‏‎‎‏‎"</string>
+    <string name="kg_unlock_with_password_or_fp" msgid="2251295907826814237">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‎‏‏‎‏‎‎‎‏‏‏‎‏‎Unlock with password or fingerprint‎‏‎‎‏‎"</string>
+    <string name="kg_unlock_with_pattern_or_fp" msgid="2391870539909135046">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‎‎‏‏‎‎Unlock with pattern or fingerprint‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_after_dpm_lock" msgid="6002804765868345917">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‏‎‏‏‎‎‏‏‎‏‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‎‏‎For added security, device was locked by work policy‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_after_user_lockdown_pin" msgid="5374732179740050373">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‎‎‎‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‎‏‎PIN is required after lockdown‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_after_user_lockdown_password" msgid="9097968458291129795">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎‎‏‎‎‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‎‎‏‏‎Password is required after lockdown‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_after_user_lockdown_pattern" msgid="215072203613597906">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‎‏‏‏‎‎‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‎‏‎‎Pattern is required after lockdown‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_unattended_update" msgid="8223448855578632202">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎‏‎‎Update will install during inactive hours‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_pin_auth_timeout" msgid="5868644725126275245">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‎‏‎Added security required. PIN not used for a while.‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_password_auth_timeout" msgid="5809110458491920871">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‎‏‏‎‏‏‎‎‏‎‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎Added security required. Password not used for a while.‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_pattern_auth_timeout" msgid="1860605401869262178">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‏‏‎‏‎‏‏‎‎‎‏‎‎Added security required. Pattern not used for a while.‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_auth_timeout" msgid="6620679830980315048">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‎‏‎‏‏‎‎‏‏‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎Added security required. Device wasn’t unlocked for a while.‎‏‎‎‏‎"</string>
+    <string name="kg_face_locked_out" msgid="2751559491287575">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‎‎‏‎‎‏‏‏‎‎‎‏‏‎‏‎‎‎‎‏‏‏‎‏‎‏‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎‎‏‎‏‏‏‎Can’t unlock with face. Too many attempts.‎‏‎‎‏‎"</string>
+    <string name="kg_fp_locked_out" msgid="6228277682396768830">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎Can’t unlock with fingerprint. Too many attempts.‎‏‎‎‏‎"</string>
+    <string name="kg_trust_agent_disabled" msgid="5400691179958727891">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‎Trust agent is unavailable‎‏‎‎‏‎"</string>
+    <string name="kg_primary_auth_locked_out_pin" msgid="5492230176361601475">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‏‎‎‎‎‏‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‏‎Too many attempts with incorrect PIN‎‏‎‎‏‎"</string>
+    <string name="kg_primary_auth_locked_out_pattern" msgid="8266214607346180952">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎Too many attempts with incorrect pattern‎‏‎‎‏‎"</string>
+    <string name="kg_primary_auth_locked_out_password" msgid="6170245108400198659">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‏‎‎‎‎‎‎‎‎‏‏‎Too many attempts with incorrect password‎‏‎‎‏‎"</string>
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‎Try again in # second.‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‎Try again in # seconds.‎‏‎‎‏‎}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎Enter SIM PIN.‎‏‎‎‏‎"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‎‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‎‏‎‎‎‏‎Enter SIM PIN for \"‎‏‎‎‏‏‎<xliff:g id="CARRIER">%1$s</xliff:g>‎‏‎‎‏‏‏‎\".‎‏‎‎‏‎"</string>
@@ -76,9 +109,9 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‏‎‏‏‎‎‏‏‏‏‎‎SIM PUK operation failed!‎‏‎‎‏‎"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎Switch input method‎‏‎‎‏‎"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‎‏‏‎‏‎‏‎‎‏‎‏‎‎Airplane mode‎‏‎‎‏‎"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎Pattern required after device restarts‎‏‎‎‏‎"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎‎‏‏‎‏‏‎‏‏‏‎‎‎‎PIN required after device restarts‎‏‎‎‏‎"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎Password required after device restarts‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_reason_restart_pattern" msgid="3321211830602827742">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎Pattern is required after device restarts‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_reason_restart_pin" msgid="2672166323886110512">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‏‎‏‎‏‎‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‎‎‏‏‎‎‎‎‎PIN is required after device restarts‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_reason_restart_password" msgid="3967993994418885887">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‏‎‎‏‎‏‏‎‎‎‎‎‏‏‏‎‏‏‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‎Password is required after device restarts‎‏‎‎‏‎"</string>
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎‏‏‏‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‏‎‏‏‏‎‎‏‏‎For additional security, use pattern instead‎‏‎‎‏‎"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎For additional security, use PIN instead‎‏‎‎‏‎"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‏‎‏‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‏‎‎‏‏‎‎‎‏‏‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎For additional security, use password instead‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index 03608ce..df37e61 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Ingresa tu PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Ingresa tu patrón"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Ingresa tu contraseña"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Tarjeta no válida"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Cargada"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando de manera inalámbrica"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"No se puede inhabilitar la eSIM debido a un error."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Intro"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Patrón incorrecto"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Contraseña incorrecta"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorrecto"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Vuelve a intentarlo en # segundo.}many{Vuelve a intentarlo en # segundos.}other{Vuelve a intentarlo en # segundos.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Ingresa el PIN de la tarjeta SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Ingresa el PIN de la tarjeta SIM de \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Se produjo un error al desbloquear la tarjeta SIM con el PUK."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Cambiar método de entrada"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Modo de avión"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Se requiere el patrón después de reiniciar el dispositivo"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Se requiere el PIN después de reiniciar el dispositivo"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Se requiere la contraseña después de reiniciar el dispositivo"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para seguridad adicional, usa un patrón"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para seguridad adicional, usa un PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para seguridad adicional, usa una contraseña"</string>
diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml
index 6ff17ca..49a2b1f 100644
--- a/packages/SystemUI/res-keyguard/values-es/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Introduce tu PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Introduce tu patrón"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Introduce tu contraseña"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Tarjeta no válida."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Cargado"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando sin cables"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"No se puede mostrar la tarjeta eSIM debido a un error."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Intro"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Patrón incorrecto"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Contraseña incorrecta"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorrecto"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Vuelve a intentarlo en # segundo.}many{Vuelve a intentarlo en # segundos.}other{Vuelve a intentarlo en # segundos.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Introduce el PIN de la tarjeta SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Introduce el PIN de la tarjeta SIM de <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"No se ha podido desbloquear la tarjeta SIM con el código PUK."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Cambiar método de introducción"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Modo Avión"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Debes introducir el patrón después de reiniciar el dispositivo"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Debes introducir el PIN después de reiniciar el dispositivo"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Debes introducir la contraseña después de reiniciar el dispositivo"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para mayor seguridad, usa el patrón"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para mayor seguridad, usa el PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para mayor seguridad, usa la contraseña"</string>
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index 2b387a4..d260c13 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Sisestage PIN-kood"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Sisestage muster"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Sisestage parool"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Kehtetu kaart."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Laetud"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Juhtmeta laadimine"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Vea tõttu ei saa eSIM-kaarte keelata."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Sisesta"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Vale muster"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Vale parool"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Vale PIN-kood"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Proovige uuesti # sekundi pärast.}other{Proovige uuesti # sekundi pärast.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Sisestage SIM-kaardi PIN-kood."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Sisestage operaatori „<xliff:g id="CARRIER">%1$s</xliff:g>” SIM-kaardi PIN-kood."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM-kaardi PUK-koodi toiming ebaõnnestus."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Vaheta sisestusmeetodit"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Lennukirežiim"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pärast seadme taaskäivitamist tuleb sisestada muster"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Pärast seadme taaskäivitamist tuleb sisestada PIN-kood"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Pärast seadme taaskäivitamist tuleb sisestada parool"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Kasutage tugevama turvalisuse huvides hoopis mustrit"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Kasutage tugevama turvalisuse huvides hoopis PIN-koodi"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Kasutage tugevama turvalisuse huvides hoopis parooli"</string>
diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml
index bfe9778f..7786ae60 100644
--- a/packages/SystemUI/res-keyguard/values-eu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Idatzi PINa"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Marraztu eredua"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Idatzi pasahitza"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Txartelak ez du balio."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Kargatuta"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Hari gabe kargatzen"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Errore bat gertatu da eta ezin da desgaitu eSIM txartela."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Sartu"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Eredua ez da zuzena"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Pasahitza ez da zuzena"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN hori ez da zuzena"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Saiatu berriro # segundo barru.}other{Saiatu berriro # segundo barru.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Idatzi SIMaren PINa."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Idatzi \"<xliff:g id="CARRIER">%1$s</xliff:g>\" operadorearen SIM txartelaren PINa."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Huts egin du SIM txartelaren PUK kodearen eragiketak!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Aldatu idazketa-metodoa"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Hegaldi modua"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Eredua marraztu beharko duzu gailua berrabiarazten denean"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PINa idatzi beharko duzu gailua berrabiarazten denean"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Pasahitza idatzi beharko duzu gailua berrabiarazten denean"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Babestuago egoteko, erabili eredua"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Babestuago egoteko, erabili PINa"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Babestuago egoteko, erabili pasahitza"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index e88b4b3..1383baf 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"پین را وارد کنید"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"الگویتان را وارد کنید"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"گذرواژه‌تان را وارد کنید"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"کارت نامعتبر"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"شارژ کامل شد"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • درحال شارژ بی‌سیم"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"به دلیل بروز خطا، سیم‌کارت داخلی غیرفعال نشد."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"الگو اشتباه است"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"گذرواژه اشتباه است"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"پین اشتباه"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# ثانیه دیگر دوباره امتحان کنید.}one{# ثانیه دیگر دوباره امتحان کنید.}other{# ثانیه دیگر دوباره امتحان کنید.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"پین سیم‌کارت را وارد کنید."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"پین سیم‌کارت «<xliff:g id="CARRIER">%1$s</xliff:g>» را وارد کنید."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"‏عملیات PUK سیم‌کارت ناموفق بود!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"تغییر روش ورودی"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"حالت هواپیما"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"بعد از بازنشانی دستگاه باید الگو وارد شود"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"بعد از بازنشانی دستگاه باید پین وارد شود"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"بعد از بازنشانی دستگاه باید گذرواژه وارد شود"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"برای امنیت بیشتر، به‌جای آن از الگو استفاده کنید"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"برای امنیت بیشتر، به‌جای آن از پین استفاده کنید"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"برای امنیت بیشتر، به‌جای آن از گذرواژه استفاده کنید"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml
index 17928c7..4b4843c 100644
--- a/packages/SystemUI/res-keyguard/values-fi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Syötä PIN-koodi"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Piirrä kuvio"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Kirjoita salasana"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Virheellinen kortti"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Ladattu"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ladataan langattomasti"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Tapahtui virhe, eikä eSIMiä voitu poistaa käytöstä."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Väärä kuvio"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Väärä salasana"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Väärä PIN-koodi"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Yritä uudelleen # sekunnin kuluttua.}other{Yritä uudelleen # sekunnin kuluttua.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Anna SIM-kortin PIN-koodi."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Anna operaattorin <xliff:g id="CARRIER">%1$s</xliff:g> SIM-kortin PIN-koodi."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM-kortin PUK-toiminto epäonnistui."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Vaihda syöttötapaa."</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Lentokonetila"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Kuvio vaaditaan laitteen uudelleenkäynnistyksen jälkeen."</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN-koodi vaaditaan laitteen uudelleenkäynnistyksen jälkeen."</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Salasana vaaditaan laitteen uudelleenkäynnistyksen jälkeen."</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Lisäsuojaa saat, kun käytät sen sijaan kuviota"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Lisäsuojaa saat, kun käytät sen sijaan PIN-koodia"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Lisäsuojaa saat, kun käytät sen sijaan salasanaa"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index 7978fda..127588c 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Entrez votre NIP"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Entrez votre schéma"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Entrez votre mot de passe"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Cette carte n\'est pas valide."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Chargé"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • En recharge sans fil"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"La carte eSIM ne peut pas être réinitialisée à cause d\'une erreur."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Entrée"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Schéma incorrect"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Mot de passe incorrect"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"NIP incorrect"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}many{Réessayez dans # secondes.}other{Réessayez dans # secondes.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Entrez le NIP de la carte SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Entrez le NIP de la carte SIM pour « <xliff:g id="CARRIER">%1$s</xliff:g> »."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Le déverrouillage de la carte SIM par code PUK a échoué."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Changer de méthode d\'entrée"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Mode Avion"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Le schéma est exigé après le redémarrage de l\'appareil"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Le NIP est exigé après le redémarrage de l\'appareil"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Le mot de passe est exigé après le redémarrage de l\'appareil"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Pour plus de sécurité, utilisez plutôt un schéma"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Pour plus de sécurité, utilisez plutôt un NIP"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Pour plus de sécurité, utilisez plutôt un mot de passe"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index 67ce8b1..41037515 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Saisissez le code d\'accès"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Tracez le schéma"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Saisissez votre mot de passe"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Carte non valide."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Chargé"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • En charge sans fil"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Impossible de désactiver la carte eSIM en raison d\'une erreur."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Entrée"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Schéma incorrect"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Mot de passe incorrect"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Code incorrect"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}many{Réessayez dans # secondes.}other{Réessayez dans # secondes.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Saisissez le code PIN de la carte SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Saisissez le code PIN de la carte SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Échec du déverrouillage à l\'aide de la clé PUK de la carte SIM."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Changer le mode de saisie"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Mode Avion"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Veuillez dessiner le schéma après le redémarrage de l\'appareil"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Veuillez saisir le code après le redémarrage de l\'appareil"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Veuillez saisir le mot de passe après le redémarrage de l\'appareil"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Pour plus de sécurité, utilisez plutôt un schéma"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Pour plus de sécurité, utilisez plutôt un code"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Pour plus de sécurité, utilisez plutôt un mot de passe"</string>
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index c1159e8..9496eab 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Introduce o teu PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Introduce o padrón"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Introduce o contrasinal"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"A tarxeta non é válida."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Cargado"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando sen fíos"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"A eSIM non se puido desactivar debido a un erro."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Intro"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"O padrón é incorrecto"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"O contrasinal é incorrecto"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorrecto"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Téntao de novo dentro de # segundo.}other{Téntao de novo dentro de # segundos.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Introduce o PIN da SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Introduce o PIN da SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Produciuse un erro ao tentar desbloquear a tarxeta SIM co código PUK."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Cambia o método de introdución"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Modo avión"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"É necesario o padrón despois do reinicio do dispositivo"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"É necesario o PIN despois do reinicio do dispositivo"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"É necesario o contrasinal despois do reinicio do dispositivo"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Utiliza un padrón para obter maior seguranza"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Utiliza un PIN para obter maior seguranza"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Utiliza un contrasinal para obter maior seguranza"</string>
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index 8ef5dc2..c66ba19 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"તમારો પિન દાખલ કરો"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"તમારી પૅટર્ન દાખલ કરો"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"તમારો પાસવર્ડ દાખલ કરો"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"અમાન્ય કાર્ડ."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"ચાર્જ થઈ ગયું"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • વાયરલેસથી ચાર્જિંગ"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"એક ભૂલને લીધે ઇ-સિમ બંધ કરી શકાતું નથી."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"દાખલ કરો"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"ખોટી પૅટર્ન"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"ખોટો પાસવર્ડ"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"ખોટો પિન"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# સેકન્ડમાં ફરી પ્રયાસ કરો.}one{# સેકન્ડમાં ફરી પ્રયાસ કરો.}other{# સેકન્ડમાં ફરી પ્રયાસ કરો.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"સિમ પિન દાખલ કરો"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" માટે સિમ પિન દાખલ કરો."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"સિમ PUK ઓપરેશન નિષ્ફળ થયું!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ઇનપુટ પદ્ધતિ સ્વિચ કરો"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"એરપ્લેન મોડ"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ઉપકરણનો પુનઃપ્રારંભ થાય તે પછી પૅટર્ન જરૂરી છે"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ઉપકરણનો પુનઃપ્રારંભ થાય તે પછી પિન જરૂરી છે"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ઉપકરણનો પુનઃપ્રારંભ થાય તે પછી પાસવર્ડ જરૂરી છે"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"વધારાની સુરક્ષા માટે, તેના બદલે પૅટર્નનો ઉપયોગ કરો"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"વધારાની સુરક્ષા માટે, તેના બદલે પિનનો ઉપયોગ કરો"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"વધારાની સુરક્ષા માટે, તેના બદલે પાસવર્ડનો ઉપયોગ કરો"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index 8ae56cb..acd49dd 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"अपना पिन डालें"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"अपना पैटर्न डालें"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"अपना पासवर्ड डालें"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"गलत कार्ड."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"चार्ज हो गई है"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • वायरलेस तरीके से चार्ज हो रहा है"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"किसी गड़बड़ी की वजह से ई-सिम बंद नहीं किया जा सकता."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"डाला गया पैटर्न गलत है"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"डाला गया पासवर्ड गलत है"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"गलत पिन"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# सेकंड बाद फिर से कोशिश करें.}one{# सेकंड बाद फिर से कोशिश करें.}other{# सेकंड बाद फिर से कोशिश करें.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"सिम पिन डालें."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" के लिए सिम पिन डालें"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK की कार्यवाही विफल रही!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"इनपुट का तरीका बदलें"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"हवाई जहाज़ मोड"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"डिवाइस फिर से चालू होने के बाद पैटर्न ज़रूरी है"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"डिवाइस फिर से चालू होने के बाद पिन ज़रूरी है"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"डिवाइस फिर से चालू होने के बाद पासवर्ड ज़रूरी है"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ज़्यादा सुरक्षा के लिए, इसके बजाय पैटर्न का इस्तेमाल करें"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ज़्यादा सुरक्षा के लिए, इसके बजाय पिन का इस्तेमाल करें"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ज़्यादा सुरक्षा के लिए, इसके बजाय पासवर्ड का इस्तेमाल करें"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index 5b121dd..8c71227 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Unesite PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Unesite uzorak"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Unesite zaporku"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Nevažeća kartica."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Napunjeno"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • bežično punjenje"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Onemogućivanje eSIM-a nije uspjelo zbog pogreške."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Unos"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Pogrešan uzorak"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Pogrešna zaporka"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Pogrešan PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Pokušajte ponovo za # s.}one{Pokušajte ponovo za # s.}few{Pokušajte ponovo za # s.}other{Pokušajte ponovo za # s.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Unesite PIN za SIM"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Unesite PIN za SIM mobilnog operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Operacija PUK-a SIM kartice nije uspjela!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Promjena načina unosa"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Način rada u zrakoplovu"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Nakon ponovnog pokretanja uređaja morate unijeti uzorak"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Nakon ponovnog pokretanja uređaja morate unijeti PIN"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Nakon ponovnog pokretanja uređaja morate unijeti zaporku"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Za dodatnu sigurnost upotrijebite uzorak"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Za dodatnu sigurnost upotrijebite PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Za dodatnu sigurnost upotrijebite zaporku"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml
index 649952a..c1ca187 100644
--- a/packages/SystemUI/res-keyguard/values-hu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Adja meg PIN-kódját"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Adja meg a mintáját"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Adja meg jelszavát"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Érvénytelen kártya."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Feltöltve"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Vezeték nélküli töltés"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Hiba történt, így az eSIM-et nem lehet letiltani."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Helytelen minta"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Helytelen jelszó"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Helytelen PIN-kód"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Próbálja újra # másodperc múlva.}other{Próbálja újra # másodperc múlva.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Adja meg a SIM-kártya PIN-kódját."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Adja meg a(z) „<xliff:g id="CARRIER">%1$s</xliff:g>” SIM-kártya PIN-kódját."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"A SIM-kártya PUK-művelete sikertelen!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Beviteli módszer váltása"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Repülős üzemmód"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Az eszköz újraindítását követően meg kell adni a mintát"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Az eszköz újraindítását követően meg kell adni a PIN-kódot"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Az eszköz újraindítását követően meg kell adni a jelszót"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"A nagyobb biztonság érdekében használjon inkább mintát"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"A nagyobb biztonság érdekében használjon inkább PIN-kódot"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"A nagyobb biztonság érdekében használjon inkább jelszót"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index e85f61c..c4936c5f 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Մուտքագրեք PIN կոդը"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Մուտքագրեք նախշը"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Մուտքագրեք գաղտնաբառը"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Սխալ քարտ"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Լիցքավորված է"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Անլար լիցքավորում"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Սխալի պատճառով չհաջողվեց անջատել eSIM-ը։"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Մուտքի ստեղն"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Նախշը սխալ է"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Գաղտնաբառը սխալ է"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN կոդը սխալ է"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Նորից փորձեք # վայրկյանից։}one{Նորից փորձեք # վայրկյանից։}other{Նորից փորձեք # վայրկյանից։}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Մուտքագրեք SIM քարտի PIN կոդը։"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Մուտքագրեք SIM քարտի PIN կոդը «<xliff:g id="CARRIER">%1$s</xliff:g>»-ի համար:"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK կոդի գործողությունը ձախողվեց:"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Փոխել ներածման եղանակը"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Ավիառեժիմ"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Սարքը վերագործարկելուց հետո անհրաժեշտ է մուտքագրել նախշը"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Սարքը վերագործարկելուց հետո անհրաժեշտ է մուտքագրել PIN կոդը"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Սարքը վերագործարկելուց հետո անհրաժեշտ է մուտքագրել գաղտնաբառը"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Լրացուցիչ անվտանգության համար օգտագործեք նախշ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Լրացուցիչ անվտանգության համար օգտագործեք PIN կոդ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Լրացուցիչ անվտանգության համար օգտագործեք գաղտնաբառ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index bc00d74..5b2b98c 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Masukkan PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Masukkan pola"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Masukkan sandi"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Kartu Tidak Valid"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Terisi penuh"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengisi daya secara nirkabel"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"eSIM tidak dapat dinonaktifkan karena terjadi error."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Masukkan"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Pola salah"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Sandi salah"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN Salah"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Coba lagi dalam # detik.}other{Coba lagi dalam # detik.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Masukkan PIN SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Masukkan PIN SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Operasi PUK SIM gagal!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Beralih metode input"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Mode pesawat"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pola diperlukan setelah perangkat dimulai ulang"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN diperlukan setelah perangkat dimulai ulang"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Sandi diperlukan setelah perangkat dimulai ulang"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Untuk keamanan tambahan, gunakan pola"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Untuk keamanan tambahan, gunakan PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Untuk keamanan tambahan, gunakan sandi"</string>
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index 1d93e08..0428316 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Sláðu inn PIN-númer"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Færðu inn mynstrið þitt"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Sláðu inn aðgangsorðið þitt"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ógilt kort."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Fullhlaðin"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Í þráðlausri hleðslu"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Villa kom í veg fyrir að hægt væri að gera eSIM-kortið óvirkt."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Færa inn"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Rangt mynstur"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Rangt aðgangsorð"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Rangt PIN-númer"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Reyndu aftur eftir # sekúndu.}one{Reyndu aftur eftir # sekúndu.}other{Reyndu aftur eftir # sekúndur.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Sláðu inn PIN-númer SIM-kortsins."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Sláðu inn PIN-númer SIM-korts fyrir „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"PUK-aðgerð SIM-korts mistókst!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Skipta um innsláttaraðferð"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Flugstilling"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Mynsturs er krafist þegar tækið er endurræst"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN-númers er krafist þegar tækið er endurræst"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Aðgangsorðs er krafist þegar tækið er endurræst"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Fyrir aukið öryggi skaltu nota mynstur í staðinn"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Fyrir aukið öryggi skaltu nota PIN-númer í staðinn"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Fyrir aukið öryggi skaltu nota aðgangsorð í staðinn"</string>
diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml
index 51a86df..848d095 100644
--- a/packages/SystemUI/res-keyguard/values-it/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-it/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Inserisci il PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Inserisci la sequenza"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Inserisci la password"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Scheda non valida."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Carico"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • In carica wireless"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Impossibile disattivare la eSIM a causa di un errore."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Invio"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Sequenza errata"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Password errata"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN errato"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Riprova fra # secondo.}many{Riprova fra # secondi.}other{Riprova fra # secondi.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Inserisci il PIN della SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Inserisci il PIN della SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Operazione con PUK della SIM non riuscita."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Cambia metodo di immissione"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Modalità aereo"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Sequenza obbligatoria dopo il riavvio del dispositivo"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN obbligatorio dopo il riavvio del dispositivo"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Password obbligatoria dopo il riavvio del dispositivo"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Per maggior sicurezza, usa invece la sequenza"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Per maggior sicurezza, usa invece il PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Per maggior sicurezza, usa invece la password"</string>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index d1f8760..1307ff5 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"צריך להזין קוד אימות"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"יש להזין קו ביטול נעילה"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"יש להזין סיסמה"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"כרטיס לא חוקי."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"הסוללה טעונה"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • בטעינה אלחוטית"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"‏לא ניתן להשבית את כרטיס ה-eSIM עקב שגיאה."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"קו ביטול נעילה שגוי"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"סיסמה שגויה"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"קוד האימות שגוי"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{אפשר לנסות שוב בעוד שנייה אחת.}one{אפשר לנסות שוב בעוד # שניות.}two{אפשר לנסות שוב בעוד # שניות.}other{אפשר לנסות שוב בעוד # שניות.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"‏יש להזין את קוד האימות של כרטיס ה-SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"‏יש להזין את קוד האימות של כרטיס ה-SIM של <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"‏הניסיון לביטול הנעילה של כרטיס ה-SIM באמצעות קוד PUK נכשל!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"החלפת שיטת קלט"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"מצב טיסה"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"יש להזין את קו ביטול הנעילה לאחר הפעלה מחדש של המכשיר"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"צריך להזין קוד אימות לאחר הפעלה מחדש של המכשיר"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"יש להזין סיסמה לאחר הפעלה מחדש של המכשיר"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"כדי להגביר את רמת האבטחה, כדאי להשתמש בקו ביטול נעילה במקום זאת"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"כדי להגביר את רמת האבטחה, כדאי להשתמש בקוד אימות במקום זאת"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"כדי להגביר את רמת האבטחה, כדאי להשתמש בסיסמה במקום זאת"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml
index 8057dfd..6bc5055 100644
--- a/packages/SystemUI/res-keyguard/values-ja/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"PIN を入力してください"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"パターンを入力してください"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"パスワードを入力してください"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"無効なカードです。"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"充電が完了しました"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ワイヤレス充電中"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"エラーのため、eSIM を無効にできません。"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"入力"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"パターンが正しくありません"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"パスワードが正しくありません"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN が正しくありません"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# 秒後にもう一度お試しください。}other{# 秒後にもう一度お試しください。}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN を入力してください。"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"「<xliff:g id="CARRIER">%1$s</xliff:g>」の SIM PIN を入力してください。"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK 操作に失敗しました。"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"入力方法の切り替え"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"機内モード"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"デバイスの再起動後はパターンの入力が必要となります"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"デバイスの再起動後は PIN の入力が必要となります"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"デバイスの再起動後はパスワードの入力が必要となります"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"セキュリティを強化するには代わりにパターンを使用してください"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"セキュリティを強化するには代わりに PIN を使用してください"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"セキュリティを強化するには代わりにパスワードを使用してください"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml
index 6b57061..4687606 100644
--- a/packages/SystemUI/res-keyguard/values-ka/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"შეიყვანეთ PIN-კოდი"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"შეიყვანეთ განმბლოკავი ნიმუში"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"შეიყვანეთ პაროლი"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ბარათი არასწორია."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"დატენილია"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • იტენება უსადენოდ"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"eSIM-ის გათიშვა ვერ ხერხდება წარმოქმნილი შეცდომის გამო."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"შეყვანა"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"ნიმუში არასწორია"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"პაროლი არასწორია"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN-კოდი არასწორია"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# წამში ისევ ცადეთ.}other{# წამში ისევ ცადეთ.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"შეიყვანეთ SIM ბარათის PIN-კოდი."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"შეიყვანეთ SIM ბარათის PIN-კოდი „<xliff:g id="CARRIER">%1$s</xliff:g>“-ისთვის."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM ბარათის PUK-კოდით განბლოკვა ვერ მოხერხდა!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"შეყვანის მეთოდის გადართვა"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"თვითმფრინავის რეჟიმი"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"მოწყობილობის გადატვირთვის შემდეგ საჭიროა ნიმუშის დახატვა"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"მოწყობილობის გადატვირთვის შემდეგ საჭიროა PIN-კოდის შეყვანა"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"მოწყობილობის გადატვირთვის შემდეგ საჭიროა პაროლის შეყვანა"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"დამატებითი უსაფრთხოებისთვის გამოიყენეთ ნიმუში"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"დამატებითი უსაფრთხოებისთვის გამოიყენეთ PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"დამატებითი უსაფრთხოებისთვის გამოიყენეთ პაროლი"</string>
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index db031d6..79e28ef 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"PIN кодын енгізіңіз"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Өрнекті енгізіңіз"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Құпия сөзді енгізіңіз"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Жарамсыз карта."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Зарядталды"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Сымсыз зарядталуда"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Қатеге байланысты eSIM картасы өшірілмеді."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Енгізу"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Өрнек дұрыс емес"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Құпия сөз дұрыс емес"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN коды қате"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# секундтан соң қайталап көріңіз.}other{# секундтан соң қайталап көріңіз.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN кодын енгізіңіз."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" үшін SIM PIN кодын енгізіңіз."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK кодымен құлпы ашылмады!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Енгізу әдісін ауыстыру"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Ұшақ режимі"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Құрылғы қайта іске қосылғаннан кейін, өрнекті енгізу қажет"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Құрылғы қайта іске қосылғаннан кейін, PIN кодын енгізу қажет"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Құрылғы қайта іске қосылғаннан кейін, құпия сөзді енгізу қажет"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Қосымша қауіпсіздік үшін өрнекті пайдаланыңыз."</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Қосымша қауіпсіздік үшін PIN кодын пайдаланыңыз."</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Қосымша қауіпсіздік үшін құпия сөзді пайдаланыңыз."</string>
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index 5a3b30b..8936c2a 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"បញ្ចូល​កូដ PIN របស់​អ្នក"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"បញ្ចូល​លំនាំ​របស់​អ្នក"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"បញ្ចូល​ពាក្យ​សម្ងាត់​របស់អ្នក"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"បណ្ណមិនត្រឹមត្រូវទេ។"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"បាន​សាក​ថ្មពេញ"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • កំពុងសាកថ្ម​ឥតខ្សែ"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"មិនអាច​បិទ eSIM បានទេ ដោយសារ​មាន​បញ្ហា។"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"លំនាំមិនត្រឹមត្រូវ"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"ពាក្យសម្ងាត់មិនត្រឹមត្រូវ"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"កូដ PIN មិន​ត្រឹមត្រូវ​ទេ"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{ព្យាយាមម្តងទៀតក្នុងរយៈពេល # វិនាទីទៀត។}other{ព្យាយាមម្តងទៀតក្នុងរយៈពេល # វិនាទីទៀត។}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"បញ្ចូល​កូដ PIN របស់​ស៊ីម។"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"បញ្ចូល​កូដ PIN របស់​ស៊ីម​សម្រាប់ \"<xliff:g id="CARRIER">%1$s</xliff:g>\"។"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"មិន​អាច​ដោះ​សោ​ដោយ​ប្រើកូដ​ PUK របស់​ស៊ីម​បានទេ!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ប្ដូរ​វិធី​បញ្ចូល"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"​ពេល​ជិះ​យន្តហោះ"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"តម្រូវឲ្យប្រើលំនាំ បន្ទាប់ពីឧបករណ៍ចាប់ផ្តើមឡើងវិញ"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"តម្រូវឲ្យបញ្ចូលកូដ PIN បន្ទាប់ពីឧបករណ៍ចាប់ផ្តើមឡើងវិញ"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"តម្រូវឲ្យបញ្ចូលពាក្យសម្ងាត់ បន្ទាប់ពីឧបករណ៍ចាប់ផ្តើមឡើងវិញ"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ដើម្បីសុវត្ថិភាពបន្ថែម សូមប្រើលំនាំជំនួសវិញ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ដើម្បីសុវត្ថិភាពបន្ថែម សូមប្រើកូដ PIN ជំនួសវិញ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ដើម្បីសុវត្ថិភាពបន្ថែម សូមប្រើពាក្យសម្ងាត់ជំនួសវិញ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index e74dd1a..cb6cdcc 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"ನಿಮ್ಮ ಪಿನ್ ನಮೂದಿಸಿ"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"ನಿಮ್ಮ ಪ್ಯಾಟರ್ನ್ ನಮೂದಿಸಿ"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ಅಮಾನ್ಯ ಕಾರ್ಡ್."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"ಚಾರ್ಜ್ ಆಗಿದೆ"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ವೈರ್‌ಲೆಸ್ ಆಗಿ ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"ದೋಷದ ಕಾರಣದಿಂದಾಗಿ eSIM ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"ನಮೂದಿಸಿ"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"ಪ್ಯಾಟರ್ನ್ ತಪ್ಪಾಗಿದೆ"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"ತಪ್ಪು ಪಾಸ್‌ವರ್ಡ್"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"ಪಿನ್‌ ತಪ್ಪಾಗಿದೆ"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# ಸೆಕೆಂಡಿನಲ್ಲಿ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.}one{# ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.}other{# ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"ಸಿಮ್‌ ಪಿನ್‌ ನಮೂದಿಸಿ."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ಗಾಗಿ ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"ಸಿಮ್‌ PUK ಕಾರ್ಯಾಚರಣೆ ವಿಫಲಗೊಂಡಿದೆ!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ಇನ್‌ಪುಟ್‌‌ ವಿಧಾನ ಬದಲಿಸಿ"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"ಏರ್‌ಪ್ಲೇನ್ ಮೋಡ್"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ಸಾಧನ ಮರುಪ್ರಾರಂಭಗೊಂಡ ನಂತರ ಪ್ಯಾಟರ್ನ್ ಅಗತ್ಯವಿರುತ್ತದೆ"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ಸಾಧನ ಮರುಪ್ರಾರಂಭಗೊಂಡ ನಂತರ ಪಿನ್ ಅಗತ್ಯವಿರುತ್ತದೆ"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ಸಾಧನ ಮರುಪ್ರಾರಂಭಗೊಂಡ ನಂತರ ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿರುತ್ತದೆ"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ, ಬದಲಿಗೆ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಬಳಸಿ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ, ಬದಲಿಗೆ ಪಿನ್ ಬಳಸಿ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ, ಬದಲಿಗೆ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml
index 8d54aef..953773d 100644
--- a/packages/SystemUI/res-keyguard/values-ko/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"PIN을 입력해 주세요."</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"패턴 입력"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"비밀번호 입력"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"유효하지 않은 카드"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"충전됨"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 무선 충전 중"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"오류로 인해 eSIM을 사용 중지할 수 없습니다."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter 키"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"잘못된 패턴"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"잘못된 비밀번호"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN 오류"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{#초 후에 다시 시도하세요.}other{#초 후에 다시 시도하세요.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN을 입력하세요."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\'<xliff:g id="CARRIER">%1$s</xliff:g>\'의 SIM PIN을 입력하세요."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK 작업이 실패했습니다."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"입력 방법 전환"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"비행기 모드"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"기기가 다시 시작되면 패턴이 필요합니다."</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"기기가 다시 시작되면 PIN이 필요합니다."</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"기기가 다시 시작되면 비밀번호가 필요합니다."</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"보안 강화를 위해 대신 패턴 사용"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"보안 강화를 위해 대신 PIN 사용"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"보안 강화를 위해 대신 비밀번호 사용"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index 23afa38..7e095de 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"PIN кодуңузду киргизиңиз"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Графикалык ачкычты киргизиңиз"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Сырсөзүңүздү киргизиңиз"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"SIM-карта жараксыз."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Кубатталды"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Зымсыз кубатталууда"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Катадан улам eSIM-картаны өчүрүүгө болбойт."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Киргизүү"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Графикалык ачкыч туура эмес"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Сырсөз туура эмес"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN-код туура эмес"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# секунддан кийин кайталаңыз.}other{# секунддан кийин кайталаңыз.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM-картанын PIN-кодун киргизиңиз."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" SIM-картасынын PIN-кодун киргизиңиз."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM-картанын PUK-кодун ачуу кыйрады!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Киргизүү ыкмасын өзгөртүү"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Учак режими"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Түзмөк кайра күйгүзүлгөндөн кийин графикалык ачкычты тартуу талап кылынат"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Түзмөк кайра күйгүзүлгөндөн кийин PIN-кодду киргизүү талап кылынат"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Түзмөк кайра күйгүзүлгөндөн кийин сырсөздү киргизүү талап кылынат"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Кошумча коопсуздук үчүн анын ордуна графикалык ачкычты колдонуңуз"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Кошумча коопсуздук үчүн анын ордуна PIN кодду колдонуңуз"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Кошумча коопсуздук үчүн анын ордуна сырсөздү колдонуңуз"</string>
diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml
index 408e916..f5e438b 100644
--- a/packages/SystemUI/res-keyguard/values-lo/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"ໃສ່ລະຫັດ PIN ຂອງທ່ານ"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"ໃສ່ຮູບແບບປົດລັອກຂອງທ່ານ"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"ປ້ອນລະຫັດຜ່ານຂອງທ່ານ"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ບັດບໍ່ຖືກຕ້ອງ."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"ສາກເຕັມແລ້ວ."</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ກຳ​ລັງ​ສາກ​ໄຟໄຮ້​ສາຍ"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"ບໍ່ສາມາດປິດການນຳໃຊ້ eSIM ໄດ້ເນື່ອງຈາກມີຂໍ້ຜິດພາດ."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"ປ້ອນເຂົ້າ"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"ຮູບແບບບໍ່ຖືກຕ້ອງ"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"ລະຫັດ PIN ບໍ່ຖືກຕ້ອງ"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{ກະລຸນາລອງໃໝ່ໃນ # ວິນາທີ.}other{ກະລຸນາລອງໃໝ່ໃນ # ວິນາທີ.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"ໃສ່ລະຫັດ PIN ຂອງຊິມ."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"ໃສ່ລະຫັດ PIN ຂອງຊິມສຳລັບ \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"PUK ຂອງ SIM ເຮັດວຽກລົ້ມເຫຼວ!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ສະລັບຮູບແບບການປ້ອນຂໍ້ມູນ"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"ໂໝດໃນຍົນ"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ຈຳເປັນຕ້ອງມີແບບຮູບປົດລັອກຫຼັງຈາກອຸປະກອນເລີ່ມລະບົບໃໝ່"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ຈຳເປັນຕ້ອງມີ PIN ຫຼັງຈາກອຸປະກອນເລີ່ມລະບົບໃໝ່"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ຈຳເປັນຕ້ອງມີລະຫັດຜ່ານຫຼັງຈາກອຸປະກອນເລີ່ມລະບົບໃໝ່"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ, ໃຫ້ໃຊ້ຮູບແບບແທນ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ, ໃຫ້ໃຊ້ PIN ແທນ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ, ໃຫ້ໃຊ້ລະຫັດຜ່ານແທນ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index b60f2b7..c173905 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Įveskite PIN kodą"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Nubrėžkite atrakinimo piešinį"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Įveskite slaptažodį"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Netinkama kortelė."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Įkrauta"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Kraunama be laidų"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Dėl klaidos nepavyko išjungti „eSIM“ kortelės."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Netinkamas atrakinimo piešinys"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Netinkamas slaptažodis"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Netinkamas PIN kodas"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Bandykite dar kartą po # sekundės.}one{Bandykite dar kartą po # sekundės.}few{Bandykite dar kartą po # sekundžių.}many{Bandykite dar kartą po # sekundės.}other{Bandykite dar kartą po # sekundžių.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Įveskite SIM kortelės PIN kodą."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Įveskite „<xliff:g id="CARRIER">%1$s</xliff:g>“ SIM kortelės PIN kodą"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Nepavyko atlikti SIM kortelės PUK kodo operacijos."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Perjungti įvesties metodą"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Lėktuvo režimas"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Iš naujo paleidus įrenginį būtinas atrakinimo piešinys"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Iš naujo paleidus įrenginį būtinas PIN kodas"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Iš naujo paleidus įrenginį būtinas slaptažodis"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Papildomai saugai užtikrinti geriau naudokite atrakinimo piešinį"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Papildomai saugai užtikrinti geriau naudokite PIN kodą"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Papildomai saugai užtikrinti geriau naudokite slaptažodį"</string>
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index e8cd99b..40b6b3f 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Ievadiet savu PIN kodu"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Ievadiet savu kombināciju"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Ievadiet paroli"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Nederīga karte."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Akumulators uzlādēts"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Notiek bezvadu uzlāde"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Kļūdas dēļ nevar atspējot eSIM karti."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Ievadīšanas taustiņš"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Nepareiza kombinācija"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Nepareiza parole"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Nepareizs PIN kods."</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Mēģiniet vēlreiz pēc # sekundes.}zero{Mēģiniet vēlreiz pēc # sekundēm.}one{Mēģiniet vēlreiz pēc # sekundes.}other{Mēģiniet vēlreiz pēc # sekundēm.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Ievadiet SIM kartes PIN kodu."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Ievadiet SIM kartes “<xliff:g id="CARRIER">%1$s</xliff:g>” PIN kodu."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM kartes PUK koda ievadīšana neizdevās!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Pārslēgt ievades metodi"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Lidojuma režīms"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pēc ierīces restartēšanas ir jāievada atbloķēšanas kombinācija."</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Pēc ierīces restartēšanas ir jāievada PIN kods."</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Pēc ierīces restartēšanas ir jāievada parole."</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Papildu drošībai izmantojiet kombināciju"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Papildu drošībai izmantojiet PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Papildu drošībai izmantojiet paroli"</string>
diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml
index b35be97..1a2513c 100644
--- a/packages/SystemUI/res-keyguard/values-mk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Внесете го PIN-кодот"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Внесете ја шемата"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Внесете ја лозинката"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Неважечка картичка."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Полна"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Се полни безжично"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"eSIM-картичката не може да се оневозможи поради грешка."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Внеси"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Погрешна шема"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Погрешна лозинка"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Погрешен PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Обидете се повторно по # секунда.}one{Обидете се повторно по # секунда.}other{Обидете се повторно по # секунди.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Внесете PIN на SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Внесете PIN на SIM за „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM-картичката не се отклучи со PUK-кодот!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Префрли метод за внесување"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Авионски режим"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Потребна е шема по рестартирање на уредот"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Потребен е PIN-код по рестартирање на уредот"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Потребна е лозинка по рестартирање на уредот"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"За дополнителна безбедност, користете шема"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"За дополнителна безбедност, користете PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"За дополнителна безбедност, користете лозинка"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index 385aadf..a223fd1 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"പിൻ നൽകുക"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"നിങ്ങളുടെ പാറ്റേൺ നൽകുക"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"നിങ്ങളുടെ പാസ്‌വേഡ് നല്‍‌കുക"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"അസാധുവായ കാർഡ്."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"ചാർജായി"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • വയർലെസ്സ് ആയി ചാർജ് ചെയ്യുന്നു"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"പിശക് കാരണം ഇ-സിം പ്രവർത്തനരഹിതമാക്കാനാകുന്നില്ല"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"എന്റർ"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"പാറ്റേൺ തെറ്റാണ്"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"പാസ്‌വേഡ് തെറ്റാണ്"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"പിൻ തെറ്റാണ്"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.}other{# സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"സിം പിൻ നൽകുക."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" എന്ന കാരിയർക്കുള്ള സിം പിൻ നൽകുക."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"PUK ഉപയോഗിച്ച് സിം അൺലോക്കു‌ചെയ്യാനുള്ള ‌ശ്രമം പരാജയപ്പെട്ടു!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ഇൻപുട്ട് രീതി മാറുക"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"ഫ്ലൈറ്റ് മോഡ്"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ഉപകരണം റീസ്റ്റാർട്ടായശേഷം ‌പാറ്റേൺ വരയ്‌ക്കേണ്ടതുണ്ട്"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ഉപകരണം റീസ്റ്റാർട്ടായശേഷം ‌പിൻ നൽകേണ്ടതുണ്ട്"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ഉപകരണം റീസ്റ്റാർട്ടായശേഷം ‌പാസ്‌വേഡ് നൽകേണ്ടതുണ്ട്"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"അധിക സുരക്ഷയ്ക്കായി, പകരം പാറ്റേൺ ഉപയോഗിക്കുക"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"അധിക സുരക്ഷയ്ക്കായി, പകരം പിൻ ഉപയോഗിക്കുക"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"അധിക സുരക്ഷയ്ക്കായി, പകരം പാസ്‍വേഡ് ഉപയോഗിക്കുക"</string>
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 2e941ba..d4d84b0 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"ПИН-ээ оруулна уу"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Хээгээ оруулна уу"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Нууц үгээ оруулна уу"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Карт хүчингүй байна."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Цэнэглэсэн"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Утасгүй цэнэглэж байна"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Алдаа гарсан тул eSIM-г идэвхгүй болгох боломжгүй байна."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Оруулах"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Хээ буруу байна"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Нууц үг буруу байна"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"ПИН код буруу байна"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# секундийн дараа дахин оролдоно уу.}other{# секундийн дараа дахин оролдоно уу.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM-н ПИН-г оруулна уу."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"-н SIM-н ПИН-г оруулна уу."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM-н PUK-г буруу орууллаа!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Оруулах аргыг сэлгэх"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Нислэгийн горим"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Төхөөрөмжийг дахин эхлүүлсний дараа загвар оруулах шаардлагатай"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Төхөөрөмжийг дахин эхлүүлсний дараа ПИН оруулах шаардлагатай"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Төхөөрөмжийг дахин эхлүүлсний дараа нууц үг оруулах шаардлагатай"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Нэмэлт аюулгүй байдлын үүднээс оронд нь хээ ашиглана уу"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Нэмэлт аюулгүй байдлын үүднээс оронд нь ПИН ашиглана уу"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Нэмэлт аюулгүй байдлын үүднээс оронд нь нууц үг ашиглана уу"</string>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index 74b3d39..8f9d4a0 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"तुमचा पिन एंटर करा"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"तुमचा पॅटर्न एंटर करा"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"तुमचा पासवर्ड एंटर करा"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"अवैध कार्ड."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"चार्ज झाली"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • वायरलेस पद्धतीने चार्ज करत आहे"</string>
@@ -32,7 +38,7 @@
     <string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • सावकाश चार्ज होत आहे"</string>
     <string name="keyguard_plugged_in_charging_limited" msgid="1053130519456324630">"<xliff:g id="PERCENTAGE">%s</xliff:g> • बॅटरीचे संरक्षण करण्यासाठी चार्जिंग ऑप्टिमाइझ केले आहे"</string>
     <string name="keyguard_plugged_in_incompatible_charger" msgid="3687961801947819076">"<xliff:g id="PERCENTAGE">%s</xliff:g> • चार्जिंगच्या ॲक्सेसरीसंबंधित समस्या"</string>
-    <string name="keyguard_instructions_when_pattern_disabled" msgid="8448804180089936954">"अनलॉक करण्यासाठी मेनू दाबा."</string>
+    <string name="keyguard_instructions_when_pattern_disabled" msgid="8448804180089936954">"अनलॉक करण्यासाठी मेनू प्रेस करा."</string>
     <string name="keyguard_network_locked_message" msgid="407096292844868608">"नेटवर्क लॉक केले"</string>
     <string name="keyguard_missing_sim_message_short" msgid="685029586173458728">"सिम नाही"</string>
     <string name="keyguard_missing_sim_instructions" msgid="7735360104844653246">"सिम जोडा."</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"एका एररमुळे eSIM बंद होऊ शकत नाही."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"एंटर करा"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"चुकीचा पॅटर्न"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"चुकीचा पासवर्ड"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"चुकीचा पिन"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# सेकंदामध्ये पुन्हा प्रयत्न करा.}other{# सेकंदांमध्ये पुन्हा प्रयत्न करा.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"सिम पिन एंटर करा"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" साठी सिम पिन एंटर करा"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"सिम PUK कार्य अयशस्‍वी झाले!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"इनपुट पद्धत स्विच करा"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"विमान मोड"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"डिव्हाइस रीस्टार्ट झाल्यावर पॅटर्न आवश्यक आहे"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"डिव्हाइस रीस्टार्ट झाल्यावर पिन आवश्यक आहे"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"डिव्हाइस रीस्टार्ट झाल्यावर पासवर्ड आवश्यक आहे"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"अतिरिक्त सुरक्षेसाठी, त्याऐवजी पॅटर्न वापरा"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"अतिरिक्त सुरक्षेसाठी, त्याऐवजी पिन वापरा"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"अतिरिक्त सुरक्षेसाठी, त्याऐवजी पासवर्ड वापरा"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml
index de9cb80..c0ebce2 100644
--- a/packages/SystemUI/res-keyguard/values-ms/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Masukkan PIN anda"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Masukkan corak anda"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Masukkan kata laluan anda"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Kad Tidak Sah."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Sudah dicas"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengecas secara wayarles"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"eSIM tidak dapat dilumpuhkan kerana ralat."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Kekunci Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Corak salah"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Kata laluan salah"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN salah"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Cuba lagi dalam # saat.}other{Cuba lagi dalam # saat.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Masukkan PIN SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Masukkan PIN SIM untuk \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Pengendalian PUK SIM gagal!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Tukar kaedah masukan"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Mod Pesawat"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Corak diperlukan setelah peranti dimulakan semula"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN diperlukan setelah peranti dimulakan semula"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Kata laluan diperlukan setelah peranti dimulakan semula"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Untuk keselamatan tambahan, gunakan corak"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Untuk keselamatan tambahan, gunakan PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Untuk keselamatan tambahan, gunakan kata laluan"</string>
diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml
index 3be9890..53035a4 100644
--- a/packages/SystemUI/res-keyguard/values-my/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-my/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"သင့်ပင်နံပါတ် ထည့်ပါ"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"သင့်လော့ခ်ဖွင့်ပုံစံ ထည့်ပါ"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"သင့်စကားဝှက် ထည့်ပါ"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ကတ် မမှန်ကန်ပါ။"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"အားသွင်းပြီးပါပြီ"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ကြိုးမဲ့ အားသွင်းနေသည်"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"အမှားအယွင်းရှိနေသောကြောင့် eSIM ကို ပိတ်၍မရပါ။"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter ခလုတ်"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"လော့ခ်ဖွင့်ပုံစံ မှားနေသည်"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"စကားဝှက် မှားနေသည်"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"ပင်နံပါတ် မမှန်ကန်ပါ"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# စက္ကန့်အကြာတွင် ထပ်စမ်းကြည့်နိုင်သည်။}other{# စက္ကန့်အကြာတွင် ထပ်စမ်းကြည့်နိုင်သည်။}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"ဆင်းမ်ကတ် ပင်နံပါတ်ကို ထည့်ပါ။"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" အတွက် ဆင်းမ်ကဒ်ပင်နံပါတ်ကို ထည့်ပါ။"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"ဆင်းမ်ကတ် ပင်နံပါတ် ပြန်ဖွင့်သည့်ကုဒ် လုပ်ဆောင်ချက် မအောင်မြင်ပါ။"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"စာရိုက်စနစ်ပြောင်းရန်"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"လေယာဉ်ပျံမုဒ်"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"စက်ပစ္စည်းကို ပိတ်ပြီးပြန်ဖွင့်လိုက်သည့်အခါတွင် ပုံစံ လိုအပ်ပါသည်"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"စက်ပစ္စည်းကို ပိတ်ပြီးပြန်ဖွင့်လိုက်သည့်အခါတွင် ပင်နံပါတ် လိုအပ်ပါသည်"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"စက်ပစ္စည်းကို ပိတ်ပြီးပြန်ဖွင့်လိုက်သည့်အခါတွင် စကားဝှက် လိုအပ်ပါသည်"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ထပ်ဆောင်းလုံခြုံရေးအတွက် ၎င်းအစား ပုံစံသုံးပါ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ထပ်ဆောင်းလုံခြုံရေးအတွက် ၎င်းအစား ပင်နံပါတ်သုံးပါ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ထပ်ဆောင်းလုံခြုံရေးအတွက် ၎င်းအစား စကားဝှက်သုံးပါ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index abc0005..13e5ffa 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Skriv inn PIN-koden din"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Legg inn mønsteret ditt"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Skriv inn passordet ditt"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ugyldig kort."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Oppladet"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Lader trådløst"</string>
@@ -47,17 +53,77 @@
     <string name="keyguard_accessibility_sim_pin_area" msgid="6272116591533888062">"PIN-området for SIM-kortet"</string>
     <string name="keyguard_accessibility_sim_puk_area" msgid="5537294043180237374">"PUK-området for SIM-kortet"</string>
     <string name="keyboardview_keycode_delete" msgid="8489719929424895174">"Slett"</string>
-    <string name="disable_carrier_button_text" msgid="7153361131709275746">"Deaktiver e-SIM-kortet"</string>
-    <string name="error_disable_esim_title" msgid="3802652622784813119">"Kan ikke deaktivere e-SIM-kortet"</string>
+    <string name="disable_carrier_button_text" msgid="7153361131709275746">"Deaktiver eSIM-kortet"</string>
+    <string name="error_disable_esim_title" msgid="3802652622784813119">"Kan ikke deaktivere eSIM-kortet"</string>
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"E-SIM-kortet kan ikke deaktiveres på grunn av en feil."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Feil mønster"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Feil passord"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Feil PIN-kode"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Prøv på nytt om # sekund.}other{Prøv på nytt om # sekunder.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Skriv inn PIN-koden for SIM-kortet."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Skriv inn PIN-koden for SIM-kortet «<xliff:g id="CARRIER">%1$s</xliff:g>»."</string>
-    <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Deaktiver e-SIM-kortet for å bruke enheten uten mobiltjeneste."</string>
+    <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Deaktiver eSIM-kortet for å bruke enheten uten mobiltjeneste."</string>
     <string name="kg_puk_enter_puk_hint" msgid="3005288372875367017">"SIM-kortet er nå deaktivert. Skriv inn PUK-koden for å fortsette. Ta kontakt med operatøren for mer informasjon."</string>
     <string name="kg_puk_enter_puk_hint_multi" msgid="4876780689904862943">"SIM-kortet «<xliff:g id="CARRIER">%1$s</xliff:g>» er nå deaktivert. Skriv inn PUK-koden for å fortsette. Ta kontakt med operatøren for mer informasjon."</string>
     <string name="kg_puk_enter_pin_hint" msgid="6028432138916150399">"Tast inn ønsket PIN-kode"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"PUK-koden for SIM-kortet ble avvist."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Bytt inndatametode"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Flymodus"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Du må tegne mønsteret etter at enheten har startet på nytt"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Du må skrive inn PIN-koden etter at enheten har startet på nytt"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Du må skrive inn passordet etter at enheten har startet på nytt"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Bruk mønster i stedet, for å øke sikkerheten"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Bruk PIN-kode i stedet, for å øke sikkerheten"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Bruk passord i stedet, for å øke sikkerheten"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index d835f42..8dc8ff0 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"आफ्नो PIN प्रविष्टि गर्नुहोस्"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"आफ्नो ढाँचा प्रविष्टि गर्नुहोस्"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"आफ्नो पासवर्ड प्रविष्ट गर्नु…"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"अमान्य कार्ड।"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"चार्ज भयो"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • तारविनै चार्ज गर्दै"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"कुनै त्रुटिका कारण यो eSIM लाई असक्षम पार्न सकिएन।"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"प्रविष्टि गर्नुहोस्"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"प्याटर्न मिलेन"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"गलत पासवर्ड"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"गलत PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# सेकेन्डपछि फेरि प्रयास गर्नुहोस्।}other{# सेकेन्डपछि फेरि प्रयास गर्नुहोस्।}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM को PIN प्रविष्टि गर्नुहोस्।"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" को SIM को PIN प्रविष्टि गर्नुहोस्।"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM को PUK कोड राखेर अनलक गर्ने कार्य असफल भयो!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"इनपुट विधिलाई स्विच गर्नुहोस्"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"हवाइजहाज मोड"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"यन्त्र पुनः सुरु भएपछि ढाँचा आवश्यक पर्दछ"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"यन्त्र पुनः सुरु भएपछि PIN आवश्यक पर्दछ"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"यन्त्र पुनः सुरु भएपछि पासवर्ड आवश्यक पर्दछ"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"अतिरिक्त सुरक्षाका लागि यो प्रमाणीकरण विधिको साटो प्याटर्न प्रयोग गर्नुहोस्"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"अतिरिक्त सुरक्षाका लागि यो प्रमाणीकरण विधिको साटो पिन प्रयोग गर्नुहोस्"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"अतिरिक्त सुरक्षाका लागि यो प्रमाणीकरण विधिको साटो पासवर्ड प्रयोग गर्नुहोस्"</string>
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index 8278d11..af6d477 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Geef je pincode op"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Geef je patroon op"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Geef je wachtwoord op"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ongeldige kaart."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Opgeladen"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Draadloos opladen"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"De e-simkaart kan niet worden uitgezet vanwege een fout."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Onjuist patroon"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Onjuist wachtwoord"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Onjuiste pincode"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Probeer het over # seconde opnieuw.}other{Probeer het over # seconden opnieuw.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Geef de pincode van de simkaart op."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Geef de pincode voor de simkaart van \'<xliff:g id="CARRIER">%1$s</xliff:g>\' op."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Bewerking met pukcode voor simkaart is mislukt."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Invoermethode wijzigen"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Vliegtuig­modus"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Patroon vereist nadat het apparaat opnieuw is opgestart"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Pincode vereist nadat het apparaat opnieuw is opgestart"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Wachtwoord vereist nadat het apparaat opnieuw is opgestart"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Gebruik in plaats daarvan het patroon voor extra beveiliging"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Gebruik in plaats daarvan de pincode voor extra beveiliging"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Gebruik in plaats daarvan het wachtwoord voor extra beveiliging"</string>
diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml
index c698727..a1a6ab2 100644
--- a/packages/SystemUI/res-keyguard/values-or/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-or/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"ନିଜର PIN ଲେଖନ୍ତୁ"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"ନିଜର ପାଟର୍ନ ଆଙ୍କନ୍ତୁ"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"ନିଜ ପାସ୍‌ୱର୍ଡ ଲେଖନ୍ତୁ"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ଅମାନ୍ୟ କାର୍ଡ।"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"ଚାର୍ଜ ହୋଇଗଲା"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"ୱାୟାର୍‍ଲେସ୍‍ଭାବରେ <xliff:g id="PERCENTAGE">%s</xliff:g> • ଚାର୍ଜ ହୋଇଛି"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"ଗୋଟିଏ ତ୍ରୁଟି କାରଣରୁ eSIMକୁ ଅକ୍ଷମ କରାଯାଇପାରିବ ନାହିଁ।"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"ଏଣ୍ଟର୍"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"ଭୁଲ ପାଟର୍ନ"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"ଭୁଲ ପାସ୍‌ୱର୍ଡ"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"ଭୁଲ PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।}other{# ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIMର PIN ଲେଖନ୍ତୁ।"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ପାଇଁ SIMର PIN ଲେଖନ୍ତୁ।"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUKର କାମ ବିଫଳ ହେଲା!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ଇନପୁଟ୍‌ ପଦ୍ଧତି ବଦଳାନ୍ତୁ"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"ଏରୋପ୍ଲେନ୍‍ ମୋଡ୍"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ଡିଭାଇସ୍‍ ରିଷ୍ଟାର୍ଟ ହେବା ପରେ ପାଟର୍ନ ଆବଶ୍ୟକ ଅଟେ"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ଡିଭାଇସ୍‍ ରିଷ୍ଟାର୍ଟ ହେବାପରେ ପାସ୍‌ୱର୍ଡ ଆବଶ୍ୟକ"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ଡିଭାଇସ୍‍ ରିଷ୍ଟାର୍ଟ ହେବା ପରେ ପାସୱର୍ଡ ଆବଶ୍ୟକ ଅଟେ"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, ଏହା ପରିବର୍ତ୍ତେ ପାଟର୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, ଏହା ପରିବର୍ତ୍ତେ PIN ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, ଏହା ପରିବର୍ତ୍ତେ ପାସୱାର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index 383eee5..61eeb49 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"ਆਪਣਾ ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"ਆਪਣਾ ਪੈਟਰਨ ਦਾਖਲ ਕਰੋ"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ਅਵੈਧ ਕਾਰਡ।"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"ਚਾਰਜ ਹੋ ਗਿਆ"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ਬਿਨਾਂ ਤਾਰ ਤੋਂ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"ਕੋਈ ਗੜਬੜ ਹੋਣ ਕਰਕੇ ਈ-ਸਿਮ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"ਦਾਖਲ ਕਰੋ"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"ਗਲਤ ਪੈਟਰਨ"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"ਗਲਤ ਪਾਸਵਰਡ"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"ਗਲਤ ਪਿੰਨ"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# ਸਕਿੰਟ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।}one{# ਸਕਿੰਟ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।}other{# ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ਲਈ ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK ਕਾਰਵਾਈ ਅਸਫਲ ਰਹੀ!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ਇਨਪੁੱਟ ਵਿਧੀ ਸਵਿੱਚ ਕਰੋ"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"ਹਵਾਈ-ਜਹਾਜ਼ ਮੋਡ"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ਡੀਵਾਈਸ ਦੇ ਮੁੜ-ਚਾਲੂ ਹੋਣ \'ਤੇ ਪੈਟਰਨ ਦੀ ਲੋੜ ਹੈ"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ਡੀਵਾਈਸ ਦੇ ਮੁੜ-ਚਾਲੂ ਹੋਣ \'ਤੇ ਪਿੰਨ ਦੀ ਲੋੜ ਹੈ"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ਡੀਵਾਈਸ ਦੇ ਮੁੜ-ਚਾਲੂ ਹੋਣ \'ਤੇ ਪਾਸਵਰਡ ਦੀ ਲੋੜ ਹੈ"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ, ਇਸਦੀ ਬਜਾਏ ਪੈਟਰਨ ਵਰਤੋ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ, ਇਸਦੀ ਬਜਾਏ ਪਿੰਨ ਵਰਤੋ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ, ਇਸਦੀ ਬਜਾਏ ਪਾਸਵਰਡ ਵਰਤੋ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml
index 9d45b5a..6ebc809 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Wpisz kod PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Narysuj wzór"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Wpisz hasło"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Nieprawidłowa karta."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Naładowana"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ładowanie bezprzewodowe"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Nie można wyłączyć karty eSIM z powodu błędu."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Nieprawidłowy wzór"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Nieprawidłowe hasło"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Nieprawidłowy kod PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Spróbuj ponownie za # sekundę.}few{Spróbuj ponownie za # sekundy.}many{Spróbuj ponownie za # sekund.}other{Spróbuj ponownie za # sekundy.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Wpisz kod PIN karty SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Wpisz kod PIN karty SIM „<xliff:g id="CARRIER">%1$s</xliff:g>”."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Operacja z kodem PUK karty SIM nie udała się."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Przełączanie metody wprowadzania"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Tryb samolotowy"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Po ponownym uruchomieniu urządzenia wymagany jest wzór"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Po ponownym uruchomieniu urządzenia wymagany jest kod PIN"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Po ponownym uruchomieniu urządzenia wymagane jest hasło"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Ze względów bezpieczeństwa użyj wzoru"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Ze względów bezpieczeństwa użyj kodu PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Ze względów bezpieczeństwa użyj hasła"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index 8534575..a958741 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Digite seu PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Digite seu padrão"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Digite sua senha"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Cartão inválido."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Carregado"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando sem fio"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Não é possível desativar o eSIM devido a um erro."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Inserir"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Padrão incorreto"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Senha incorreta"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorreto"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}many{Tente novamente em # segundos.}other{Tente novamente em # segundos.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Informe o PIN do chip."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Informe o PIN do chip para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Falha na operação de PUK do chip."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Alterar o método de entrada"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Modo avião"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"O padrão é exigido após a reinicialização do dispositivo"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"O PIN é exigido após a reinicialização do dispositivo"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"A senha é exigida após a reinicialização do dispositivo"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para ter mais segurança, use o padrão"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para ter mais segurança, use o PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para ter mais segurança, use a senha"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index e0d3eb0..77db3f7 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Introduza o PIN."</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Introduza o padrão."</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Introduza a palavra-passe."</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Cartão inválido."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Carregada"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • A carregar sem fios"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Não é possível desativar o eSIM devido a um erro."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Tecla Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Padrão incorreto."</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Palavra-passe incorreta."</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorreto"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Tente novamente dentro de # segundo.}many{Tente novamente dentro de # segundos.}other{Tente novamente dentro de # segundos.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Introduza o PIN do cartão SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Introduza o PIN do cartão SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Falha ao introduzir o PUK do cartão SIM!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Alternar o método de introdução"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Modo de avião"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"É necessário um padrão após reiniciar o dispositivo"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"É necessário um PIN após reiniciar o dispositivo"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"É necessária uma palavra-passe após reiniciar o dispositivo"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para uma segurança adicional, use antes o padrão"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para uma segurança adicional, use antes o PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para uma segurança adicional, use antes a palavra-passe"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml
index 8534575..a958741 100644
--- a/packages/SystemUI/res-keyguard/values-pt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Digite seu PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Digite seu padrão"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Digite sua senha"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Cartão inválido."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Carregado"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando sem fio"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Não é possível desativar o eSIM devido a um erro."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Inserir"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Padrão incorreto"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Senha incorreta"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorreto"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}many{Tente novamente em # segundos.}other{Tente novamente em # segundos.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Informe o PIN do chip."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Informe o PIN do chip para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Falha na operação de PUK do chip."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Alterar o método de entrada"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Modo avião"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"O padrão é exigido após a reinicialização do dispositivo"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"O PIN é exigido após a reinicialização do dispositivo"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"A senha é exigida após a reinicialização do dispositivo"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para ter mais segurança, use o padrão"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para ter mais segurança, use o PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para ter mais segurança, use a senha"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml
index 0a5538f..683901f 100644
--- a/packages/SystemUI/res-keyguard/values-ro/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Introdu codul PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Introdu modelul"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Introdu parola"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Card nevalid"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Încărcată"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Se încarcă wireless"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Cardul eSIM nu poate fi dezactivat din cauza unei erori."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Introdu"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Model greșit"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Parolă greșită"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Cod PIN greșit"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Reîncearcă peste o secundă.}few{Reîncearcă peste # secunde.}other{Reîncearcă peste # de secunde.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Introdu codul PIN al cardului SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Introdu codul PIN al cardului SIM pentru „<xliff:g id="CARRIER">%1$s</xliff:g>”."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Deblocarea cu ajutorul codului PUK pentru cardul SIM nu a reușit!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Schimbă metoda de introducere"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Mod Avion"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Modelul este necesar după repornirea dispozitivului"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Codul PIN este necesar după repornirea dispozitivului"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Parola este necesară după repornirea dispozitivului"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Pentru mai multă securitate, folosește modelul"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Pentru mai multă securitate, folosește codul PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Pentru mai multă securitate, folosește parola"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index 39bf861..01499c8 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Введите PIN-код"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Введите графический ключ"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Введите пароль"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ошибка SIM-карты."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Батарея заряжена"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Беспроводная зарядка"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Не удалось отключить eSIM."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Клавиша ввода"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Неверный графический ключ"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Неверный пароль"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Неверный PIN-код"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Повторите попытку через # секунду.}one{Повторите попытку через # секунду.}few{Повторите попытку через # секунды.}many{Повторите попытку через # секунд.}other{Повторите попытку через # секунды.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Введите PIN-код SIM-карты."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Введите PIN-код SIM-карты \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Не удалось разблокировать SIM-карту"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Сменить способ ввода"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Режим полета"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"После перезагрузки устройства необходимо ввести графический ключ"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"После перезагрузки устройства необходимо ввести PIN-код"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"После перезагрузки устройства необходимо ввести пароль"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"В целях дополнительной безопасности используйте графический ключ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"В целях дополнительной безопасности используйте PIN-код"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"В целях дополнительной безопасности используйте пароль"</string>
diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml
index 1bb6f04..6cacbf2 100644
--- a/packages/SystemUI/res-keyguard/values-si/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-si/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"ඔබේ PIN ඇතුළු කරන්න"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"ඔබගේ රටාව ඇතුළු කරන්න"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"ඔබේ මුරපදය ඇතුළු කරන්න"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"වලංගු නොවන කාඩ්පත."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"අරෝපිතයි"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • නොරැහැන්ව ආරෝපණ කෙරේ"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"දෝෂයක් හේතුවෙන් eSIM අබල කළ නොහැකිය."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"ඇතුල් කරන්න"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"වැරදි රටාවකි"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"වැරදි මුරපදයකි"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN එක වැරදියි"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{තත්පර #කින් නැවත උත්සාහ කරන්න.}one{තත්පර #කින් නැවත උත්සාහ කරන්න.}other{තත්පර #කින් නැවත උත්සාහ කරන්න.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN ඇතුළු කරන්න"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" සඳහා SIM PIN ඇතුළු කරන්න"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK මෙහෙයුම අසාර්ථක විය!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ආදාන ක්‍රමය මාරු කිරීම"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"ගුවන් යානා ප්‍රකාරය"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"උපාංගය නැවත ආරම්භ වූ පසු රටාව අවශ්‍යයි"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"උපාංගය නැවත ආරම්භ වූ පසු PIN අංකය අවශ්‍යයි"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"උපාංගය නැවත ආරම්භ වූ පසු මුරපදය අවශ්‍යයි"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"අතිරේක ආරක්ෂාව සඳහා, ඒ වෙනුවට රටාව භාවිතා කරන්න"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"අතිරේක ආරක්ෂාව සඳහා, ඒ වෙනුවට PIN භාවිතා කරන්න"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"අතිරේක ආරක්ෂාව සඳහා, ඒ වෙනුවට මුරපදය භාවිතා කරන්න"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index 12028a6..f2f92cb 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Zadajte PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Zadajte vzor"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Zadajte heslo"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Neplatná karta."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Nabité"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Nabíja sa bezdrôtovo"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"eSIM karta sa nedá deaktivovať, pretože sa vyskytla chyba."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Nesprávny vzor"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Nesprávne heslo"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Nesprávny kód PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Skúste to znova o # sekundu.}few{Skúste to znova o # sekundy.}many{Skúste to znova o # sekundy.}other{Skúste to znova o # sekúnd.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Zadajte PIN pre SIM kartu"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Zadajte kód PIN pre SIM kartu operátora <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Operácia kódu PUK SIM karty zlyhala!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Prepnúť metódu vstupu"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Režim v lietadle"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Po reštartovaní zariadenia musíte zadať bezpečnostný vzor"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Po reštartovaní zariadenia musíte zadať kód PIN"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Po reštartovaní zariadenia musíte zadať heslo"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"V rámci zvýšenia zabezpečenia použite radšej vzor"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"V rámci zvýšenia zabezpečenia použite radšej PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"V rámci zvýšenia zabezpečenia použite radšej heslo"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml
index 114fc52..8b14411 100644
--- a/packages/SystemUI/res-keyguard/values-sl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Vnesite kodo PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Vnesite vzorec"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Vnesite geslo"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Neveljavna kartica"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Baterija napolnjena"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • brezžično polnjenje"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Digitalne kartice e-SIM zaradi napake ni mogoče onemogočiti."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Tipka Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Napačen vzorec"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Napačno geslo"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Napačna koda PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Poskusite znova čez # sekundo.}one{Poskusite znova čez # sekundo.}two{Poskusite znova čez # sekundi.}few{Poskusite znova čez # sekunde.}other{Poskusite znova čez # sekund.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Vnesite kodo PIN kartice SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Vnesite kodo PIN kartice SIM operaterja »<xliff:g id="CARRIER">%1$s</xliff:g>«."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Postopek za odklepanje s kodo PUK kartice SIM ni uspel."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Preklop načina vnosa"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Način za letalo"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Po vnovičnem zagonu naprave je treba vnesti vzorec"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Po vnovičnem zagonu naprave je treba vnesti kodo PIN"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Po vnovičnem zagonu naprave je treba vnesti geslo"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Za dodatno varnost raje uporabite vzorec."</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Za dodatno varnost raje uporabite kodo PIN."</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Za dodatno varnost raje uporabite geslo."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml
index 5d8173b..646d660 100644
--- a/packages/SystemUI/res-keyguard/values-sq/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Fut kodin PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Fut motivin"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Fut fjalëkalimin"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Karta e pavlefshme."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"I karikuar"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Po karikohet me valë"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Karta eSIM nuk mund të çaktivizohet për shkak të një gabimi."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Dërgo"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Motiv i gabuar"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Fjalëkalim i gabuar"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Kod PIN i gabuar"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Provo sërish pas # sekonde.}other{Provo sërish pas # sekondash.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Fut kodin PIN të kartës SIM"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Fut kodin PIN të kartës SIM për \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Operacioni i kodit PUK të kartës SIM dështoi!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Ndërro metodën e hyrjes"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Modaliteti i aeroplanit"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Kërkohet motivi pas rinisjes së pajisjes"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Kërkohet kodi PIN pas rinisjes së pajisjes"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Kërkohet fjalëkalimi pas rinisjes së pajisjes"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Për më shumë siguri, përdor motivin më mirë"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Për më shumë siguri, përdor kodin PIN më mirë"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Për më shumë siguri, përdor fjalëkalimin më mirë"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index a26d7e8..1fcd4c3 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Унесите PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Унесите шаблон"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Унесите лозинку"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Неважећа картица."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Напуњена је"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Бежично пуњење"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"eSIM не може да се онемогући због грешке."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Погрешан шаблон"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Погрешна лозинка"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Погрешан PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Пробајте поново за # секунду.}one{Пробајте поново за # секунду.}few{Пробајте поново за # секунде.}other{Пробајте поново за # секунди.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Унесите PIN за SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Унесите PIN за SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Радња са PUK кодом за SIM није успела!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Промени метод уноса"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Режим рада у авиону"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Треба да унесете шаблон када се уређај поново покрене"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Треба да унесете PIN када се уређај поново покрене"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Треба да унесете лозинку када се уређај поново покрене"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"За додатну безбедност користите шаблон"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"За додатну безбедност користите PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"За додатну безбедност користите лозинку"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml
index 623532b..69553d9 100644
--- a/packages/SystemUI/res-keyguard/values-sv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Ange pinkoden"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Ange mönstret"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Ange ditt lösenord"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ogiltigt kort."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Laddat"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laddas trådlöst"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Det gick inte att inaktivera eSIM-kortet på grund av ett fel."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Retur"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Fel mönster"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Fel lösenord"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Fel pinkod"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Försök igen om # sekund.}other{Försök igen om # sekunder.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Ange pinkod för SIM-kortet."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Ange pinkod för SIM-kortet för <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Det gick inte att låsa upp med PUK-koden för SIM-kortet."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Byt inmatningsmetod"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Flygplansläge"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Du måste rita mönster när du har startat om enheten"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Du måste ange pinkod när du har startat om enheten"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Du måste ange lösenord när du har startat om enheten"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"För ytterligare säkerhet använder du mönstret i stället"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"För ytterligare säkerhet använder du pinkoden i stället"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"För ytterligare säkerhet använder du lösenordet i stället"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml
index 96309e1..be383eb 100644
--- a/packages/SystemUI/res-keyguard/values-sw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Weka PIN yako"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Weka mchoro wako"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Weka nenosiri lako"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Kadi si Sahihi."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Betri imejaa"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Inachaji bila kutumia waya"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Hitilafu imetokea wakati wa kuzima eSIM."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Weka"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Mchoro si sahihi"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Nenosiri si sahihi"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Nambari ya PIN si sahihi"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Jaribu tena baada ya sekunde #.}other{Jaribu tena baada ya sekunde #.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Weka PIN ya SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Weka PIN ya SIM ya \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Utendakazi wa PUK ya SIM haujafanikiwa!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Kubadili mbinu ya kuingiza data"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Hali ya ndegeni"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Unafaa kuchora mchoro baada ya kuwasha kifaa upya"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Unafaa kuweka PIN baada ya kuwasha kifaa upya"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Unafaa kuweka nenosiri baada ya kuwasha kifaa upya"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Kwa usalama wa ziada, tumia mchoro badala yake"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Kwa usalama wa ziada, tumia PIN badala yake"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Kwa usalama wa ziada, tumia nenosiri badala yake"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index 9f85a97..db8b8f8 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"பின்னை உள்ளிடுக"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"பேட்டர்னை உள்ளிடுக"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"கடவுச்சொல்லை உள்ளிடுக"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"செல்லாத சிம் கார்டு."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"சார்ஜ் செய்யப்பட்டது"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • வயர்லெஸ் முறையில் சார்ஜாகிறது"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"பிழை ஏற்பட்டதால் eSIMஐ முடக்க முடியவில்லை."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"என்டர் பட்டன்"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"தவறான பேட்டர்ன்"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"தவறான கடவுச்சொல்"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"தவறான பின்"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# வினாடியில் மீண்டும் முயலவும்.}other{# வினாடிகளில் மீண்டும் முயலவும்.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"சிம் பின்னை உள்ளிடவும்."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"க்கான சிம் பின்னை உள்ளிடவும்."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"சிம் PUK செயல்பாடு தோல்வியடைந்தது!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"உள்ளீட்டு முறையை மாற்றும்"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"விமானப் பயன்முறை"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"சாதனத்தை மீண்டும் தொடங்கியதும், பேட்டர்னை வரைய வேண்டும்"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"சாதனத்தை மீண்டும் தொடங்கியதும், பின்னை உள்ளிட வேண்டும்"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"சாதனத்தை மீண்டும் தொடங்கியதும், கடவுச்சொல்லை உள்ளிட வேண்டும்"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"கூடுதல் பாதுகாப்பிற்குப் பேட்டர்னைப் பயன்படுத்தவும்"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"கூடுதல் பாதுகாப்பிற்குப் பின்னை (PIN) பயன்படுத்தவும்"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"கூடுதல் பாதுகாப்பிற்குக் கடவுச்சொல்லைப் பயன்படுத்தவும்"</string>
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index 1684eb87b..798a89a 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"మీ పిన్‌ని నమోదు చేయండి"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"మీ నమూనాను నమోదు చేయండి"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"మీ పాస్‌వర్డ్‌ను ఎంటర్ చేయండి"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"చెల్లని కార్డ్."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"ఛార్జ్ చేయబడింది"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • వైర్‌ లేకుండా ఛార్జ్ అవుతోంది"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"ఎర్రర్ కారణంగా eSIMని నిలపడం సాధ్యపడదు."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"నమూనా తప్పు"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"పాస్‌వర్డ్ తప్పు"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"పిన్ తప్పు"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# సెకనులో మళ్లీ ట్రై చేయండి.}other{# సెకన్లలో మళ్లీ ట్రై చేయండి.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM పిన్‌ని నమోదు చేయండి."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" కోసం SIM పిన్‌ని నమోదు చేయండి."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK చర్య విఫలమైంది!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ఇన్‌పుట్ పద్ధతిని మార్చు"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"విమానం మోడ్"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"పరికరాన్ని పునఃప్రారంభించిన తర్వాత నమూనాను గీయాలి"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"డివైజ్‌ను పునఃప్రారంభించిన తర్వాత పిన్ నమోదు చేయాలి"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"పరికరాన్ని పునఃప్రారంభించిన తర్వాత పాస్‌వర్డ్‌ను నమోదు చేయాలి"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"అదనపు సెక్యూరిటీ కోసం, బదులుగా ఆకృతిని ఉపయోగించండి"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"అదనపు సెక్యూరిటీ కోసం, బదులుగా PINను ఉపయోగించండి"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"అదనపు సెక్యూరిటీ కోసం, బదులుగా పాస్‌వర్డ్‌ను ఉపయోగించండి"</string>
diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml
index f268e60..dc16bb6 100644
--- a/packages/SystemUI/res-keyguard/values-th/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-th/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"ป้อน PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"ป้อนรูปแบบ"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"ป้อนรหัสผ่าน"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"การ์ดไม่ถูกต้อง"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"ชาร์จแล้ว"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • กำลังชาร์จแบบไร้สาย"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"ปิดใช้ eSIM ไม่ได้เนื่องจากมีข้อผิดพลาด"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"รูปแบบไม่ถูกต้อง"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"รหัสผ่านไม่ถูกต้อง"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN ไม่ถูกต้อง"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{ลองอีกครั้งใน # วินาที}other{ลองอีกครั้งใน # วินาที}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"ป้อน PIN ของซิม"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"ป้อน PIN ของซิมสำหรับ \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"การปลดล็อกด้วย PUK ของซิมล้มเหลว!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"สลับวิธีการป้อนข้อมูล"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"โหมดบนเครื่องบิน"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"ต้องวาดรูปแบบหลังจากอุปกรณ์รีสตาร์ท"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"ต้องระบุ PIN หลังจากอุปกรณ์รีสตาร์ท"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"ต้องป้อนรหัสผ่านหลังจากอุปกรณ์รีสตาร์ท"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ใช้รูปแบบแทนเพื่อเพิ่มความปลอดภัย"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ใช้ PIN แทนเพื่อเพิ่มความปลอดภัย"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ใช้รหัสผ่านแทนเพื่อเพิ่มความปลอดภัย"</string>
diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml
index b96f0ae..4df08f5 100644
--- a/packages/SystemUI/res-keyguard/values-tl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Ilagay ang iyong PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Ilagay ang iyong pattern"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Ilagay ang iyong password"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Di-wasto ang Card."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Tapos nang mag-charge"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Wireless na nagcha-charge"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Hindi ma-disable ang eSIM dahil sa isang error."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Mali ang pattern"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Mali ang password"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Mali ang PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Subukan ulit sa # segundo.}one{Subukan ulit sa # segundo.}other{Subukan ulit sa # na segundo.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Ilagay ang PIN ng SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Ilagay ang PIN ng SIM para sa \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Nabigo ang operasyon ng PUK ng SIM!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Magpalit ng pamamaraan ng pag-input"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Airplane mode"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Kailangan ng pattern pagkatapos mag-restart ng device"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Kailangan ng PIN pagkatapos mag-restart ng device"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Kailangan ng password pagkatapos mag-restart ng device"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para sa karagdagang seguridad, gumamit na lang ng pattern"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para sa karagdagang seguridad, gumamit na lang ng PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para sa karagdagang seguridad, gumamit na lang ng password"</string>
diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml
index ae8be96..2aca8ad 100644
--- a/packages/SystemUI/res-keyguard/values-tr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"PIN kodunuzu girin"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Deseninizi girin"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Şifrenizi girin"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Geçersiz Kart."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Şarj oldu"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Kablosuz olarak şarj ediliyor"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Bir hata nedeniyle eSIM devre dışı bırakılamıyor."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Yanlış desen"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Yanlış şifre"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Yanlış PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# saniye içinde tekrar deneyin.}other{# saniye içinde tekrar deneyin.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN kodunu girin."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" için SIM PIN kodunu girin."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM PUK işlemi başarısız oldu!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Giriş yöntemini değiştir"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Uçak modu"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Cihaz yeniden başladıktan sonra desen gerekir"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Cihaz yeniden başladıktan sonra PIN gerekir"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Cihaz yeniden başladıktan sonra şifre gerekir"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Ek güvenlik için bunun yerine desen kullanın"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Ek güvenlik için bunun yerine PIN kullanın"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Ek güvenlik için bunun yerine şifre kullanın"</string>
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index 3b3b20c..7da9b98 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Введіть PIN-код"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Введіть ключ"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Введіть пароль"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Недійсна картка."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Заряджено"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Бездротове заряджання"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Не вдається вимкнути eSIM-карту через помилку."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Ввести"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Неправильний ключ"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Неправильний пароль"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Неправильний PIN-код"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Повторіть спробу через # секунду.}one{Повторіть спробу через # секунду.}few{Повторіть спробу через # секунди.}many{Повторіть спробу через # секунд.}other{Повторіть спробу через # секунди.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Введіть PIN-код SIM-карти."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Введіть PIN-код SIM-карти для оператора \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Помилка введення PUK-коду SIM-карти."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Змінити метод введення"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Режим польоту"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Після перезавантаження пристрою потрібно ввести ключ"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Після перезавантаження пристрою потрібно ввести PIN-код"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Після перезавантаження пристрою потрібно ввести пароль"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"З міркувань додаткової безпеки скористайтеся ключем"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"З міркувань додаткової безпеки скористайтеся PIN-кодом"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"З міркувань додаткової безпеки скористайтеся паролем"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index dac46fd..4a75afc 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"‏اپنا PIN درج کریں"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"اپنا پیٹرن درج کریں"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"اپنا پاس ورڈ درج کریں"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"غلط کارڈ۔"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"چارج ہوگئی"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • وائرلیس طریقے سے چارج ہو رہا ہے"</string>
@@ -32,7 +38,7 @@
     <string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • آہستہ چارج ہو رہا ہے"</string>
     <string name="keyguard_plugged_in_charging_limited" msgid="1053130519456324630">"<xliff:g id="PERCENTAGE">%s</xliff:g> • بیٹری کی حفاظت کے لیے چارجنگ کو بہتر بنایا گیا"</string>
     <string name="keyguard_plugged_in_incompatible_charger" msgid="3687961801947819076">"<xliff:g id="PERCENTAGE">%s</xliff:g> • چارجنگ ایکسیسری کے ساتھ مسئلہ"</string>
-    <string name="keyguard_instructions_when_pattern_disabled" msgid="8448804180089936954">"غیر مقفل کرنے کیلئے مینو دبائیں۔"</string>
+    <string name="keyguard_instructions_when_pattern_disabled" msgid="8448804180089936954">"غیر مقفل کرنے کیلئے مینیو دبائیں۔"</string>
     <string name="keyguard_network_locked_message" msgid="407096292844868608">"نیٹ ورک مقفل ہو گیا"</string>
     <string name="keyguard_missing_sim_message_short" msgid="685029586173458728">"‏کوئی SIM نہیں ہے"</string>
     <string name="keyguard_missing_sim_instructions" msgid="7735360104844653246">"‏ایک SIM شامل کریں۔"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"‏ایک خرابی کی وجہ سے eSIM کو غیر فعال نہیں کیا جا سکتا۔"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"درج کریں"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"غلط پیٹرن"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"غلط پاس ورڈ"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"‏غلط PIN"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# سیکنڈ میں دوبارہ کوشش کریں۔}other{# سیکنڈ میں دوبارہ کوشش کریں۔}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"‏SIM PIN درج کریں۔"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"‏\"<xliff:g id="CARRIER">%1$s</xliff:g>\" کیلئے SIM PIN درج کریں۔"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"‏SIM PUK کارروائی ناکام ہو گئی!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"اندراج کا طریقہ سوئچ کریں"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"ہوائی جہاز وضع"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"آلہ دوبارہ چالو ہونے کے بعد پیٹرن درکار ہوتا ہے"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"‏آلہ دوبارہ چالو ہونے کے بعد PIN درکار ہوتا ہے"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"آلہ دوبارہ چالو ہونے کے بعد پاس ورڈ درکار ہوتا ہے"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"اضافی سیکیورٹی کے لئے، اس کے بجائے پیٹرن استعمال کریں"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"‏اضافی سیکیورٹی کے لئے، اس کے بجائے PIN استعمال کریں"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"اضافی سیکیورٹی کے لئے، اس کے بجائے پاس ورڈ استعمال کریں"</string>
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index 7091405..4c5f476 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"PIN kodni kiriting"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Grafik kalitni chizing"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Parolni kiriting"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"SIM karta yaroqsiz."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Quvvat oldi"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Simsiz quvvatlanyapti"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Xatolik tufayli eSIM faolsizlantirilmadi."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter tugmasi"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Grafik kalit xato"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Parol xato"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN kod xato"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# soniyadan keyin qaytadan urining.}other{# soniyadan keyin qayta urining.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM karta PIN kodini kiriting."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"“<xliff:g id="CARRIER">%1$s</xliff:g>” SIM kartasi PIN kodini kiriting."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM kartani qulfdan chiqarib bo‘lmadi!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Matn kiritish usulini almashtirish"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Parvoz rejimi"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Qurilma qayta ishga tushganidan keyin grafik kalitni kiritish zarur"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Qurilma qayta ishga tushganidan keyin PIN kodni kiritish zarur"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Qurilma qayta ishga tushganidan keyin parolni kiritish zarur"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Qoʻshimcha xavfsizlik maqsadida oʻrniga grafik kalitdan foydalaning"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Qoʻshimcha xavfsizlik maqsadida oʻrniga PIN koddan foydalaning"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Qoʻshimcha xavfsizlik maqsadida oʻrniga paroldan foydalaning"</string>
diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml
index 79b9f06..49abeb6 100644
--- a/packages/SystemUI/res-keyguard/values-vi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Nhập mã PIN của bạn"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Nhập hình mở khóa của bạn"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Nhập mật khẩu của bạn"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Thẻ không hợp lệ."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Đã sạc đầy"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Đang sạc không dây"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"Không thể tắt eSIM do lỗi."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Nhập"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Hình mở khóa không chính xác"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Mật khẩu sai"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Mã PIN sai"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Hãy thử lại sau # giây.}other{Hãy thử lại sau # giây.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Nhập mã PIN của SIM."</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Nhập mã PIN của SIM dành cho \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Thao tác mã PUK của SIM không thành công!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Chuyển phương thức nhập"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Chế độ trên máy bay"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Yêu cầu hình mở khóa sau khi thiết bị khởi động lại"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Yêu cầu mã PIN sau khi thiết bị khởi động lại"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Yêu cầu mật khẩu sau khi thiết bị khởi động lại"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Để tăng cường bảo mật, hãy sử dụng hình mở khoá"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Để tăng cường bảo mật, hãy sử dụng mã PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Để tăng cường bảo mật, hãy sử dụng mật khẩu"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index a2387b0..685f835 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"输入您的 PIN 码"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"绘制您的图案"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"输入您的密码"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"SIM 卡无效。"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"已充满电"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在无线充电"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"出现错误,无法停用 eSIM 卡。"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"输入"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"图案错误"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"密码错误"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN 码错误"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{请在 # 秒后重试。}other{请在 # 秒后重试。}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"请输入 SIM 卡 PIN 码。"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"请输入“<xliff:g id="CARRIER">%1$s</xliff:g>”的 SIM 卡 PIN 码。"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM 卡 PUK 码操作失败!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"切换输入法"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"飞行模式"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"重启设备后需要绘制解锁图案"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"重启设备后需要输入 PIN 码"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"重启设备后需要输入密码"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"为增强安全性,请改用图案"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"为增强安全性,请改用 PIN 码"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"为增强安全性,请改用密码"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index 8eeb8a3f..e36f294 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"請輸入 PIN"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"請畫出圖案"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"請輸入密碼"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"SIM 卡無效。"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"已完成充電"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 無線充電中"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"發生錯誤,因此無法停用此 eSIM 卡。"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter 鍵 (輸入)"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"圖案錯誤"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"密碼錯誤"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN 碼錯誤"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{請在 # 秒後再試一次。}other{請在 # 秒後再試一次。}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"輸入 SIM 卡的 PIN 碼。"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」SIM 卡的 PIN 碼。"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"無法使用 SIM 卡 PUK 碼解鎖!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"轉換輸入方法"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"飛行模式"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"裝置重新啟動後,必須畫出上鎖圖案才能使用"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"裝置重新啟動後,必須輸入 PIN 碼才能使用"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"裝置重新啟動後,必須輸入密碼才能使用"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"為提升安全性,請改用圖案"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"為提升安全性,請改用 PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"為提升安全性,請改用密碼"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index 781cf44..cd3e7a4 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"輸入 PIN 碼"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"畫出解鎖圖案"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"輸入密碼"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"卡片無效。"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"充電完成"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 無線充電"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"發生錯誤,因此無法停用 eSIM 卡。"</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Enter 鍵"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"圖案錯誤"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"密碼錯誤"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN 碼錯誤"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{請於 # 秒後再試一次。}other{請於 # 秒後再試一次。}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"輸入 SIM 卡的 PIN 碼。"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」SIM 卡的 PIN 碼。"</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"SIM 卡 PUK 碼解鎖失敗!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"切換輸入法"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"飛航模式"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"裝置重新啟動後需要畫出解鎖圖案"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"裝置重新啟動後需要輸入 PIN 碼"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"裝置重新啟動後需要輸入密碼"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"為強化安全性,請改用解鎖圖案"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"為強化安全性,請改用 PIN 碼"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"為強化安全性,請改用密碼"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml
index 94bd6a1..01cf8cf 100644
--- a/packages/SystemUI/res-keyguard/values-zu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml
@@ -21,8 +21,14 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Faka iPHINIKHODI yakho"</string>
+    <!-- no translation found for keyguard_enter_pin (8114529922480276834) -->
+    <skip />
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Faka iphethini yakho"</string>
+    <!-- no translation found for keyguard_enter_pattern (7616595160901084119) -->
+    <skip />
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Faka iphasiwedi yakho"</string>
+    <!-- no translation found for keyguard_enter_password (6483623792371009758) -->
+    <skip />
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ikhadi elingavumelekile."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Kushajiwe"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Iyashaja ngaphandle kwentambo"</string>
@@ -52,8 +58,68 @@
     <string name="error_disable_esim_msg" msgid="2441188596467999327">"I-eSIM ayikwakhi ukukhutshazwa ngenxa yephutha."</string>
     <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Faka"</string>
     <string name="kg_wrong_pattern" msgid="5907301342430102842">"Iphethini engalungile"</string>
+    <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) -->
+    <skip />
     <string name="kg_wrong_password" msgid="4143127991071670512">"Iphasiwedi engalungile"</string>
+    <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) -->
+    <skip />
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Iphinikhodi engalungile"</string>
+    <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) -->
+    <skip />
+    <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) -->
+    <skip />
+    <!-- no translation found for kg_fp_not_recognized (5183108260932029241) -->
+    <skip />
+    <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) -->
+    <skip />
+    <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) -->
+    <skip />
+    <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) -->
+    <skip />
+    <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) -->
+    <skip />
+    <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) -->
+    <skip />
+    <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) -->
+    <skip />
+    <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) -->
+    <skip />
+    <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) -->
+    <skip />
+    <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) -->
+    <skip />
+    <!-- no translation found for kg_face_locked_out (2751559491287575) -->
+    <skip />
+    <!-- no translation found for kg_fp_locked_out (6228277682396768830) -->
+    <skip />
+    <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) -->
+    <skip />
+    <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) -->
+    <skip />
     <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Zama futhi kumzuzwana ongu-#.}one{Zama futhi kumizuzwana engu-#.}other{Zama futhi kumizuzwana engu-#.}}"</string>
     <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Faka i-PIN ye-SIM"</string>
     <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Faka i-PIN ye-SIM ye-\"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
@@ -76,9 +142,12 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Umsebenzi we-PUK ye-SIM wehlulekile!"</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Shintsha indlela yokufaka"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Imodi yendiza"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Iphethini iyadingeka ngemuva kokuqala kabusha kwedivayisi"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Iphinikhodi iyadingeka ngemuva kokuqala kabusha kwedivayisi"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Iphasiwedi iyadingeka ngemuva kokuqala kabusha kwedivayisi"</string>
+    <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) -->
+    <skip />
+    <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) -->
+    <skip />
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Ukuze uthole ukuvikeleka okwengeziwe, sebenzisa iphetheni esikhundleni salokho"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Ukuze uthole ukuvikeleka okwengeziwe, sebenzisa i-PIN esikhundleni salokho"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Ukuze uthole ukuvikeleka okwengeziwe, sebenzisa iphasiwedi esikhundleni salokho"</string>
diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml
index 1f44f05..cad2c16 100644
--- a/packages/SystemUI/res-keyguard/values/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values/dimens.xml
@@ -95,6 +95,7 @@
     <dimen name="num_pad_key_margin_end">12dp</dimen>
 
     <!-- additional offset for clock switch area items -->
+    <dimen name="small_clock_height">114dp</dimen>
     <dimen name="clock_padding_start">28dp</dimen>
     <dimen name="below_clock_padding_start">32dp</dimen>
     <dimen name="below_clock_padding_end">16dp</dimen>
diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml
index 11b4d79..2143fc4 100644
--- a/packages/SystemUI/res-keyguard/values/strings.xml
+++ b/packages/SystemUI/res-keyguard/values/strings.xml
@@ -21,12 +21,21 @@
     <!-- Instructions telling the user to enter their PIN password to unlock the keyguard [CHAR LIMIT=30] -->
     <string name="keyguard_enter_your_pin">Enter your PIN</string>
 
+    <!-- Instructions telling the user to enter their PIN password to unlock the keyguard [CHAR LIMIT=26] -->
+    <string name="keyguard_enter_pin">Enter PIN</string>
+
     <!-- Instructions telling the user to enter their pattern to unlock the keyguard [CHAR LIMIT=30] -->
     <string name="keyguard_enter_your_pattern">Enter your pattern</string>
 
+    <!-- Instructions telling the user to enter their pattern to unlock the keyguard [CHAR LIMIT=26] -->
+    <string name="keyguard_enter_pattern">Draw pattern</string>
+
     <!-- Instructions telling the user to enter their text password to unlock the keyguard [CHAR LIMIT=30] -->
     <string name="keyguard_enter_your_password">Enter your password</string>
 
+    <!-- Instructions telling the user to enter their text password to unlock the keyguard [CHAR LIMIT=26] -->
+    <string name="keyguard_enter_password">Enter password</string>
+
     <!-- Shown in the lock screen when there is SIM card IO error. -->
     <string name="keyguard_sim_error_message_short">Invalid Card.</string>
 
@@ -118,11 +127,104 @@
 
     <!-- Message shown when user enters wrong pattern -->
     <string name="kg_wrong_pattern">Wrong pattern</string>
+
+    <!-- Message shown when user enters wrong pattern [CHAR LIMIT=26] -->
+    <string name="kg_wrong_pattern_try_again">Wrong pattern. Try again.</string>
+
     <!-- Message shown when user enters wrong password -->
     <string name="kg_wrong_password">Wrong password</string>
+
+    <!-- Message shown when user enters wrong pattern [CHAR LIMIT=26] -->
+    <string name="kg_wrong_password_try_again">Wrong password. Try again.</string>
+
     <!-- Message shown when user enters wrong PIN -->
     <string name="kg_wrong_pin">Wrong PIN</string>
-    <!-- Countdown message shown after too many failed unlock attempts -->
+
+    <!-- Message shown when user enters wrong PIN  [CHAR LIMIT=26] -->
+    <string name="kg_wrong_pin_try_again">Wrong PIN. Try again.</string>
+
+    <!-- Message shown when user enters wrong PIN/password/pattern below the main message, for ex: "Wrong PIN. Try again" in line 1 and the following text in line 2.  [CHAR LIMIT=52] -->
+    <string name="kg_wrong_input_try_fp_suggestion">Or unlock with fingerprint</string>
+
+    <!-- Message shown when user fingerprint is not recognized  [CHAR LIMIT=26] -->
+    <string name="kg_fp_not_recognized">Fingerprint not recognized</string>
+
+    <!-- Message shown when we want the users to try biometric auth again or use pin/pattern/password  [CHAR LIMIT=26] -->
+    <string name="bouncer_face_not_recognized">Face not recognized</string>
+
+    <!-- Message shown when we want the users to try biometric auth again or use pin/pattern/password  [CHAR LIMIT=52] -->
+    <string name="kg_bio_try_again_or_pin">Try again or enter PIN</string>
+
+    <!-- Message shown when we want the users to try biometric auth again or use pin/pattern/password  [CHAR LIMIT=52] -->
+    <string name="kg_bio_try_again_or_password">Try again or enter password</string>
+
+    <!-- Message shown when we want the users to try biometric auth again or use pin/pattern/password  [CHAR LIMIT=52] -->
+    <string name="kg_bio_try_again_or_pattern">Try again or draw pattern</string>
+
+    <!-- Message shown when we are on bouncer after temporary lockout of either face or fingerprint  [CHAR LIMIT=52] -->
+    <string name="kg_bio_too_many_attempts_pin">PIN is required after too many attempts</string>
+
+    <!-- Message shown when we are on bouncer after temporary lockout of either face or fingerprint  [CHAR LIMIT=52] -->
+    <string name="kg_bio_too_many_attempts_password">Password is required after too many attempts</string>
+
+    <!-- Message shown when we are on bouncer after temporary lockout of either face or fingerprint  [CHAR LIMIT=52] -->
+    <string name="kg_bio_too_many_attempts_pattern">Pattern is required after too many attempts</string>
+
+    <!-- Instructions when the user can unlock with PIN/password/pattern or fingerprint from bouncer. [CHAR LIMIT=26]  -->
+    <string name="kg_unlock_with_pin_or_fp">Unlock with PIN or fingerprint</string>
+
+    <!-- Instructions when the user can unlock with PIN/password/pattern or fingerprint from bouncer. [CHAR LIMIT=26]  -->
+    <string name="kg_unlock_with_password_or_fp">Unlock with password or fingerprint</string>
+
+    <!-- Instructions when the user can unlock with PIN/password/pattern or fingerprint from bouncer. [CHAR LIMIT=26]  -->
+    <string name="kg_unlock_with_pattern_or_fp">Unlock with pattern or fingerprint</string>
+
+    <!-- Message shown when we are on bouncer after Device admin requested lockdown.  [CHAR LIMIT=52] -->
+    <string name="kg_prompt_after_dpm_lock">For added security, device was locked by work policy</string>
+
+    <!-- Message shown for pin/pattern/password when we are on bouncer after user triggered lockdown.  [CHAR LIMIT=52] -->
+    <string name="kg_prompt_after_user_lockdown_pin">PIN is required after lockdown</string>
+
+    <!-- Message shown for pin/pattern/password when we are on bouncer after user triggered lockdown.  [CHAR LIMIT=52] -->
+    <string name="kg_prompt_after_user_lockdown_password">Password is required after lockdown</string>
+
+    <!-- Message shown for pin/pattern/password when we are on bouncer after user triggered lockdown.  [CHAR LIMIT=52] -->
+    <string name="kg_prompt_after_user_lockdown_pattern">Pattern is required after lockdown</string>
+
+    <!-- Message shown to prepare for an unattended update (OTA). Also known as an over-the-air (OTA) update.  [CHAR LIMIT=52] -->
+    <string name="kg_prompt_unattended_update">Update will install during inactive hours</string>
+
+    <!-- Message shown when primary authentication hasn't been used for some time.  [CHAR LIMIT=52] -->
+    <string name="kg_prompt_pin_auth_timeout">Added security required. PIN not used for a while.</string>
+
+    <!-- Message shown when primary authentication hasn't been used for some time.  [CHAR LIMIT=52] -->
+    <string name="kg_prompt_password_auth_timeout">Added security required. Password not used for a while.</string>
+
+    <!-- Message shown when primary authentication hasn't been used for some time.  [CHAR LIMIT=52] -->
+    <string name="kg_prompt_pattern_auth_timeout">Added security required. Pattern not used for a while.</string>
+
+    <!-- Message shown when device hasn't been unlocked for a while.  [CHAR LIMIT=52] -->
+    <string name="kg_prompt_auth_timeout">Added security required. Device wasn\u2019t unlocked for a while.</string>
+
+    <!-- Message shown when face unlock is not available after too many failed face authentication attempts.  [CHAR LIMIT=52] -->
+    <string name="kg_face_locked_out">Can\u2019t unlock with face. Too many attempts.</string>
+
+    <!-- Message shown when fingerprint unlock isn't available after too many failed fingerprint authentication attempts.  [CHAR LIMIT=52] -->
+    <string name="kg_fp_locked_out">Can\u2019t unlock with fingerprint. Too many attempts.</string>
+
+    <!-- Message shown when Trust Agent is disabled.  [CHAR LIMIT=52] -->
+    <string name="kg_trust_agent_disabled">Trust agent is unavailable</string>
+
+    <!-- Message shown when primary auth is locked out after too many attempts [CHAR LIMIT=52]  -->
+    <string name="kg_primary_auth_locked_out_pin">Too many attempts with incorrect PIN</string>
+
+    <!-- Message shown when primary auth is locked out after too many attempts [CHAR LIMIT=52]  -->
+    <string name="kg_primary_auth_locked_out_pattern">Too many attempts with incorrect pattern</string>
+
+    <!-- Message shown when primary auth is locked out after too many attempts [CHAR LIMIT=52]  -->
+    <string name="kg_primary_auth_locked_out_password">Too many attempts with incorrect password</string>
+
+    <!-- Countdown message shown after too many failed unlock attempts [CHAR LIMIT=26]-->
     <string name="kg_too_many_failed_attempts_countdown">{count, plural,
         =1 {Try again in # second.}
         other {Try again in # seconds.}
@@ -194,14 +296,14 @@
     <!-- Description of airplane mode -->
     <string name="airplane_mode">Airplane mode</string>
 
-    <!-- An explanation text that the pattern needs to be solved since the device has just been restarted. [CHAR LIMIT=80] -->
-    <string name="kg_prompt_reason_restart_pattern">Pattern required after device restarts</string>
+    <!-- An explanation text that the pattern needs to be solved since the device has just been restarted. [CHAR LIMIT=52] -->
+    <string name="kg_prompt_reason_restart_pattern">Pattern is required after device restarts</string>
 
-    <!-- An explanation text that the pin needs to be entered since the device has just been restarted. [CHAR LIMIT=80] -->
-    <string name="kg_prompt_reason_restart_pin">PIN required after device restarts</string>
+    <!-- An explanation text that the pin needs to be entered since the device has just been restarted. [CHAR LIMIT=52] -->
+    <string name="kg_prompt_reason_restart_pin">PIN is required after device restarts</string>
 
-    <!-- An explanation text that the password needs to be entered since the device has just been restarted. [CHAR LIMIT=80] -->
-    <string name="kg_prompt_reason_restart_password">Password required after device restarts</string>
+    <!-- An explanation text that the password needs to be entered since the device has just been restarted. [CHAR LIMIT=52] -->
+    <string name="kg_prompt_reason_restart_password">Password is required after device restarts</string>
 
     <!-- An explanation text that the pattern needs to be solved since the user hasn't used strong authentication since quite some time. [CHAR LIMIT=80] -->
     <string name="kg_prompt_reason_timeout_pattern">For additional security, use pattern instead</string>
diff --git a/packages/SystemUI/res-product/values-mr/strings.xml b/packages/SystemUI/res-product/values-mr/strings.xml
index feb9604..33c3eb4 100644
--- a/packages/SystemUI/res-product/values-mr/strings.xml
+++ b/packages/SystemUI/res-product/values-mr/strings.xml
@@ -21,8 +21,8 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="dock_alignment_slow_charging" product="default" msgid="6997633396534416792">"फास्ट चार्ज करण्यासाठी फोन पुन्हा अलाइन करा"</string>
     <string name="dock_alignment_not_charging" product="default" msgid="3980752926226749808">"वायरलेस पद्धतीने चार्ज करण्यासाठी फोन पुन्हा अलाइन करा"</string>
-    <string name="inattentive_sleep_warning_message" product="tv" msgid="6844464574089665063">"Android TV डिव्हाइस लवकरच बंद होणार आहे; सुरू ठेवण्यासाठी बटण दाबा."</string>
-    <string name="inattentive_sleep_warning_message" product="default" msgid="5693904520452332224">"डिव्हाइस लवकरच बंद होणार आहे; ते सुरू ठेवण्यासाठी दाबा."</string>
+    <string name="inattentive_sleep_warning_message" product="tv" msgid="6844464574089665063">"Android TV डिव्हाइस लवकरच बंद होणार आहे; सुरू ठेवण्यासाठी बटण प्रेस करा."</string>
+    <string name="inattentive_sleep_warning_message" product="default" msgid="5693904520452332224">"डिव्हाइस लवकरच बंद होणार आहे; ते सुरू ठेवण्यासाठी प्रेस करा."</string>
     <string name="keyguard_missing_sim_message" product="tablet" msgid="408124574073032188">"टॅबलेटमध्ये सिम नाही."</string>
     <string name="keyguard_missing_sim_message" product="default" msgid="2605468359948247208">"फोनमध्ये सिम नाही."</string>
     <string name="kg_invalid_confirm_pin_hint" product="default" msgid="6278551068943958651">"पिन कोड जुळत नाहीत"</string>
diff --git a/packages/SystemUI/res/drawable/contrast_dialog_button_background.xml b/packages/SystemUI/res/drawable/contrast_dialog_button_background.xml
new file mode 100644
index 0000000..4181220
--- /dev/null
+++ b/packages/SystemUI/res/drawable/contrast_dialog_button_background.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright 2023, The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+-->
+<selector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+
+    <item android:state_selected="true">
+        <shape android:shape="rectangle">
+            <solid android:color="?androidprv:attr/colorSurfaceHighlight" />
+            <stroke
+                android:color="?androidprv:attr/colorAccentPrimary"
+                android:width="@dimen/contrast_dialog_button_stroke_width" />
+            <corners android:radius="@dimen/contrast_dialog_button_radius"/>
+        </shape>
+    </item>
+
+    <item>
+        <layer-list>
+            <item android:top="@dimen/contrast_dialog_button_stroke_width"
+                android:bottom="@dimen/contrast_dialog_button_stroke_width"
+                android:left="@dimen/contrast_dialog_button_stroke_width"
+                android:right="@dimen/contrast_dialog_button_stroke_width">
+                <shape android:shape="rectangle">
+                    <solid android:color="?androidprv:attr/colorSurfaceHighlight" />
+                    <corners android:radius="@dimen/contrast_dialog_button_radius"/>
+                </shape>
+            </item>
+        </layer-list>
+    </item>
+</selector>
diff --git a/packages/SystemUI/res/drawable/ic_contrast_high.xml b/packages/SystemUI/res/drawable/ic_contrast_high.xml
new file mode 100644
index 0000000..aa5b5ab
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_contrast_high.xml
@@ -0,0 +1,25 @@
+<!--
+  ~ Copyright (C) 2023 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector android:autoMirrored="true" android:height="20dp"
+    android:viewportHeight="20" android:viewportWidth="66"
+    android:width="66dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#F2F1E8"
+        android:pathData="M0.5,8C0.5,3.858 3.858,0.5 8,0.5H58C62.142,0.5 65.5,3.858 65.5,8V12C65.5,16.142 62.142,19.5 58,19.5H8C3.858,19.5 0.5,16.142 0.5,12V8Z"
+        android:strokeColor="#1B1C17" android:strokeWidth="1"/>
+    <path android:fillColor="#1B1C17" android:pathData="M11,10m-6,0a6,6 0,1 1,12 0a6,6 0,1 1,-12 0"/>
+    <path android:fillColor="#1B1C17" android:pathData="M23,5L43,5A2,2 0,0 1,45 7L45,7A2,2 0,0 1,43 9L23,9A2,2 0,0 1,21 7L21,7A2,2 0,0 1,23 5z"/>
+    <path android:fillColor="#1B1C17" android:pathData="M23,11L55,11A2,2 0,0 1,57 13L57,13A2,2 0,0 1,55 15L23,15A2,2 0,0 1,21 13L21,13A2,2 0,0 1,23 11z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_contrast_medium.xml b/packages/SystemUI/res/drawable/ic_contrast_medium.xml
new file mode 100644
index 0000000..89519b8
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_contrast_medium.xml
@@ -0,0 +1,23 @@
+<!--
+  ~ 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.
+  -->
+<vector android:autoMirrored="true" android:height="20dp"
+    android:viewportHeight="20" android:viewportWidth="66"
+    android:width="66dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#F2F1E8" android:pathData="M0,8C0,3.582 3.582,0 8,0H58C62.418,0 66,3.582 66,8V12C66,16.418 62.418,20 58,20H8C3.582,20 0,16.418 0,12V8Z"/>
+    <path android:fillColor="#919283" android:pathData="M11,10m-6,0a6,6 0,1 1,12 0a6,6 0,1 1,-12 0"/>
+    <path android:fillColor="#919283" android:pathData="M23,5L43,5A2,2 0,0 1,45 7L45,7A2,2 0,0 1,43 9L23,9A2,2 0,0 1,21 7L21,7A2,2 0,0 1,23 5z"/>
+    <path android:fillColor="#919283" android:pathData="M23,11L55,11A2,2 0,0 1,57 13L57,13A2,2 0,0 1,55 15L23,15A2,2 0,0 1,21 13L21,13A2,2 0,0 1,23 11z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_contrast_standard.xml b/packages/SystemUI/res/drawable/ic_contrast_standard.xml
new file mode 100644
index 0000000..f914975
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_contrast_standard.xml
@@ -0,0 +1,23 @@
+<!--
+  ~ 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.
+  -->
+<vector android:autoMirrored="true" android:height="20dp"
+    android:viewportHeight="20" android:viewportWidth="66"
+    android:width="66dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#C7C8B7" android:pathData="M0,8C0,3.582 3.582,0 8,0H58C62.418,0 66,3.582 66,8V12C66,16.418 62.418,20 58,20H8C3.582,20 0,16.418 0,12V8Z"/>
+    <path android:fillColor="#919283" android:pathData="M11,10m-6,0a6,6 0,1 1,12 0a6,6 0,1 1,-12 0"/>
+    <path android:fillColor="#919283" android:pathData="M23,5L43,5A2,2 0,0 1,45 7L45,7A2,2 0,0 1,43 9L23,9A2,2 0,0 1,21 7L21,7A2,2 0,0 1,23 5z"/>
+    <path android:fillColor="#919283" android:pathData="M23,11L55,11A2,2 0,0 1,57 13L57,13A2,2 0,0 1,55 15L23,15A2,2 0,0 1,21 13L21,13A2,2 0,0 1,23 11z"/>
+</vector>
diff --git a/packages/SystemUI/res/layout/contrast_dialog.xml b/packages/SystemUI/res/layout/contrast_dialog.xml
new file mode 100644
index 0000000..8e885cf
--- /dev/null
+++ b/packages/SystemUI/res/layout/contrast_dialog.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2023 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal">
+
+    <Space
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"/>
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <FrameLayout
+            android:id="@+id/contrast_button_standard"
+            android:layout_width="@dimen/contrast_dialog_button_total_size"
+            android:layout_height="@dimen/contrast_dialog_button_total_size"
+            android:background="@drawable/contrast_dialog_button_background">
+
+            <ImageView
+                android:layout_gravity="center"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:src="@drawable/ic_contrast_standard"/>
+        </FrameLayout>
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/contrast_dialog_button_text_spacing"
+            android:gravity="center_horizontal|top"
+            android:textSize="@dimen/contrast_dialog_button_text_size"
+            android:text="@string/quick_settings_contrast_standard"
+            android:textColor="?androidprv:attr/textColorPrimary"/>
+    </LinearLayout>
+
+    <Space
+        android:layout_width="@dimen/contrast_dialog_button_horizontal_spacing"
+        android:layout_height="match_parent" />
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <FrameLayout
+            android:id="@+id/contrast_button_medium"
+            android:layout_width="@dimen/contrast_dialog_button_total_size"
+            android:layout_height="@dimen/contrast_dialog_button_total_size"
+            android:background="@drawable/contrast_dialog_button_background">
+
+            <ImageView
+                android:layout_gravity="center"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:src="@drawable/ic_contrast_medium"/>
+        </FrameLayout>
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/contrast_dialog_button_text_spacing"
+            android:gravity="center_horizontal|top"
+            android:textSize="@dimen/contrast_dialog_button_text_size"
+            android:text="@string/quick_settings_contrast_medium"
+            android:textColor="?androidprv:attr/textColorPrimary"/>
+    </LinearLayout>
+
+    <Space
+        android:layout_width="@dimen/contrast_dialog_button_horizontal_spacing"
+        android:layout_height="match_parent" />
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <FrameLayout
+            android:id="@+id/contrast_button_high"
+            android:layout_width="@dimen/contrast_dialog_button_total_size"
+            android:layout_height="@dimen/contrast_dialog_button_total_size"
+            android:background="@drawable/contrast_dialog_button_background">
+
+            <ImageView
+                android:layout_gravity="center"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:src="@drawable/ic_contrast_high"/>
+
+        </FrameLayout>
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/contrast_dialog_button_text_spacing"
+            android:gravity="center_horizontal|top"
+            android:textSize="@dimen/contrast_dialog_button_text_size"
+            android:text="@string/quick_settings_contrast_high"
+            android:textColor="?androidprv:attr/textColorPrimary"/>
+    </LinearLayout>
+
+    <Space
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"/>
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/controls_management.xml b/packages/SystemUI/res/layout/controls_management.xml
index b9e711e..d8967d4 100644
--- a/packages/SystemUI/res/layout/controls_management.xml
+++ b/packages/SystemUI/res/layout/controls_management.xml
@@ -77,6 +77,29 @@
                 app:layout_constraintStart_toStartOf="parent"/>
 
             <Button
+                android:id="@+id/rearrange"
+                android:visibility="gone"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:gravity="center_vertical"
+                style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toStartOf="parent"/>
+
+            <Button
+                android:id="@+id/addControls"
+                android:visibility="gone"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:gravity="center_vertical"
+                android:text="@string/controls_favorite_add_controls"
+                style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toStartOf="parent"/>
+
+            <Button
                 android:id="@+id/done"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
diff --git a/packages/SystemUI/res/layout/notification_conversation_info.xml b/packages/SystemUI/res/layout/notification_conversation_info.xml
index 79948da..4f6e88c 100644
--- a/packages/SystemUI/res/layout/notification_conversation_info.xml
+++ b/packages/SystemUI/res/layout/notification_conversation_info.xml
@@ -170,11 +170,11 @@
             android:layout_width="@dimen/notification_importance_toggle_size"
             android:layout_height="@dimen/notification_importance_toggle_size"
             android:layout_centerVertical="true"
-            android:background="@drawable/ripple_drawable"
             android:contentDescription="@string/notification_more_settings"
+            android:background="@drawable/ripple_drawable_20dp"
             android:src="@drawable/ic_settings"
-            android:layout_alignParentEnd="true"
-            android:tint="@color/notification_guts_link_icon_tint"/>
+            android:tint="?android:attr/colorAccent"
+            android:layout_alignParentEnd="true" />
 
     </LinearLayout>
 
diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml
index 4d6c2022..852db1b 100644
--- a/packages/SystemUI/res/layout/notification_info.xml
+++ b/packages/SystemUI/res/layout/notification_info.xml
@@ -108,11 +108,11 @@
             android:layout_width="@dimen/notification_importance_toggle_size"
             android:layout_height="@dimen/notification_importance_toggle_size"
             android:layout_centerVertical="true"
-            android:background="@android:color/transparent"
             android:contentDescription="@string/notification_more_settings"
-            android:src="@drawable/notif_settings_button"
-            android:layout_alignParentEnd="true"
-            android:tint="@color/notification_guts_link_icon_tint"/>
+            android:background="@drawable/ripple_drawable_20dp"
+            android:src="@drawable/ic_settings"
+            android:tint="?android:attr/colorAccent"
+            android:layout_alignParentEnd="true" />
 
     </LinearLayout>
 
diff --git a/packages/SystemUI/res/layout/partial_conversation_info.xml b/packages/SystemUI/res/layout/partial_conversation_info.xml
index 9ed3f92..4850b35 100644
--- a/packages/SystemUI/res/layout/partial_conversation_info.xml
+++ b/packages/SystemUI/res/layout/partial_conversation_info.xml
@@ -81,11 +81,11 @@
             android:layout_width="@dimen/notification_importance_toggle_size"
             android:layout_height="@dimen/notification_importance_toggle_size"
             android:layout_centerVertical="true"
-            android:background="@drawable/ripple_drawable"
             android:contentDescription="@string/notification_more_settings"
+            android:background="@drawable/ripple_drawable_20dp"
             android:src="@drawable/ic_settings"
-            android:layout_alignParentEnd="true"
-            android:tint="@color/notification_guts_link_icon_tint"/>
+            android:tint="?android:attr/colorAccent"
+            android:layout_alignParentEnd="true"/>
 
     </LinearLayout>
 
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 73a77bd..752346a 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktiveer"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Klank en vibrasie"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Instellings"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Program is vasgespeld"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Oorsig om dit te ontspeld."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Tuis om dit te ontspeld."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Vergrotingwisselaar"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Vergroot die hele skerm"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Vergroot \'n deel van die skerm"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Wissel"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Maak vergrotinginstellings oop"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Sleep hoek om grootte te verander"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Laat diagonale rollees toe"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Medium"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Klein"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Groot"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Volskerm"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Klaar"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Wysig"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Vergrootglasvensterinstellings"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle kontroles is verwyder"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Veranderinge is nie gestoor nie"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Sien ander programme"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Kontroles kon nie gelaai word nie. Gaan die <xliff:g id="APP">%s</xliff:g>-program na om seker te maak dat die programinstellings nie verander het nie."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Versoenbare kontroles is nie beskikbaar nie"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Ander"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 4159cca..10c7c44 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -69,8 +69,7 @@
     <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"ዩኤስቢ አንቃ"</string>
     <string name="learn_more" msgid="4690632085667273811">"የበለጠ ለመረዳት"</string>
     <string name="global_action_screenshot" msgid="2760267567509131654">"ቅጽበታዊ ገጽ እይታ"</string>
-    <!-- no translation found for global_action_smart_lock_disabled (6286551337177954859) -->
-    <skip />
+    <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"መክፈትን አራዝም ተሰናክሏል"</string>
     <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ምስል ተልኳል"</string>
     <string name="screenshot_saving_title" msgid="2298349784913287333">"ቅጽበታዊ ገጽ እይታ በማስቀመጥ ላይ..."</string>
     <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ቅጽበታዊ ገጽ እይታን ወደ የስራ መገለጫ በማስቀመጥ ላይ…"</string>
@@ -459,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"አሰናክል"</string>
     <string name="sound_settings" msgid="8874581353127418308">"ድምፅ እና ንዝረት"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ቅንብሮች"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"መተግበሪያ ተሰክቷል"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል ተመለስ እና አጠቃላይ ዕይታ የሚለውን ይጫኑ እና ይያዙ።"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል ተመለስ እና መነሻ የሚለውን ይንኩ እና ይያዙ።"</string>
@@ -833,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"የማጉላት ማብሪያ/ማጥፊያ"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"ሙሉ ገጽ እይታን ያጉሉ"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"የማያ ገጹን ክፍል አጉላ"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ማብሪያ/ማጥፊያ"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"የማጉያ ቅንብሮችን ክፈት"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"መጠን ለመቀየር ጠርዙን ይዘው ይጎትቱ"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"ሰያፍ ሽብለላን ፍቀድ"</string>
@@ -850,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"መካከለኛ"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"ትንሽ"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"ትልቅ"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"ሙሉ ገጽ ዕይታ"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"ተከናውኗል"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"አርትዕ"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"የማጉያ መስኮት ቅንብሮች"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"ሁሉም መቆጣጠሪያዎች ተወግደዋል"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ለውጦች አልተቀመጡም"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"ሌሎች መተግበሪያዎች ይመልከቱ"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"መቆጣጠሪያዎች ሊጫኑ አልቻሉም። የመተግበሪያው ቅንብሮች እንዳልተቀየሩ ለማረጋገጥ <xliff:g id="APP">%s</xliff:g> መተግበሪያን ይፈትሹ።"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"ተኳዃኝ መቆጣጠሪያዎች አይገኙም"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ሌላ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 17c3d0f7..1fa13d5 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"إيقاف"</string>
     <string name="sound_settings" msgid="8874581353127418308">"الصوت والاهتزاز"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"الإعدادات"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"تم تثبيت الشاشة على التطبيق"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار الزرين \"رجوع\" و\"نظرة عامة\" لإزالة التثبيت."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار الزرين \"رجوع\" و\"الشاشة الرئيسية\" لإزالة التثبيت."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"مفتاح تبديل وضع التكبير"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"تكبير الشاشة كلها"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"تكبير جزء من الشاشة"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"تبديل"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"فتح إعدادات التكبير"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"اسحب الزاوية لتغيير الحجم."</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"السماح بالتمرير القطري"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"متوسط"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"صغير"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"كبير"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"ملء الشاشة"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"تم"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"تعديل"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"إعدادات نافذة مكبّر الشاشة"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{تمت إضافة عنصر تحكّم واحد.}zero{تمت إضافة # عنصر تحكّم.}two{تمت إضافة عنصرَي تحكّم.}few{تمت إضافة # عناصر تحكّم.}many{تمت إضافة # عنصر تحكّم.}other{تمت إضافة # عنصر تحكّم.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"تمت الإزالة"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"هل تريد إضافة \"<xliff:g id="APPNAME">%s</xliff:g>\"؟"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"يمكن لتطبيق \"<xliff:g id="APPNAME">%s</xliff:g>\" اختيار المحتوى وعناصر التحكّم التي تظهر هنا."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"هل تريد إزالة عناصر التحكّم في \"<xliff:g id="APPNAME">%s</xliff:g>\"؟"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"تمت الإضافة إلى المفضّلة"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"تمت الإضافة إلى المفضّلة، الموضع <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"تمت إزالة كل عناصر التحكّم."</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"لم يتم حفظ التغييرات."</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"عرض التطبيقات الأخرى"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"تعذَّر تحميل عناصر التحكّم. تحقّق من تطبيق <xliff:g id="APP">%s</xliff:g> للتأكّد من أنه لم يتم تغيير إعدادات التطبيق."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"عناصر التحكّم المتوافقة غير متوفّرة"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"غير ذلك"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 95cfcb4..b42dbeb 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -71,14 +71,14 @@
     <string name="global_action_screenshot" msgid="2760267567509131654">"স্ক্ৰীনশ্বট"</string>
     <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock অক্ষম কৰা আছে"</string>
     <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"এখন প্ৰতিচ্ছবি পঠিয়াইছে"</string>
-    <string name="screenshot_saving_title" msgid="2298349784913287333">"স্ক্ৰীণশ্বট ছেভ কৰি থকা হৈছে…"</string>
+    <string name="screenshot_saving_title" msgid="2298349784913287333">"স্ক্ৰীনশ্বট ছেভ কৰি থকা হৈছে…"</string>
     <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"কৰ্মস্থানৰ প্ৰ’ফাইলত স্ক্ৰীনশ্বট ছেভ কৰি থকা হৈছে…"</string>
-    <string name="screenshot_saved_title" msgid="8893267638659083153">"স্ক্ৰীণশ্বট ছেভ কৰা হ’ল"</string>
-    <string name="screenshot_failed_title" msgid="3259148215671936891">"স্ক্ৰীণশ্বট ছেভ কৰিব পৰা নগ\'ল"</string>
+    <string name="screenshot_saved_title" msgid="8893267638659083153">"স্ক্ৰীনশ্বট ছেভ কৰা হ’ল"</string>
+    <string name="screenshot_failed_title" msgid="3259148215671936891">"স্ক্ৰীনশ্বট ছেভ কৰিব পৰা নগ\'ল"</string>
     <string name="screenshot_failed_to_save_user_locked_text" msgid="6156607948256936920">"স্ক্ৰীনশ্বট ছেভ কৰিবলৈ ডিভাইচটো আনলক কৰিবই লাগিব"</string>
-    <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"স্ক্ৰীণশ্বট আকৌ ল\'বলৈ চেষ্টা কৰক"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"স্ক্ৰীনশ্বট আকৌ ল\'বলৈ চেষ্টা কৰক"</string>
     <string name="screenshot_failed_to_save_text" msgid="7232739948999195960">"স্ক্ৰীনশ্বট ছেভ কৰিব নোৱাৰি"</string>
-    <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"এপটোৱে বা আপোনাৰ প্ৰতিষ্ঠানে স্ক্ৰীণশ্বট ল\'বলৈ অনুমতি নিদিয়ে"</string>
+    <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"এপটোৱে বা আপোনাৰ প্ৰতিষ্ঠানে স্ক্ৰীনশ্বট ল\'বলৈ অনুমতি নিদিয়ে"</string>
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"স্ক্ৰীনশ্বট লোৱাটো আপোনাৰ আইটি প্ৰশাসকে অৱৰোধ কৰিছে"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"সম্পাদনা কৰক"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"স্ক্ৰীনশ্বট সম্পাদনা কৰক"</string>
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"অক্ষম কৰক"</string>
     <string name="sound_settings" msgid="8874581353127418308">"ধ্বনি আৰু কম্পন"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ছেটিং"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"এপ্‌টো পিন কৰা আছে"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ \'পিছলৈ যাওক\' আৰু \'অৱলোকন\'-ত স্পৰ্শ কৰি থাকক।"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ পিছলৈ যাওক আৰু হ\'মত স্পৰ্শ কৰি সেঁচি ধৰক।"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"বিবৰ্ধনৰ ছুইচ"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"পূৰ্ণ স্ক্ৰীন বিবৰ্ধন কৰক"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"স্ক্ৰীনৰ কিছু অংশ বিবৰ্ধন কৰক"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ছুইচ"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"বিবৰ্ধন কৰাৰ ছেটিং খোলক"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"আকাৰ সলনি কৰিবলৈ চুককেইটা টানি আনি এৰক"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"কৰ্ণডালৰ দিশত স্ক্ৰ’ল কৰাৰ সুবিধা"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"মধ্যমীয়া"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"সৰু"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"ডাঙৰ"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"পূৰ্ণ স্ক্ৰীন"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"কৰা হ’ল"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"সম্পাদনা কৰক"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"বিবৰ্ধকৰ ৱিণ্ড’ৰ ছেটিং"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"আটাইবোৰ নিয়ন্ত্ৰণ আঁতৰোৱা হৈছে"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"সালসলনিসমূহ ছেভ নহ’ল"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"অন্য এপ্‌সমূহ চাওক"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"নিয়ন্ত্ৰণসমূহ ল’ড কৰিবপৰা নগ’ল। এপ্‌টোৰ ছেটিং সলনি কৰা হোৱা নাই বুলি নিশ্চিত কৰিবলৈ <xliff:g id="APP">%s</xliff:g> এপ্‌টো পৰীক্ষা কৰক।"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"সমিল নিয়ন্ত্ৰণসমূহ উপলব্ধ নহয়"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"অন্য"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 7e26882..8c9af86 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktiv edin"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Səs və vibrasiya"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ayarlar"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Tətbiq bərkidilib"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri və İcmal düymələrinə basıb saxlayın."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"\"Geri\" və \"Əsas ekran\" düymələrinin davamlı basılması ilə çıxarılana qədər tətbiq göz önündə qalır."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Böyütmə dəyişdiricisi"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Tam ekranı böyüdün"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ekran hissəsinin böyüdülməsi"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Dəyişdirici"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Böyütmə ayarlarını açın"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Ölçüsünü dəyişmək üçün küncündən sürüşdürün"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Diaqonal sürüşdürməyə icazə verin"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Orta"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Kiçik"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Böyük"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Tam ekran"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Hazırdır"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Redaktə edin"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Böyüdücü pəncərə ayarları"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Kontrol vidcetləri silindi"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Dəyişikliklər yadda saxlanmadı"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Digər tətbiqlərə baxın"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Nizamlayıcıları yükləmək mümkün olmadı. <xliff:g id="APP">%s</xliff:g> tətbiqinə toxunaraq tətbiq ayarlarının dəyişmədiyinə əmin olun."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Uyğun nizamlayıcılar əlçatan deyil"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Digər"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 6f36211..fd56a3e 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"onemogućite"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Zvuk i vibriranje"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Podešavanja"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacija je zakačena"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Nazad i Pregled da biste ga otkačili."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Nazad i Početna da biste ga otkačili."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Prelazak na drugi režim uvećanja"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Uvećajte ceo ekran"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Uvećajte deo ekrana"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Pređi"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Otvori podešavanja uvećanja"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Prevucite ugao da biste promenili veličinu"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Dozvoli dijagonalno skrolovanje"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Srednje"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Malo"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Veliko"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Preko celog ekrana"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Gotovo"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Izmeni"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Podešavanja prozora za uvećanje"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Sve kontrole su uklonjene"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Promene nisu sačuvane"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Pogledajte druge aplikacije"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Učitavanje kontrola nije uspelo. Pogledajte aplikaciju <xliff:g id="APP">%s</xliff:g> da biste se uverili da se podešavanja aplikacije nisu promenila."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Kompatibilne kontrole nisu dostupne"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 0b30428..80a07f4 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"адключыць"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Гук і вібрацыя"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Налады"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Праграма замацавана"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, краніце і ўтрымлівайце кнопкі \"Назад\" і \"Агляд\"."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, націсніце і ўтрымлівайце кнопкі \"Назад\" і \"Галоўны экран\"."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Пераключальнік павелічэння"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Павялічыць увесь экран"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Павялічыць частку экрана"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Пераключальнік"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Адкрыць налады павелічэння"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Каб змяніць памер, перацягніце вугал"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Дазволіць прагортванне па дыяганалі"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Сярэдні"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Дробны"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Вялікі"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Поўнаэкранны рэжым"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Гатова"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Змяніць"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Налады акна лупы"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Дададзены # элемент кіравання.}one{Дададзена # элемента кіравання.}few{Дададзена # элементы кіравання.}many{Дададзена # элементаў кіравання.}other{Дададзена # элемента кіравання.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Выдалена"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"Дадаць праграму \"<xliff:g id="APPNAME">%s</xliff:g>\"?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"У праграме \"<xliff:g id="APPNAME">%s</xliff:g>\" можна выбраць налады і змесціва, якія будуць тут паказвацца."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Выдаліць налады для <xliff:g id="APPNAME">%s</xliff:g>?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"Дададзена ў абранае"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Дададзена ў абранае, пазіцыя <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Усе элементы кіравання выдалены"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Змяненні не захаваны"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Паказаць іншыя праграмы"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Не ўдалося загрузіць элементы кіравання. Праверце, ці не змяніліся налады праграмы \"<xliff:g id="APP">%s</xliff:g>\"."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Сумяшчальныя элементы кіравання недаступныя"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Іншае"</string>
@@ -1066,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"змяніць"</string>
     <string name="add" msgid="81036585205287996">"Дадаць"</string>
     <string name="manage_users" msgid="1823875311934643849">"Кіраванне карыстальнікамі"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"Гэта апавяшчэнне нельга перацягнуць на падзелены экран."</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Сетка Wi‑Fi недаступная"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Прыярытэтны рэжым"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Будзільнік зададзены"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index dd4c4e8..585902f 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"деактивиране"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Звук и вибриране"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Настройки"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Приложението е фиксирано"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за връщане назад и този за общ преглед."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за връщане назад и „Начало“."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Превключване на увеличението"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Увеличаване на целия екран"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Увеличаване на част от екрана"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Превключване"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Отваряне на настройките за увеличението"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Плъзнете ъгъла за преоразмеряване"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Разрешаване на диагонално превъртане"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Среден"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Малък"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Голям"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Цял екран"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Готово"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Редактиране"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Настройки за инструмента за увеличаване на прозорци"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Всички контроли са премахнати"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Промените не са запазени"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Преглед на други приложения"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Контролите не се заредиха. Отворете приложението <xliff:g id="APP">%s</xliff:g> и проверете дали настройките му не са променени."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Не са налице съвместими контроли"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Друго"</string>
@@ -1065,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"редактиране"</string>
     <string name="add" msgid="81036585205287996">"Добавяне"</string>
     <string name="manage_users" msgid="1823875311934643849">"Управление на потребителите"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"Това известие не поддържа плъзгане за разделяне на екрана"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi не е налице"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Приоритетен режим"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Будилникът е зададен"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 1d7d607..76e657d 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -451,13 +451,17 @@
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent দিয়ে আনলক করে রাখা হয়েছে"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"সাউন্ড সেটিংস"</string>
-    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"মিডিয়া অটোমেটিক ক্যাপশন করুন"</string>
+    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"অটোমেটিক মিডিয়া ক্যাপশন দেখুন"</string>
     <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"ক্লোজড ক্যাপশন টুল টিপ বন্ধ করুন"</string>
     <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"ক্যাপশন ওভারলে"</string>
     <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"চালু হবে"</string>
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"বন্ধ হবে"</string>
     <string name="sound_settings" msgid="8874581353127418308">"সাউন্ড ও ভাইব্রেশন"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"সেটিংস"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"অ্যাপ পিন করা হয়েছে"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"এটি আপনি আনপিন না করা পর্যন্ত এটিকে প্রদর্শিত করবে৷ আনপিন করতে ফিরুন এবং ওভারভিউ স্পর্শ করে ধরে থাকুন।"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"এর ফলে আপনি এটি আনপিন না করা পর্যন্ত এটি দেখানো হতে থাকবে। আনপিন করতে \"ফিরে যান\" এবং \"হোম\" বোতামদুটি ট্যাপ করে ধরে রাখুন।"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"বড় করে দেখার সুইচ"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"সম্পূর্ণ স্ক্রিন বড় করে দেখা"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"স্ক্রিনের কিছুটা অংশ বড় করুন"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"বদল করুন"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"বড় করে দেখার সেটিংস খুলুন"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"ছোট বড় করার জন্য কোণ টেনে আনুন"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"কোণাকুণি স্ক্রল করার অনুমতি দেওয়া"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"মাঝারি"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"ছোট"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"বড়"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"ফুল স্ক্রিন"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"হয়ে গেছে"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"এডিট করুন"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"\'ম্যাগনিফায়ার উইন্ডো\' সেটিংস"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"সমস্ত কন্ট্রোল সরানো হয়েছে"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"পরিবর্তন সেভ করা হয়নি"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"অন্যান্য অ্যাপ দেখুন"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"কন্ট্রোল লোড করা যায়নি। অ্যাপ সেটিংসে কোনও পরিবর্তন করা হয়েছে কিনা তা ভাল করে দেখে নিতে <xliff:g id="APP">%s</xliff:g> অ্যাপ চেক করুন।"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"মানানসই কন্ট্রোল উপলভ্য নেই"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"অন্য"</string>
@@ -1065,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"এডিট করতে"</string>
     <string name="add" msgid="81036585205287996">"যোগ করুন"</string>
     <string name="manage_users" msgid="1823875311934643849">"ব্যবহারকারীদের ম্যানেজ করুন"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"\'স্প্লিটস্ক্রিন\' মোডে এই বিজ্ঞপ্তি টেনে আনা যাবে না"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"ওয়াই-ফাই উপলভ্য নেই"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"প্রায়োরিটি মোড"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"অ্যালার্ম সেট করা হয়েছে"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 62eafb4..4ce0baf 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"onemogući"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Zvuk i vibracija"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Postavke"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacija je zakačena"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Nazad."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Na ovaj način ekran ostaje prikazan dok ga ne otkačite. Da otkačite ekran, dodirnite i držite dugme Nazad i Početna."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Prekidač za uvećavanje"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Uvećavanje prikaza preko cijelog ekrana"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Uvećavanje dijela ekrana"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Prekidač"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Otvori postavke uvećavanja"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Prevucite ugao da promijenite veličinu"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Dozvoli dijagonalno klizanje"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Srednje"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Malo"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Veliko"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Prikaz preko cijelog ekrana"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Gotovo"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Uredi"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Postavke prozora povećala"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Sve kontrole su uklonjene"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Promjene nisu sačuvane"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Prikaži druge aplikacije"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Učitavanje kontrola nije uspjelo. Provjerite aplikaciju <xliff:g id="APP">%s</xliff:g> da se uvjerite da postavke aplikacije nisu izmijenjene."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Kompatibilne kontrole nisu dostupne"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 42649d1..c08858a 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desactivar"</string>
     <string name="sound_settings" msgid="8874581353127418308">"So i vibració"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Configuració"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"L\'aplicació està fixada"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, toca i mantén premudes els botons Enrere i Aplicacions recents."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, mantén premuts els botons Enrere i Inici."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Canvia al mode d\'ampliació"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Amplia la pantalla completa"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Amplia una part de la pantalla"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Canvia"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Obre la configuració de l\'ampliació"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Arrossega el cantó per canviar la mida"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Permet el desplaçament en diagonal"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Normal"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Petit"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Gran"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Pantalla completa"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Fet"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Edita"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Configuració de la finestra de la lupa"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"S\'han suprimit tots els controls"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Els canvis no s\'han desat"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Mostra altres aplicacions"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"No s\'han pogut carregar els controls. Consulta l\'aplicació <xliff:g id="APP">%s</xliff:g> per assegurar-te que la configuració de l\'aplicació no hagi canviat."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Els controls compatibles no estan disponibles"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Altres"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 13b87f1..a63025f 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktivovat"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Zvuk a vibrace"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Nastavení"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikace je připnutá"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Obsah bude připnut v zobrazení, dokud jej neuvolníte. Uvolníte jej stisknutím a podržením tlačítek Zpět a Přehled."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Obsah bude připnut v zobrazení, dokud ho neuvolníte. Uvolníte ho podržením tlačítek Zpět a Plocha."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Přepínač zvětšení"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Zvětšit celou obrazovku"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Zvětšit část obrazovky"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Přepnout"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Otevřít nastavení zvětšení"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Velikost změníte přetažením rohu"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Povolit diagonální posouvání"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Střední"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Malý"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Velký"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Celá obrazovka"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Hotovo"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Upravit"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Nastavení okna zvětšení"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Byl přidán # ovládací prvek.}few{Byly přidány # ovládací prvky.}many{Bylo přidáno # ovládacího prvku.}other{Bylo přidáno # ovládacích prvků.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Odstraněno"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"Přidat aplikaci <xliff:g id="APPNAME">%s</xliff:g>?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"Aplikace <xliff:g id="APPNAME">%s</xliff:g> může vybrat, které ovládací prvky a obsah se zde zobrazí."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Odstranit ovládací prvky aplikace <xliff:g id="APPNAME">%s</xliff:g>?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"Přidáno do oblíbených"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Přidáno do oblíbených na pozici <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Všechny ovládací prvky byly odstraněny"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Změny nebyly uloženy"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Zobrazit další aplikace"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Ovládací prvky se nepodařilo načíst. V aplikaci <xliff:g id="APP">%s</xliff:g> zkontrolujte, zda se nezměnilo nastavení."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Kompatibilní ovládání není k dispozici"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Jiné"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 815b402..e0e1a24 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktiver"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Lyd og vibration"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Indstillinger"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Appen er fastgjort"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Dette fastholder skærmen i visningen, indtil du frigør den. Tryk på Tilbage og Overblik, og hold fingeren nede for at frigøre skærmen."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Dette fastholder skærmen i visningen, indtil du frigør den. Hold Tilbage og Startskærm nede for at frigøre skærmen."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Skift forstørrelsestilstand"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Forstør hele skærmen"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Forstør en del af skærmen"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Skift"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Åbn indstillinger for forstørrelse"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Træk i hjørnet for at justere størrelsen"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Tillad diagonal rulning"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Mellem"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Lille"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Stor"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Fuld skærm"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Udfør"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Rediger"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Indstillinger for lupvindue"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# styringselement er tilføjet.}one{# styringselement er tilføjet.}other{# styringselementer er tilføjet.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Fjernet"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"Vil du tilføje <xliff:g id="APPNAME">%s</xliff:g>?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> kan vælge, hvilke styringselementer og hvilket indhold der skal vises her."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Vil du fjerne styringselementerne for <xliff:g id="APPNAME">%s</xliff:g>?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"Angivet som favorit"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Angivet som favorit. Position <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle styringselementerne blev fjernet"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Ændringerne blev ikke gemt"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Se andre apps"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Betjeningselementerne kunne ikke indlæses. Tjek <xliff:g id="APP">%s</xliff:g>-appen for at sikre, at dine appindstillinger ikke er blevet ændret."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Kompatible betjeningselementer er ikke tilgængelige"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Andre"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index a3dcf62..662393c 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktivieren"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Ton &amp; Vibration"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Einstellungen"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"App ist auf dem Bildschirm fixiert"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Die App bleibt so lange auf dem Bildschirm fixiert, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Übersicht\"."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Die App bleibt so lange auf dem Bildschirm fixiert, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Startbildschirm\"."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Vergrößerungsschalter"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Ganzen Bildschirm vergrößern"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Teil des Bildschirms vergrößern"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Schalter"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Vergrößerungseinstellungen öffnen"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Zum Anpassen der Größe Ecke ziehen"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Diagonales Scrollen erlauben"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Mittel"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Klein"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Groß"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Vollbild"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Fertig"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Bearbeiten"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Einstellungen für das Vergrößerungsfenster"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle Steuerelemente entfernt"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Änderungen nicht gespeichert"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Andere Apps ansehen"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Steuerelemente konnten nicht geladen werden. Prüfe in der <xliff:g id="APP">%s</xliff:g> App, ob die Einstellungen möglicherweise geändert wurden."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Kompatible Steuerelemente nicht verfügbar"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Andere"</string>
@@ -1065,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"bearbeiten"</string>
     <string name="add" msgid="81036585205287996">"Hinzufügen"</string>
     <string name="manage_users" msgid="1823875311934643849">"Nutzer verwalten"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"Diese Benachrichtigung lässt sich nicht auf einen geteilten Bildschirm ziehen"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WLAN nicht verfügbar"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritätsmodus"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Wecker gestellt"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 4c76e17..50b0b49 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -458,6 +458,8 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"απενεργοποίηση"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Ήχος και δόνηση"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ρυθμίσεις"</string>
+    <string name="csd_lowered_title" product="default" msgid="1786173629015030856">"Μειώθηκε σε πιο ασφαλή ένταση ήχου"</string>
+    <string name="csd_system_lowered_text" product="default" msgid="2001603282316829500">"Η ένταση ήχου ήταν σε υψηλό επίπεδο για μεγαλύτερο διάστημα από αυτό που συνιστάται"</string>
     <string name="screen_pinning_title" msgid="9058007390337841305">"Η εφαρμογή είναι καρφιτσωμένη."</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Με αυτόν τον τρόπο παραμένει σε προβολή μέχρι να το ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα τα στοιχεία \"Επιστροφή\" και \"Επισκόπηση\" για ξεκαρφίτσωμα."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Με αυτόν τον τρόπο, παραμένει σε προβολή μέχρι να το ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα τα στοιχεία \"Πίσω\" και \"Αρχική οθόνη\" για ξεκαρφίτσωμα."</string>
@@ -832,7 +834,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Εναλλαγή μεγιστοποίησης"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Μεγέθυνση πλήρους οθόνης"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Μεγέθυνση μέρους της οθόνης"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Εναλλαγή"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Άνοιγμα ρυθμίσεων μεγιστοποίησης"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Σύρετε τη γωνία για αλλαγή μεγέθους"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Να επιτρέπεται η διαγώνια κύλιση"</string>
@@ -849,6 +850,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Μέτριο"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Μικρό"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Μεγάλο"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Πλήρης οθόνη"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Τέλος"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Επεξεργασία"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Ρυθμίσεις παραθύρου μεγεθυντικού φακού"</string>
@@ -884,6 +886,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Όλα τα στοιχεία ελέγχου καταργήθηκαν"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Οι αλλαγές δεν αποθηκεύτηκαν"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Εμφάνιση άλλων εφαρμογών"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Δεν ήταν δυνατή η φόρτωση των στοιχείων ελέγχου. Ελέγξτε την εφαρμογή <xliff:g id="APP">%s</xliff:g> για να βεβαιωθείτε ότι δεν έχουν αλλάξει οι ρυθμίσεις της εφαρμογής."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Μη διαθέσιμα συμβατά στοιχεία ελέγχου"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Άλλο"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 8086828..6913b2d 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"disable"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Sound and vibration"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Settings"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"App is pinned"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"This keeps it in view until you unpin. Touch &amp; hold Back and Overview to unpin."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"This keeps it in view until you unpin. Touch &amp; hold Back and Home to unpin."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Magnification switch"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Magnify full screen"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Magnify part of screen"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Open magnification settings"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Drag corner to resize"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Allow diagonal scrolling"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Medium"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Small"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Large"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Full screen"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Done"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Edit"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Magnifier window settings"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"All controls removed"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Changes not saved"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"See other apps"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Controls could not be loaded. Check the <xliff:g id="APP">%s</xliff:g> app to make sure that the app settings haven’t changed."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Compatible controls unavailable"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index c53db18..5e3f6ae 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -458,6 +458,8 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"disable"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Sound &amp; vibration"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Settings"</string>
+    <string name="csd_lowered_title" product="default" msgid="1786173629015030856">"Lowered to safer volume"</string>
+    <string name="csd_system_lowered_text" product="default" msgid="2001603282316829500">"The volume has been high for longer than recommended"</string>
     <string name="screen_pinning_title" msgid="9058007390337841305">"App is pinned"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"This keeps it in view until you unpin. Touch &amp; hold Back and Overview to unpin."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"This keeps it in view until you unpin. Touch &amp; hold Back and Home to unpin."</string>
@@ -832,7 +834,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Magnification switch"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Magnify full screen"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Magnify part of screen"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Open magnification settings"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Drag corner to resize"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Allow diagonal scrolling"</string>
@@ -849,6 +850,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Medium"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Small"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Large"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Full screen"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Done"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Edit"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Magnifier window settings"</string>
@@ -884,6 +886,9 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"All controls removed"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Changes not saved"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"See other apps"</string>
+    <string name="controls_favorite_rearrange_button" msgid="2942788904364641185">"Rearrange"</string>
+    <string name="controls_favorite_add_controls" msgid="1221420435546694004">"Add controls"</string>
+    <string name="controls_favorite_back_to_editing" msgid="184125114090062713">"Back to editing"</string>
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Controls could not be loaded. Check the <xliff:g id="APP">%s</xliff:g> app to make sure that the app settings haven’t changed."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Compatible controls unavailable"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string>
@@ -1086,7 +1091,7 @@
     <string name="dream_time_complication_24_hr_time_format" msgid="6248280719733640813">"kk:mm"</string>
     <string name="log_access_confirmation_title" msgid="4843557604739943395">"Allow <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> to access all device logs?"</string>
     <string name="log_access_confirmation_allow" msgid="752147861593202968">"Allow one-time access"</string>
-    <string name="log_access_confirmation_deny" msgid="2389461495803585795">"Don’t allow"</string>
+    <string name="log_access_confirmation_deny" msgid="2389461495803585795">"Don\'t allow"</string>
     <string name="log_access_confirmation_body" msgid="6883031912003112634">"Device logs record what happens on your device. Apps can use these logs to find and fix issues.\n\nSome logs may contain sensitive info, so only allow apps you trust to access all device logs. \n\nIf you don’t allow this app to access all device logs, it can still access its own logs. Your device manufacturer may still be able to access some logs or info on your device."</string>
     <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Learn more"</string>
     <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Learn more at <xliff:g id="URL">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 8086828..6913b2d 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"disable"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Sound and vibration"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Settings"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"App is pinned"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"This keeps it in view until you unpin. Touch &amp; hold Back and Overview to unpin."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"This keeps it in view until you unpin. Touch &amp; hold Back and Home to unpin."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Magnification switch"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Magnify full screen"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Magnify part of screen"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Open magnification settings"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Drag corner to resize"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Allow diagonal scrolling"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Medium"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Small"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Large"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Full screen"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Done"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Edit"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Magnifier window settings"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"All controls removed"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Changes not saved"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"See other apps"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Controls could not be loaded. Check the <xliff:g id="APP">%s</xliff:g> app to make sure that the app settings haven’t changed."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Compatible controls unavailable"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 8086828..6913b2d 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"disable"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Sound and vibration"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Settings"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"App is pinned"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"This keeps it in view until you unpin. Touch &amp; hold Back and Overview to unpin."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"This keeps it in view until you unpin. Touch &amp; hold Back and Home to unpin."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Magnification switch"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Magnify full screen"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Magnify part of screen"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Open magnification settings"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Drag corner to resize"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Allow diagonal scrolling"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Medium"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Small"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Large"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Full screen"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Done"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Edit"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Magnifier window settings"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"All controls removed"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Changes not saved"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"See other apps"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Controls could not be loaded. Check the <xliff:g id="APP">%s</xliff:g> app to make sure that the app settings haven’t changed."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Compatible controls unavailable"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 11c7db8..fd6a292 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -458,6 +458,8 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‏‏‏‏‎disable‎‏‎‎‏‎"</string>
     <string name="sound_settings" msgid="8874581353127418308">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎Sound &amp; vibration‎‏‎‎‏‎"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‏‎‎‎‎‎‏‏‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‏‏‎‎Settings‎‏‎‎‏‎"</string>
+    <string name="csd_lowered_title" product="default" msgid="1786173629015030856">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‎‏‏‏‎‎‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎Lowered to safer volume‎‏‎‎‏‎"</string>
+    <string name="csd_system_lowered_text" product="default" msgid="2001603282316829500">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‎‎‏‏‏‏‎‎‎The volume has been high for longer than recommended‎‏‎‎‏‎"</string>
     <string name="screen_pinning_title" msgid="9058007390337841305">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‎‏‏‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‏‎‎‎‏‎‎‏‏‎‎‏‎App is pinned‎‏‎‎‏‎"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‎‎‎‏‎‎‏‏‎‎‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎‎‎‏‏‏‏‏‎This keeps it in view until you unpin. Touch &amp; hold Back and Overview to unpin.‎‏‎‎‏‎"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‎‎‎‏‎‏‎‏‎‎‏‎‏‎‏‎This keeps it in view until you unpin. Touch &amp; hold Back and Home to unpin.‎‏‎‎‏‎"</string>
@@ -832,7 +834,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎Magnification switch‎‏‎‎‏‎"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‎‏‎‏‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‎‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‎Magnify full screen‎‏‎‎‏‎"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‏‎‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎Magnify part of screen‎‏‎‎‏‎"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‎‏‎‎‏‏‏‎‎‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‏‏‎‎‎‏‏‏‎‏‎‏‏‏‎Switch‎‏‎‎‏‎"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‏‏‎Open magnification settings‎‏‎‎‏‎"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‎‏‎‎Drag corner to resize‎‏‎‎‏‎"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‏‏‏‎‎Allow diagonal scrolling‎‏‎‎‏‎"</string>
@@ -849,6 +850,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‎Medium‎‏‎‎‏‎"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‎‎‏‎‎Small‎‏‎‎‏‎"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎‏‎‏‏‎‎‏‏‎‎Large‎‏‎‎‏‎"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‏‎‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‎‎Full screen‎‏‎‎‏‎"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎‎‎‎Done‎‏‎‎‏‎"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‎‏‏‎‎‎‏‏‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‏‎‏‎‎‏‎‎‎‏‎‏‎‏‏‏‎‎‎Edit‎‏‎‎‏‎"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‎‎Magnifier window settings‎‏‎‎‏‎"</string>
@@ -884,6 +886,9 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎All controls removed‎‏‎‎‏‎"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‏‎Changes not saved‎‏‎‎‏‎"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‏‏‏‎‎‏‎‎‎‎‎‏‎‎‎See other apps‎‏‎‎‏‎"</string>
+    <string name="controls_favorite_rearrange_button" msgid="2942788904364641185">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‎‏‏‎‏‏‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‏‏‏‏‎‏‏‎‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎Rearrange‎‏‎‎‏‎"</string>
+    <string name="controls_favorite_add_controls" msgid="1221420435546694004">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎Add controls‎‏‎‎‏‎"</string>
+    <string name="controls_favorite_back_to_editing" msgid="184125114090062713">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎‏‎‎‎‎‏‏‎‏‎‎‏‏‏‎‎‏‎‎‎‏‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‏‎Back to editing‎‏‎‎‏‎"</string>
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‎‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‏‏‎‏‎‏‏‎Controls could not be loaded. Check the ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ app to make sure that the app settings haven’t changed.‎‏‎‎‏‎"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‎‎‎‏‏‎‎‏‏‏‏‎Compatible controls unavailable‎‏‎‎‏‎"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎‎‏‎‏‏‎‎‎‏‏‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‎‎‎Other‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 8f3fc6f..e067d94 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -451,13 +451,17 @@
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent lo mantiene desbloqueado"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Configuración de sonido"</string>
-    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Subtitular automáticamente"</string>
+    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Muestra subtítulos automáticos"</string>
     <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"Sugerencia de subtítulos"</string>
     <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Superposición de subtítulos"</string>
     <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"habilitar"</string>
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"inhabilitar"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Sonido y vibración"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Configuración"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"La app está fijada"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionados los botones Atrás y Recientes."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionados los botones de inicio y Atrás."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Interruptor de ampliación"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Ampliar pantalla completa"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ampliar parte de la pantalla"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Interruptor"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Abrir la configuración de ampliación"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Arrastra la esquina para cambiar el tamaño"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Permitir desplazamiento en diagonal"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Mediano"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Pequeño"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Grande"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Pantalla completa"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Listo"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Editar"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Configuración de la ventana de ampliación"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Se quitaron todos los controles"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"No se guardaron los cambios"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Ver otras apps"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"No se pudieron cargar los controles. Revisa la app de <xliff:g id="APP">%s</xliff:g> para asegurarte de que su configuración no haya cambiado."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"No hay ningún control compatible disponible"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Otros"</string>
@@ -1065,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"editar"</string>
     <string name="add" msgid="81036585205287996">"Agregar"</string>
     <string name="manage_users" msgid="1823875311934643849">"Administrar usuarios"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"Esta notificación no admite arrastrar entre pantallas divididas"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"La red Wi-Fi no está disponible"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Modo prioridad"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Se estableció la alarma"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index a4c4dd0..5ba337e 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desactivar"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Sonido y vibración"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ajustes"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Aplicación fijada"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"La aplicación se mantendrá visible hasta que dejes de fijarla. Para dejar de fijarla, mantén pulsados los botones Atrás y Aplicaciones recientes."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"La aplicación se mantendrá visible hasta que dejes de fijarla. Para dejar de fijarla, mantén pulsados los botones Atrás e Inicio."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Botón para cambiar el modo de ampliación"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Ampliar pantalla completa"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ampliar parte de la pantalla"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Cambiar"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Abrir ajustes de ampliación"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Arrastra la esquina para cambiar el tamaño"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Permitir desplazamiento en diagonal"</string>
@@ -849,7 +852,8 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Mediano"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Pequeño"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Grande"</string>
-    <string name="accessibility_magnification_done" msgid="263349129937348512">"Listo"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Pantalla completa"</string>
+    <string name="accessibility_magnification_done" msgid="263349129937348512">"Hecho"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Editar"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Configuración de la ventana de la lupa"</string>
     <string name="accessibility_floating_button_migration_tooltip" msgid="5217151214439341902">"Toca para abrir funciones de accesibilidad. Personaliza o sustituye este botón en Ajustes.\n\n"<annotation id="link">"Ver ajustes"</annotation></string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos los controles quitados"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"No se han guardado los cambios"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Ver otras aplicaciones"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"No se han podido cargar los controles. Comprueba que no hayan cambiado los ajustes de la aplicación <xliff:g id="APP">%s</xliff:g>."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Los controles compatibles no están disponibles"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Otros"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 1288060..7db471a 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"keela"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Heli ja vibreerimine"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Seaded"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Rakendus on kinnitatud"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Avakuva."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Suurenduse lüliti"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Täisekraani suurendamine"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ekraanikuva osa suurendamine"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Vaheta"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Ava suurendamisseaded"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Suuruse muutmiseks lohistage nurka"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Luba diagonaalne kerimine"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Keskmine"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Väike"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Suur"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Täisekraan"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Valmis"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Muuda"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Luubi akna seaded"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Kõik juhtelemendid eemaldati"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Muudatusi ei salvestatud"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Kuva muud rakendused"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Juhtelemente ei õnnestunud laadida. Kontrollige rakendust <xliff:g id="APP">%s</xliff:g> ja veenduge, et rakenduse seaded poleks muutunud."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Ühilduvaid juhtelemente pole saadaval"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Muu"</string>
@@ -1065,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"muutmine"</string>
     <string name="add" msgid="81036585205287996">"Lisa"</string>
     <string name="manage_users" msgid="1823875311934643849">"Kasutajate haldamine"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"See märguanne ei toeta jagatud ekraanikuvale lohistamist."</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WiFi pole saadaval"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Režiim Prioriteetne"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm on määratud"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 4873d88..492bb6f 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desgaitu"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Audioa eta dardara"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ezarpenak"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikazioa ainguratuta dago"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Horrela, ikusgai egongo da aingura kendu arte. Aingura kentzeko, eduki sakatuta \"Atzera\" eta \"Ikuspegi orokorra\" botoiak."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Horrela, ikusgai egongo da aingura kendu arte. Aingura kentzeko, eduki sakatuta Atzera eta Hasiera botoiak."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Lupa aplikatzeko botoia"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Handitu pantaila osoa"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Handitu pantailaren zati bat"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Botoia"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Ireki luparen ezarpenak"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Arrastatu izkina bat tamaina aldatzeko"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Eman diagonalki gora eta behera egiteko aukera erabiltzeko baimena"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Ertaina"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Txikia"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Handia"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Pantaila osoa"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Eginda"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Editatu"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Luparen leihoaren ezarpenak"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Kendu dira kontrolatzeko aukera guztiak"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Ez dira gorde aldaketak"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Ikusi beste aplikazio batzuk"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Ezin izan dira kargatu kontrolatzeko aukerak. Joan <xliff:g id="APP">%s</xliff:g> aplikaziora, eta ziurtatu aplikazioaren ezarpenak ez direla aldatu."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Ez dago erabilgarri kontrolatzeko aukera bateragarririk"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Beste bat"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index f62ab77..b8bf0c9 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"غیرفعال کردن"</string>
     <string name="sound_settings" msgid="8874581353127418308">"صدا و لرزش"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"تنظیمات"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"برنامه سنجاق شده است"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"تا زمانی که سنجاق را برندارید، در نما نگه‌داشته می‌شود. برای برداشتن سنجاق، «برگشت» و «نمای کلی» را لمس کنید و نگه‌دارید."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"تا برداشتن سنجاق، در نما نگه‌داشته می‌شود. برای برداشتن سنجاق، «برگشت» و «صفحه اصلی» را لمس کنید و نگه‌دارید."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"کلید درشت‌نمایی"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"درشت‌نمایی تمام‌صفحه"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"درشت‌نمایی بخشی از صفحه"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"کلید"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"باز کردن تنظیمات درشت‌نمایی"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"برای تغییر اندازه، گوشه را بکشید"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"مجاز کردن پیمایش قطری"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"متوسط"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"کوچک"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"بزرگ"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"تمام‌صفحه"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"تمام"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"ویرایش"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"تنظیمات پنجره ذره‌بین"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"همه کنترل‌ها برداشته شده‌اند"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"تغییرات ذخیره نشد"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"دیدن برنامه‌های دیگر"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"کنترل‌ها بار نشدند. برنامه <xliff:g id="APP">%s</xliff:g> را بررسی کنید تا مطمئن شوید تنظیمات برنامه تغییر نکرده باشد."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"کنترل‌های سازگار دردسترس نیستند"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"موارد دیگر"</string>
@@ -1065,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"ویرایش کردن"</string>
     <string name="add" msgid="81036585205287996">"افزودن"</string>
     <string name="manage_users" msgid="1823875311934643849">"مدیریت کاربران"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"این اعلان از عملکرد کشیدن به صفحهٔ دونیمه پشتیبانی نمی‌کند"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"‏Wi‑Fi دردسترس نیست"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"حالت اولویت"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"زنگ ساعت تنظیم شد"</string>
@@ -1087,7 +1096,7 @@
     <string name="dream_time_complication_24_hr_time_format" msgid="6248280719733640813">"kk:mm"</string>
     <string name="log_access_confirmation_title" msgid="4843557604739943395">"به <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> اجازه می‌دهید به همه گزارش‌های دستگاه دسترسی داشته باشد؟"</string>
     <string name="log_access_confirmation_allow" msgid="752147861593202968">"مجاز کردن دسترسی یک‌باره"</string>
-    <string name="log_access_confirmation_deny" msgid="2389461495803585795">"اجازه نمی‌دهم"</string>
+    <string name="log_access_confirmation_deny" msgid="2389461495803585795">"اجازه ندادن"</string>
     <string name="log_access_confirmation_body" msgid="6883031912003112634">"گزارش‌های دستگاه آنچه را در دستگاهتان رخ می‌دهد ثبت می‌کند. برنامه‌ها می‌توانند از این گزارش‌ها برای پیدا کردن مشکلات و رفع آن‌ها استفاده کنند.\n\nبرخی‌از گزارش‌ها ممکن است حاوی اطلاعات حساس باشند، بنابراین فقط به برنامه‌های مورداعتمادتان اجازه دسترسی به همه گزارش‌های دستگاه را بدهید. \n\nاگر به این برنامه اجازه ندهید به همه گزارش‌های دستگاه دسترسی داشته باشد، همچنان می‌تواند به گزارش‌های خودش دسترسی داشته باشد. سازنده دستگاه نیز ممکن است همچنان بتواند به برخی‌از گزارش‌ها یا اطلاعات دستگاهتان دسترسی داشته باشد."</string>
     <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"بیشتر بدانید"</string>
     <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"در <xliff:g id="URL">%s</xliff:g> اطلاعات بیشتری دریافت کنید"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index e478bd2..d7d2117 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"poista käytöstä"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Ääni ja värinä"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Asetukset"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Sovellus on kiinnitetty"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Edellinen ja Viimeisimmät."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Edellinen ja Aloitusnäyttö."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Suurennusvalinta"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Koko näytön suurennus"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Suurenna osa näytöstä"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Vaihda"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Avaa suurennusasetukset"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Muuta kokoa vetämällä kulmaa"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Diagonaalisen vierittämisen salliminen"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Keskitaso"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Pieni"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Suuri"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Koko näyttö"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Valmis"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Muokkaa"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Ikkunan suurennuksen asetukset"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# säädin lisätty.}other{# säädintä lisätty.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Poistettu"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"Lisätäänkö <xliff:g id="APPNAME">%s</xliff:g>?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> voi valita täällä näkyvät ohjaimet ja sisällön."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Poistetaanko säätimet: <xliff:g id="APPNAME">%s</xliff:g>?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"Lisätty suosikkeihin"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Lisätty suosikkeihin sijalle <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Kaikki säätimet poistettu"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Muutoksia ei tallennettu"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Katso muita sovelluksia"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Säätimiä ei voitu ladata. Avaa <xliff:g id="APP">%s</xliff:g> ja tarkista, että sovelluksen asetukset eivät ole muuttuneet."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Yhteensopivat säätimet eivät käytettävissä"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Muu"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index bb26ad4..4abf838 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -258,7 +258,7 @@
     <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminosité"</string>
     <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversion des couleurs"</string>
     <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correction des couleurs"</string>
-    <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Taille de la police"</string>
+    <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Taille de police"</string>
     <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Gérer les utilisateurs"</string>
     <string name="quick_settings_done" msgid="2163641301648855793">"Terminé"</string>
     <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fermer"</string>
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"désactiver"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Son et vibration"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Paramètres"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"L\'application est épinglée"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur « Retour » et « Aperçu »."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur les touches Retour et Accueil."</string>
@@ -574,7 +578,7 @@
     <string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="6429668976593634862">"paramètres des notifications"</string>
     <string name="notification_menu_snooze_description" msgid="4740133348901973244">"options de répétition des notifications"</string>
-    <string name="notification_menu_snooze_action" msgid="5415729610393475019">"Me rappeler"</string>
+    <string name="notification_menu_snooze_action" msgid="5415729610393475019">"Me le rappeler"</string>
     <string name="snooze_undo" msgid="2738844148845992103">"Annuler"</string>
     <string name="snoozed_for_time" msgid="7586689374860469469">"Reporté pour <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# heure}=2{# heures}one{# heure}many{# d\'heures}other{# heures}}"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Commutateur d\'agrandissement"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Agrandir la totalité de l\'écran"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Agrandir une partie de l\'écran"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Commutateur"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Ouvrir les paramètres d\'agrandissement"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Faire glisser le coin pour redimensionner"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Autoriser le défilement en diagonale"</string>
@@ -849,6 +852,8 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Moyenne"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Petite"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Grande"</string>
+    <!-- no translation found for accessibility_magnification_fullscreen (5043514702759201964) -->
+    <skip />
     <string name="accessibility_magnification_done" msgid="263349129937348512">"OK"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Modifier"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Paramètres de la fenêtre de loupe"</string>
@@ -870,8 +875,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# commande ajoutée.}one{# commande ajoutée.}many{# de commandes ajoutées.}other{# commandes ajoutées.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Supprimé"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"Ajouter <xliff:g id="APPNAME">%s</xliff:g>?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> peut définir les commandes et le contenu qui s\'affiche ici."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Retirer les commandes pour <xliff:g id="APPNAME">%s</xliff:g>?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"Ajouté aux favoris"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Ajouté aux favoris, en position <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +889,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Toutes les commandes ont été supprimées"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Modifications non enregistrées"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Afficher autres applications"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Impossible de charger les commandes. Vérifiez l\'application <xliff:g id="APP">%s</xliff:g> pour vous assurer que les paramètres de l\'application n\'ont pas changé."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Les commandes compatibles ne sont pas accessibles"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Autre"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index fb0d42c..fa48b7a 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"désactiver"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Son et vibreur"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Paramètres"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"L\'application est épinglée"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Elle restera visible jusqu\'à ce que vous la retiriez. Pour la retirer, appuyez de manière prolongée sur les boutons Retour et Récents."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Elle restera visible jusqu\'à ce que vous la retiriez. Pour la retirer, appuyez de manière prolongée sur les boutons Retour et Accueil."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Changer de mode d\'agrandissement"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Agrandir tout l\'écran"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Agrandir une partie de l\'écran"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Changer"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Ouvrir les paramètres d\'agrandissement"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Faire glisser le coin pour redimensionner"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Autoriser le défilement diagonal"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Moyen"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Petit"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Grand"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Plein écran"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"OK"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Modifier"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Paramètres de la fenêtre d\'agrandissement"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Toutes les commandes ont été supprimées"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Les modifications n\'ont pas été enregistrées"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Afficher d\'autres applications"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Impossible de charger les commandes. Vérifiez l\'application <xliff:g id="APP">%s</xliff:g> pour vous assurer que les paramètres n\'ont pas changé."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Commandes compatibles indisponibles"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Autre"</string>
@@ -1065,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"modifier"</string>
     <string name="add" msgid="81036585205287996">"Ajouter"</string>
     <string name="manage_users" msgid="1823875311934643849">"Gérer les utilisateurs"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"Impossible de faire glisser cette notification vers l\'écran partagé"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi non disponible"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Mode Prioritaire"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarme réglée"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index ac8acde..7828b20 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desactiva"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Son e vibración"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Configuración"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"A aplicación está fixada"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"A pantalla manterase visible ata que deixes de fixala. Para facelo, mantén premido Atrás e Visión xeral."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"A pantalla manterase visible ata que deixes de fixala. Para facelo, mantén premido Atrás e Inicio."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Interruptor do modo de ampliación"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Ampliar pantalla completa"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Amplía parte da pantalla"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Cambiar"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Abrir configuración da ampliación"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Arrastrar a esquina para cambiar o tamaño"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Permitir desprazamento diagonal"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Mediano"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Pequeno"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Grande"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Pantalla completa"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Feito"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Editar"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Configuración da ventá da lupa"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Engadiuse # control.}other{Engadíronse # controis.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Quitouse"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"Queres engadir <xliff:g id="APPNAME">%s</xliff:g>?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> pode escoller os controis e o contido que se mostrarán aquí."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Queres quitar os controis de <xliff:g id="APPNAME">%s</xliff:g>?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"Está entre os controis favoritos"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Está entre os controis favoritos (posición: <xliff:g id="NUMBER">%d</xliff:g>)"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Quitáronse todos os controis"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Non se gardaron os cambios"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Ver outras aplicacións"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Non se puideron cargar os controis. Comproba a aplicación <xliff:g id="APP">%s</xliff:g> para asegurarte de que non se modificase a súa configuración."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Non hai controis compatibles que estean dispoñibles"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outra"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 1267200..012607e 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"બંધ કરો"</string>
     <string name="sound_settings" msgid="8874581353127418308">"સાઉન્ડ અને વાઇબ્રેશન"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"સેટિંગ"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"ઍપને પિન કરેલી છે"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને વ્યૂમાં રાખે છે. અનપિન કરવા માટે પાછળ અને ઓવરવ્યૂને સ્પર્શ કરી રાખો."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને વ્યૂમાં રાખે છે. અનપિન કરવા માટે પાછળ અને હોમને સ્પર્શ કરી રાખો."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"મોટું કરવાની સુવિધાવાળી સ્વિચ"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"પૂર્ણ સ્ક્રીનને મોટી કરો"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"સ્ક્રીનનો કોઈ ભાગ મોટો કરો"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"સ્વિચ"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"મોટા કરવાના સેટિંગ ખોલો"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"કદ બદલવા માટે ખૂણો ખેંચો"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"ડાયગોનલ સ્ક્રોલિંગને મંજૂરી આપો"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"મધ્યમ"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"નાનું"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"મોટું"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"પૂર્ણ સ્ક્રીન"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"થઈ ગયું"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"ફેરફાર કરો"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"મેગ્નિફાયર વિન્ડોના સેટિંગ"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"બધા નિયંત્રણો કાઢી નાખ્યા"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ફેરફારો સાચવ્યા નથી"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"અન્ય બધી ઍપ જુઓ"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"નિયંત્રણો લોડ કરી શકાયા નથી. ઍપના સેટિંગ બદલાયા નથી તેની ખાતરી કરવા માટે <xliff:g id="APP">%s</xliff:g> ઍપ ચેક કરો."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"સુસંગત નિયંત્રણો ઉપલબ્ધ નથી"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"અન્ય"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index f1ff616..4728ea1 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -385,7 +385,7 @@
     <string name="media_projection_permission_dialog_title" msgid="7130975432309482596">"क्या आपको शेयर या रिकॉर्ड करने की <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> को अनुमति देनी है?"</string>
     <string name="media_projection_permission_dialog_option_entire_screen" msgid="392086473225692983">"पूरी स्क्रीन"</string>
     <string name="media_projection_permission_dialog_option_single_app" msgid="1591110238124910521">"सिर्फ़ एक ऐप्लिकेशन"</string>
-    <string name="media_projection_permission_dialog_warning_entire_screen" msgid="3989078820637452717">"शेयर, रिकॉर्ड या कास्ट करते समय, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> के पास स्क्रीन पर दिख रही हर चीज़ या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, शेयर, रिकॉर्ड या कास्ट करते समय, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज या किसी और संवेदनशील जानकारी को लेकर खास सावधानी बरतें."</string>
+    <string name="media_projection_permission_dialog_warning_entire_screen" msgid="3989078820637452717">"शेयर, रिकॉर्ड या कास्ट करते समय <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> के पास स्क्रीन पर दिख रही हर चीज़ या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज या किसी और संवेदनशील जानकारी को लेकर खास सावधानी बरतें."</string>
     <string name="media_projection_permission_dialog_warning_single_app" msgid="1659532781536753059">"शेयर, रिकॉर्ड या कास्ट करते समय, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> के पास उस ऐप्लिकेशन पर दिख रही हर चीज़ या उस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज या किसी और संवेदनशील जानकारी को लेकर खास सावधानी बरतें."</string>
     <string name="media_projection_permission_dialog_continue" msgid="1827799658916736006">"जारी रखें"</string>
     <string name="media_projection_permission_app_selector_title" msgid="894251621057480704">"ऐप्लिकेशन शेयर करें या उसकी रिकॉर्डिंग करें"</string>
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"बंद करें"</string>
     <string name="sound_settings" msgid="8874581353127418308">"आवाज़ और वाइब्रेशन"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"सेटिंग"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"ऐप्लिकेशन पिन किया गया है"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"इससे वह तब तक दिखता रहता है, जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, \'वापस जाएं\' और \'खास जानकारी\' को दबाकर रखें."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"इससे वह तब तक दिखाई देती है जब तक आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, होम और वापस जाएं वाले बटन को दबाकर रखें."</string>
@@ -816,7 +820,7 @@
     <string name="privacy_type_location" msgid="7991481648444066703">"जगह"</string>
     <string name="privacy_type_microphone" msgid="9136763906797732428">"माइक्रोफ़ोन"</string>
     <string name="privacy_type_media_projection" msgid="8136723828804251547">"स्क्रीन रिकॉर्डिंग"</string>
-    <string name="music_controls_no_title" msgid="4166497066552290938">"कोई शीर्षक नहीं"</string>
+    <string name="music_controls_no_title" msgid="4166497066552290938">"कोई टाइटल नहीं"</string>
     <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टैंडबाई"</string>
     <string name="font_scaling_dialog_title" msgid="6273107303850248375">"फ़ॉन्ट का साइज़"</string>
     <string name="font_scaling_smaller" msgid="1012032217622008232">"छोटा करें"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"ज़ूम करने की सुविधा वाला स्विच"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"फ़ुल स्क्रीन को ज़ूम करें"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"स्क्रीन के किसी हिस्से को ज़ूम करें"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"स्विच"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"ज़ूम करने की सुविधा वाली सेटिंग खोलें"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"साइज़ बदलने के लिए, कोने को खींचें और छोड़ें"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"तिरछी दिशा में स्क्रोल करने की अनुमति दें"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"मध्यम"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"छोटा"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"बड़ा"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"फ़ुल स्क्रीन"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"हो गया"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"बदलाव करें"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"ज़ूम करने की सुविधा वाली विंडो से जुड़ी सेटिंग"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"सभी कंट्रोल हटा दिए गए"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"बदलाव सेव नहीं किए गए"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"दूसरे ऐप्लिकेशन देखें"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"कंट्रोल लोड नहीं किए जा सके. <xliff:g id="APP">%s</xliff:g> ऐप्लिकेशन देखें, ताकि यह पक्का किया जा सके कि ऐप्लिकेशन की सेटिंग में कोई बदलाव नहीं हुआ है."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"इस सेटिंग के साथ काम करने वाले कंट्रोल उपलब्ध नहीं हैं"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"अन्य"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 4ece4b6..a68d099 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"onemogući"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Zvuk i vibracija"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Postavke"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacija je prikvačena"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite i zadržite Natrag i Pregled da biste ga otkvačili."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite gumbe Natrag i Početna i zadržite pritisak da biste ga otkvačili."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Prebacivanje povećavanja"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Povećajte cijeli zaslon"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Povećaj dio zaslona"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Prebacivanje"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Otvori postavke povećavanja"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Povucite kut da biste promijenili veličinu"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Dopusti dijagonalno pomicanje"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Srednja"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Mala"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Velika"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Cijeli zaslon"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Gotovo"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Uredi"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Postavke prozora povećala"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Sve su kontrole uklonjene"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Promjene nisu spremljene"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Pogledajte ostale aplikacije"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Kontrole se ne mogu učitati. U aplikaciji <xliff:g id="APP">%s</xliff:g> provjerite da se postavke aplikacije nisu promijenile."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Kompatibilne kontrole nisu dostupne"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 8d38e1f..e2f0eb0 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"letiltás"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Hang és rezgés"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Beállítások"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Az alkalmazás ki van tűzve"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva a Vissza és az Áttekintés lehetőséget."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva a Vissza és a Kezdőképernyő elemet."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Nagyításváltó"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"A teljes képernyő felnagyítása"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Képernyő bizonyos részének nagyítása"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Váltás"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Nagyítási beállítások megnyitása"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Az átméretezéshez húzza a kívánt sarkot"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Átlós görgetés engedélyezése"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Közepes"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Kicsi"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Nagy"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Teljes képernyő"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Kész"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Szerkesztés"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Nagyítóablak beállításai"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Minden vezérlő eltávolítva"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"A rendszer nem mentette a módosításokat"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Többi alkalmazás megtekintése"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Nem sikerült betölteni a vezérlőket. Ellenőrizze a(z) <xliff:g id="APP">%s</xliff:g> alkalmazást, és győződjön meg arról, hogy nem változtak az alkalmazásbeállítások."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Nem állnak rendelkezésre kompatibilis vezérlők"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Más"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index ed4b312..26a4315 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"անջատել"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Ձայն և թրթռոց"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Կարգավորումներ"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Հավելվածն ամրացված է"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Էկրանը կմնա տեսադաշտում, մինչև այն ապամրացնեք: Ապամրացնելու համար հպեք և պահեք Հետ և Համատեսք կոճակները:"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Էկրանը կցուցադրվի այնքան ժամանակ, մինչև չեղարկեք ամրացումը: Չեղարկելու համար հպեք և պահեք «Հետ» և «Գլխավոր էկրան» կոճակները"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Խոշորացման փոփոխություն"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Խոշորացնել ամբողջ էկրանը"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Խոշորացնել էկրանի որոշակի հատվածը"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Փոխել"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Բացել խոշորացման կարգավորումները"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Քաշեք անկյունը՝ չափը փոխելու համար"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Թույլատրել անկյունագծով ոլորումը"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Միջին"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Փոքր"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Մեծ"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Լիաէկրան ռեժիմ"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Պատրաստ է"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Փոփոխել"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Խոշորացույցի պատուհանի կարգավորումներ"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Ավելացվեց կառավարման # տարր։}one{Ավելացվեց կառավարման # տարր։}other{Ավելացվեց կառավարման # տարր։}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Հեռացված է"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"Ավելացնե՞լ <xliff:g id="APPNAME">%s</xliff:g> հավելվածը"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> հավելվածը կարող է ընտրել, թե որ կարգավորումները և ինչ բովանդակություն ցուցադրվեն այստեղ։"</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Հեռացնե՞լ <xliff:g id="APPNAME">%s</xliff:g> հավելվածի համար կարգավորումները։"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"Ավելացված է ընտրանիում"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Ավելացված է ընտրանիում, դիրքը՝ <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Կառավարման բոլոր տարրերը հեռացվեցին"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Փոփոխությունները չեն պահվել"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Տեսնել այլ հավելվածներ"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Չհաջողվեց բեռնել կառավարման տարրերը։ Ստուգեք <xliff:g id="APP">%s</xliff:g> հավելվածը՝ համոզվելու, որ հավելվածի կարգավորումները չեն փոխվել։"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Համատեղելի կառավարման տարրերը հասանելի չեն"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Այլ"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 72f7158..dade59c 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"nonaktifkan"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Suara &amp; getaran"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Setelan"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikasi disematkan"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Ini akan terus ditampilkan sampai Anda melepas sematan. Sentuh lama tombol Kembali dan Ringkasan untuk melepas sematan."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ini akan terus ditampilkan sampai Anda melepas sematan. Sentuh lama tombol Kembali dan Beranda untuk melepas sematan."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Tombol pembesaran"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Memperbesar tampilan layar penuh"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Perbesar sebagian layar"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Alihkan"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Buka setelan pembesaran"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Tarik pojok persegi untuk mengubah ukuran"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Izinkan scrolling diagonal"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Sedang"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Kecil"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Besar"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Layar penuh"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Selesai"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Edit"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Setelan jendela kaca pembesar"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Semua kontrol dihapus"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Perubahan tidak disimpan"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Lihat aplikasi lainnya"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Kontrol tidak dapat dimuat. Periksa aplikasi <xliff:g id="APP">%s</xliff:g> untuk memastikan setelan aplikasi tidak berubah."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Kontrol yang kompatibel tidak tersedia"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Lainnya"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index d84e544..a588d36 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"slökkva"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Hljóð og titringur"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Stillingar"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Forrit er fest"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Þetta heldur þessu opnu þangað til þú losar það. Haltu fingri á „Til baka“ og „Yfirlit“ til að losa."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Þetta heldur þessu opnu þangað til það er losað. Haltu inni bakkhnappinum og heimahnappinum til að losa."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Stækkunarrofi"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Stækka allan skjáinn"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Stækka hluta skjásins"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Rofi"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Opna stillingar stækkunar"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Dragðu horn til að breyta stærð"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Leyfa skáflettingu"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Miðlungs"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Lítið"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Stórt"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Allur skjárinn"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Lokið"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Breyta"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Stillingar stækkunarglugga"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Allar stýringar fjarlægðar"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Breytingar ekki vistaðar"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Sjá önnur forrit"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Ekki tókst að hlaða stýringum. Athugaðu <xliff:g id="APP">%s</xliff:g> til að ganga úr skugga um að stillingar forritsins hafi ekki breyst."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Samhæfar stýringar eru ekki tiltækar"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Annað"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index d103e41..f46ccb7 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -264,7 +264,7 @@
     <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Chiudi"</string>
     <string name="quick_settings_connected" msgid="3873605509184830379">"Connesso"</string>
     <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Connesso, batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
-    <string name="quick_settings_connecting" msgid="2381969772953268809">"Connessione..."</string>
+    <string name="quick_settings_connecting" msgid="2381969772953268809">"Connessione in corso..."</string>
     <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Hotspot"</string>
     <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Attivazione…"</string>
     <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Risp. dati attivo"</string>
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"disattiva"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Suoni e vibrazione"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Impostazioni"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"L\'app è bloccata sullo schermo"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"La schermata rimane visibile finché non viene sganciata. Per sganciarla, tieni premuto Indietro e Panoramica."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"La schermata rimane visibile finché non viene disattivato il blocco su schermo. Per disattivarlo, tocca e tieni premuto Indietro e Home."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Opzione Ingrandimento"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Ingrandisci l\'intero schermo"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ingrandisci parte dello schermo"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Opzione"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Apri le impostazioni di ingrandimento"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Trascina l\'angolo per ridimensionare"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Consenti lo scorrimento diagonale"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Medio"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Piccolo"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Grande"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Schermo intero"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Fine"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Modifica"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Impostazioni della finestra di ingrandimento"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controllo aggiunto.}many{# controlli aggiunti.}other{# controlli aggiunti.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Rimosso"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"Vuoi aggiungere <xliff:g id="APPNAME">%s</xliff:g>?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"L\'app <xliff:g id="APPNAME">%s</xliff:g> potrà scegliere quali controlli e contenuti visualizzare qui."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Vuoi rimuovere i controlli per l\'app <xliff:g id="APPNAME">%s</xliff:g>?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"Aggiunto ai preferiti"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Preferito, posizione <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Tutti i controlli sono stati rimossi"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Modifiche non salvate"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Mostra altre app"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Impossibile caricare i controlli. Verifica nell\'app <xliff:g id="APP">%s</xliff:g> che le relative impostazioni non siano cambiate."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Controlli compatibili non disponibili"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Altro"</string>
@@ -896,7 +905,7 @@
     <string name="controls_settings_show_controls_dialog_title" msgid="3357852503553809554">"Vuoi visualizzare e controllare i dispositivi dalla schermata di blocco?"</string>
     <string name="controls_settings_show_controls_dialog_message" msgid="7666211700524587969">"Puoi aggiungere impostazioni alla schermata di blocco per i tuoi dispositivi esterni.\n\nL\'app del tuo dispositivo potrebbe consentirti di controllare alcuni dispositivi senza dover sbloccare il tuo telefono o tablet.\n\nPuoi apportare modifiche in qualsiasi momento in Impostazioni."</string>
     <string name="controls_settings_trivial_controls_dialog_title" msgid="7593188157655036677">"Vuoi controllare i dispositivi dalla schermata di blocco?"</string>
-    <string name="controls_settings_trivial_controls_dialog_message" msgid="397178734990952575">"Puoi controllare alcuni dispositivi senza sbloccare il telefono o il tablet. L\'app del dispositivo determina quali dispositivi possono essere controllati in questo modo."</string>
+    <string name="controls_settings_trivial_controls_dialog_message" msgid="397178734990952575">"Puoi controllare alcuni dispositivi senza sbloccare il telefono o il tablet. L\'app del tuo dispositivo determina quali dispositivi possono essere controllati in questo modo."</string>
     <string name="controls_settings_dialog_neutral_button" msgid="4514446354793124140">"No, grazie"</string>
     <string name="controls_settings_dialog_positive_button" msgid="436070672551674863">"Sì"</string>
     <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Il PIN contiene lettere o simboli"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 8c9667c..7eb2764 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"השבתה"</string>
     <string name="sound_settings" msgid="8874581353127418308">"צליל ורטט"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"הגדרות"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"האפליקציה מוצמדת"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"נשאר בתצוגה עד לביטול ההצמדה. יש ללחוץ לחיצה ארוכה על הלחצנים \'הקודם\' ו\'סקירה\' כדי לבטל את ההצמדה."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"נשאר בתצוגה עד לביטול ההצמדה. יש ללחוץ לחיצה ארוכה על הלחצנים \'הקודם\' ו\'דף הבית\' כדי לבטל את ההצמדה."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"מעבר למצב הגדלה"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"הגדלה של המסך המלא"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"הגדלת חלק מהמסך"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"מעבר"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"פתיחת הגדרות ההגדלה"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"צריך לגרור את הפינה כדי לשנות את הגודל"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"הפעלת גלילה באלכסון"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"בינוני"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"קטן"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"גדול"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"מסך מלא"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"סיום"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"עריכה"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"ההגדרות של חלון ההגדלה"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"כל הפקדים הוסרו"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"השינויים לא נשמרו"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"הצגת אפליקציות אחרות"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"לא ניתן היה לטעון את הפקדים. יש לבדוק את האפליקציה <xliff:g id="APP">%s</xliff:g> כדי לוודא שהגדרות האפליקציה לא השתנו."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"פקדים תואמים לא זמינים"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"אחר"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 2fb65a8..6f43e4b 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"無効にする"</string>
     <string name="sound_settings" msgid="8874581353127418308">"音とバイブレーション"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"設定"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"アプリは固定されています"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"固定を解除するまで画面が常に表示されるようになります。[戻る] と [最近] を同時に押し続けると固定が解除されます。"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"固定を解除するまで画面が常に表示されるようになります。[戻る] と [ホーム] を同時に押し続けると固定が解除されます。"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"拡大スイッチ"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"画面全体を拡大します"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"画面の一部を拡大します"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"スイッチ"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"画面の拡大設定を開く"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"サイズを変更するには角をドラッグ"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"斜めスクロールを許可"</string>
@@ -849,13 +852,14 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"中"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"小"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"大"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"全画面表示"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"完了"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"編集"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"拡大鏡ウィンドウの設定"</string>
     <string name="accessibility_floating_button_migration_tooltip" msgid="5217151214439341902">"タップしてユーザー補助機能を開きます。ボタンのカスタマイズや入れ替えを [設定] で行えます。\n\n"<annotation id="link">"設定を表示"</annotation></string>
     <string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"ボタンを一時的に非表示にするには、端に移動させてください"</string>
     <string name="accessibility_floating_button_undo" msgid="511112888715708241">"元に戻す"</string>
-    <string name="accessibility_floating_button_undo_message_label_text" msgid="9017658016426242640">"<xliff:g id="FEATURE_NAME">%s</xliff:g> 個のショートカットを削除"</string>
+    <string name="accessibility_floating_button_undo_message_label_text" msgid="9017658016426242640">"<xliff:g id="FEATURE_NAME">%s</xliff:g> のショートカットを削除"</string>
     <string name="accessibility_floating_button_undo_message_number_text" msgid="4909270290725226075">"{count,plural, =1{# 個のショートカットを削除}other{# 個のショートカットを削除}}"</string>
     <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"左上に移動"</string>
     <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"右上に移動"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# 件のコントロールを追加しました。}other{# 件のコントロールを追加しました。}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"削除済み"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> を追加しますか?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> はここに表示されるコントロールとコンテンツを選択できます。"</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> のコントロールを削除しますか?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"お気に入りに追加済み"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"お気に入りに追加済み、位置: <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"すべてのコントロールを削除しました"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"変更が保存されていません"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"その他のアプリを表示"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"コントロールを読み込めませんでした。<xliff:g id="APP">%s</xliff:g> アプリで、アプリの設定が変更されていないことをご確認ください。"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"互換性のあるコントロールがありません"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"その他"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 67852ea..97ccc04 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"გამორთვა"</string>
     <string name="sound_settings" msgid="8874581353127418308">"ხმა და ვიბრაცია"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"პარამეტრები"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"აპი ჩამაგრებულია"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „უკან და მიმოხილვა“-ს."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „უკან მთავარ გვერდზე“-ს."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"გადიდების გადართვა"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"გაადიდეთ სრულ ეკრანზე"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"ეკრანის ნაწილის გადიდება"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"გადართვა"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"გახსენით გადიდების პარამეტრები"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"ჩავლებით გადაიტანეთ კუთხე ზომის შესაცვლელად"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"დიაგონალური გადახვევის დაშვება"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"საშუალო"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"პატარა"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"დიდი"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"სრული ეკრანი"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"მზადაა"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"რედაქტირება"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"გადიდების ფანჯრის პარამეტრები"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"მართვის ყველა საშუალება ამოიშალა"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ცვლილებები არ შენახულა"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"სხვა აპების ნახვა"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"მართვის საშუალებების ჩატვირთვა ვერ მოხერხდა. შეამოწმეთ <xliff:g id="APP">%s</xliff:g> აპი, რათა დარწმუნდეთ, რომ აპის პარამეტრები არ შეცვლილა."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"მართვის თავსებადი საშუალებები მიუწვდომელია"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"სხვა"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index fb0688d..609dba4 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"өшіру"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Дыбыс және діріл"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Параметрлер"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Қолданба бекітілді"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Өзіңіз босатқаша ашық тұрады. Босату үшін \"Артқа\" және \"Шолу\" түймелерін басып тұрыңыз."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Өзіңіз босатқаша ашық тұрады. Босату үшін \"Артқа\" және \"Негізгі бет\" түймелерін басып тұрыңыз"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Ұлғайту режиміне ауыстырғыш"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Толық экранды ұлғайту"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Экранның бөлігін ұлғайту"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Ауысу"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Ұлғайту параметрлерін ашу"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Өлшемін өзгерту үшін бұрышынан сүйреңіз."</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Диагональ бойынша айналдыруға рұқсат беру"</string>
@@ -849,6 +852,8 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Орташа"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Кішi"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Үлкен"</string>
+    <!-- no translation found for accessibility_magnification_fullscreen (5043514702759201964) -->
+    <skip />
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Дайын"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Өзгерту"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Ұлғайтқыш терезесінің параметрлері"</string>
@@ -884,6 +889,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Барлық басқару элементтері жойылды."</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Өзгерістер сақталмады."</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Басқа қолданбаларды көру"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Басқару элементтері жүктелмеді. Қолданба параметрлерінің өзгермегенін тексеру үшін <xliff:g id="APP">%s</xliff:g> қолданбасын қараңыз."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Үйлесімді басқару элементтері қолжетімді емес."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Басқа"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 1106ef2..0d4333f 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"បិទ"</string>
     <string name="sound_settings" msgid="8874581353127418308">"សំឡេង និងការញ័រ"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ការកំណត់"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"កម្មវិធី​ត្រូវបានខ្ទាស់"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"វា​នឹង​នៅតែ​បង្ហាញ រហូត​ទាល់​តែ​អ្នក​ដក​ការដៅ។ សូម​សង្កត់​ប៊ូតុង​ថយ​ក្រោយ និង​ប៊ូតុង​ទិដ្ឋភាពរួម​ឲ្យ​ជាប់ ដើម្បី​ដក​ការ​ដៅ។"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"វា​នឹង​នៅតែ​បង្ហាញ រហូត​ទាល់​តែ​អ្នក​ដក​ការដៅ។ សូម​ចុចប៊ូតុង​ថយក្រោយ និងប៊ូតុង​ទំព័រដើម​ឱ្យ​ជាប់ ដើម្បី​ដក​ការ​ដៅ។"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"ប៊ូតុងបិទបើកការ​ពង្រីក"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"ពង្រីក​ពេញអេក្រង់"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"ពង្រីក​ផ្នែកនៃ​អេក្រង់"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ប៊ូតុងបិទបើក"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"បើកការកំណត់​ការពង្រីក"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"អូសជ្រុងដើម្បីប្ដូរទំហំ"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"អនុញ្ញាត​ការរំកិលបញ្ឆិត"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"មធ្យម"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"តូច"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"ធំ"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"អេក្រង់ពេញ"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"រួចរាល់"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"កែ"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"ការកំណត់វិនដូ​កម្មវិធីពង្រីក"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"បាន​ដកផ្ទាំងគ្រប់គ្រងទាំងអស់ហើយ"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"មិនបាន​រក្សាទុក​ការផ្លាស់ប្ដូរទេ"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"មើល​កម្មវិធី​ផ្សេងទៀត"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"មិនអាចផ្ទុក​ការគ្រប់គ្រង​បានទេ។ សូមពិនិត្យមើល​កម្មវិធី <xliff:g id="APP">%s</xliff:g> ដើម្បីធ្វើឱ្យប្រាកដថា​ការកំណត់កម្មវិធី​មិនបានផ្លាស់ប្ដូរ។"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"មិនអាចប្រើ​ការគ្រប់គ្រង​ដែលត្រូវគ្នា​បានទេ"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ផ្សេងៗ"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index f1c2b918..43fc735 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -124,7 +124,7 @@
     <string name="accessibility_back" msgid="6530104400086152611">"ಹಿಂದೆ"</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_accessibility_button" msgid="4089042473497107709">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ"</string>
     <string name="accessibility_rotate_button" msgid="1238584767612362586">"ಪರದೆಯನ್ನು ತಿರುಗಿಸಿ"</string>
     <string name="accessibility_recent" msgid="901641734769533575">"ಸಮಗ್ರ ನೋಟ"</string>
     <string name="accessibility_camera_button" msgid="2938898391716647247">"ಕ್ಯಾಮರಾ"</string>
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="sound_settings" msgid="8874581353127418308">"ಧ್ವನಿ &amp; ವೈಬ್ರೇಷನ್"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"ಆ್ಯಪ್ ಅನ್ನು ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"ನೀವು ಅನ್‌ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಹಾಗೂ ಅನ್‌ಪಿನ್ ಮಾಡಲು ಅವಲೋಕಿಸಿ."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"ನೀವು ಅನ್‌ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಹಾಗೂ ಅನ್‌ಪಿನ್ ಮಾಡಲು ಮುಖಪುಟಕ್ಕೆ ಹಿಂತಿರುಗಿ."</string>
@@ -481,13 +485,13 @@
     <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>
+    <string name="stream_accessibility" msgid="3873610336741987152">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ"</string>
     <string name="volume_ringer_status_normal" msgid="1339039682222461143">"ರಿಂಗ್"</string>
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"ವೈಬ್ರೇಟ್‌"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ಮ್ಯೂಟ್"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. ಅನ್‌ಮ್ಯೂಟ್‌ ಮಾಡುವುದಕ್ಕಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
-    <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. ಕಂಪನಕ್ಕೆ ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಪ್ರವೇಶಿಸುವಿಕೆ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್‌ ಮಾಡಬಹುದು."</string>
-    <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಪ್ರವೇಶಿಸುವಿಕೆ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್‌ ಮಾಡಬಹುದು."</string>
+    <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. ಕಂಪನಕ್ಕೆ ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್‌ ಮಾಡಬಹುದು."</string>
+    <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್‌ ಮಾಡಬಹುದು."</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. ವೈಬ್ರೇಟ್ ಮಾಡಲು ಹೊಂದಿಸುವುದಕ್ಕಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"ರಿಂಗರ್ ಮೋಡ್ ಬದಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"ಝೂಮ್ ಮಾಡುವ ಸ್ವಿಚ್"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"ಪೂರ್ಣ ಸ್ಕ್ರೀನ್‌ ಅನ್ನು ಹಿಗ್ಗಿಸಿ"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"ಸ್ಕ್ರೀನ್‌ನ ಅರ್ಧಭಾಗವನ್ನು ಝೂಮ್ ಮಾಡಿ"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ಸ್ವಿಚ್"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"ಹಿಗ್ಗಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"ಮರುಗಾತ್ರಗೊಳಿಸಲು ಮೂಲೆಯನ್ನು ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"ಡಯಾಗನಲ್ ಸ್ಕ್ರೋಲಿಂಗ್ ಅನ್ನು ಅನುಮತಿಸಿ"</string>
@@ -849,10 +852,11 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"ಮಧ್ಯಮ"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"ಚಿಕ್ಕದು"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"ದೊಡ್ಡದು"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"ಫುಲ್‌ ಸ್ಕ್ರೀನ್"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"ಮುಗಿದಿದೆ"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"ಎಡಿಟ್ ಮಾಡಿ"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"ಮ್ಯಾಗ್ನಿಫೈರ್ ವಿಂಡೋ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
-    <string name="accessibility_floating_button_migration_tooltip" msgid="5217151214439341902">"ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ತೆರೆಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಈ ಬಟನ್ ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ ಅಥವಾ ಬದಲಾಯಿಸಿ.\n\n"<annotation id="link">"ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</annotation></string>
+    <string name="accessibility_floating_button_migration_tooltip" msgid="5217151214439341902">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ತೆರೆಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಈ ಬಟನ್ ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ ಅಥವಾ ಬದಲಾಯಿಸಿ.\n\n"<annotation id="link">"ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</annotation></string>
     <string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"ಅದನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ಮರೆಮಾಡಲು ಅಂಚಿಗೆ ಬಟನ್ ಸರಿಸಿ"</string>
     <string name="accessibility_floating_button_undo" msgid="511112888715708241">"ರದ್ದುಗೊಳಿಸಿ"</string>
     <string name="accessibility_floating_button_undo_message_label_text" msgid="9017658016426242640">"<xliff:g id="FEATURE_NAME">%s</xliff:g> ಶಾರ್ಟ್‌ಕಟ್ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"ಎಲ್ಲಾ ನಿಯಂತ್ರಣಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಲಾಗಿಲ್ಲ"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"ಇತರ ಆ್ಯಪ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"ನಿಯಂತ್ರಣಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಆ್ಯಪ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಬದಲಾಗಿಲ್ಲ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು <xliff:g id="APP">%s</xliff:g> ಆ್ಯಪ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"ಹೊಂದಾಣಿಕೆಯ ನಿಯಂತ್ರಣಗಳು ಲಭ್ಯವಿಲ್ಲ"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ಇತರ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index d1f9a2d..724233c 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"사용 중지"</string>
     <string name="sound_settings" msgid="8874581353127418308">"소리 및 진동"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"설정"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"앱 고정됨"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 뒤로 및 최근 사용을 길게 터치하세요."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 뒤로 및 홈을 길게 터치하세요."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"확대 전환"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"전체 화면 확대"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"화면 일부 확대"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"전환"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"확대 설정 열기"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"모서리를 드래그하여 크기 조절"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"대각선 스크롤 허용"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"보통"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"작게"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"크게"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"전체 화면"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"완료"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"수정"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"돋보기 창 설정"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"모든 컨트롤 삭제됨"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"변경사항이 저장되지 않음"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"다른 앱 보기"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"컨트롤을 로드할 수 없습니다. <xliff:g id="APP">%s</xliff:g> 앱에서 설정이 변경되지 않았는지 확인하세요."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"호환 컨트롤을 사용할 수 없습니다."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"기타"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 4693950..2c43d93 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"өчүрүү"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Үн жана дирилдөө"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Параметрлер"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Колдонмо кадалды"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн \"Артка\" жана \"Назар\" баскычтарын басып, кармап туруңуз."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Артка\" жана \"Башкы бет\" баскычтарын басып, кармап туруңуз."</string>
@@ -720,7 +724,7 @@
     <string name="accessibility_qs_edit_position" msgid="4509277359815711830">"<xliff:g id="POSITION">%1$d</xliff:g>-позиция"</string>
     <string name="accessibility_qs_edit_tile_added" msgid="9067146040380836334">"Карта кошулду"</string>
     <string name="accessibility_qs_edit_tile_removed" msgid="1175925632436612036">"Карта өчүрүлдү"</string>
-    <string name="accessibility_desc_quick_settings_edit" msgid="741658939453595297">"Ыкчам жөндөөлөр түзөткүчү."</string>
+    <string name="accessibility_desc_quick_settings_edit" msgid="741658939453595297">"Ыкчам параметрлер түзөткүчү."</string>
     <string name="accessibility_desc_notification_icon" msgid="7331265967584178674">"<xliff:g id="ID_1">%1$s</xliff:g> эскертмеси: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
     <string name="accessibility_quick_settings_settings" msgid="7098489591715844713">"Жөндөөлөрдү ачуу."</string>
     <string name="accessibility_quick_settings_expand" msgid="2609275052412521467">"Ыкчам жөндөөлөрдү ачуу."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Чоңойтуу режимине которулуу"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Толук экранда ачуу"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Экрандын бир бөлүгүн чоңойтуу"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Которулуу"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Чоңойтуу параметрлерин ачуу"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Өлчөмүн өзгөртүү үчүн бурчун сүйрөңүз"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Диагональ боюнча сыдырууга уруксат берүү"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Орто"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Кичине"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Чоң"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Толук экран"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Бүттү"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Түзөтүү"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Чоңойткуч терезесинин параметрлери"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Бардык башкаруу элементтери өчүрүлдү"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Өзгөртүүлөр сакталган жок"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Башка колдонмолорду көрүү"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Башкаруу элементтери жүктөлгөн жок. <xliff:g id="APP">%s</xliff:g> колдонмосуна өтүп, колдонмонун параметрлери өзгөрбөгөнүн текшериңиз."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Шайкеш башкаруу элементтери жеткиликсиз"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Башка"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 21f4312..b57f836 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -458,6 +458,8 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ປິດນຳໃຊ້"</string>
     <string name="sound_settings" msgid="8874581353127418308">"ສຽງ ແລະ ການສັ່ນເຕືອນ"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ການຕັ້ງຄ່າ"</string>
+    <string name="csd_lowered_title" product="default" msgid="1786173629015030856">"ໄດ້ຫຼຸດລົງຫາລະດັບສຽງທີ່ປອດໄພຍິ່ງຂຶ້ນ"</string>
+    <string name="csd_system_lowered_text" product="default" msgid="2001603282316829500">"ລະດັບສຽງສູງເປັນເວລາດົນກວ່າທີ່ແນະນໍາໃຫ້"</string>
     <string name="screen_pinning_title" msgid="9058007390337841305">"ແອັບຖືກປັກໝຸດແລ້ວ"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກມຸດ. ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກມຸດ."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກໝຸດ. ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກໝຸດ."</string>
@@ -832,7 +834,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"ສະຫຼັບການຂະຫຍາຍ"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"ຂະຫຍາຍເຕັມຈໍ"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"ຂະຫຍາຍບາງສ່ວນຂອງໜ້າຈໍ"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ສະຫຼັບ"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"ເປີດການຕັ້ງຄ່າການຂະຫຍາຍ"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"ລາກຢູ່ມຸມເພື່ອປັບຂະໜາດ"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"ອະນຸຍາດໃຫ້ເລື່ອນທາງຂວາງ"</string>
@@ -849,6 +850,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"ປານກາງ"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"ນ້ອຍ"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"ໃຫຍ່"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"ເຕັມຈໍ"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"ແລ້ວໆ"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"ແກ້ໄຂ"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"ການຕັ້ງຄ່າໜ້າຈໍຂະຫຍາຍ"</string>
@@ -884,6 +886,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"ລຶບການຄວບຄຸມທັງໝົດອອກແລ້ວ"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ບໍ່ໄດ້ບັນທຶກການປ່ຽນແປງໄວ້"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"ເບິ່ງແອັບອື່ນໆ"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"ບໍ່ສາມາດໂຫຼດການຄວບຄຸມໄດ້. ກວດສອບແອັບ <xliff:g id="APP">%s</xliff:g> ເພື່ອໃຫ້ແນ່ໃຈວ່າຍັງບໍ່ມີການປ່ຽນແປງການຕັ້ງຄ່າແອັບເທື່ອ."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"ບໍ່ມີການຄວບຄຸມທີ່ໃຊ້ຮ່ວມກັນທີ່ສາມາດໃຊ້ໄດ້"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ອື່ນໆ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 326f11b..ab2ac5a 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"išjungti"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Garsas ir vibravimas"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Nustatymai"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Programa prisegta"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Apžvalga“, kad atsegtumėte."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Pagrindinis ekranas“, kad atsegtumėte."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Didinimo jungiklis"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Viso ekrano didinimas"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Didinti ekrano dalį"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Perjungti"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Atidaryti didinimo nustatymus"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Norėdami keisti dydį, vilkite kampą"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Slinkimo įstrižai leidimas"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Vidutinis"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Mažas"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Didelis"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Visas ekranas"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Atlikta"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Redaguoti"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Didinimo lango nustatymai"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Visi valdikliai pašalinti"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Pakeitimai neišsaugoti"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Žr. kitas programas"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Nepavyko įkelti valdiklių. Eikite į programą „<xliff:g id="APP">%s</xliff:g>“ ir įsitikinkite, kad programos nustatymai nepakeisti."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Suderinami valdikliai nepasiekiami"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Kita"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index d7e99d4..4992eb1 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"atspējot"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Skaņa un vibrācija"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Iestatījumi"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Lietotne ir piesprausta"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogām Atpakaļ un Pārskats un turiet tās."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogām “Atpakaļ” un “Sākums” un turiet tās."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Palielinājuma slēdzis"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Palielināt visu ekrānu"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Palielināt ekrāna daļu"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Pārslēgt"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Atvērt palielinājuma iestatījumus"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Velciet stūri, lai mainītu izmērus"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Atļaut ritināšanu pa diagonāli"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Vidējs"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Mazs"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Liels"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Pilnekrāna režīms"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Gatavs"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Rediģēt"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Lupas loga iestatījumi"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Visas vadīklas ir noņemtas"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Izmaiņas nav saglabātas."</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Skatīt citas lietotnes"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Nevarēja ielādēt vadīklas. Lietotnē <xliff:g id="APP">%s</xliff:g> pārbaudiet, vai nav mainīti lietotnes iestatījumi."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Nav pieejamas saderīgas vadīklas"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Cita"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 1948796..ec30a5b 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"оневозможи"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Звук и вибрации"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Поставки"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Апликацијата е закачена"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Ќе се гледа сѐ додека не го откачите. Допрете и држете „Назад“ и „Краток преглед“ за откачување."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ќе се гледа сѐ додека не го откачите. Допрете и задржете „Назад“ и „Почетен екран“ за откачување."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Прекинувач за зголемување"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Зголемете го целиот екран"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Зголемувајте дел од екранот"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Префрли"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Отвори поставки за зголемување"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Повлечете на аголот за да ја промените големината"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Дозволете дијагонално лизгање"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Средно"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Мало"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Големо"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Цел екран"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Готово"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Изменете"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Поставки за прозорец за лупа"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Сите контроли се отстранети"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Промените не се зачувани"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Видете други апликации"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Контролите не може да се вчитаат. Проверете ја апликацијата <xliff:g id="APP">%s</xliff:g> за да се уверите дека поставките за апликацијата не се променети."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Нема компатибилни контроли"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Друга"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 0a36380..790ebdb 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"പ്രവർത്തനരഹിതമാക്കുക"</string>
     <string name="sound_settings" msgid="8874581353127418308">"ശബ്‌ദവും വൈബ്രേഷനും"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ക്രമീകരണം"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"ആപ്പ് പിൻ ചെയ്തു"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'തിരികെ\', \'ചുരുക്കവിവരണം\' എന്നിവ സ്‌പർശിച്ച് പിടിക്കുക."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'തിരികെ പോവുക\', \'ഹോം\' ബട്ടണുകൾ സ്‌പർശിച്ച് പിടിക്കുക."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"മാഗ്നിഫിക്കേഷൻ മോഡ് മാറുക"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"സ്ക്രീൻ പൂർണ്ണമായും മാഗ്നിഫൈ ചെയ്യുക"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"സ്‌ക്രീനിന്റെ ഭാഗം മാഗ്നിഫൈ ചെയ്യുക"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"മാറുക"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"മാഗ്നിഫിക്കേഷൻ ക്രമീകരണം തുറക്കുക"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"വലുപ്പം മാറ്റാൻ മൂല വലിച്ചിടുക"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"ഡയഗണൽ സ്‌ക്രോളിംഗ് അനുവദിക്കുക"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"ഇടത്തരം"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"ചെറുത്"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"വലുത്"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"പൂർണ്ണ സ്ക്രീൻ"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"പൂർത്തിയായി"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"എഡിറ്റ് ചെയ്യുക"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"മാഗ്നിഫയർ വിൻഡോ ക്രമീകരണം"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"എല്ലാ നിയന്ത്രണങ്ങളും നീക്കം ചെയ്തു"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"മാറ്റങ്ങൾ സംരക്ഷിച്ചിട്ടില്ല"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"മറ്റ് ആപ്പുകൾ കാണുക"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"നിയന്ത്രണങ്ങൾ ലോഡ് ചെയ്യാനായില്ല. ആപ്പ് ക്രമീകരണം മാറ്റിയിട്ടില്ലെന്ന് ഉറപ്പാക്കാൻ <xliff:g id="APP">%s</xliff:g> ആപ്പ് പരിശോധിക്കുക."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"അനുയോജ്യമായ നിയന്ത്രണങ്ങൾ ലഭ്യമല്ല"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"മറ്റുള്ളവ"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 759218a..5d00da2 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"идэвхгүй болгох"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Дуу, чичиргээ"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Тохиргоо"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Аппыг бэхэлсэн"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Таныг тогтоосныг болиулах хүртэл үүнийг харуулна. Тогтоосныг болиулахын тулд Буцах, Тоймыг дараад хүлээнэ үү."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Таныг тогтоосныг болиулах хүртэл үүнийг харуулсан хэвээр байна. Тогтоосныг болиулахын тулд Буцах, Нүүр хуудас товчлуурыг дараад хүлээнэ үү."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Томруулах сэлгэлт"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Бүтэн дэлгэцийг томруулах"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Дэлгэцийн нэг хэсгийг томруулах"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Сэлгэх"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Томруулах тохиргоог нээх"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Хэмжээг өөрчлөхийн тулд булангаас чирнэ үү"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Хөндлөн гүйлгэхийг зөвшөөрнө үү"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Дунд зэрэг"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Жижиг"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Том"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Бүтэн дэлгэц"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Болсон"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Засах"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Томруулагчийн цонхны тохиргоо"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Бүх хяналтыг хассан"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Өөрчлөлтийг хадгалаагүй"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Бусад аппыг харах"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Хяналтыг ачаалж чадсангүй. Аппын тохиргоог өөрчлөөгүй эсэхийг нягтлахын тулд <xliff:g id="APP">%s</xliff:g> аппыг шалгана уу."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Тохирох хяналт байхгүй"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Бусад"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index c0605a8..20b1267 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"बंद करा"</string>
     <string name="sound_settings" msgid="8874581353127418308">"आवाज आणि व्हायब्रेशन"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"सेटिंग्ज"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"ॲप पिन केले आहे"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"तुम्ही अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्‍यासाठी परत आणि विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"तुम्ही अनपिन करेर्यंत हे त्याला दृश्यामध्ये ठेवते. अनपिन करण्‍यासाठी मागे आणि होम वर स्पर्श करा आणि धरून ठेवा."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"मॅग्निफिकेशन स्विच"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"फुल स्क्रीन मॅग्निफाय करा"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"स्क्रीनचा काही भाग मॅग्निफाय करा"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"स्विच करा"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"मॅग्निफिकेशन सेटिंग्ज उघडा"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"आकार बदलण्यासाठी कोपरा ड्रॅग करा"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"तिरपे स्क्रोल करण्याची अनुमती द्या"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"मध्‍यम"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"लहान"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"मोठा"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"फुल स्क्रीन"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"पूर्ण झाले"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"संपादित करा"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"मॅग्निफायर विंडो सेटिंग्ज"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"सर्व नियंत्रणे काढून टाकली आहेत"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"बदल सेव्ह केले गेले नाहीत"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"इतर अ‍ॅप्स पहा"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"नियंत्रणे लोड करता अली नाहीत. ॲपची सेटिंग्ज बदलली नसल्याची खात्री करण्यासाठी <xliff:g id="APP">%s</xliff:g> ॲप तपासा."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"कंपॅटिबल नियंत्रणे उपलब्ध नाहीत"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"इतर"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index ce9aa40..5936fc8 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"lumpuhkan"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Bunyi &amp; getaran"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Tetapan"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Apl telah disemat"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh &amp; tahan Kembali dan Ikhtisar untuk menyahsemat."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh &amp; tahan Kembali dan Skrin Utama untuk menyahsemat."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Suis pembesaran"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Besarkan skrin penuh"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Besarkan sebahagian skrin"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Tukar"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Buka tetapan pembesaran"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Seret sudut untuk mengubah saiz"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Benarkan penatalan pepenjuru"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Sederhana"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Kecil"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Besar"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Skrin penuh"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Selesai"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Edit"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Tetapan tetingkap penggadang"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Semua kawalan dialih keluar"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Perubahan tidak disimpan"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Lihat apl lain"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Kawalan tidak dapat dimuatkan. Semak apl <xliff:g id="APP">%s</xliff:g> untuk memastikan bahawa tetapan apl tidak berubah."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Kawalan serasi tidak tersedia"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Lain-lain"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 0194c77..ae55ab2 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -124,7 +124,7 @@
     <string name="accessibility_back" msgid="6530104400086152611">"နောက်သို့"</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_accessibility_button" msgid="4089042473497107709">"အများသုံးနိုင်မှု"</string>
     <string name="accessibility_rotate_button" msgid="1238584767612362586">"မျက်နှာပြင် လှည့်ရန်"</string>
     <string name="accessibility_recent" msgid="901641734769533575">"ခြုံကြည့်မှု။"</string>
     <string name="accessibility_camera_button" msgid="2938898391716647247">"ကင်မရာ"</string>
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ပိတ်ရန်"</string>
     <string name="sound_settings" msgid="8874581353127418308">"အသံနှင့် တုန်ခါမှု"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ဆက်တင်များ"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"အက်ပ်ကို ပင်ထိုးထားသည်"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"သင်ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် Back နှင့် Overview ကို ထိ၍ဖိထားပါ။"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"သင်က ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် \'နောက်သို့\' နှင့် \'ပင်မ\' ခလုတ်တို့ကို တို့၍ဖိထားပါ။"</string>
@@ -481,13 +485,13 @@
     <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>
+    <string name="stream_accessibility" msgid="3873610336741987152">"အများသုံးနိုင်မှု"</string>
     <string name="volume_ringer_status_normal" msgid="1339039682222461143">"အသံမြည်သည်"</string>
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"တုန်ခါသည်"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"အသံတိတ်သည်"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s။ အသံပြန်ဖွင့်ရန် တို့ပါ။"</string>
-    <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s။ တုန်ခါမှုကို သတ်မှတ်ရန် တို့ပါ။ အများသုံးစွဲနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string>
-    <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s။ အသံပိတ်ရန် တို့ပါ။ အများသုံးစွဲနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string>
+    <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s။ တုန်ခါမှုကို သတ်မှတ်ရန် တို့ပါ။ အများသုံးနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string>
+    <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s။ အသံပိတ်ရန် တို့ပါ။ အများသုံးနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s။ တုန်ခါခြင်းသို့ သတ်မှတ်ရန်တို့ပါ။"</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s။ အသံပိတ်ရန် တို့ပါ။"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"ဖုန်းခေါ်သံမုဒ်သို့ ပြောင်းရန် တို့ပါ"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"ချဲ့ရန် ခလုတ်"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"ဖန်သားပြင်အပြည့် ချဲ့သည်"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"ဖန်သားပြင် တစ်စိတ်တစ်ပိုင်းကို ချဲ့ပါ"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ခလုတ်"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"ချဲ့ခြင်း ဆက်တင်များ ဖွင့်ရန်"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"အရွယ်အစားပြန်ပြုပြင်ရန် ထောင့်စွန်းကို ဖိဆွဲပါ"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"ထောင့်ဖြတ် လှိမ့်ခွင့်ပြုရန်"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"အလတ်"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"အသေး"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"အကြီး"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"ဖန်သားပြင်အပြည့်"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"ပြီးပြီ"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"ပြင်ရန်"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"မှန်ဘီလူးဝင်းဒိုး ဆက်တင်များ"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"ထိန်းချုပ်မှုအားလုံး ဖယ်ရှားလိုက်သည်"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"အပြောင်းအလဲများကို သိမ်းမထားပါ"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"အခြားအက်ပ်များကိုကြည့်ပါ"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"ထိန်းချုပ်မှုများကို ဖွင့်၍မရပါ။ အက်ပ်ဆက်တင်များ ပြောင်းမထားကြောင်း သေချာစေရန် <xliff:g id="APP">%s</xliff:g> အက်ပ်ကို စစ်ဆေးပါ။"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"ကိုက်ညီသော ထိန်းချုပ်မှုများကို မရရှိနိုင်ပါ"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"အခြား"</string>
@@ -897,7 +907,7 @@
     <string name="controls_settings_trivial_controls_dialog_title" msgid="7593188157655036677">"လော့ခ်မျက်နှာပြင်တွင် စက်ပစ္စည်းများ ထိန်းချုပ်မလား။"</string>
     <string name="controls_settings_trivial_controls_dialog_message" msgid="397178734990952575">"အချို့စက်များကို ဖုန်း (သို့) တက်ဘလက် လော့ခ်ဖွင့်ရန်မလိုဘဲ ထိန်းချုပ်နိုင်သည်။ ဤနည်းလမ်းအတိုင်း ထိန်းချုပ်နိုင်မည့်စက်များကို သင့်စက်ပစ္စည်းအက်ပ်က ဆုံးဖြတ်သည်။"</string>
     <string name="controls_settings_dialog_neutral_button" msgid="4514446354793124140">"မလိုပါ"</string>
-    <string name="controls_settings_dialog_positive_button" msgid="436070672551674863">"Yes"</string>
+    <string name="controls_settings_dialog_positive_button" msgid="436070672551674863">"လုပ်ပါမည်"</string>
     <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"ပင်နံပါတ်တွင် စာလုံး သို့မဟုတ် သင်္ကေတများပါဝင်သည်"</string>
     <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ကို အတည်ပြုခြင်း"</string>
     <string name="controls_pin_wrong" msgid="6162694056042164211">"ပင်နံပါတ် မှားနေသည်"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index f0da4e9..ea27460 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktiver"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Lyd og vibrering"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Innstillinger"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Appen er festet"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Gjør at den vises til du løsner den. Trykk og hold inne Tilbake og Oversikt for å løsne den."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Gjør at den vises til du løsner den. Trykk og hold inne Tilbake og Startside for å løsne den."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Forstørringsbryter"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Forstørr hele skjermen"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Forstørr en del av skjermen"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Bytt"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Åpne innstillinger for forstørring"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Dra hjørnet for å endre størrelse"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Tillat diagonal rulling"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Middels"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Liten"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Stor"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Fullskjerm"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Ferdig"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Endre"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Innstillinger for forstørringsvindu"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# kontroll er lagt til.}other{# kontroller er lagt til.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Fjernet"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"Vil du legge til <xliff:g id="APPNAME">%s</xliff:g>?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> kan velge hvilke kontroller og hvilket innhold som vises her."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Vil du fjerne kontrollene for <xliff:g id="APPNAME">%s</xliff:g>?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"Favoritt"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Favoritt, posisjon <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle kontroller er fjernet"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Endringene er ikke lagret"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Se andre apper"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Kunne ikke laste inn kontrollene. Sjekk <xliff:g id="APP">%s</xliff:g>-appen for å sjekke at appinnstillingene ikke er endret."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Kompatible kontroller er ikke tilgjengelige"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Annet"</string>
@@ -1066,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"redigere"</string>
     <string name="add" msgid="81036585205287996">"Legg til"</string>
     <string name="manage_users" msgid="1823875311934643849">"Administrer brukere"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"Dette varselet støtter ikke at du drar det til en delt skjerm"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi er utilgjengelig"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioriteringsmodus"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarmen er stilt inn"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index c451853..8a2057a 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"असक्षम पार्नुहोस्"</string>
     <string name="sound_settings" msgid="8874581353127418308">"साउन्ड तथा भाइब्रेसन"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"सेटिङ"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"एप पिन गरिएको छ"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र परिदृश्य बटनलाई टच एण्ड होल्ड गर्नुहोस्।"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र गृह नामक बटनहरूलाई टच एण्ड होल्ड गर्नुहोस्।"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"म्याग्निफिकेसन स्विच"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"पूरै स्क्रिन जुम इन गर्नुहोस्"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"स्क्रिनको केही भाग म्याग्निफाइ गर्नुहोस्"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"बदल्नुहोस्"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"जुम इनसम्बन्धी सेटिङ खोल्नुहोस्"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"आकार बदल्न कुनाबाट ड्र्याग गर्नुहोस्"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"डायगोनल तरिकाले स्क्रोल गर्ने अनुमति दिनुहोस्"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"मध्यम"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"सानो"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"ठुलो"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"फुल स्क्रिन"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"सम्पन्न भयो"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"सम्पादन गर्नुहोस्"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"म्याग्निफायर विन्डोसम्बन्धी सेटिङ"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"सबै कन्ट्रोल हटाइए"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"परिवर्तनहरू सुरक्षित गरिएका छैनन्"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"अन्य एपहरू हेर्नुहोस्"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"नियन्त्रण सुविधाहरू लोड गर्न सकिएन। <xliff:g id="APP">%s</xliff:g> एपका सेटिङ परिवर्तन गरिएका छैनन् भन्ने कुरा सुनिश्चित गर्न उक्त एप जाँच्नुहोस्।"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"मिल्दा नियन्त्रण सुविधाहरू उपलब्ध छैनन्"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"अन्य"</string>
@@ -1065,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"सम्पादन गर्नुहोस्"</string>
     <string name="add" msgid="81036585205287996">"हाल्नुहोस्"</string>
     <string name="manage_users" msgid="1823875311934643849">"प्रयोगकर्ताहरूको व्यवस्थापन गर्नुहोस्"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"यो सूचना ड्र्याग गरेर स्प्लिट स्क्रिनमा लैजान मिल्दैन"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi उपलब्ध छैन"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"प्राथमिकता मोड"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"अलार्म सेट गरिएको छ"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 88faab4..1a0265f 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"uitzetten"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Geluid en trillen"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Instellingen"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"App is vastgezet"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Terug en Overzicht en houd deze vast om het scherm los te maken."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Terug en Home en houd deze vast om het scherm los te maken."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Vergrotingsschakelaar"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Volledig scherm vergroten"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Deel van het scherm vergroten"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Schakelen"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Instellingen voor vergroting openen"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Sleep een hoek om het formaat te wijzigen"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Diagonaal scrollen toestaan"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Normaal"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Klein"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Groot"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Volledig scherm"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Klaar"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Bewerken"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Instellingen voor vergrotingsvenster"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle bedieningselementen verwijderd"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Wijzigingen zijn niet opgeslagen"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Andere apps bekijken"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Bedieningselementen kunnen niet worden geladen. Check de <xliff:g id="APP">%s</xliff:g>-app om na te gaan of de app-instellingen niet zijn gewijzigd."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Geen geschikte bedieningselementen beschikbaar"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Overig"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index a576ac5..df284c1 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ଅକ୍ଷମ କରନ୍ତୁ"</string>
     <string name="sound_settings" msgid="8874581353127418308">"ସାଉଣ୍ଡ ଓ ଭାଇବ୍ରେସନ"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ସେଟିଂସ"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"ଆପକୁ ପିନ୍ କରାଯାଇଛି"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"ଆପଣ ଅନପିନ୍‍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଦେଖାଉଥିବ। ଅନପିନ୍‍ କରିବାକୁ ସ୍ପର୍ଶ କରି ଧରିରଖନ୍ତୁ ଓ ଦେଖନ୍ତୁ।"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"ଆପଣ ଅନପିନ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଦେଖାଉଥିବ। ଅନପିନ୍ କରିବା ପାଇଁ ହୋମ ଓ ବ୍ୟାକ ବଟନକୁ ଦବାଇ ଧରନ୍ତୁ।"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ସ୍ୱିଚ୍"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"ସମ୍ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନକୁ ମ୍ୟାଗ୍ନିଫାଏ କରନ୍ତୁ"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"ସ୍କ୍ରିନର ଅଂଶ ମାଗ୍ନିଫାଏ କରନ୍ତୁ"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ସ୍ୱିଚ୍ କରନ୍ତୁ"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"ମାଗ୍ନିଫିକେସନ ସେଟିଂସ ଖୋଲନ୍ତୁ"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"ରିସାଇଜ କରିବା ପାଇଁ କୋଣକୁ ଡ୍ରାଗ କରନ୍ତୁ"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"ଡାଏଗୋନାଲ ସ୍କ୍ରୋଲିଂକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"ମଧ୍ୟମ"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"ଛୋଟ"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"ବଡ଼"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"ହୋଇଗଲା"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"ଏଡିଟ କରନ୍ତୁ"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"ମ୍ୟାଗ୍ନିଫାୟର ୱିଣ୍ଡୋର ସେଟିଂସ"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"ସମସ୍ତ ନିୟନ୍ତ୍ରଣ କାଢ଼ି ଦିଆଯାଇଛି"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ସେଭ୍ କରାଯାଇନାହିଁ"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"ଅନ୍ୟ ଆପ୍ ଦେଖନ୍ତୁ"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ଲୋଡ୍ କରାଯାଇପାରିଲା ନାହିଁ। ଆପ୍ ସେଟିଂସ୍ ପରିବର୍ତ୍ତନ ହୋଇନାହିଁ ବୋଲି ନିଶ୍ଚିତ କରିବାକୁ <xliff:g id="APP">%s</xliff:g> ଆପ୍ ଯାଞ୍ଚ କରନ୍ତୁ।"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"ସୁସଙ୍ଗତ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ଉପଲବ୍ଧ ନାହିଁ"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ଅନ୍ୟ"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index acc9339..67f1314 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ਬੰਦ ਕਰੋ"</string>
     <string name="sound_settings" msgid="8874581353127418308">"ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ਸੈਟਿੰਗਾਂ"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"ਐਪ ਨੂੰ ਪਿੰਨ ਕੀਤਾ ਗਿਆ ਹੈ"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"ਇਹ ਇਸ ਨੂੰ ਤਦ ਤੱਕ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਰੱਖਦਾ ਹੈ ਜਦ ਤੱਕ ਤੁਸੀਂ ਅਨਪਿੰਨ ਨਹੀਂ ਕਰਦੇ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਪਿੱਛੇ\' ਅਤੇ \'ਰੂਪ-ਰੇਖਾ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਅਨਪਿੰਨ ਕੀਤੇ ਜਾਣ ਤੱਕ ਇਸਨੂੰ ਦਿਖਾਇਆ ਜਾਂਦਾ ਹੈ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਪਿੱਛੇ\' ਅਤੇ \'ਹੋਮ\' ਨੂੰ ਸਪਰਸ਼ ਕਰਕੇ ਰੱਖੋ।"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"ਵੱਡਦਰਸ਼ੀਕਰਨ ਸਵਿੱਚ"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"ਪੂਰੀ ਸਕ੍ਰੀਨ ਨੂੰ ਵੱਡਦਰਸ਼ੀ ਕਰੋ"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"ਸਕ੍ਰੀਨ ਦੇ ਹਿੱਸੇ ਨੂੰ ਵੱਡਾ ਕਰੋ"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ਸਵਿੱਚ"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"ਵੱਡਦਰਸ਼ੀਕਰਨ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"ਆਕਾਰ ਬਦਲਣ ਲਈ ਕੋਨਾ ਘਸੀਟੋ"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"ਟੇਡੀ ਦਿਸ਼ਾ ਵਿੱਚ ਸਕ੍ਰੋਲ ਕਰਨ ਦਿਓ"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"ਦਰਮਿਆਨਾ"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"ਛੋਟਾ"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"ਵੱਡਾ"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"ਪੂਰੀ ਸਕ੍ਰੀਨ"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"ਹੋ ਗਿਆ"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"ਸੰਪਾਦਨ ਕਰੋ"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"ਵੱਡਦਰਸ਼ੀ ਵਿੰਡੋ ਸੈਟਿੰਗਾਂ"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# ਕੰਟਰੋਲ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ।}one{# ਕੰਟਰੋਲ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ।}other{# ਕੰਟਰੋਲ ਸ਼ਾਮਲ ਕੀਤੇ ਗਏ।}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"ਹਟਾਇਆ ਗਿਆ"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"ਕੀ <xliff:g id="APPNAME">%s</xliff:g> ਸ਼ਾਮਲ ਕਰਨਾ ਹੈ?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> ਚੁਣ ਸਕਦੀ ਹੈ ਕਿ ਇੱਥੇ ਕਿਹੜੇ ਕੰਟਰੋਲ ਅਤੇ ਕਿਹੜੀ ਸਮੱਗਰੀ ਦਿਸੇਗੀ।"</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"ਕੀ <xliff:g id="APPNAME">%s</xliff:g> ਲਈ ਕੰਟਰੋਲਾਂ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"ਮਨਪਸੰਦ ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"ਮਨਪਸੰਦ ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ, ਸਥਾਨ <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"ਸਾਰੇ ਕੰਟਰੋਲ ਹਟਾਏ ਗਏ"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ਤਬਦੀਲੀਆਂ ਨੂੰ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"ਹੋਰ ਐਪਾਂ ਦੇਖੋ"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"ਕੰਟਰੋਲਾਂ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਇਹ ਪੱਕਾ ਕਰਨ ਲਈ <xliff:g id="APP">%s</xliff:g> ਐਪ ਦੀ ਜਾਂਚ ਕਰੋ ਕਿ ਐਪ ਸੈਟਿੰਗਾਂ ਨਹੀਂ ਬਦਲੀਆਂ ਹਨ।"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"ਕੋਈ ਅਨੁਰੂਪ ਕੰਟਰੋਲ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ਹੋਰ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 078db24..db2ea37 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"wyłącz"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Dźwięk i wibracje"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ustawienia"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacja jest przypięta"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj Wstecz oraz Przegląd."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, naciśnij i przytrzymaj Wstecz oraz Ekran główny."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Przełączanie powiększenia"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Powiększanie pełnego ekranu"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Powiększ część ekranu"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Przełącz"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Otwórz ustawienia powiększenia"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Przeciągnij róg, aby zmienić rozmiar"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Zezwalaj na przewijanie poprzeczne"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Średni"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Mały"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Duży"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Pełny ekran"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Gotowe"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Edytuj"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Ustawienia okna powiększania"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Usunięto wszystkie elementy sterujące"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Zmiany nie zostały zapisane"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Wyświetl pozostałe aplikacje"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Nie udało się wczytać elementów sterujących. Sprawdź aplikację <xliff:g id="APP">%s</xliff:g>, aby upewnić się, że jej ustawienia się nie zmieniły."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Zgodne elementy sterujące niedostępne"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Inne"</string>
@@ -1065,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"edytować"</string>
     <string name="add" msgid="81036585205287996">"Dodaj"</string>
     <string name="manage_users" msgid="1823875311934643849">"Zarządzaj użytkownikami"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"To powiadomienie nie obsługuje dzielenia ekranu przez przeciąganie."</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Sieć Wi‑Fi niedostępna"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Tryb priorytetowy"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Alarm ustawiony"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 6b78aa7..9e434d5 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desativar"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Som e vibração"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Configurações"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"O app está fixado"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Visão geral e mantenha essas opções pressionadas para liberar."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Início e mantenha essas opções pressionadas para liberar."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Chave de ampliação"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Ampliar toda a tela"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ampliar parte da tela"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Trocar"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Abrir as configurações de ampliação"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Arraste o canto para redimensionar"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Permitir rolagem diagonal"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Médio"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Pequeno"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Grande"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Tela cheia"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Concluído"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Editar"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Configurações da janela de lupa"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos os controles foram removidos"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"As mudanças não foram salvas"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Ver outros apps"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Não foi possível carregar os controles. Verifique o app <xliff:g id="APP">%s</xliff:g> para garantir que as configurações não tenham sido modificadas."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Controles compatíveis indisponíveis"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outro"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 8595ed0..5de3135 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -458,6 +458,8 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desativar"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Som e vibração"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Definições"</string>
+    <string name="csd_lowered_title" product="default" msgid="1786173629015030856">"Volume reduzido para um nível mais seguro"</string>
+    <string name="csd_system_lowered_text" product="default" msgid="2001603282316829500">"O volume está elevado há mais tempo que o recomendado"</string>
     <string name="screen_pinning_title" msgid="9058007390337841305">"A app está fixada"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Anterior e em Vista geral para soltar."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Anterior e em Página inicial para soltar."</string>
@@ -832,7 +834,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Interruptor de ampliação"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Ampliar o ecrã inteiro"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ampliar parte do ecrã"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Mudar"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Abrir definições de ampliação"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Arrastar o canto para redimensionar"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Permitir deslocamento da página na diagonal"</string>
@@ -849,6 +850,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Médio"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Pequeno"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Grande"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Ecrã inteiro"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Concluir"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Editar"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Definições da janela da lupa"</string>
@@ -884,6 +886,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos os controlos foram removidos."</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Alterações não guardadas."</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Ver outras apps"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Não foi possível carregar os controlos. Verifique a app <xliff:g id="APP">%s</xliff:g> para se certificar de que as definições da mesma não foram alteradas."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Controlos compatíveis indisponíveis"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outro"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 6b78aa7..9e434d5 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desativar"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Som e vibração"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Configurações"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"O app está fixado"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Visão geral e mantenha essas opções pressionadas para liberar."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Início e mantenha essas opções pressionadas para liberar."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Chave de ampliação"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Ampliar toda a tela"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ampliar parte da tela"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Trocar"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Abrir as configurações de ampliação"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Arraste o canto para redimensionar"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Permitir rolagem diagonal"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Médio"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Pequeno"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Grande"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Tela cheia"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Concluído"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Editar"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Configurações da janela de lupa"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos os controles foram removidos"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"As mudanças não foram salvas"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Ver outros apps"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Não foi possível carregar os controles. Verifique o app <xliff:g id="APP">%s</xliff:g> para garantir que as configurações não tenham sido modificadas."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Controles compatíveis indisponíveis"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outro"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index c915522..6380223 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"dezactivează"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Sunete și vibrații"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Setări"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Aplicația este fixată"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunile Înapoi și Recente pentru a anula fixarea."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Astfel rămâne afișat până anulezi fixarea. Atinge lung opțiunile Înapoi și Acasă pentru a anula fixarea."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Comutator de mărire"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Mărește tot ecranul"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Mărește o parte a ecranului"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Comutator"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Deschide setările pentru mărire"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Trage de colț pentru a redimensiona"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Permite derularea pe diagonală"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Mediu"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Mic"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Mare"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Ecran complet"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Gata"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Editează"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Setările ferestrei de mărire"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Au fost șterse toate comenzile"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Modificările nu au fost salvate"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Vezi alte aplicații"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Comenzile nu au putut fi încărcate. Accesează aplicația <xliff:g id="APP">%s</xliff:g> pentru a te asigura că setările aplicației nu s-au schimbat."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Nu sunt disponibile comenzi compatibile"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Altul"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 42fe056..dd6aff6 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"отключить"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Звук и вибрация"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Открыть настройки"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Приложение закреплено"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопки \"Назад\" и \"Обзор\"."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопки \"Назад\" и \"Главный экран\"."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Переключатель режима увеличения"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Увеличение всего экрана"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Увеличить часть экрана"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Переключить"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Открыть настройки увеличения"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Потяните за угол, чтобы изменить размер"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Разрешить прокручивать по диагонали"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Средняя"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Маленькая"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Большая"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Полноэкранный режим"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"ОК"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Изменить"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Настройка окна лупы"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Все виджеты управления удалены."</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Изменения не сохранены."</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Показать другие приложения"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Не удалось загрузить список виджетов для управления устройствами. Проверьте, не изменились ли настройки приложения \"<xliff:g id="APP">%s</xliff:g>\"."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Управление недоступно."</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Другое"</string>
@@ -895,7 +905,7 @@
     <string name="controls_settings_show_controls_dialog_title" msgid="3357852503553809554">"Разрешить показывать устройства и управлять ими на заблокированном экране?"</string>
     <string name="controls_settings_show_controls_dialog_message" msgid="7666211700524587969">"Вы можете добавить элементы управления внешними устройствами на заблокированный экран.\n\nПриложение на вашем устройстве может разрешать управление некоторыми устройствами с заблокированного экрана.\n\nИзменить параметры можно в любое время в настройках."</string>
     <string name="controls_settings_trivial_controls_dialog_title" msgid="7593188157655036677">"Управлять устройствами на заблокированном экране?"</string>
-    <string name="controls_settings_trivial_controls_dialog_message" msgid="397178734990952575">"Некоторыми устройствами можно управлять без разблокировки экрана на телефоне или планшете. Их точный перечень зависит от приложения на вашем устройстве."</string>
+    <string name="controls_settings_trivial_controls_dialog_message" msgid="397178734990952575">"Некоторыми устройствами можно управлять без разблокировки экрана телефона или планшета. Их список зависит от того, какое у вас сопутствующее приложение."</string>
     <string name="controls_settings_dialog_neutral_button" msgid="4514446354793124140">"Не сейчас"</string>
     <string name="controls_settings_dialog_positive_button" msgid="436070672551674863">"Да"</string>
     <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN-код содержит буквы или символы"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 5522178..67ebeab 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"අබල කරන්න"</string>
     <string name="sound_settings" msgid="8874581353127418308">"ශබ්ද සහ කම්පනය"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"සැකසීම්"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"යෙදුම අමුණා ඇත"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට දළ විශ්ලේෂණය ස්පර්ශ කර ආපසු අල්ලාගෙන සිටින්න."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට මුල් පිටුව ස්පර්ශ කර අල්ලාගෙන සිටින්න."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"විශාලන ස්විචය"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"පූර්ණ තිරය විශාලනය කරන්න"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"තිරයේ කොටසක් විශාලනය කරන්න"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ස්විචය"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"විශාලන සැකසීම් විවෘත කරන්න"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"ප්‍රමාණය වෙනස් කිරීමට කොන අදින්න"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"විකර්ණ අනුචලනයට ඉඩ දෙන්න"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"මධ්‍යම"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"කුඩා"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"විශාල"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"පූර්ණ තිරය"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"නිමයි"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"සංස්කරණය කරන්න"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"විශාලන කවුළු සැකසීම්"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# පාලනයක් එක් කර ඇත.}one{පාලන #ක් එක් කර ඇත.}other{පාලන #ක් එක් කර ඇත.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"ඉවත් කළා"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> එක් කරන්න ද?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> හට මෙහි පෙන්වන්නේ කුමන පාලන සහ අන්තර්ගත ද යන්න තෝරා ගත හැක."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> සඳහා පාලන ඉවත් කරන්න ද?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"ප්‍රියතම කළා"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"ප්‍රියතම කළා, තත්ත්ව <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"සියලු පාලන ඉවත් කර ඇත"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"වෙනස් කිරීම් නොසුරැකිණි"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"වෙනත් යෙදුම් බලන්න"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"පාලන පූරණය කළ නොහැකි විය. යෙදුම් සැකසීම් වෙනස් වී නැති බව සහතික කර ගැනීමට <xliff:g id="APP">%s</xliff:g> යෙදුම පරීක්ෂා කරන්න."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"ගැළපෙන පාලන ලබා ගත නොහැකිය"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"වෙනත්"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 7210689..45faf7f 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"zakázať"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Zvuk a vibrácie"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Nastavenia"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikácia je pripnutá"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho stlačením a podržaním tlačidiel Späť a Prehľad."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho pridržaním tlačidiel Späť a Domov."</string>
@@ -634,7 +638,7 @@
     <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skrytie a opätovné zobrazenie panela úloh"</string>
     <string name="group_system_access_system_settings" msgid="7961639365383008053">"Prístup k nastaveniam systému"</string>
     <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Prístup k Asistentovi Google"</string>
-    <string name="group_system_lock_screen" msgid="7391191300363416543">"Uzamknutá obrazovka"</string>
+    <string name="group_system_lock_screen" msgid="7391191300363416543">"Zamknúť obrazovku"</string>
     <string name="group_system_quick_memo" msgid="2914234890158583919">"Otvorenie aplikácie Poznámky na rýchle zapisovanie"</string>
     <string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking systému"</string>
     <string name="system_multitasking_rhs" msgid="6593269428880305699">"Rozdelenie obrazovky s aktuálnou aplikáciou vpravo"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Prepínač zväčenia"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Zväčšenie celej obrazovky"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Zväčšiť časť obrazovky"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Prepnúť"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Otvoriť nastavenia zväčšenia"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Veľkosť zmeníte presunutím rohu"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Povoliť diagonálne posúvanie"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Stredný"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Malý"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Veľký"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Celá obrazovka"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Hotovo"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Upraviť"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Nastavenia okna lupy"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Všetky ovládače boli odstránené"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Zmeny neboli uložené"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Zobraziť ďalšie aplikácie"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Ovládacie prvky sa nepodarilo načítať. V aplikácii <xliff:g id="APP">%s</xliff:g> skontrolujte, či sa nezmenili nastavenia."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Kompatibilné ovládacie prvky nie sú k dispozícii"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Iné"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 7bdb979..e90a29d 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -124,7 +124,7 @@
     <string name="accessibility_back" msgid="6530104400086152611">"Nazaj"</string>
     <string name="accessibility_home" msgid="5430449841237966217">"Začetni zaslon"</string>
     <string name="accessibility_menu" msgid="2701163794470513040">"Meni"</string>
-    <string name="accessibility_accessibility_button" msgid="4089042473497107709">"Funkcije za ljudi s posebnimi potrebami"</string>
+    <string name="accessibility_accessibility_button" msgid="4089042473497107709">"Dostopnost"</string>
     <string name="accessibility_rotate_button" msgid="1238584767612362586">"Sukanje zaslona"</string>
     <string name="accessibility_recent" msgid="901641734769533575">"Pregled"</string>
     <string name="accessibility_camera_button" msgid="2938898391716647247">"Fotoaparat"</string>
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"onemogoči"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Zvok in vibriranje"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Nastavitve"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacija je pripeta"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"S tem ostane vidna, dokler je ne odpnete. Če jo želite odpeti, hkrati pridržite gumba za nazaj in pregled."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"S tem ostane vidna, dokler je ne odpnete. Če jo želite odpeti, hkrati pridržite gumba za nazaj in za začetni zaslon."</string>
@@ -481,13 +485,13 @@
     <string name="stream_notification" msgid="7930294049046243939">"Obvestilo"</string>
     <string name="stream_bluetooth_sco" msgid="6234562365528664331">"Bluetooth"</string>
     <string name="stream_dtmf" msgid="7322536356554673067">"Dvojna večtonska frekvenca"</string>
-    <string name="stream_accessibility" msgid="3873610336741987152">"Funkcije za ljudi s posebnimi potrebami"</string>
+    <string name="stream_accessibility" msgid="3873610336741987152">"Dostopnost"</string>
     <string name="volume_ringer_status_normal" msgid="1339039682222461143">"Zvonjenje"</string>
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Vibriranje"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Utišano"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Dotaknite se, če želite vklopiti zvok."</string>
-    <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Dotaknite se, če želite nastaviti vibriranje. V storitvah za ljudi s posebnimi potrebami bo morda izklopljen zvok."</string>
-    <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Dotaknite se, če želite izklopiti zvok. V storitvah za ljudi s posebnimi potrebami bo morda izklopljen zvok."</string>
+    <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Dotaknite se, če želite nastaviti vibriranje. V storitvah za dostopnost bo morda izklopljen zvok."</string>
+    <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Dotaknite se, če želite izklopiti zvok. V storitvah za dostopnost bo morda izklopljen zvok."</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Dotaknite se, če želite nastaviti vibriranje."</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Dotaknite se, če želite izklopiti zvok."</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"Dotaknite se, če želite spremeniti način zvonjenja."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Stikalo za povečavo"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Povečanje celotnega zaslona"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Povečava dela zaslona"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Stikalo"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Odpri nastavitve povečave"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Povlecite vogal, da spremenite velikost."</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Dovoli diagonalno pomikanje"</string>
@@ -849,10 +852,11 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Srednja"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Majhna"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Velika"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Celozaslonski način"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Končano"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Uredi"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Nastavitve okna povečevalnika"</string>
-    <string name="accessibility_floating_button_migration_tooltip" msgid="5217151214439341902">"Dotaknite se za funkcije za ljudi s posebnimi potrebami. Ta gumb lahko prilagodite ali zamenjate v nastavitvah.\n\n"<annotation id="link">"Ogled nastavitev"</annotation></string>
+    <string name="accessibility_floating_button_migration_tooltip" msgid="5217151214439341902">"Dotaknite se za funkcije dostopnosti. Ta gumb lahko prilagodite ali zamenjate v nastavitvah.\n\n"<annotation id="link">"Ogled nastavitev"</annotation></string>
     <string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Če želite gumb začasno skriti, ga premaknite ob rob."</string>
     <string name="accessibility_floating_button_undo" msgid="511112888715708241">"Razveljavi"</string>
     <string name="accessibility_floating_button_undo_message_label_text" msgid="9017658016426242640">"Odstranjena bližnjica za fun. <xliff:g id="FEATURE_NAME">%s</xliff:g>"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Vsi kontrolniki so bili odstranjeni."</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Spremembe niso shranjene"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Prikaz drugih aplikacij"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Kontrolnikov ni bilo mogoče naložiti. Preverite aplikacijo <xliff:g id="APP">%s</xliff:g> in se prepričajte, da se njene nastavitve niso spremenile."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Združljivi kontrolniki niso na voljo"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 71da15c..37248fe 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"çaktivizo"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Tingulli dhe dridhjet"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Cilësimet"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacioni është i gozhduar"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Prapa\" dhe \"Përmbledhje\" për ta hequr nga gozhdimi."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Prapa\" dhe \"Kreu\" për ta hequr nga gozhdimi."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Ndërrimi i zmadhimit"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Zmadho ekranin e plotë"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Zmadho një pjesë të ekranit"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Ndërro"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Hap cilësimet e zmadhimit"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Zvarrit këndin për të ndryshuar përmasat"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Lejo lëvizjen diagonale"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Mesatar"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"I vogël"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"I madh"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Ekran i plotë"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"U krye"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Modifiko"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Cilësimet e dritares së zmadhimit"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Të gjitha kontrollet u hoqën"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Ndryshimet nuk u ruajtën"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Shiko aplikacionet e tjera"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Kontrollet nuk mund të ngarkoheshin. Kontrollo aplikacionin <xliff:g id="APP">%s</xliff:g> për t\'u siguruar që cilësimet e aplikacionit nuk janë ndryshuar."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Kontrollet e përputhshme nuk ofrohen"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Tjetër"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 6136c36..d26d5a4 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"онемогућите"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Звук и вибрирање"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Подешавања"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Апликација је закачена"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"На овај начин се ово стално приказује док га не откачите. Додирните и задржите Назад и Преглед да бисте га откачили."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"На овај начин се ово стално приказује док га не откачите. Додирните и задржите Назад и Почетна да бисте га откачили."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Прелазак на други режим увећања"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Увећајте цео екран"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Увећајте део екрана"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Пређи"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Отвори подешавања увећања"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Превуците угао да бисте променили величину"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Дозволи дијагонално скроловање"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Средње"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Мало"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Велико"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Преко целог екрана"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Готово"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Измени"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Подешавања прозора за увећање"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Све контроле су уклоњене"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Промене нису сачуване"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Погледајте друге апликације"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Учитавање контрола није успело. Погледајте апликацију <xliff:g id="APP">%s</xliff:g> да бисте се уверили да се подешавања апликације нису променила."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Компатибилне контроле нису доступне"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Друго"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index f359ae9..58a7426 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"inaktivera"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Ljud och vibration"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Inställningar"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Appen har fästs"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Skärmen visas tills du lossar den. Tryck länge på Tillbaka och Översikt om du vill lossa skärmen."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Skärmen visas tills du lossar den. Tryck länge på Tillbaka och Startsida om du vill lossa skärmen."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Förstoringsreglage"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Förstora hela skärmen"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Förstora en del av skärmen"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Reglage"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Öppna inställningarna för förstoring"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Dra i hörnet för att ändra storlek"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Tillåt diagonal scrollning"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Medel"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Liten"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Stor"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Helskärm"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Klar"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Redigera"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Inställningar för förstoringsfönster"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Alla kontroller har tagits bort"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Ändringarna har inte sparats"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Visa andra appar"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Det gick inte att läsa in enhetsstyrning. Kontrollera att inställningarna inte har ändrats i <xliff:g id="APP">%s</xliff:g>-appen."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Ingen kompatibel enhetsstyrning tillgänglig"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Övrigt"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 6973c89..a3cd098 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"zima"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Sauti na mtetemo"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Mipangilio"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Programu imebandikwa"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kipengele cha Nyuma na Muhtasari ili ubandue."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kitufe cha kurudisha Nyuma na cha Mwanzo kwa pamoja ili ubandue."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Swichi ya ukuzaji"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Kuza skrini nzima"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Kuza sehemu ya skrini"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Swichi"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Fungua mipangilio ya ukuzaji"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Buruta kona ili ubadilishe ukubwa"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Ruhusu usogezaji wa kimshazari"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Wastani"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Ndogo"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Kubwa"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Skrini nzima"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Nimemaliza"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Badilisha"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Mipangilio ya dirisha la kikuzaji"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Umeondoa vidhibiti vyote"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Mabadiliko hayajahifadhiwa"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Angalia programu zingine"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Imeshindwa kupakia vidhibiti. Angalia programu ya <xliff:g id="APP">%s</xliff:g> ili uhakikishe kuwa mipangilio yake haijabadilika."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Vidhibiti vinavyooana havipatikani"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Nyingine"</string>
@@ -1065,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"ubadilishe"</string>
     <string name="add" msgid="81036585205287996">"Weka"</string>
     <string name="manage_users" msgid="1823875311934643849">"Dhibiti watumiaji"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"Arifa hii haitumii utaratibu wa kuburuta ili kugawa skrini"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi-Fi haipatikani"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Hali ya kipaumbele"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Kengele imewekwa"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index e32f28a..41a7743 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"முடக்கும்"</string>
     <string name="sound_settings" msgid="8874581353127418308">"ஒலி &amp; அதிர்வு"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"அமைப்புகள்"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"ஆப்ஸ் பின் செய்யப்பட்டது"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"இதற்கான பின்னை அகற்றும் வரை, இந்தப் பயன்முறை செயல்பாட்டிலேயே இருக்கும். அகற்றுவதற்கு, முந்தையது மற்றும் முகப்பு பட்டன்களைத் தொட்டுப் பிடிக்கவும்."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"பெரிதாக்கல் ஸ்விட்ச்"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"முழுத்திரையைப் பெரிதாக்கும்"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"திரையின் ஒரு பகுதியைப் பெரிதாக்கும்"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"ஸ்விட்ச்"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"பெரிதாக்கல் அமைப்புகளைத் திற"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"அளவை மாற்ற மூலையை இழுக்கவும்"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"குறுக்கே ஸ்க்ரோல் செய்வதை அனுமதி"</string>
@@ -849,6 +852,8 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"நடுத்தரமானது"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"சிறியது"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"பெரியது"</string>
+    <!-- no translation found for accessibility_magnification_fullscreen (5043514702759201964) -->
+    <skip />
     <string name="accessibility_magnification_done" msgid="263349129937348512">"முடிந்தது"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"மாற்று"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"சாளரத்தைப் பெரிதாக்கும் கருவிக்கான அமைப்புகள்"</string>
@@ -870,8 +875,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# கட்டுப்பாடு சேர்க்கப்பட்டது.}other{# கட்டுப்பாடுகள் சேர்க்கப்பட்டன.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"அகற்றப்பட்டது"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> ஆப்ஸைச் சேர்க்கவா?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"இங்கே எந்தெந்தக் கட்டுப்பாடுகளும் உள்ளடக்கமும் காட்டப்பட வேண்டும் என்பதை <xliff:g id="APPNAME">%s</xliff:g> ஆப்ஸால் தேர்வுசெய்ய முடியும்."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> ஆப்ஸுக்கான கட்டுப்பாடுகளை அகற்றவா?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"பிடித்தவற்றில் சேர்க்கப்பட்டது"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"பிடித்தவற்றில் சேர்க்கப்பட்டது, நிலை <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +889,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"கட்டுப்பாடுகள் அனைத்தும் அகற்றப்பட்டன"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"மாற்றங்கள் சேமிக்கப்படவில்லை"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"பிற ஆப்ஸையும் காட்டு"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"கட்டுப்பாடுகளை ஏற்ற முடியவில்லை. ஆப்ஸ் அமைப்புகள் மாறவில்லை என்பதை உறுதிப்படுத்த <xliff:g id="APP">%s</xliff:g> ஆப்ஸைப் பார்க்கவும்."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"இணக்கமான கட்டுப்பாடுகள் இல்லை"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"பிற"</string>
@@ -1066,8 +1076,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"திருத்தும்"</string>
     <string name="add" msgid="81036585205287996">"சேர்"</string>
     <string name="manage_users" msgid="1823875311934643849">"பயனர்களை நிர்வகித்தல்"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"பிரிக்கப்பட்ட திரைக்குள் இந்த அறிவிப்பை இழுத்துவிட முடியாது"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"வைஃபை கிடைக்கவில்லை"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"முன்னுரிமைப் பயன்முறை"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"அலாரம் அமைக்கப்பட்டுள்ளது"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 894298a..fa549b8 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"నిలిపివేయండి"</string>
     <string name="sound_settings" msgid="8874581353127418308">"సౌండ్ &amp; వైబ్రేషన్"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"సెట్టింగ్‌లు"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"యాప్ పిన్ చేయబడి ఉంది"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"దీని వలన మీరు అన్‌పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్‌పిన్ చేయడానికి వెనుకకు మరియు స్థూలదృష్టి తాకి &amp; అలాగే పట్టుకోండి."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"దీని వలన మీరు అన్‌పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్‌పిన్ చేయడానికి వెనుకకు మరియు హోమ్‌ని తాకి &amp; అలాగే పట్టుకోండి."</string>
@@ -682,8 +686,8 @@
   <string-array name="nav_bar_layouts">
     <item msgid="9156773083127904112">"సాధారణం"</item>
     <item msgid="2019571224156857610">"సంక్షిప్తమైనది"</item>
-    <item msgid="7453955063378349599">"ఎడమవైపుకు వాలుగా"</item>
-    <item msgid="5874146774389433072">"కుడివైపుకు వాలుగా"</item>
+    <item msgid="7453955063378349599">"ఎడమ వైపునకు వాలుగా"</item>
+    <item msgid="5874146774389433072">"కుడి వైపునకు వాలుగా"</item>
   </string-array>
     <string name="save" msgid="3392754183673848006">"సేవ్ చేయండి"</string>
     <string name="reset" msgid="8715144064608810383">"రీసెట్ చేయండి"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"మ్యాగ్నిఫికేషన్ స్విచ్"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"ఫుల్ స్క్రీన్‌ను మ్యాగ్నిఫై చేయండి"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"స్క్రీన్‌లో భాగాన్ని మ్యాగ్నిఫై చేయండి"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"స్విచ్ చేయి"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"మ్యాగ్నిఫికేషన్ సెట్టింగ్‌లను తెరవండి"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"సైజ్ మార్చడానికి మూలను లాగండి"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"వికర్ణ స్క్రోలింగ్‌ను అనుమతించండి"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"మధ్యస్థం"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"చిన్నది"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"పెద్దది"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"ఫుల్ స్క్రీన్"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"పూర్తయింది"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"ఎడిట్ చేయండి"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"మాగ్నిఫయర్ విండో సెట్టింగ్‌లు"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"అన్ని కంట్రోల్స్ తీసివేయబడ్డాయి"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"మార్పులు సేవ్ చేయబడలేదు"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"ఇతర యాప్‌లను చూడండి"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"కంట్రోల్‌లను లోడ్ చేయడం సాధ్యపడలేదు. యాప్ సెట్టింగ్‌లు మారలేదని నిర్ధారించడానికి <xliff:g id="APP">%s</xliff:g> యాప్‌ను చెక్ చేయండి."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"అనుకూల కంట్రోల్‌లు అందుబాటులో లేవు"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ఇతరం"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index d141402..110b62ae 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ปิดใช้"</string>
     <string name="sound_settings" msgid="8874581353127418308">"เสียงและการสั่น"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"การตั้งค่า"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"ปักหมุดแอปอยู่"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกปักหมุด แตะ \"กลับ\" และ \"ภาพรวม\" ค้างไว้เพื่อเลิกปักหมุด"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกปักหมุด แตะ \"กลับ\" และ \"หน้าแรก\" ค้างไว้เพื่อเลิกปักหมุด"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"เปลี่ยนโหมดการขยาย"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"ขยายเป็นเต็มหน้าจอ"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"ขยายบางส่วนของหน้าจอ"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"เปลี่ยน"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"เปิดการตั้งค่าการขยาย"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"ลากที่มุมเพื่อปรับขนาด"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"อนุญาตการเลื่อนแบบทแยงมุม"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"ปานกลาง"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"เล็ก"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"ใหญ่"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"เต็มหน้าจอ"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"เสร็จสิ้น"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"แก้ไข"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"การตั้งค่าหน้าต่างแว่นขยาย"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"นำตัวควบคุมทั้งหมดออกแล้ว"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ยังไม่ได้บันทึกการเปลี่ยนแปลง"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"ดูแอปอื่นๆ"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"โหลดตัวควบคุมไม่ได้ ตรวจสอบแอป <xliff:g id="APP">%s</xliff:g> ให้แน่ใจว่าการตั้งค่าของแอปไม่เปลี่ยนแปลง"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"ตัวควบคุมที่เข้ากันได้ไม่พร้อมใช้งาน"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"อื่นๆ"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 732094f..285b865 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"i-disable"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Tunog at pag-vibrate"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Mga Setting"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Naka-pin ang app"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik at Overview upang mag-unpin."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik at Home upang mag-unpin."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Switch ng pag-magnify"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"I-magnify ang buong screen"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"I-magnify ang isang bahagi ng screen"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Buksan ang mga setting ng pag-magnify"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"I-drag ang sulok para i-resize"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Payagan ang diagonal na pag-scroll"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Katamtaman"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Maliit"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Malaki"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Full screen"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Tapos na"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"I-edit"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Mga setting ng window ng magnifier"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Inalis ang lahat ng kontrol"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Hindi na-save ang mga pagbabago"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Tingnan ang iba pang app"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Hindi ma-load ang mga kontrol. Tingnan ang app na <xliff:g id="APP">%s</xliff:g> para matiyak na hindi nabago ang mga setting ng app."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Hindi available ang mga compatible na kontrol"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Iba pa"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 3c3c079..f82194d 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"devre dışı bırak"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Ses ve titreşim"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ayarlar"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Uygulama sabitlendi"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye ve Genel Bakış\'a dokunup basılı tutun."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye ve Ana sayfaya dokunup basılı tutun."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Büyütme moduna geçin"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Tam ekran büyütme"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ekranın bir parçasını büyütün"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Geç"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Büyütme ayarlarını aç"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Yeniden boyutlandırmak için köşeyi sürükleyin"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Çapraz kaydırmaya izin ver"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Orta"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Küçük"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Büyük"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Tam ekran"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Bitti"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Düzenle"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Büyüteç penceresi ayarları"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# kontrol eklendi.}other{# kontrol eklendi.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Kaldırıldı"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> eklensin mi?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> uygulaması hangi kontrollerin ve içeriklerin burada gösterileceğini seçebilir."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> için denetimler kaldırılsın mı?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"Favoriler listesine eklendi"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Favorilere eklendi, konum: <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Tüm denetimler kaldırıldı"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Değişiklikler kaydedilmedi"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Tüm uygulamaları göster"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Kontroller yüklenemedi. Uygulama ayarlarının değişmediğinden emin olmak için <xliff:g id="APP">%s</xliff:g> uygulamasını kontrol edin."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Uyumlu kontrol bulunamadı"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Diğer"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index eecabf4..62e1ec6 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -124,7 +124,7 @@
     <string name="accessibility_back" msgid="6530104400086152611">"Назад"</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_accessibility_button" msgid="4089042473497107709">"Доступність"</string>
     <string name="accessibility_rotate_button" msgid="1238584767612362586">"Обернути екран"</string>
     <string name="accessibility_recent" msgid="901641734769533575">"Огляд"</string>
     <string name="accessibility_camera_button" msgid="2938898391716647247">"Камера"</string>
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"вимкнути"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Звук і вібрація"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Налаштування"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Додаток закріплено"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Ви постійно бачитимете екран, доки не відкріпите його. Щоб відкріпити екран, натисніть і втримуйте кнопки \"Назад\" та \"Огляд\"."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ви бачитимете цей екран, доки не відкріпите його. Для цього натисніть і утримуйте кнопки \"Назад\" та \"Головний екран\"."</string>
@@ -481,7 +485,7 @@
     <string name="stream_notification" msgid="7930294049046243939">"Сповіщення"</string>
     <string name="stream_bluetooth_sco" msgid="6234562365528664331">"Bluetooth"</string>
     <string name="stream_dtmf" msgid="7322536356554673067">"Двотональний багаточастотний аналоговий сигнал"</string>
-    <string name="stream_accessibility" msgid="3873610336741987152">"Спеціальні можливості"</string>
+    <string name="stream_accessibility" msgid="3873610336741987152">"Доступність"</string>
     <string name="volume_ringer_status_normal" msgid="1339039682222461143">"Дзвінок"</string>
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Вібросигнал"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"без звуку"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Перемикач режиму збільшення"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Збільшення всього екрана"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Збільшити частину екрана"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Перемкнути"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Відкрити налаштування збільшення"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Потягніть кут, щоб змінити розмір"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Дозволити прокручування по діагоналі"</string>
@@ -849,10 +852,11 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Звичайна"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Мала"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Велика"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"На весь екран"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Готово"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Змінити"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Налаштування розміру лупи"</string>
-    <string name="accessibility_floating_button_migration_tooltip" msgid="5217151214439341902">"Кнопка спеціальних можливостей. Змініть або замініть її в Налаштуваннях.\n\n"<annotation id="link">"Переглянути налаштування"</annotation></string>
+    <string name="accessibility_floating_button_migration_tooltip" msgid="5217151214439341902">"Торкніться, щоб відкрити функції доступності. Змінити або замінити цю кнопку можна в Налаштуваннях.\n\n"<annotation id="link">"Налаштування"</annotation></string>
     <string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Щоб тимчасово сховати кнопку, перемістіть її на край екрана"</string>
     <string name="accessibility_floating_button_undo" msgid="511112888715708241">"Відмінити"</string>
     <string name="accessibility_floating_button_undo_message_label_text" msgid="9017658016426242640">"Ярлик функції \"<xliff:g id="FEATURE_NAME">%s</xliff:g>\" вилучено"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Додано # елемент керування.}one{Додано # елемент керування.}few{Додано # елементи керування.}many{Додано # елементів керування.}other{Додано # елемента керування.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Вилучено"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"Долучити додаток <xliff:g id="APPNAME">%s</xliff:g>?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"У додатку <xliff:g id="APPNAME">%s</xliff:g> можна вибрати, які елементи керування і контент тут відображатимуться."</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Вилучити елементи керування для додатка <xliff:g id="APPNAME">%s</xliff:g>?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"Додано у вибране"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Додано у вибране, позиція <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Усі елементи керування вилучено"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Зміни не збережено"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Переглянути інші додатки"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Не вдалося завантажити елементи керування. Перевірте в додатку <xliff:g id="APP">%s</xliff:g>, чи його налаштування не змінились."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Сумісні елементи керування недоступні"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Інше"</string>
@@ -1066,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"змінити"</string>
     <string name="add" msgid="81036585205287996">"Додати"</string>
     <string name="manage_users" msgid="1823875311934643849">"Керувати користувачами"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"Це сповіщення не підтримує режим розділеного екрана"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Мережа Wi-Fi недоступна"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Режим пріоритету"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Будильник установлено"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 89e6930..c2bbe9d 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -123,7 +123,7 @@
     <string name="screenrecord_start_error" msgid="2200660692479682368">"اسکرین ریکارڈنگ شروع کرنے میں خرابی"</string>
     <string name="accessibility_back" msgid="6530104400086152611">"واپس جائیں"</string>
     <string name="accessibility_home" msgid="5430449841237966217">"ہوم"</string>
-    <string name="accessibility_menu" msgid="2701163794470513040">"مینو"</string>
+    <string name="accessibility_menu" msgid="2701163794470513040">"مینیو"</string>
     <string name="accessibility_accessibility_button" msgid="4089042473497107709">"ایکسیسبیلٹی"</string>
     <string name="accessibility_rotate_button" msgid="1238584767612362586">"اسکرین کو گھمائیں"</string>
     <string name="accessibility_recent" msgid="901641734769533575">"عمومی جائزہ"</string>
@@ -364,7 +364,7 @@
     <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • آہستہ چارج ہو رہا ہے • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> میں مکمل"</string>
     <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • چارج ہو رہا ہے • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> میں مکمل"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"صارف سوئچ کریں"</string>
-    <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"پل ڈاؤن مینو"</string>
+    <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"پل ڈاؤن مینیو"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"اس سیشن میں موجود سبھی ایپس اور ڈیٹا کو حذف کر دیا جائے گا۔"</string>
     <string name="guest_wipe_session_title" msgid="7147965814683990944">"مہمان، پھر سے خوش آمدید!"</string>
     <string name="guest_wipe_session_message" msgid="3393823610257065457">"کیا آپ اپنا سیشن جاری رکھنا چاہتے ہیں؟"</string>
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"غیر فعال کریں"</string>
     <string name="sound_settings" msgid="8874581353127418308">"آواز اور وائبریشن"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ترتیبات"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"ایپ کو پن کر دیا گیا ہے"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"اس سے یہ اس وقت تک منظر میں رہتی ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے پیچھے اور مجموعی جائزہ کے بٹنز کو ٹچ کریں اور دبائے رکھیں۔"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"اس سے یہ اس وقت تک منظر میں رہتی ہے جب تک آپ اس سے پن نہیں ہٹا دیتے۔ پن ہٹانے کیلئے \"پیچھے\" اور \"ہوم\" بٹنز کو ٹچ کریں اور دبائے رکھیں۔"</string>
@@ -730,7 +734,7 @@
     <string name="data_connection_no_internet" msgid="691058178914184544">"انٹرنیٹ نہیں ہے"</string>
     <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"<xliff:g id="ID_1">%s</xliff:g> ترتیبات کھولیں۔"</string>
     <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"ترتیبات کی ترتیب میں ترمیم کریں۔"</string>
-    <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"پاور مینو"</string>
+    <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"پاور مینیو"</string>
     <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"صفحہ <xliff:g id="ID_1">%1$d</xliff:g> از <xliff:g id="ID_2">%2$d</xliff:g>"</string>
     <string name="tuner_lock_screen" msgid="2267383813241144544">"مقفل اسکرین"</string>
     <string name="thermal_shutdown_title" msgid="2702966892682930264">"حرارت کی وجہ سے فون آف ہو گیا"</string>
@@ -756,7 +760,7 @@
     <string name="tuner_minus" msgid="5258518368944598545">"علامت تفریق"</string>
     <string name="tuner_left" msgid="5758862558405684490">"بائیں"</string>
     <string name="tuner_right" msgid="8247571132790812149">"دائیں"</string>
-    <string name="tuner_menu" msgid="363690665924769420">"مینو"</string>
+    <string name="tuner_menu" msgid="363690665924769420">"مینیو"</string>
     <string name="tuner_app" msgid="6949280415826686972">"<xliff:g id="APP">%1$s</xliff:g> ایپ"</string>
     <string name="notification_channel_alerts" msgid="3385787053375150046">"الرٹس"</string>
     <string name="notification_channel_battery" msgid="9219995638046695106">"بیٹری"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"میگنیفکیشن پر سوئچ کریں"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"فُل اسکرین کو بڑا کریں"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"اسکرین کا حصہ بڑا کریں"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"سوئچ کریں"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"میگنیفکیشن کی ترتیبات کھولیں"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"سائز تبدیل کرنے کے لیے کونے کو گھسیٹیں"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"وتری سکرولنگ کی اجازت دیں"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"متوسط"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"چھوٹا"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"بڑا"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"فُل اسکرین"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"ہو گیا"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"ترمیم کریں"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"میگنیفائر ونڈو کی ترتیبات"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"سبھی کنٹرولز ہٹا دیے گئے"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"تبدیلیاں محفوظ نہیں ہوئیں"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"دیگر ایپس دیکھیں"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"کنٹرولز کو لوڈ نہیں کیا جا سکا۔ یہ یقینی بنانے کے لیے <xliff:g id="APP">%s</xliff:g> ایپ کو چیک کریں کہ ایپ کی ترتیبات تبدیل نہیں ہوئی ہیں۔"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"موافق کنٹرولز دستیاب نہیں ہیں"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"دیگر"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index a701ae3..fb20f8b 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -124,7 +124,7 @@
     <string name="accessibility_back" msgid="6530104400086152611">"Orqaga"</string>
     <string name="accessibility_home" msgid="5430449841237966217">"Uyga"</string>
     <string name="accessibility_menu" msgid="2701163794470513040">"Menyu"</string>
-    <string name="accessibility_accessibility_button" msgid="4089042473497107709">"Maxsus imkoniyatlar"</string>
+    <string name="accessibility_accessibility_button" msgid="4089042473497107709">"Qulayliklar"</string>
     <string name="accessibility_rotate_button" msgid="1238584767612362586">"Ekranni burish"</string>
     <string name="accessibility_recent" msgid="901641734769533575">"Umumiy nazar"</string>
     <string name="accessibility_camera_button" msgid="2938898391716647247">"Kamera"</string>
@@ -181,7 +181,7 @@
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Bunga ulangan: <xliff:g id="CAST">%s</xliff:g>."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Ulanmagan."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Rouming"</string>
-    <string name="cell_data_off" msgid="4886198950247099526">"Yoqilmagan"</string>
+    <string name="cell_data_off" msgid="4886198950247099526">"Oʻchiq"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Parvoz rejimi"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN yoniq."</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Batareya <xliff:g id="NUMBER">%d</xliff:g> foiz."</string>
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"faolsizlantirish"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Tovush va tebranish"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Sozlamalar"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Ilova mahkamlandi"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Ekran yechilmaguncha u o‘zgarmas holatda qoladi. Uni yechish uchun “Orqaga” va “Umumiy ma’lumot” tugmalarini bosib turing."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ekran yechib olinmagunicha u mahkamlangan holatda qoladi. Uni yechish uchun Orqaga va Asosiy tugmalarni birga bosib turing."</string>
@@ -481,13 +485,13 @@
     <string name="stream_notification" msgid="7930294049046243939">"Bildirishnoma"</string>
     <string name="stream_bluetooth_sco" msgid="6234562365528664331">"Bluetooth"</string>
     <string name="stream_dtmf" msgid="7322536356554673067">"Ikkitali ko‘pchastotali ovoz"</string>
-    <string name="stream_accessibility" msgid="3873610336741987152">"Maxsus imkoniyatlar"</string>
+    <string name="stream_accessibility" msgid="3873610336741987152">"Qulayliklar"</string>
     <string name="volume_ringer_status_normal" msgid="1339039682222461143">"Jiringlatish"</string>
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Tebranish"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Ovozsiz"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Ovozini yoqish uchun ustiga bosing."</string>
-    <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tebranishni yoqish uchun ustiga bosing. Maxsus imkoniyatlar ishlamasligi mumkin."</string>
-    <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Ovozini o‘chirish uchun ustiga bosing. Maxsus imkoniyatlar ishlamasligi mumkin."</string>
+    <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tebranishni yoqish uchun ustiga bosing. Qulayliklar ishlamasligi mumkin."</string>
+    <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Ovozini o‘chirish uchun ustiga bosing. Qulayliklar ishlamasligi mumkin."</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Tebranishni yoqish uchun ustiga bosing."</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Ovozsiz qilish uchun ustiga bosing."</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"Jiringlagich rejimini oʻzgartirish uchun bosing"</string>
@@ -666,7 +670,7 @@
     <string name="data_saver" msgid="3484013368530820763">"Trafik tejash"</string>
     <string name="accessibility_data_saver_on" msgid="5394743820189757731">"Trafik tejash yoniq"</string>
     <string name="switch_bar_on" msgid="1770868129120096114">"Yoniq"</string>
-    <string name="switch_bar_off" msgid="5669805115416379556">"Yoqilmagan"</string>
+    <string name="switch_bar_off" msgid="5669805115416379556">"Oʻchiq"</string>
     <string name="tile_unavailable" msgid="3095879009136616920">"Mavjud emas"</string>
     <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"batafsil"</string>
     <string name="nav_bar" msgid="4642708685386136807">"Navigatsiya paneli"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Kattalashtirish rejimini almashtirish"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Ekranni toʻliq kattalashtirish"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ekran qismini kattalashtirish"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Almashtirish"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Kattalashtirish sozlamalarini ochish"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Oʻlchamini oʻzgartirish uchun burchakni torting"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Diagonal aylantirishga ruxsat berish"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Oʻrtacha"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Kichik"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Yirik"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Butun ekran"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Tayyor"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Tahrirlash"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Lupa oynasi sozlamalari"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Barcha boshqaruv elementlari olib tashlandi"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Oʻzgarishlar saqlanmadi"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Boshqa ilovalar"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Boshqaruvlar yuklanmadi. <xliff:g id="APP">%s</xliff:g> ilovasining sozlamalari oʻzgarmaganini tekshiring."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Mos boshqaruv elementlari mavjud emas"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Boshqa"</string>
diff --git a/packages/SystemUI/res/values-uz/tiles_states_strings.xml b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
index 4a45f03..bd5ee89 100644
--- a/packages/SystemUI/res/values-uz/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
@@ -88,7 +88,7 @@
   </string-array>
   <string-array name="tile_states_color_correction">
     <item msgid="2840507878437297682">"Ishlamaydi"</item>
-    <item msgid="1909756493418256167">"Yoqilmagan"</item>
+    <item msgid="1909756493418256167">"Oʻchiq"</item>
     <item msgid="4531508423703413340">"Yoniq"</item>
   </string-array>
   <string-array name="tile_states_inversion">
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 8f651b0..0f2ebf6 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"tắt"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Âm thanh và chế độ rung"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Cài đặt"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"Đã ghim ứng dụng"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Ứng dụng này sẽ ở cố định trên màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ Quay lại và Tổng quan để bỏ ghim."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ứng dụng này sẽ ở cố định trên màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ nút Quay lại và nút Màn hình chính để bỏ ghim."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Nút chuyển phóng to"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Phóng to toàn màn hình"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Phóng to một phần màn hình"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Chuyển"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Mở chế độ cài đặt phóng to"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Kéo góc để thay đổi kích thước"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Cho phép cuộn chéo"</string>
@@ -849,6 +852,8 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Vừa"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Nhỏ"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Lớn"</string>
+    <!-- no translation found for accessibility_magnification_fullscreen (5043514702759201964) -->
+    <skip />
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Xong"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Chỉnh sửa"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Chế độ cài đặt cửa sổ phóng to"</string>
@@ -884,6 +889,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Đã xóa tất cả tùy chọn điều khiển"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Chưa lưu các thay đổi"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Xem ứng dụng khác"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Không tải được các chức năng điều khiển. Hãy kiểm tra ứng dụng <xliff:g id="APP">%s</xliff:g> để đảm bảo rằng thông tin cài đặt của ứng dụng chưa thay đổi."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Không có các chức năng điều khiển tương thích"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Khác"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 5532c29..571ee95 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"停用"</string>
     <string name="sound_settings" msgid="8874581353127418308">"提示音和振动"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"设置"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"应用已固定"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“返回”和“概览”即可取消固定屏幕。"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“返回”和“主屏幕”即可取消固定屏幕。"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"切换放大模式"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"放大整个屏幕"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"放大部分屏幕"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"切换"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"打开放大功能设置"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"拖动一角即可调整大小"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"允许沿对角线滚动"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"中"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"小"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"大"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"全屏"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"完成"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"修改"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"放大镜窗口设置"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"已移除所有控制器"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"未保存更改"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"查看其他应用"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"无法加载控件。请查看<xliff:g id="APP">%s</xliff:g>应用,确保应用设置没有更改。"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"找不到兼容的控件"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string>
@@ -894,7 +904,7 @@
     <string name="controls_tile_locked" msgid="731547768182831938">"设备已锁定"</string>
     <string name="controls_settings_show_controls_dialog_title" msgid="3357852503553809554">"要从锁定屏幕上显示和控制设备吗?"</string>
     <string name="controls_settings_show_controls_dialog_message" msgid="7666211700524587969">"您可以在锁定屏幕上添加用于控制外部设备的控件。\n\n您的设备应用可能会允许您在不解锁手机或平板电脑的情况下控制某些设备。\n\n您可以随时在“设置”中进行更改。"</string>
-    <string name="controls_settings_trivial_controls_dialog_title" msgid="7593188157655036677">"要从锁定屏幕上控制设备吗?"</string>
+    <string name="controls_settings_trivial_controls_dialog_title" msgid="7593188157655036677">"要在锁屏状态下控制设备吗?"</string>
     <string name="controls_settings_trivial_controls_dialog_message" msgid="397178734990952575">"您可以在不解锁手机或平板电脑的情况下控制某些设备。您的设备配套应用将决定哪些设备可以通过这种方式进行控制。"</string>
     <string name="controls_settings_dialog_neutral_button" msgid="4514446354793124140">"不用了"</string>
     <string name="controls_settings_dialog_positive_button" msgid="436070672551674863">"是"</string>
@@ -1065,8 +1075,7 @@
     <string name="clipboard_edit" msgid="4500155216174011640">"修改"</string>
     <string name="add" msgid="81036585205287996">"添加"</string>
     <string name="manage_users" msgid="1823875311934643849">"管理用户"</string>
-    <!-- no translation found for drag_split_not_supported (7173481676120546121) -->
-    <skip />
+    <string name="drag_split_not_supported" msgid="7173481676120546121">"此通知不支持拖动到分屏中"</string>
     <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WLAN 已关闭"</string>
     <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"优先模式"</string>
     <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"闹钟已设置"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index e6ece12..8df1c3d 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"停用"</string>
     <string name="sound_settings" msgid="8874581353127418308">"音效和震動"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"設定"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"已固定應用程式"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"應用程式將會固定在螢幕上顯示,直至您取消固定為止。按住「返回」和「概覽」按鈕即可取消固定。"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"應用程式將會固定在螢幕上顯示,直至您取消固定為止。按住「返回」按鈕和主按鈕即可取消固定。"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"放大開關"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"放大成個畫面"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"放大部分螢幕畫面"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"切換"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"開啟放大設定"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"拖曳角落即可調整大小"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"允許斜角捲動"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"中"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"小"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"大"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"全螢幕"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"完成"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"編輯"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"放大鏡視窗設定"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{已新增 # 個控制項。}other{已新增 # 個控制項。}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"已移除"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"要新增「<xliff:g id="APPNAME">%s</xliff:g>」嗎?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"「<xliff:g id="APPNAME">%s</xliff:g>」可選擇要在這裡顯示的控制項和內容。"</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"要移除「<xliff:g id="APPNAME">%s</xliff:g>」的控制項嗎?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"已加入收藏"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"已加入至收藏位置 <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"已移除所有控制項"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"未儲存變更"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"查看其他應用程式"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"無法載入控制項。請檢查 <xliff:g id="APP">%s</xliff:g> 應用程式,確保設定沒有變動。"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"沒有兼容的控制項"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 7af44dc..a25fc44 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"停用"</string>
     <string name="sound_settings" msgid="8874581353127418308">"音效與震動"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"設定"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"應用程式已固定"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住 [返回] 按鈕和 [總覽] 按鈕即可取消固定。"</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"這會讓應用程式顯示在螢幕上,直到取消固定為止。按住 [返回] 按鈕和主畫面按鈕即可取消固定。"</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"切換放大模式"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"放大整個螢幕畫面"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"放大局部螢幕畫面"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"切換"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"開啟放大功能設定"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"拖曳角落即可調整大小"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"允許沿對角線捲動"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"中"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"小"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"大"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"全螢幕"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"完成"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"編輯"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"放大鏡視窗設定"</string>
@@ -870,8 +874,7 @@
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{已新增 # 個控制項。}other{已新增 # 個控制項。}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"已移除"</string>
     <string name="controls_panel_authorization_title" msgid="267429338785864842">"要新增「<xliff:g id="APPNAME">%s</xliff:g>」嗎?"</string>
-    <!-- no translation found for controls_panel_authorization (7045551688535104194) -->
-    <skip />
+    <string name="controls_panel_authorization" msgid="7045551688535104194">"「<xliff:g id="APPNAME">%s</xliff:g>」可選擇要顯示在這裡的控制選項和內容。"</string>
     <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"要移除「<xliff:g id="APPNAME">%s</xliff:g>」的控制嗎?"</string>
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"已加入收藏"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"已加入收藏,位置 <xliff:g id="NUMBER">%d</xliff:g>"</string>
@@ -885,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"所有控制項都已移除"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"未儲存變更"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"查看其他應用程式"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"無法載入控制項。請查看「<xliff:g id="APP">%s</xliff:g>」應用程式,確認應用程式設定沒有任何異動。"</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"找不到相容的控制項"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 5a2af59..59884dbc 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -458,6 +458,10 @@
     <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"khubaza"</string>
     <string name="sound_settings" msgid="8874581353127418308">"Umsindo nokudlidliza"</string>
     <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Amasethingi"</string>
+    <!-- no translation found for csd_lowered_title (1786173629015030856) -->
+    <skip />
+    <!-- no translation found for csd_system_lowered_text (2001603282316829500) -->
+    <skip />
     <string name="screen_pinning_title" msgid="9058007390337841305">"I-app iphiniwe"</string>
     <string name="screen_pinning_description" msgid="8699395373875667743">"Lokhu kuyigcina ibukeka uze ususe ukuphina. Thinta uphinde ubambe okuthi Emuva Nokubuka konke ukuze ususe ukuphina."</string>
     <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Lokhu kuyigcina ibonakala uze uyisuse. Thinta uphinde ubambe okuthi Emuva nokuthi Ekhaya ukuze ususe ukuphina."</string>
@@ -832,7 +836,6 @@
     <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Iswishi yokukhulisa"</string>
     <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Khulisa isikrini esigcwele"</string>
     <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Khulisa ingxenye eyesikrini"</string>
-    <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Iswishi"</string>
     <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"Vula amasethingi okukhuliswa"</string>
     <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"Hudula ikhona ukuze usayize kabusha"</string>
     <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Vumela ukuskrola oku-diagonal"</string>
@@ -849,6 +852,7 @@
     <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Kumaphakathi"</string>
     <string name="accessibility_magnification_small" msgid="8144502090651099970">"Esincane"</string>
     <string name="accessibility_magnification_large" msgid="6602944330021308774">"Obukhulu"</string>
+    <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"Iskrini esigcwele"</string>
     <string name="accessibility_magnification_done" msgid="263349129937348512">"Kwenziwe"</string>
     <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Hlela"</string>
     <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Amasethingi ewindi lesikhulisi"</string>
@@ -884,6 +888,12 @@
     <string name="controls_favorite_removed" msgid="5276978408529217272">"Zonke izilawuli zisusiwe"</string>
     <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Izinguquko azilondolozwanga"</string>
     <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Bona ezinye izinhlelo zokusebenza"</string>
+    <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) -->
+    <skip />
+    <!-- no translation found for controls_favorite_add_controls (1221420435546694004) -->
+    <skip />
+    <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) -->
+    <skip />
     <string name="controls_favorite_load_error" msgid="5126216176144877419">"Izilawuli azikwazanga ukulayishwa. Hlola uhlelo lokusebenza le-<xliff:g id="APP">%s</xliff:g> ukuqinisekisa ukuthi amasethingi wohlelo lokusebenza awashintshile."</string>
     <string name="controls_favorite_load_none" msgid="7687593026725357775">"Izilawuli ezihambelanayo azitholakali"</string>
     <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Okunye"</string>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 0c0defa..714d495 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -1407,13 +1407,13 @@
     <dimen name="pulse_expansion_max_top_overshoot">32dp</dimen>
 
     <!-- The drag amount required for the split shade to fully expand. -->
-    <dimen name="split_shade_full_transition_distance">200dp</dimen>
+    <dimen name="split_shade_full_transition_distance">400dp</dimen>
     <!--
         The drag amount required for the scrim to fully fade in when expanding the split shade.
         Currently setting it a little longer than the full shade transition distance, to avoid
         having a state where the screen is fully black without any content showing.
     -->
-    <dimen name="split_shade_scrim_transition_distance">300dp</dimen>
+    <dimen name="split_shade_scrim_transition_distance">600dp</dimen>
 
     <dimen name="people_space_widget_radius">28dp</dimen>
     <dimen name="people_space_image_radius">20dp</dimen>
@@ -1553,6 +1553,9 @@
     <dimen name="status_bar_user_chip_end_margin">12dp</dimen>
     <dimen name="status_bar_user_chip_text_size">12sp</dimen>
 
+    <!-- System UI Dialog -->
+    <dimen name="dialog_title_text_size">24sp</dimen>
+
     <!-- Internet panel related dimensions -->
     <dimen name="internet_dialog_list_max_height">662dp</dimen>
     <!-- The height of the WiFi network in Internet panel. -->
@@ -1732,6 +1735,15 @@
     <dimen name="broadcast_dialog_btn_minHeight">44dp</dimen>
     <dimen name="broadcast_dialog_margin">16dp</dimen>
 
+    <!-- Contrast dialog -->
+    <dimen name="contrast_dialog_button_total_size">90dp</dimen>
+    <dimen name="contrast_dialog_button_inner_size">82dp</dimen>
+    <dimen name="contrast_dialog_button_radius">20dp</dimen>
+    <dimen name="contrast_dialog_button_stroke_width">4dp</dimen>
+    <dimen name="contrast_dialog_button_text_size">14sp</dimen>
+    <dimen name="contrast_dialog_button_text_spacing">4dp</dimen>
+    <dimen name="contrast_dialog_button_horizontal_spacing">16dp</dimen>
+
     <!-- Shadow for dream overlay clock complication -->
     <dimen name="dream_overlay_clock_key_text_shadow_dx">0dp</dimen>
     <dimen name="dream_overlay_clock_key_text_shadow_dy">0dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index e7be6fc..f1777f8 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -757,6 +757,15 @@
     <!-- QuickSettings: Label for the toggle that controls whether One-handed mode is enabled. [CHAR LIMIT=NONE] -->
     <string name="quick_settings_onehanded_label">One-handed mode</string>
 
+    <!-- QuickSettings: Contrast tile [CHAR LIMIT=NONE] -->
+    <string name="quick_settings_contrast_label">Contrast</string>
+    <!-- QuickSettings: Contrast tile description: standard [CHAR LIMIT=NONE] -->
+    <string name="quick_settings_contrast_standard">Standard</string>
+    <!-- QuickSettings: Contrast tile description: medium [CHAR LIMIT=NONE] -->
+    <string name="quick_settings_contrast_medium">Medium</string>
+    <!-- QuickSettings: Contrast tile description: high [CHAR LIMIT=NONE] -->
+    <string name="quick_settings_contrast_high">High</string>
+
     <!--- Title of dialog triggered if the microphone is disabled but an app tried to access it. [CHAR LIMIT=150] -->
     <string name="sensor_privacy_start_use_mic_dialog_title">Unblock device microphone?</string>
     <!--- Title of dialog triggered if the camera is disabled but an app tried to access it. [CHAR LIMIT=150] -->
@@ -1270,6 +1279,11 @@
     <!-- Label for button to go to sound settings screen [CHAR_LIMIT=30] -->
     <string name="volume_panel_dialog_settings_button">Settings</string>
 
+    <!-- Title for notification after audio lowers -->
+    <string name="csd_lowered_title" product="default">Lowered to safer volume</string>
+    <!-- Message shown in notification after system lowers audio -->
+    <string name="csd_system_lowered_text" product="default">The volume has been high for longer than recommended</string>
+
     <!-- content description for audio output chooser [CHAR LIMIT=NONE]-->
 
     <!-- Screen pinning dialog title. -->
@@ -2466,6 +2480,15 @@
     <!-- Controls management favorites screen. See other apps button [CHAR LIMIT=30] -->
     <string name="controls_favorite_see_other_apps">See other apps</string>
 
+    <!-- Controls management favorites screen. Rearrange controls button [CHAR LIMIT=30]-->
+    <string name="controls_favorite_rearrange_button">Rearrange</string>
+
+    <!-- Controls management edit screen. Add controls button [CHAR LIMIT=30]-->
+    <string name="controls_favorite_add_controls">Add controls</string>
+
+    <!-- Controls management edit screen. Return to editing button [CHAR LIMIT=30]-->
+    <string name="controls_favorite_back_to_editing">Back to editing</string>
+
     <!-- Controls management controls screen error on load message [CHAR LIMIT=NONE] -->
     <string name="controls_favorite_load_error">Controls could not be loaded. Check the <xliff:g id="app" example="System UI">%s</xliff:g> app to make sure that the app settings haven\u2019t changed.</string>
     <!-- Controls management controls screen no controls found on load message [CHAR LIMIT=NONE] -->
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index a3655c31..064cea1 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -377,6 +377,10 @@
         <item name="android:windowBackground">@android:color/transparent</item>
     </style>
 
+    <style name="Theme.SystemUI.ContrastDialog" parent="@android:style/Theme.DeviceDefault.Dialog">
+        <item name="android:windowBackground">@android:color/transparent</item>
+    </style>
+
     <style name="Theme.SystemUI.QuickSettings.Dialog" parent="@android:style/Theme.DeviceDefault.Dialog">
         <item name="android:dialogCornerRadius">@dimen/notification_corner_radius</item>
     </style>
@@ -1041,7 +1045,7 @@
 
     <style name="TextAppearance.Dialog.Title" parent="@android:style/TextAppearance.DeviceDefault.Large">
         <item name="android:textColor">?android:attr/textColorPrimary</item>
-        <item name="android:textSize">24sp</item>
+        <item name="android:textSize">@dimen/dialog_title_text_size</item>
         <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
         <item name="android:lineHeight">32sp</item>
         <item name="android:gravity">center</item>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java
index 0890465..fac2f91 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java
@@ -133,6 +133,10 @@
             return this.baseIntent.getPackage();
         }
 
+        public int getId() {
+            return id;
+        }
+
         @Override
         public boolean equals(Object o) {
             if (!(o instanceof TaskKey)) {
@@ -307,6 +311,10 @@
         lastSnapshotData.set(rawTask.lastSnapshotData);
     }
 
+    public TaskKey getKey() {
+        return key;
+    }
+
     /**
      * Returns the visible width to height ratio. Returns 0f if snapshot data is not available.
      */
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java
index 53fab69..cab54d0 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java
@@ -66,7 +66,6 @@
 
 import java.io.PrintWriter;
 import java.util.Optional;
-import java.util.function.Consumer;
 import java.util.function.Supplier;
 
 /**
@@ -244,7 +243,12 @@
 
         mListenersRegistered = false;
 
-        mContext.unregisterReceiver(mDockedReceiver);
+        try {
+            mContext.unregisterReceiver(mDockedReceiver);
+        } catch (IllegalArgumentException e) {
+            Log.e(TAG, "Docked receiver already unregistered", e);
+        }
+
         if (mRotationWatcherRegistered) {
             try {
                 WindowManagerGlobal.getWindowManagerService().removeRotationWatcher(
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InteractionJankMonitorWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InteractionJankMonitorWrapper.java
index e08a604..4269530 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InteractionJankMonitorWrapper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InteractionJankMonitorWrapper.java
@@ -59,6 +59,8 @@
             InteractionJankMonitor.CUJ_RECENTS_SCROLLING;
     public static final int CUJ_APP_SWIPE_TO_RECENTS =
             InteractionJankMonitor.CUJ_LAUNCHER_APP_SWIPE_TO_RECENTS;
+    public static final int CUJ_OPEN_SEARCH_RESULT =
+            InteractionJankMonitor.CUJ_LAUNCHER_OPEN_SEARCH_RESULT;
 
     @IntDef({
             CUJ_APP_LAUNCH_FROM_RECENTS,
@@ -72,7 +74,8 @@
             CUJ_APP_SWIPE_TO_RECENTS,
             CUJ_OPEN_ALL_APPS,
             CUJ_CLOSE_ALL_APPS_SWIPE,
-            CUJ_CLOSE_ALL_APPS_TO_HOME
+            CUJ_CLOSE_ALL_APPS_TO_HOME,
+            CUJ_OPEN_SEARCH_RESULT,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface CujType {
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 6c59a94..3c447a8 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
@@ -116,28 +116,27 @@
     public static final int SYSUI_STATE_FREEFORM_ACTIVE_IN_DESKTOP_MODE = 1 << 26;
     // Device dreaming state
     public static final int SYSUI_STATE_DEVICE_DREAMING = 1 << 27;
-    // Whether the screen is currently on. Note that the screen is considered on while turning on,
-    // but not while turning off.
-    public static final int SYSUI_STATE_SCREEN_ON = 1 << 28;
-    // Whether the screen is currently transitioning into the state indicated by
-    // SYSUI_STATE_SCREEN_ON.
-    public static final int SYSUI_STATE_SCREEN_TRANSITION = 1 << 29;
+    // Whether the device is currently awake (as opposed to asleep, see WakefulnessLifecycle).
+    // Note that the device is awake on while waking up on, but not while going to sleep.
+    public static final int SYSUI_STATE_AWAKE = 1 << 28;
+    // Whether the device is currently transitioning between awake/asleep indicated by
+    // SYSUI_STATE_AWAKE.
+    public static final int SYSUI_STATE_WAKEFULNESS_TRANSITION = 1 << 29;
     // The notification panel expansion fraction is > 0
     public static final int SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE = 1 << 30;
+    // When keyguard will be dismissed but didn't start animation yet
+    public static final int SYSUI_STATE_STATUS_BAR_KEYGUARD_GOING_AWAY = 1 << 31;
 
-    // Mask for SystemUiStateFlags to isolate SYSUI_STATE_SCREEN_ON and
-    // SYSUI_STATE_SCREEN_TRANSITION, to match SCREEN_STATE_*
-    public static final int SYSUI_STATE_SCREEN_STATE_MASK =
-            SYSUI_STATE_SCREEN_ON | SYSUI_STATE_SCREEN_TRANSITION;
-    // Screen is off.
-    public static final int SCREEN_STATE_OFF = 0;
-    // Screen is on.
-    public static final int SCREEN_STATE_ON = SYSUI_STATE_SCREEN_ON;
-    // Screen is still on, but transitioning to turn off.
-    public static final int SCREEN_STATE_TURNING_OFF = SYSUI_STATE_SCREEN_TRANSITION;
-    // Screen was off and is now turning on.
-    public static final int SCREEN_STATE_TURNING_ON =
-            SYSUI_STATE_SCREEN_TRANSITION | SYSUI_STATE_SCREEN_ON;
+    // Mask for SystemUiStateFlags to isolate SYSUI_STATE_AWAKE and
+    // SYSUI_STATE_WAKEFULNESS_TRANSITION, to match WAKEFULNESS_* constants
+    public static final int SYSUI_STATE_WAKEFULNESS_MASK =
+            SYSUI_STATE_AWAKE | SYSUI_STATE_WAKEFULNESS_TRANSITION;
+    // Mirroring the WakefulnessLifecycle#Wakefulness states
+    public static final int WAKEFULNESS_ASLEEP = 0;
+    public static final int WAKEFULNESS_AWAKE = SYSUI_STATE_AWAKE;
+    public static final int WAKEFULNESS_GOING_TO_SLEEP = SYSUI_STATE_WAKEFULNESS_TRANSITION;
+    public static final int WAKEFULNESS_WAKING =
+            SYSUI_STATE_WAKEFULNESS_TRANSITION | SYSUI_STATE_AWAKE;
 
     // Whether the back gesture is allowed (or ignored) by the Shade
     public static final boolean ALLOW_BACK_GESTURE_IN_SHADE = SystemProperties.getBoolean(
@@ -172,8 +171,10 @@
             SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING,
             SYSUI_STATE_FREEFORM_ACTIVE_IN_DESKTOP_MODE,
             SYSUI_STATE_DEVICE_DREAMING,
-            SYSUI_STATE_SCREEN_ON,
-            SYSUI_STATE_SCREEN_TRANSITION,
+            SYSUI_STATE_AWAKE,
+            SYSUI_STATE_WAKEFULNESS_TRANSITION,
+            SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE,
+            SYSUI_STATE_STATUS_BAR_KEYGUARD_GOING_AWAY,
     })
     public @interface SystemUiStateFlags {}
 
@@ -195,7 +196,7 @@
             str.add("navbar_hidden");
         }
         if ((flags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) != 0) {
-            str.add("notif_visible");
+            str.add("notif_expanded");
         }
         if ((flags & SYSUI_STATE_QUICK_SETTINGS_EXPANDED) != 0) {
             str.add("qs_visible");
@@ -263,11 +264,17 @@
         if ((flags & SYSUI_STATE_DEVICE_DREAMING) != 0) {
             str.add("device_dreaming");
         }
-        if ((flags & SYSUI_STATE_SCREEN_TRANSITION) != 0) {
-            str.add("screen_transition");
+        if ((flags & SYSUI_STATE_WAKEFULNESS_TRANSITION) != 0) {
+            str.add("wakefulness_transition");
         }
-        if ((flags & SYSUI_STATE_SCREEN_ON) != 0) {
-            str.add("screen_on");
+        if ((flags & SYSUI_STATE_AWAKE) != 0) {
+            str.add("awake");
+        }
+        if ((flags & SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE) != 0) {
+            str.add("notif_visible");
+        }
+        if ((flags & SYSUI_STATE_STATUS_BAR_KEYGUARD_GOING_AWAY) != 0) {
+            str.add("keygrd_going_away");
         }
 
         return str.toString();
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java
index 44f9d43..f094102 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java
@@ -63,6 +63,7 @@
         final ArrayList<RemoteAnimationTarget> out = new ArrayList<>();
         for (int i = 0; i < info.getChanges().size(); i++) {
             TransitionInfo.Change change = info.getChanges().get(i);
+            if (TransitionUtil.isOrderOnly(change)) continue;
             if (filter.test(change)) {
                 out.add(TransitionUtil.newTarget(
                         change, info.getChanges().size() - i, info, t, leashMap));
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
index 58e7747..1fbf743 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
@@ -89,7 +89,7 @@
                 }
             }
         };
-        return new RemoteTransition(remote, appThread);
+        return new RemoteTransition(remote, appThread, "Recents");
     }
 
     /**
diff --git a/packages/SystemUI/src-debug/com/android/systemui/flags/FlagsFactory.kt b/packages/SystemUI/src-debug/com/android/systemui/flags/FlagsFactory.kt
index 31234cf..c22d689 100644
--- a/packages/SystemUI/src-debug/com/android/systemui/flags/FlagsFactory.kt
+++ b/packages/SystemUI/src-debug/com/android/systemui/flags/FlagsFactory.kt
@@ -43,9 +43,8 @@
         id: Int,
         name: String,
         namespace: String = "systemui",
-        teamfood: Boolean = false
     ): ReleasedFlag {
-        val flag = ReleasedFlag(id = id, name = name, namespace = namespace, teamfood = teamfood)
+        val flag = ReleasedFlag(id = id, name = name, namespace = namespace, teamfood = false)
         checkForDupesAndAdd(flag)
         return flag
     }
@@ -55,7 +54,6 @@
         @BoolRes resourceId: Int,
         name: String,
         namespace: String = "systemui",
-        teamfood: Boolean = false
     ): ResourceBooleanFlag {
         val flag =
             ResourceBooleanFlag(
@@ -63,7 +61,7 @@
                 name = name,
                 namespace = namespace,
                 resourceId = resourceId,
-                teamfood = teamfood
+                teamfood = false,
             )
         checkForDupesAndAdd(flag)
         return flag
diff --git a/packages/SystemUI/src-release/com/android/systemui/flags/FlagsFactory.kt b/packages/SystemUI/src-release/com/android/systemui/flags/FlagsFactory.kt
index 27c5699..5502da1 100644
--- a/packages/SystemUI/src-release/com/android/systemui/flags/FlagsFactory.kt
+++ b/packages/SystemUI/src-release/com/android/systemui/flags/FlagsFactory.kt
@@ -43,9 +43,8 @@
         id: Int,
         name: String,
         namespace: String = "systemui",
-        teamfood: Boolean = false
     ): ReleasedFlag {
-        val flag = ReleasedFlag(id = id, name = name, namespace = namespace, teamfood = teamfood)
+        val flag = ReleasedFlag(id = id, name = name, namespace = namespace, teamfood = false)
         flagMap[name] = flag
         return flag
     }
@@ -55,7 +54,6 @@
         @BoolRes resourceId: Int,
         name: String,
         namespace: String = "systemui",
-        teamfood: Boolean = false
     ): ResourceBooleanFlag {
         val flag =
             ResourceBooleanFlag(
@@ -63,7 +61,7 @@
                 name = name,
                 namespace = namespace,
                 resourceId = resourceId,
-                teamfood = teamfood
+                teamfood = false,
             )
         flagMap[name] = flag
         return flag
diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
index 3b9060a..0779653 100644
--- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
+++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
@@ -46,10 +46,10 @@
 import com.android.systemui.plugins.ClockController
 import com.android.systemui.plugins.ClockFaceController
 import com.android.systemui.plugins.ClockTickRate
+import com.android.systemui.plugins.WeatherData
 import com.android.systemui.plugins.log.LogBuffer
 import com.android.systemui.plugins.log.LogLevel.DEBUG
 import com.android.systemui.shared.regionsampling.RegionSampler
-import com.android.systemui.plugins.WeatherData
 import com.android.systemui.statusbar.policy.BatteryController
 import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback
 import com.android.systemui.statusbar.policy.ConfigurationController
@@ -144,8 +144,10 @@
                 val currentViewRect = Rect(left, top, right, bottom)
                 val oldViewRect = Rect(oldLeft, oldTop, oldRight, oldBottom)
 
-                if (currentViewRect.width() != oldViewRect.width() ||
-                    currentViewRect.height() != oldViewRect.height()) {
+                if (
+                    currentViewRect.width() != oldViewRect.width() ||
+                        currentViewRect.height() != oldViewRect.height()
+                ) {
                     updateRegionSampler(view)
                 }
             }
@@ -425,7 +427,7 @@
             }
 
             isRunning = true
-            when (clockFace.events.tickRate) {
+            when (clockFace.config.tickRate) {
                 ClockTickRate.PER_MINUTE -> {
                     /* Handled by KeyguardClockSwitchController */
                 }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java
index 9f2333d..1980f70 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java
@@ -107,14 +107,7 @@
         // start fresh
         mDismissing = false;
         mView.resetPasswordText(false /* animate */, false /* announce */);
-        // if the user is currently locked out, enforce it.
-        long deadline = mLockPatternUtils.getLockoutAttemptDeadline(
-                KeyguardUpdateMonitor.getCurrentUser());
-        if (shouldLockout(deadline)) {
-            handleAttemptLockout(deadline);
-        } else {
-            resetState();
-        }
+        resetState();
     }
 
     @Override
@@ -277,7 +270,12 @@
     @Override
     public void onResume(int reason) {
         mResumed = true;
-        reset();
+        // if the user is currently locked out, enforce it.
+        long deadline = mLockPatternUtils.getLockoutAttemptDeadline(
+                KeyguardUpdateMonitor.getCurrentUser());
+        if (shouldLockout(deadline)) {
+            handleAttemptLockout(deadline);
+        }
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
index cdaed87..9290220 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
@@ -40,7 +40,6 @@
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
 import com.android.systemui.log.dagger.KeyguardClockLog;
-import com.android.systemui.plugins.ClockAnimations;
 import com.android.systemui.plugins.ClockController;
 import com.android.systemui.plugins.log.LogBuffer;
 import com.android.systemui.plugins.log.LogLevel;
@@ -390,6 +389,13 @@
             PropertyAnimator.setProperty(mStatusArea, AnimatableProperty.TRANSLATION_X,
                     x, props, animate);
         }
+
+    }
+
+    void updateKeyguardStatusViewOffset() {
+        // updateClockTargetRegions will call onTargetRegionChanged
+        // which will require the correct translationY property of keyguardStatusView after updating
+        mView.updateClockTargetRegions();
     }
 
     /**
@@ -462,7 +468,7 @@
     }
 
     @Nullable
-    private ClockController getClock() {
+    public ClockController getClock() {
         return mClockEventController.getClock();
     }
 
@@ -528,13 +534,6 @@
         }
 
         return ((mCurrentClockSize == LARGE) ? clock.getLargeClock() : clock.getSmallClock())
-                .getEvents().getHasCustomWeatherDataDisplay();
-    }
-
-    /** Gets the animations for the current clock. */
-    @Nullable
-    public ClockAnimations getClockAnimations() {
-        ClockController clock = getClock();
-        return clock == null ? null : clock.getAnimations();
+                .getConfig().getHasCustomWeatherDataDisplay();
     }
 }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java
index 68b40ab..5c56aab 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java
@@ -260,20 +260,18 @@
         mLockPatternView.setEnabled(true);
         mLockPatternView.clearPattern();
 
-        // if the user is currently locked out, enforce it.
-        long deadline = mLockPatternUtils.getLockoutAttemptDeadline(
-                KeyguardUpdateMonitor.getCurrentUser());
-        if (deadline != 0) {
-            handleAttemptLockout(deadline);
-        } else {
-            displayDefaultSecurityMessage();
-        }
+        displayDefaultSecurityMessage();
     }
 
     @Override
     public void onResume(int reason) {
         super.onResume(reason);
-        reset();
+        // if the user is currently locked out, enforce it.
+        long deadline = mLockPatternUtils.getLockoutAttemptDeadline(
+                KeyguardUpdateMonitor.getCurrentUser());
+        if (deadline != 0) {
+            handleAttemptLockout(deadline);
+        }
     }
 
     @Override
@@ -300,34 +298,38 @@
     @Override
     public void showPromptReason(int reason) {
         /// TODO: move all this logic into the MessageAreaController?
+        int resId =  0;
         switch (reason) {
             case PROMPT_REASON_RESTART:
-                mMessageAreaController.setMessage(R.string.kg_prompt_reason_restart_pattern);
+                resId = R.string.kg_prompt_reason_restart_pattern;
                 break;
             case PROMPT_REASON_TIMEOUT:
-                mMessageAreaController.setMessage(R.string.kg_prompt_reason_timeout_pattern);
+                resId = R.string.kg_prompt_reason_timeout_pattern;
                 break;
             case PROMPT_REASON_DEVICE_ADMIN:
-                mMessageAreaController.setMessage(R.string.kg_prompt_reason_device_admin);
+                resId = R.string.kg_prompt_reason_device_admin;
                 break;
             case PROMPT_REASON_USER_REQUEST:
-                mMessageAreaController.setMessage(R.string.kg_prompt_reason_user_request);
+                resId = R.string.kg_prompt_reason_user_request;
                 break;
             case PROMPT_REASON_PREPARE_FOR_UPDATE:
-                mMessageAreaController.setMessage(R.string.kg_prompt_reason_timeout_pattern);
+                resId = R.string.kg_prompt_reason_timeout_pattern;
                 break;
             case PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT:
-                mMessageAreaController.setMessage(R.string.kg_prompt_reason_timeout_pattern);
+                resId = R.string.kg_prompt_reason_timeout_pattern;
                 break;
             case PROMPT_REASON_TRUSTAGENT_EXPIRED:
-                mMessageAreaController.setMessage(R.string.kg_prompt_reason_timeout_pattern);
+                resId = R.string.kg_prompt_reason_timeout_pattern;
                 break;
             case PROMPT_REASON_NONE:
                 break;
             default:
-                mMessageAreaController.setMessage(R.string.kg_prompt_reason_timeout_pattern);
+                resId = R.string.kg_prompt_reason_timeout_pattern;
                 break;
         }
+        if (resId != 0) {
+            mMessageAreaController.setMessage(getResources().getText(resId), /* animate= */ false);
+        }
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java
index 559db76..ded1238 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java
@@ -127,6 +127,11 @@
     @Override
     public void onResume(int reason) {
         super.onResume(reason);
+        // It's possible to reach a state here where mPasswordEntry believes it is focused
+        // but it is not actually focused. This state will prevent the view from gaining focus,
+        // as requestFocus will no-op since the focus flag is already set. By clearing focus first,
+        // it's guaranteed that the view has focus.
+        mPasswordEntry.clearFocus();
         mPasswordEntry.requestFocus();
     }
 
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index 1a572b7..87a7758 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -40,6 +40,7 @@
 import android.os.SystemClock;
 import android.os.UserHandle;
 import android.telephony.TelephonyManager;
+import android.text.TextUtils;
 import android.util.Log;
 import android.util.MathUtils;
 import android.util.Slog;
@@ -64,6 +65,7 @@
 import com.android.keyguard.KeyguardSecurityContainer.SwipeListener;
 import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
 import com.android.keyguard.dagger.KeyguardBouncerScope;
+import com.android.settingslib.Utils;
 import com.android.settingslib.utils.ThreadUtils;
 import com.android.systemui.Gefingerpoken;
 import com.android.systemui.R;
@@ -634,6 +636,16 @@
                 mKeyguardStateController.isFaceAuthEnabled());
     }
 
+    /** Sets an initial message that would override the default message */
+    public void setInitialMessage() {
+        CharSequence customMessage = mViewMediatorCallback.consumeCustomMessage();
+        if (!TextUtils.isEmpty(customMessage)) {
+            showMessage(customMessage, Utils.getColorError(getContext()));
+            return;
+        }
+        showPromptReason(mViewMediatorCallback.getBouncerPromptReason());
+    }
+
     /**
      * Show the bouncer and start appear animations.
      *
@@ -753,7 +765,7 @@
                 case SimPuk:
                     // Shortcut for SIM PIN/PUK to go to directly to user's security screen or home
                     SecurityMode securityMode = mSecurityModel.getSecurityMode(targetUserId);
-                    if (securityMode == SecurityMode.None && mLockPatternUtils.isLockScreenDisabled(
+                    if (securityMode == SecurityMode.None || mLockPatternUtils.isLockScreenDisabled(
                             KeyguardUpdateMonitor.getCurrentUser())) {
                         finish = true;
                         eventSubtype = BOUNCER_DISMISS_SIM;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
index f4c5815..c4df836 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
@@ -16,12 +16,13 @@
 
 package com.android.keyguard;
 
+import android.annotation.Nullable;
 import android.graphics.Rect;
 import android.util.Slog;
 
 import com.android.keyguard.KeyguardClockSwitch.ClockSize;
 import com.android.keyguard.logging.KeyguardLogger;
-import com.android.systemui.plugins.ClockAnimations;
+import com.android.systemui.plugins.ClockController;
 import com.android.systemui.statusbar.notification.AnimatableProperty;
 import com.android.systemui.statusbar.notification.PropertyAnimator;
 import com.android.systemui.statusbar.notification.stack.AnimationProperties;
@@ -172,11 +173,15 @@
      * Update position of the view with an optional animation
      */
     public void updatePosition(int x, int y, float scale, boolean animate) {
+        float oldY = mView.getY();
         PropertyAnimator.setProperty(mView, AnimatableProperty.Y, y, CLOCK_ANIMATION_PROPERTIES,
                 animate);
 
         mKeyguardClockSwitchController.updatePosition(x, scale, CLOCK_ANIMATION_PROPERTIES,
                 animate);
+        if (oldY != y) {
+            mKeyguardClockSwitchController.updateKeyguardStatusViewOffset();
+        }
     }
 
     /**
@@ -237,8 +242,9 @@
         }
     }
 
-    /** Gets the animations for the current clock. */
-    public ClockAnimations getClockAnimations() {
-        return mKeyguardClockSwitchController.getClockAnimations();
+    /** Gets the current clock controller. */
+    @Nullable
+    public ClockController getClockController() {
+        return mKeyguardClockSwitchController.getClock();
     }
 }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java
index a678edc..ac0a3fd 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java
@@ -28,6 +28,7 @@
 import com.android.systemui.statusbar.notification.AnimatableProperty;
 import com.android.systemui.statusbar.notification.PropertyAnimator;
 import com.android.systemui.statusbar.notification.stack.AnimationProperties;
+import com.android.systemui.statusbar.phone.AnimatorHandle;
 import com.android.systemui.statusbar.phone.DozeParameters;
 import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -47,6 +48,7 @@
     private final ScreenOffAnimationController mScreenOffAnimationController;
     private boolean mAnimateYPos;
     private boolean mKeyguardViewVisibilityAnimating;
+    private AnimatorHandle mKeyguardAnimatorHandle;
     private boolean mLastOccludedState = false;
     private final AnimationProperties mAnimationProperties = new AnimationProperties();
     private final LogBuffer mLogBuffer;
@@ -83,6 +85,10 @@
             boolean keyguardFadingAway,
             boolean goingToFullShade,
             int oldStatusBarState) {
+        if (mKeyguardAnimatorHandle != null) {
+            mKeyguardAnimatorHandle.cancel();
+            mKeyguardAnimatorHandle = null;
+        }
         mView.animate().cancel();
         boolean isOccluded = mKeyguardStateController.isOccluded();
         mKeyguardViewVisibilityAnimating = false;
@@ -116,7 +122,7 @@
                     .setDuration(320)
                     .setInterpolator(Interpolators.ALPHA_IN)
                     .withEndAction(mAnimateKeyguardStatusViewVisibleEndRunnable);
-            log("keyguardFadingAway transition w/ Y Aniamtion");
+            log("keyguardFadingAway transition w/ Y Animation");
         } else if (statusBarState == KEYGUARD) {
             if (keyguardFadingAway) {
                 mKeyguardViewVisibilityAnimating = true;
@@ -148,7 +154,7 @@
 
                 // Ask the screen off animation controller to animate the keyguard visibility for us
                 // since it may need to be cancelled due to keyguard lifecycle events.
-                mScreenOffAnimationController.animateInKeyguard(
+                mKeyguardAnimatorHandle = mScreenOffAnimationController.animateInKeyguard(
                         mView, mAnimateKeyguardStatusViewVisibleEndRunnable);
             } else {
                 log("Direct set Visibility to VISIBLE");
diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
index 1ae380e..235a8bc 100644
--- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
@@ -22,7 +22,6 @@
 import static com.android.keyguard.LockIconView.ICON_FINGERPRINT;
 import static com.android.keyguard.LockIconView.ICON_LOCK;
 import static com.android.keyguard.LockIconView.ICON_UNLOCK;
-import static com.android.systemui.classifier.Classifier.LOCK_ICON;
 import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset;
 import static com.android.systemui.flags.Flags.DOZING_MIGRATION_1;
 import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow;
@@ -127,8 +126,6 @@
     private boolean mCanDismissLockScreen;
     private int mStatusBarState;
     private boolean mIsKeyguardShowing;
-    private boolean mUserUnlockedWithBiometric;
-    private Runnable mCancelDelayedUpdateVisibilityRunnable;
     private Runnable mOnGestureDetectedRunnable;
     private Runnable mLongPressCancelRunnable;
 
@@ -229,7 +226,6 @@
         updateIsUdfpsEnrolled();
         updateConfiguration();
         updateKeyguardShowing();
-        mUserUnlockedWithBiometric = false;
 
         mIsBouncerShowing = mKeyguardViewController.isBouncerShowing();
         mIsDozing = mStatusBarStateController.isDozing();
@@ -270,11 +266,6 @@
         mStatusBarStateController.removeCallback(mStatusBarStateListener);
         mKeyguardStateController.removeCallback(mKeyguardStateCallback);
 
-        if (mCancelDelayedUpdateVisibilityRunnable != null) {
-            mCancelDelayedUpdateVisibilityRunnable.run();
-            mCancelDelayedUpdateVisibilityRunnable = null;
-        }
-
         mAccessibilityManager.removeAccessibilityStateChangeListener(
                 mAccessibilityStateChangeListener);
     }
@@ -288,11 +279,6 @@
     }
 
     private void updateVisibility() {
-        if (mCancelDelayedUpdateVisibilityRunnable != null) {
-            mCancelDelayedUpdateVisibilityRunnable.run();
-            mCancelDelayedUpdateVisibilityRunnable = null;
-        }
-
         if (!mIsKeyguardShowing && !mIsDozing) {
             mView.setVisibility(View.INVISIBLE);
             return;
@@ -300,9 +286,9 @@
 
         boolean wasShowingFpIcon = mUdfpsEnrolled && !mShowUnlockIcon && !mShowLockIcon
                 && !mShowAodUnlockedIcon && !mShowAodLockIcon;
-        mShowLockIcon = !mCanDismissLockScreen && !mUserUnlockedWithBiometric && isLockScreen()
+        mShowLockIcon = !mCanDismissLockScreen && isLockScreen()
                 && (!mUdfpsEnrolled || !mRunningFPS);
-        mShowUnlockIcon = (mCanDismissLockScreen || mUserUnlockedWithBiometric) && isLockScreen();
+        mShowUnlockIcon = mCanDismissLockScreen && isLockScreen();
         mShowAodUnlockedIcon = mIsDozing && mUdfpsEnrolled && !mRunningFPS && mCanDismissLockScreen;
         mShowAodLockIcon = mIsDozing && mUdfpsEnrolled && !mRunningFPS && !mCanDismissLockScreen;
 
@@ -426,7 +412,6 @@
         pw.println(" isFlagEnabled(DOZING_MIGRATION_1): "
                 + mFeatureFlags.isEnabled(DOZING_MIGRATION_1));
         pw.println(" mIsBouncerShowing: " + mIsBouncerShowing);
-        pw.println(" mUserUnlockedWithBiometric: " + mUserUnlockedWithBiometric);
         pw.println(" mRunningFPS: " + mRunningFPS);
         pw.println(" mCanDismissLockScreen: " + mCanDismissLockScreen);
         pw.println(" mStatusBarState: " + StatusBarState.toString(mStatusBarState));
@@ -469,17 +454,6 @@
         }
     }
 
-    /**
-     * @return whether the userUnlockedWithBiometric state changed
-     */
-    private boolean updateUserUnlockedWithBiometric() {
-        final boolean wasUserUnlockedWithBiometric = mUserUnlockedWithBiometric;
-        mUserUnlockedWithBiometric =
-                mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(
-                        KeyguardUpdateMonitor.getCurrentUser());
-        return wasUserUnlockedWithBiometric != mUserUnlockedWithBiometric;
-    }
-
     private StatusBarStateController.StateListener mStatusBarStateListener =
             new StatusBarStateController.StateListener() {
                 @Override
@@ -516,36 +490,15 @@
                 }
 
                 @Override
-                public void onBiometricsCleared() {
-                    if (updateUserUnlockedWithBiometric()) {
-                        updateVisibility();
-                    }
-                }
-
-                @Override
                 public void onBiometricRunningStateChanged(boolean running,
                         BiometricSourceType biometricSourceType) {
                     final boolean wasRunningFps = mRunningFPS;
-                    final boolean userUnlockedWithBiometricChanged =
-                            updateUserUnlockedWithBiometric();
 
                     if (biometricSourceType == FINGERPRINT) {
                         mRunningFPS = running;
-                        if (wasRunningFps && !mRunningFPS) {
-                            if (mCancelDelayedUpdateVisibilityRunnable != null) {
-                                mCancelDelayedUpdateVisibilityRunnable.run();
-                            }
-
-                            // For some devices, auth is cancelled immediately on screen off but
-                            // before dozing state is set. We want to avoid briefly showing the
-                            // button in this case, so we delay updating the visibility by 50ms.
-                            mCancelDelayedUpdateVisibilityRunnable =
-                                    mExecutor.executeDelayed(() -> updateVisibility(), 50);
-                            return;
-                        }
                     }
 
-                    if (userUnlockedWithBiometricChanged || wasRunningFps != mRunningFPS) {
+                    if (wasRunningFps != mRunningFPS) {
                         updateVisibility();
                     }
                 }
@@ -556,7 +509,6 @@
         @Override
         public void onUnlockedChanged() {
             mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen();
-            updateUserUnlockedWithBiometric();
             updateKeyguardShowing();
             updateVisibility();
         }
@@ -573,9 +525,6 @@
             mIsBouncerShowing = mKeyguardViewController.isBouncerShowing();
 
             updateKeyguardShowing();
-            if (mIsKeyguardShowing) {
-                updateUserUnlockedWithBiometric();
-            }
             updateVisibility();
         }
 
@@ -694,7 +643,7 @@
 
     private void onLongPress() {
         cancelTouches();
-        if (mFalsingManager.isFalseTouch(LOCK_ICON)) {
+        if (mFalsingManager.isFalseLongTap(FalsingManager.LOW_PENALTY)) {
             Log.v(TAG, "lock icon long-press rejected by the falsing manager.");
             return;
         }
diff --git a/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java b/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java
index 6a6e81e..14810d9 100644
--- a/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java
+++ b/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java
@@ -30,7 +30,6 @@
 import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.animation.Animation;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
@@ -50,7 +49,7 @@
             android.R.attr.textColorPrimary).getDefaultColor();
     private int mPosition = 0;
     private final PinShapeAdapter mPinShapeAdapter;
-    private Animation mCurrentPlayingAnimation;
+    private ValueAnimator mValueAnimator = ValueAnimator.ofFloat(1f, 0f);
     public PinShapeNonHintingView(Context context, AttributeSet attrs) {
         super(context, attrs);
         mPinShapeAdapter = new PinShapeAdapter(context);
@@ -80,15 +79,17 @@
             Log.e(getClass().getName(), "Trying to delete a non-existent char");
             return;
         }
+        if (mValueAnimator.isRunning()) {
+            mValueAnimator.end();
+        }
         mPosition--;
         ImageView pinDot = (ImageView) getChildAt(mPosition);
-        ValueAnimator animator = ValueAnimator.ofFloat(1f, 0f);
-        animator.addUpdateListener(valueAnimator -> {
+        mValueAnimator.addUpdateListener(valueAnimator -> {
             float value = (float) valueAnimator.getAnimatedValue();
             pinDot.setScaleX(value);
             pinDot.setScaleY(value);
         });
-        animator.addListener(new AnimatorListenerAdapter() {
+        mValueAnimator.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
                 super.onAnimationEnd(animation);
@@ -96,11 +97,10 @@
                         PinShapeNonHintingView.this,
                         new PinShapeViewTransition());
                 removeView(pinDot);
-                mCurrentPlayingAnimation = null;
             }
         });
-        animator.setDuration(PasswordTextView.DISAPPEAR_DURATION);
-        animator.start();
+        mValueAnimator.setDuration(PasswordTextView.DISAPPEAR_DURATION);
+        mValueAnimator.start();
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java
index 12b5705..f3c71da 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java
@@ -210,8 +210,8 @@
         // Saving in instance variable since to prevent GC since
         // NotificationShadeWindowController.registerCallback() only keeps weak references.
         mNotificationShadeCallback =
-                (keyguardShowing, keyguardOccluded, bouncerShowing, mDozing, panelExpanded,
-                            isDreaming) ->
+                (keyguardShowing, keyguardOccluded, keyguardGoingAway, bouncerShowing, mDozing,
+                        panelExpanded, isDreaming) ->
                         registerOrUnregisterDismissNotificationShadeAction();
         mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/fontscaling/FontScalingDialog.kt b/packages/SystemUI/src/com/android/systemui/accessibility/fontscaling/FontScalingDialog.kt
index 1836ce8..c9579d5 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/fontscaling/FontScalingDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/fontscaling/FontScalingDialog.kt
@@ -21,6 +21,7 @@
 import android.content.res.Configuration
 import android.os.Bundle
 import android.provider.Settings
+import android.util.TypedValue
 import android.view.LayoutInflater
 import android.widget.Button
 import android.widget.SeekBar
@@ -49,8 +50,7 @@
     private lateinit var seekBarWithIconButtonsView: SeekBarWithIconButtonsView
     private var lastProgress: Int = -1
 
-    private val configuration: Configuration =
-        Configuration(context.getResources().getConfiguration())
+    private val configuration: Configuration = Configuration(context.resources.configuration)
 
     override fun onCreate(savedInstanceState: Bundle?) {
         setTitle(R.string.font_scaling_dialog_title)
@@ -84,31 +84,45 @@
 
         seekBarWithIconButtonsView.setOnSeekBarChangeListener(
             object : OnSeekBarChangeListener {
+                var isTrackingTouch = false
+
                 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
-                    if (progress != lastProgress) {
-                        if (!fontSizeHasBeenChangedFromTile) {
-                            backgroundExecutor.execute { updateSecureSettingsIfNeeded() }
-                            fontSizeHasBeenChangedFromTile = true
-                        }
-
-                        backgroundExecutor.execute { updateFontScale(strEntryValues[progress]) }
-
-                        lastProgress = progress
+                    if (!isTrackingTouch) {
+                        // The seekbar progress is changed by icon buttons
+                        changeFontSize(progress)
+                    } else {
+                        // Provide preview configuration for text instead of changing the system
+                        // font scale before users release their finger from the seekbar.
+                        createTextPreview(progress)
                     }
                 }
 
                 override fun onStartTrackingTouch(seekBar: SeekBar) {
-                    // Do nothing
+                    isTrackingTouch = true
                 }
 
                 override fun onStopTrackingTouch(seekBar: SeekBar) {
-                    // Do nothing
+                    isTrackingTouch = false
+                    changeFontSize(seekBar.progress)
                 }
             }
         )
         doneButton.setOnClickListener { dismiss() }
     }
 
+    private fun changeFontSize(progress: Int) {
+        if (progress != lastProgress) {
+            if (!fontSizeHasBeenChangedFromTile) {
+                backgroundExecutor.execute { updateSecureSettingsIfNeeded() }
+                fontSizeHasBeenChangedFromTile = true
+            }
+
+            backgroundExecutor.execute { updateFontScale(strEntryValues[progress]) }
+
+            lastProgress = progress
+        }
+    }
+
     private fun fontSizeValueToIndex(value: Float): Int {
         var lastValue = strEntryValues[0].toFloat()
         for (i in 1 until strEntryValues.size) {
@@ -153,6 +167,20 @@
         }
     }
 
+    /** Provides font size preview for text before putting the final settings to the system. */
+    fun createTextPreview(index: Int) {
+        val previewConfig = Configuration(configuration)
+        previewConfig.fontScale = strEntryValues[index].toFloat()
+
+        val previewConfigContext = context.createConfigurationContext(previewConfig)
+        previewConfigContext.theme.setTo(context.theme)
+
+        title.setTextSize(
+            TypedValue.COMPLEX_UNIT_PX,
+            previewConfigContext.resources.getDimension(R.dimen.dialog_title_text_size)
+        )
+    }
+
     companion object {
         private const val ON = "1"
         private const val OFF = "0"
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt
index 64211b5..d15a2af 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt
@@ -39,7 +39,7 @@
     private fun onPanelExpansionChanged(event: ShadeExpansionChangeEvent) =
         mainExecutor.execute {
             action?.let {
-                if (event.tracking) {
+                if (event.tracking || event.expanded) {
                     Log.v(TAG, "Detected panel interaction, event: $event")
                     it.onPanelInteraction.run()
                     disable()
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt
index 868ffcf..e0b9f01 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt
@@ -34,6 +34,7 @@
 import com.android.systemui.flags.FeatureFlags
 import com.android.systemui.flags.Flags
 import com.android.systemui.keyguard.WakefulnessLifecycle
+import com.android.systemui.plugins.log.LogLevel
 import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.statusbar.CircleReveal
 import com.android.systemui.statusbar.LiftReveal
@@ -43,7 +44,6 @@
 import com.android.systemui.statusbar.commandline.CommandRegistry
 import com.android.systemui.statusbar.phone.BiometricUnlockController
 import com.android.systemui.statusbar.phone.CentralSurfaces
-import com.android.systemui.statusbar.phone.KeyguardBypassController
 import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope
 import com.android.systemui.statusbar.policy.ConfigurationController
 import com.android.systemui.statusbar.policy.KeyguardStateController
@@ -52,7 +52,7 @@
 import javax.inject.Inject
 import javax.inject.Provider
 
-/***
+/**
  * Controls two ripple effects:
  *   1. Unlocked ripple: shows when authentication is successful
  *   2. UDFPS dwell ripple: shows when the user has their finger down on the UDFPS area and reacts
@@ -71,14 +71,15 @@
     private val wakefulnessLifecycle: WakefulnessLifecycle,
     private val commandRegistry: CommandRegistry,
     private val notificationShadeWindowController: NotificationShadeWindowController,
-    private val bypassController: KeyguardBypassController,
-    private val biometricUnlockController: BiometricUnlockController,
     private val udfpsControllerProvider: Provider<UdfpsController>,
     private val statusBarStateController: StatusBarStateController,
     private val featureFlags: FeatureFlags,
     private val logger: KeyguardLogger,
-        rippleView: AuthRippleView?
-) : ViewController<AuthRippleView>(rippleView), KeyguardStateController.Callback,
+    private val biometricUnlockController: BiometricUnlockController,
+    rippleView: AuthRippleView?
+) :
+    ViewController<AuthRippleView>(rippleView),
+    KeyguardStateController.Callback,
     WakefulnessLifecycle.Observer {
 
     @VisibleForTesting
@@ -102,8 +103,24 @@
         keyguardStateController.addCallback(this)
         wakefulnessLifecycle.addObserver(this)
         commandRegistry.registerCommand("auth-ripple") { AuthRippleCommand() }
+        biometricUnlockController.addListener(biometricModeListener)
     }
 
+    private val biometricModeListener =
+        object : BiometricUnlockController.BiometricUnlockEventsListener {
+            override fun onBiometricUnlockedWithKeyguardDismissal(
+                    biometricSourceType: BiometricSourceType?
+            ) {
+                if (biometricSourceType != null) {
+                    showUnlockRipple(biometricSourceType)
+                } else {
+                    logger.log(TAG,
+                            LogLevel.ERROR,
+                            "Unexpected scenario where biometricSourceType is null")
+                }
+            }
+        }
+
     @VisibleForTesting
     public override fun onViewDetached() {
         udfpsController?.removeCallback(udfpsControllerCallback)
@@ -113,6 +130,7 @@
         keyguardStateController.removeCallback(this)
         wakefulnessLifecycle.removeObserver(this)
         commandRegistry.unregisterCommand("auth-ripple")
+        biometricUnlockController.removeListener(biometricModeListener)
 
         notificationShadeWindowController.setForcePluginOpen(false, this)
     }
@@ -143,9 +161,6 @@
                 showUnlockedRipple()
             }
         } else if (biometricSourceType == BiometricSourceType.FACE) {
-            if (!bypassController.canBypass() && !authController.isUdfpsFingerDown) {
-                return
-            }
             faceSensorLocation?.let {
                 mView.setSensorLocation(it)
                 circleReveal = CircleReveal(
@@ -267,7 +282,6 @@
                 if (biometricSourceType == BiometricSourceType.FINGERPRINT) {
                     mView.fadeDwellRipple()
                 }
-                showUnlockRipple(biometricSourceType)
             }
 
         override fun onBiometricAuthFailed(biometricSourceType: BiometricSourceType) {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index cbc0a1b..ac30311 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -25,7 +25,6 @@
 import static android.hardware.biometrics.BiometricOverlayConstants.REASON_ENROLL_FIND_SENSOR;
 
 import static com.android.internal.util.Preconditions.checkNotNull;
-import static com.android.systemui.classifier.Classifier.LOCK_ICON;
 import static com.android.systemui.classifier.Classifier.UDFPS_AUTHENTICATION;
 
 import android.content.BroadcastReceiver;
@@ -619,9 +618,9 @@
         }
         logBiometricTouch(processedTouch.getEvent(), data);
 
-        // Always pilfer pointers that are within sensor area
-        if (isWithinSensorArea(mOverlay.getOverlayView(), event.getRawX(), event.getRawY(), true)) {
-            Log.d("Austin", "pilferTouch invalid overlap");
+        // Always pilfer pointers that are within sensor area or when alternate bouncer is showing
+        if (isWithinSensorArea(mOverlay.getOverlayView(), event.getRawX(), event.getRawY(), true)
+                || mAlternateBouncerInteractor.isVisibleState()) {
             mInputManager.pilferPointers(
                     mOverlay.getOverlayView().getViewRootImpl().getInputToken());
         }
@@ -983,7 +982,7 @@
         }
 
         if (!mKeyguardUpdateMonitor.isFingerprintDetectionRunning()) {
-            if (mFalsingManager.isFalseTouch(LOCK_ICON)) {
+            if (mFalsingManager.isFalseLongTap(FalsingManager.LOW_PENALTY)) {
                 Log.v(TAG, "aod lock icon long-press rejected by the falsing manager.");
                 return;
             }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
index 414c2ec..f876aff 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
@@ -353,10 +353,19 @@
             flags = flags or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
         }
 
-        // Original sensorBounds assume portrait mode.
+        val isEnrollment = when (requestReason) {
+            REASON_ENROLL_FIND_SENSOR, REASON_ENROLL_ENROLLING -> true
+            else -> false
+        }
+
+        // Use expanded overlay unless touchExploration enabled
         var rotatedBounds =
             if (featureFlags.isEnabled(Flags.UDFPS_NEW_TOUCH_DETECTION)) {
-                Rect(overlayParams.overlayBounds)
+                if (accessibilityManager.isTouchExplorationEnabled && isEnrollment) {
+                    Rect(overlayParams.sensorBounds)
+                } else {
+                    Rect(overlayParams.overlayBounds)
+                }
             } else {
                 Rect(overlayParams.sensorBounds)
             }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
index ee9081c..ba8e60a 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
@@ -24,6 +24,7 @@
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.content.Context;
+import android.content.res.ColorStateList;
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffColorFilter;
 import android.graphics.Rect;
@@ -176,7 +177,9 @@
 
         mTextColorPrimary = Utils.getColorAttrDefaultColor(mContext,
             android.R.attr.textColorPrimary);
-        mBgProtection.setImageDrawable(getContext().getDrawable(R.drawable.fingerprint_bg));
+        final int backgroundColor = Utils.getColorAttrDefaultColor(getContext(),
+                com.android.internal.R.attr.colorSurface);
+        mBgProtection.setImageTintList(ColorStateList.valueOf(backgroundColor));
         mLockScreenFp.invalidate(); // updated with a valueCallback
     }
 
@@ -303,7 +306,7 @@
                 lp.width = mSensorBounds.width();
                 lp.height = mSensorBounds.height();
                 RectF relativeToView = getBoundsRelativeToView(new RectF(mSensorBounds));
-                lp.setMargins(
+                lp.setMarginsRelative(
                         (int) relativeToView.left,
                         (int) relativeToView.top,
                         (int) relativeToView.right,
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.kt
index 3e7d81a..5101ad4 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.kt
@@ -167,6 +167,9 @@
 
     private val keyguardStateControllerCallback: KeyguardStateController.Callback =
         object : KeyguardStateController.Callback {
+            override fun onUnlockedChanged() {
+                updatePauseAuth()
+            }
             override fun onLaunchTransitionFadingAwayChanged() {
                 launchTransitionFadingAway = keyguardStateController.isLaunchTransitionFadingAway
                 updatePauseAuth()
@@ -390,16 +393,28 @@
             return true
         }
 
-        // Only pause auth if we're not on the keyguard AND we're not transitioning to doze
-        // (ie: dozeAmount = 0f). For the UnlockedScreenOffAnimation, the statusBarState is
+        // Only pause auth if we're not on the keyguard AND we're not transitioning to doze.
+        // For the UnlockedScreenOffAnimation, the statusBarState is
         // delayed. However, we still animate in the UDFPS affordance with the
-        // mUnlockedScreenOffDozeAnimator.
-        if (statusBarState != StatusBarState.KEYGUARD && lastDozeAmount == 0f) {
+        // unlockedScreenOffDozeAnimator.
+        if (
+            statusBarState != StatusBarState.KEYGUARD &&
+                !unlockedScreenOffAnimationController.isAnimationPlaying()
+        ) {
             return true
         }
         if (isBouncerExpansionGreaterThan(.5f)) {
             return true
         }
+        if (
+            keyguardUpdateMonitor.getUserUnlockedWithBiometric(
+                KeyguardUpdateMonitor.getCurrentUser()
+            )
+        ) {
+            // If the device was unlocked by a biometric, immediately hide the UDFPS icon to avoid
+            // overlap with the LockIconView. Shortly afterwards, UDFPS will stop running.
+            return true
+        }
         return view.unpausedAlpha < 255 * .1
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt
index 000213f..86940ca 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt
@@ -38,7 +38,6 @@
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.catch
-import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.launchIn
 import kotlinx.coroutines.flow.map
@@ -147,11 +146,6 @@
 
     override fun addBiometricContextListener(listener: IBiometricContextListener): Job {
         return applicationScope.launch {
-            combine(isAod, isAwake) { doze, awake -> doze to awake }
-                .onEach { (aod, awake) -> listener.onDozeChanged(aod, awake) }
-                .catch { t -> Log.w(TAG, "failed to notify new doze state", t) }
-                .launchIn(this)
-
             foldState
                 .onEach { state -> listener.onFoldChanged(state) }
                 .catch { t -> Log.w(TAG, "failed to notify new fold state", t) }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java b/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java
index 701df89..334cf93 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java
@@ -41,7 +41,6 @@
     public static final int SHADE_DRAG = 11;
     public static final int QS_COLLAPSE = 12;
     public static final int UDFPS_AUTHENTICATION = 13;
-    public static final int LOCK_ICON = 14;
     public static final int QS_SWIPE_SIDE = 15;
     public static final int BACK_GESTURE = 16;
     public static final int QS_SWIPE_NESTED = 17;
@@ -58,12 +57,10 @@
             GENERIC,
             BOUNCER_UNLOCK,
             PULSE_EXPAND,
-            BRIGHTNESS_SLIDER,
             SHADE_DRAG,
             QS_COLLAPSE,
             BRIGHTNESS_SLIDER,
             UDFPS_AUTHENTICATION,
-            LOCK_ICON,
             QS_SWIPE_SIDE,
             QS_SWIPE_NESTED,
             BACK_GESTURE,
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/DiagonalClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/DiagonalClassifier.java
index d17eadd..8ec48b9 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/DiagonalClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/DiagonalClassifier.java
@@ -19,7 +19,6 @@
 import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE;
 import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE;
 import static com.android.systemui.classifier.Classifier.LEFT_AFFORDANCE;
-import static com.android.systemui.classifier.Classifier.LOCK_ICON;
 import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE;
 
 import android.provider.DeviceConfig;
@@ -73,8 +72,7 @@
         }
 
         if (interactionType == LEFT_AFFORDANCE
-                || interactionType == RIGHT_AFFORDANCE
-                || interactionType == LOCK_ICON) {
+                || interactionType == RIGHT_AFFORDANCE) {
             return Result.passed(0);
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java
index f8ee49a..15e2e9a 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java
@@ -158,7 +158,6 @@
                 || interactionType == SHADE_DRAG
                 || interactionType == QS_COLLAPSE
                 || interactionType == Classifier.UDFPS_AUTHENTICATION
-                || interactionType == Classifier.LOCK_ICON
                 || interactionType == Classifier.QS_SWIPE_SIDE
                 || interactionType == QS_SWIPE_NESTED) {
             return Result.passed(0);
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java
index d8d2c98..2fb6aaf 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java
@@ -47,8 +47,7 @@
     Result calculateFalsingResult(
             @Classifier.InteractionType int interactionType,
             double historyBelief, double historyConfidence) {
-        if (interactionType == Classifier.UDFPS_AUTHENTICATION
-                || interactionType == Classifier.LOCK_ICON) {
+        if (interactionType == Classifier.UDFPS_AUTHENTICATION) {
             return Result.passed(0);
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/ZigZagClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/ZigZagClassifier.java
index 840982c..4a3710b 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/ZigZagClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/ZigZagClassifier.java
@@ -21,7 +21,6 @@
 import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE;
 import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE;
 import static com.android.systemui.classifier.Classifier.BRIGHTNESS_SLIDER;
-import static com.android.systemui.classifier.Classifier.LOCK_ICON;
 import static com.android.systemui.classifier.Classifier.MEDIA_SEEKBAR;
 import static com.android.systemui.classifier.Classifier.SHADE_DRAG;
 
@@ -93,8 +92,7 @@
             double historyBelief, double historyConfidence) {
         if (interactionType == BRIGHTNESS_SLIDER
                 || interactionType == MEDIA_SEEKBAR
-                || interactionType == SHADE_DRAG
-                || interactionType == LOCK_ICON) {
+                || interactionType == SHADE_DRAG) {
             return Result.passed(0);
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
index e049ae0..e6affb0 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
@@ -24,8 +24,11 @@
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_DISMISSED_OTHER;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_DISMISS_TAPPED;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_EDIT_TAPPED;
+import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_EXPANDED_FROM_MINIMIZED;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_REMOTE_COPY_TAPPED;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_SHARE_TAPPED;
+import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_SHOWN_EXPANDED;
+import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_SHOWN_MINIMIZED;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_SWIPE_DISMISSED;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_TAP_OUTSIDE;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_TIMED_OUT;
@@ -274,9 +277,11 @@
             reset();
             mClipboardLogger.setClipSource(mClipboardModel.getSource());
             if (shouldShowMinimized(mWindow.getWindowInsets())) {
+                mClipboardLogger.logUnguarded(CLIPBOARD_OVERLAY_SHOWN_MINIMIZED);
                 mIsMinimized = true;
                 mView.setMinimized(true);
             } else {
+                mClipboardLogger.logUnguarded(CLIPBOARD_OVERLAY_SHOWN_EXPANDED);
                 setExpandedView();
             }
             animateIn();
@@ -308,7 +313,7 @@
                 if (model.isSensitive()) {
                     mView.showTextPreview(mContext.getString(R.string.clipboard_asterisks), true);
                 } else {
-                    mView.showTextPreview(model.getText(), false);
+                    mView.showTextPreview(model.getText().toString(), false);
                 }
                 mView.setEditAccessibilityAction(true);
                 mOnPreviewTapped = this::editText;
@@ -359,7 +364,10 @@
             @Override
             public void onAnimationEnd(Animator animation) {
                 super.onAnimationEnd(animation);
-                mIsMinimized = false;
+                if (mIsMinimized) {
+                    mClipboardLogger.logUnguarded(CLIPBOARD_OVERLAY_EXPANDED_FROM_MINIMIZED);
+                    mIsMinimized = false;
+                }
                 setExpandedView();
                 animateIn();
             }
@@ -527,7 +535,7 @@
     }
 
     private void showEditableText(CharSequence text, boolean hidden) {
-        mView.showTextPreview(text, hidden);
+        mView.showTextPreview(text.toString(), hidden);
         mView.setEditAccessibilityAction(true);
         mOnPreviewTapped = this::editText;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayEvent.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayEvent.java
index 4b5f876..e26acd5 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayEvent.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayEvent.java
@@ -44,6 +44,12 @@
     CLIPBOARD_OVERLAY_TAP_OUTSIDE(1077),
     @UiEvent(doc = "clipboard overlay dismissed, miscellaneous reason")
     CLIPBOARD_OVERLAY_DISMISSED_OTHER(1078),
+    @UiEvent(doc = "clipboard overlay shown in expanded form")
+    CLIPBOARD_OVERLAY_SHOWN_EXPANDED(1356),
+    @UiEvent(doc = "clipboard overlay shown in minimized form")
+    CLIPBOARD_OVERLAY_SHOWN_MINIMIZED(1357),
+    @UiEvent(doc = "clipboard overlay expanded")
+    CLIPBOARD_OVERLAY_EXPANDED_FROM_MINIMIZED(1358),
     @UiEvent(doc = "clipboard toast shown")
     CLIPBOARD_TOAST_SHOWN(1270);
 
diff --git a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt
new file mode 100644
index 0000000..9e15c7e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.contrast
+
+import android.app.UiModeManager
+import android.app.UiModeManager.ContrastUtils.CONTRAST_LEVEL_HIGH
+import android.app.UiModeManager.ContrastUtils.CONTRAST_LEVEL_MEDIUM
+import android.app.UiModeManager.ContrastUtils.CONTRAST_LEVEL_STANDARD
+import android.app.UiModeManager.ContrastUtils.fromContrastLevel
+import android.app.UiModeManager.ContrastUtils.toContrastLevel
+import android.content.Context
+import android.os.Bundle
+import android.provider.Settings
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.FrameLayout
+import com.android.internal.annotations.VisibleForTesting
+import com.android.systemui.R
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.statusbar.phone.SystemUIDialog
+import com.android.systemui.util.settings.SecureSettings
+import java.util.concurrent.Executor
+
+/** Dialog to select contrast options */
+class ContrastDialog(
+    context: Context?,
+    @Main private val mainExecutor: Executor,
+    private val uiModeManager: UiModeManager,
+    private val userTracker: UserTracker,
+    private val secureSettings: SecureSettings,
+) : SystemUIDialog(context), UiModeManager.ContrastChangeListener {
+
+    @VisibleForTesting lateinit var contrastButtons: Map<Int, FrameLayout>
+    lateinit var dialogView: View
+    @VisibleForTesting var initialContrast: Float = fromContrastLevel(CONTRAST_LEVEL_STANDARD)
+
+    public override fun onCreate(savedInstanceState: Bundle?) {
+        dialogView = LayoutInflater.from(context).inflate(R.layout.contrast_dialog, null)
+        setView(dialogView)
+
+        setTitle(R.string.quick_settings_contrast_label)
+        setNeutralButton(R.string.cancel) { _, _ ->
+            secureSettings.putFloatForUser(
+                Settings.Secure.CONTRAST_LEVEL,
+                initialContrast,
+                userTracker.userId
+            )
+            dismiss()
+        }
+        setPositiveButton(R.string.done) { _, _ -> dismiss() }
+        super.onCreate(savedInstanceState)
+
+        contrastButtons =
+            mapOf(
+                CONTRAST_LEVEL_STANDARD to findViewById(R.id.contrast_button_standard),
+                CONTRAST_LEVEL_MEDIUM to findViewById(R.id.contrast_button_medium),
+                CONTRAST_LEVEL_HIGH to findViewById(R.id.contrast_button_high)
+            )
+
+        contrastButtons.forEach { (contrastLevel, contrastButton) ->
+            contrastButton.setOnClickListener {
+                val contrastValue = fromContrastLevel(contrastLevel)
+                secureSettings.putFloatForUser(
+                    Settings.Secure.CONTRAST_LEVEL,
+                    contrastValue,
+                    userTracker.userId
+                )
+            }
+        }
+
+        initialContrast = uiModeManager.contrast
+        highlightContrast(toContrastLevel(initialContrast))
+    }
+
+    override fun onStart() {
+        super.onStart()
+        uiModeManager.addContrastChangeListener(mainExecutor, this)
+    }
+
+    override fun onStop() {
+        super.onStop()
+        uiModeManager.removeContrastChangeListener(this)
+    }
+
+    override fun onContrastChanged(contrast: Float) {
+        highlightContrast(toContrastLevel(contrast))
+    }
+
+    private fun highlightContrast(contrast: Int) {
+        contrastButtons.forEach { (level, button) -> button.isSelected = level == contrast }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogActivity.kt b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogActivity.kt
new file mode 100644
index 0000000..70d7138
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogActivity.kt
@@ -0,0 +1,46 @@
+/*
+ * 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.contrast
+
+import android.app.Activity
+import android.app.UiModeManager
+import android.content.Context
+import android.os.Bundle
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.util.settings.SecureSettings
+import java.util.concurrent.Executor
+import javax.inject.Inject
+
+/** Trampoline activity responsible for creating a [ContrastDialog] */
+class ContrastDialogActivity
+@Inject
+constructor(
+    private val context: Context,
+    @Main private val mainExecutor: Executor,
+    private val uiModeManager: UiModeManager,
+    private val userTracker: UserTracker,
+    private val secureSettings: SecureSettings
+) : Activity() {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        val contrastDialog =
+            ContrastDialog(context, mainExecutor, uiModeManager, userTracker, secureSettings)
+        contrastDialog.show()
+        finish()
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
index ac1150e..e8c97bf 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
@@ -31,7 +31,6 @@
 import android.util.ArrayMap
 import android.util.Log
 import com.android.internal.annotations.VisibleForTesting
-import com.android.internal.notification.NotificationAccessConfirmationActivityContract.EXTRA_USER_ID
 import com.android.systemui.Dumpable
 import com.android.systemui.backup.BackupHelper
 import com.android.systemui.controls.ControlStatus
@@ -44,7 +43,6 @@
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.dump.DumpManager
-import com.android.systemui.people.widget.PeopleSpaceWidgetProvider.EXTRA_USER_HANDLE
 import com.android.systemui.settings.UserFileManager
 import com.android.systemui.settings.UserTracker
 import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.PREFS_CONTROLS_FILE
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/AllModel.kt b/packages/SystemUI/src/com/android/systemui/controls/management/AllModel.kt
index 00a406e..be428a8 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/AllModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/AllModel.kt
@@ -75,9 +75,12 @@
         } else {
             favoriteIds.remove(controlId)
         }
-        if (changed && !modified) {
-            modified = true
-            controlsModelCallback.onFirstChange()
+        if (changed) {
+            if (!modified) {
+                modified = true
+                controlsModelCallback.onFirstChange()
+            }
+            controlsModelCallback.onChange()
         }
         toChange?.let {
             it.controlStatus.favorite = favorite
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt
index 7df0865..d629e3e 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt
@@ -27,6 +27,7 @@
 import android.view.ViewStub
 import android.widget.Button
 import android.widget.TextView
+import android.widget.Toast
 import android.window.OnBackInvokedCallback
 import android.window.OnBackInvokedDispatcher
 import androidx.activity.ComponentActivity
@@ -38,8 +39,9 @@
 import com.android.systemui.controls.controller.ControlsControllerImpl
 import com.android.systemui.controls.controller.StructureInfo
 import com.android.systemui.controls.ui.ControlsActivity
-import com.android.systemui.controls.ui.ControlsUiController
 import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.flags.Flags
 import com.android.systemui.settings.UserTracker
 import java.util.concurrent.Executor
 import javax.inject.Inject
@@ -48,17 +50,19 @@
  * Activity for rearranging and removing controls for a given structure
  */
 open class ControlsEditingActivity @Inject constructor(
+    featureFlags: FeatureFlags,
     @Main private val mainExecutor: Executor,
     private val controller: ControlsControllerImpl,
     private val userTracker: UserTracker,
     private val customIconCache: CustomIconCache,
-    private val uiController: ControlsUiController
 ) : ComponentActivity() {
 
     companion object {
         private const val DEBUG = false
         private const val TAG = "ControlsEditingActivity"
         const val EXTRA_STRUCTURE = ControlsFavoritingActivity.EXTRA_STRUCTURE
+        const val EXTRA_APP = ControlsFavoritingActivity.EXTRA_APP
+        const val EXTRA_FROM_FAVORITING = "extra_from_favoriting"
         private val SUBTITLE_ID = R.string.controls_favorite_rearrange
         private val EMPTY_TEXT_ID = R.string.controls_favorite_removed
     }
@@ -68,7 +72,12 @@
     private lateinit var model: FavoritesModel
     private lateinit var subtitle: TextView
     private lateinit var saveButton: View
+    private lateinit var addControls: View
 
+    private var isFromFavoriting: Boolean = false
+
+    private val isNewFlowEnabled: Boolean =
+        featureFlags.isEnabled(Flags.CONTROLS_MANAGEMENT_NEW_FLOWS)
     private val userTrackerCallback: UserTracker.Callback = object : UserTracker.Callback {
         private val startingUser = controller.currentUserId
 
@@ -93,7 +102,7 @@
         intent.getParcelableExtra<ComponentName>(Intent.EXTRA_COMPONENT_NAME)?.let {
             component = it
         } ?: run(this::finish)
-
+        isFromFavoriting = intent.getBooleanExtra(EXTRA_FROM_FAVORITING, false)
         intent.getCharSequenceExtra(EXTRA_STRUCTURE)?.let {
             structure = it
         } ?: run(this::finish)
@@ -165,8 +174,42 @@
     }
 
     private fun bindButtons() {
+        addControls = requireViewById<Button>(R.id.addControls).apply {
+            isEnabled = true
+            visibility = if (isNewFlowEnabled) View.VISIBLE else View.GONE
+            setOnClickListener {
+                if (saveButton.isEnabled) {
+                    // The user has made changes
+                    Toast.makeText(
+                        applicationContext,
+                        R.string.controls_favorite_toast_no_changes,
+                        Toast.LENGTH_SHORT
+                    ).show()
+                }
+                if (isFromFavoriting) {
+                    animateExitAndFinish()
+                } else {
+                    startActivity(Intent(context, ControlsFavoritingActivity::class.java).also {
+                        it.putExtra(ControlsFavoritingActivity.EXTRA_STRUCTURE, structure)
+                        it.putExtra(Intent.EXTRA_COMPONENT_NAME, component)
+                        it.putExtra(
+                            ControlsFavoritingActivity.EXTRA_APP,
+                            intent.getCharSequenceExtra(EXTRA_APP),
+                        )
+                        it.putExtra(
+                            ControlsFavoritingActivity.EXTRA_SOURCE,
+                            ControlsFavoritingActivity.EXTRA_SOURCE_VALUE_FROM_EDITING,
+                        )
+                    },
+                                  ActivityOptions.makeSceneTransitionAnimation(
+                                      this@ControlsEditingActivity
+                                  ).toBundle(),
+                    )
+                }
+            }
+        }
         saveButton = requireViewById<Button>(R.id.done).apply {
-            isEnabled = false
+            isEnabled = isFromFavoriting
             setText(R.string.save)
             setOnClickListener {
                 saveFavorites()
@@ -194,6 +237,8 @@
             }
         }
 
+        override fun onChange() = Unit
+
         override fun onFirstChange() {
             saveButton.isEnabled = true
         }
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt
index 3e97d31..d3ffc95 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt
@@ -37,6 +37,7 @@
 import android.window.OnBackInvokedCallback
 import android.window.OnBackInvokedDispatcher
 import androidx.activity.ComponentActivity
+import androidx.annotation.VisibleForTesting
 import androidx.viewpager2.widget.ViewPager2
 import com.android.systemui.Prefs
 import com.android.systemui.R
@@ -45,20 +46,20 @@
 import com.android.systemui.controls.controller.ControlsControllerImpl
 import com.android.systemui.controls.controller.StructureInfo
 import com.android.systemui.controls.ui.ControlsActivity
-import com.android.systemui.controls.ui.ControlsUiController
 import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.flags.Flags
 import com.android.systemui.settings.UserTracker
 import java.text.Collator
 import java.util.concurrent.Executor
-import java.util.function.Consumer
 import javax.inject.Inject
 
 open class ControlsFavoritingActivity @Inject constructor(
+    featureFlags: FeatureFlags,
     @Main private val executor: Executor,
     private val controller: ControlsControllerImpl,
     private val listingController: ControlsListingController,
     private val userTracker: UserTracker,
-    private val uiController: ControlsUiController
 ) : ComponentActivity() {
 
     companion object {
@@ -71,7 +72,10 @@
         // If provided, show this structure page first
         const val EXTRA_STRUCTURE = "extra_structure"
         const val EXTRA_SINGLE_STRUCTURE = "extra_single_structure"
-        const val EXTRA_FROM_PROVIDER_SELECTOR = "extra_from_provider_selector"
+        const val EXTRA_SOURCE = "extra_source"
+        const val EXTRA_SOURCE_UNDEFINED: Byte = 0
+        const val EXTRA_SOURCE_VALUE_FROM_PROVIDER_SELECTOR: Byte = 1
+        const val EXTRA_SOURCE_VALUE_FROM_EDITING: Byte = 2
         private const val TOOLTIP_PREFS_KEY = Prefs.Key.CONTROLS_STRUCTURE_SWIPE_TOOLTIP_COUNT
         private const val TOOLTIP_MAX_SHOWN = 2
     }
@@ -79,7 +83,7 @@
     private var component: ComponentName? = null
     private var appName: CharSequence? = null
     private var structureExtra: CharSequence? = null
-    private var fromProviderSelector = false
+    private var openSource = EXTRA_SOURCE_UNDEFINED
 
     private lateinit var structurePager: ViewPager2
     private lateinit var statusText: TextView
@@ -89,12 +93,19 @@
     private var mTooltipManager: TooltipManager? = null
     private lateinit var doneButton: View
     private lateinit var otherAppsButton: View
+    private lateinit var rearrangeButton: Button
     private var listOfStructures = emptyList<StructureContainer>()
 
     private lateinit var comparator: Comparator<StructureContainer>
     private var cancelLoadRunnable: Runnable? = null
     private var isPagerLoaded = false
 
+    private val fromProviderSelector: Boolean
+        get() = openSource == EXTRA_SOURCE_VALUE_FROM_PROVIDER_SELECTOR
+    private val fromEditing: Boolean
+        get() = openSource == EXTRA_SOURCE_VALUE_FROM_EDITING
+    private val isNewFlowEnabled: Boolean =
+        featureFlags.isEnabled(Flags.CONTROLS_MANAGEMENT_NEW_FLOWS)
     private val userTrackerCallback: UserTracker.Callback = object : UserTracker.Callback {
         private val startingUser = controller.currentUserId
 
@@ -117,14 +128,20 @@
 
         override fun onServicesUpdated(serviceInfos: List<ControlsServiceInfo>) {
             if (serviceInfos.size > 1) {
-                otherAppsButton.post {
-                    otherAppsButton.visibility = View.VISIBLE
+                val newVisibility = if (isNewFlowEnabled) View.GONE else View.VISIBLE
+                if (otherAppsButton.visibility != newVisibility) {
+                    otherAppsButton.post {
+                        otherAppsButton.visibility = newVisibility
+                    }
                 }
             }
         }
     }
 
     override fun onBackPressed() {
+        if (fromEditing) {
+            animateExitAndFinish()
+        }
         if (!fromProviderSelector) {
             openControlsOrigin()
         }
@@ -139,7 +156,7 @@
         appName = intent.getCharSequenceExtra(EXTRA_APP)
         structureExtra = intent.getCharSequenceExtra(EXTRA_STRUCTURE)
         component = intent.getParcelableExtra<ComponentName>(Intent.EXTRA_COMPONENT_NAME)
-        fromProviderSelector = intent.getBooleanExtra(EXTRA_FROM_PROVIDER_SELECTOR, false)
+        openSource = intent.getByteExtra(EXTRA_SOURCE, EXTRA_SOURCE_UNDEFINED)
 
         bindViews()
     }
@@ -148,14 +165,19 @@
         override fun onFirstChange() {
             doneButton.isEnabled = true
         }
+
+        override fun onChange() {
+            val structure: StructureContainer = listOfStructures[structurePager.currentItem]
+            rearrangeButton.isEnabled = structure.model.favorites.isNotEmpty()
+        }
     }
 
     private fun loadControls() {
-        component?.let {
+        component?.let { componentName ->
             statusText.text = resources.getText(com.android.internal.R.string.loading)
             val emptyZoneString = resources.getText(
                     R.string.controls_favorite_other_zone_header)
-            controller.loadForComponent(it, Consumer { data ->
+            controller.loadForComponent(componentName, { data ->
                 val allControls = data.allControls
                 val favoriteKeys = data.favoritesIds
                 val error = data.errorOnLoad
@@ -213,7 +235,7 @@
                         ControlsAnimations.enterAnimation(structurePager).start()
                     }
                 }
-            }, Consumer { runnable -> cancelLoadRunnable = runnable })
+            }, { runnable -> cancelLoadRunnable = runnable })
         }
     }
 
@@ -299,7 +321,8 @@
         bindButtons()
     }
 
-    private fun animateExitAndFinish() {
+    @VisibleForTesting
+    internal open fun animateExitAndFinish() {
         val rootView = requireViewById<ViewGroup>(R.id.controls_management_root)
         ControlsAnimations.exitAnimation(
                 rootView,
@@ -312,6 +335,32 @@
     }
 
     private fun bindButtons() {
+        rearrangeButton = requireViewById<Button>(R.id.rearrange).apply {
+            text = if (fromEditing) {
+                getString(R.string.controls_favorite_back_to_editing)
+            } else {
+                getString(R.string.controls_favorite_rearrange_button)
+            }
+            isEnabled = false
+            visibility = if (isNewFlowEnabled) View.VISIBLE else View.GONE
+            setOnClickListener {
+                if (component == null) return@setOnClickListener
+                saveFavorites()
+                startActivity(
+                    Intent(context, ControlsEditingActivity::class.java).also {
+                        it.putExtra(Intent.EXTRA_COMPONENT_NAME, component)
+                        it.putExtra(ControlsEditingActivity.EXTRA_APP, appName)
+                        it.putExtra(ControlsEditingActivity.EXTRA_FROM_FAVORITING, true)
+                        it.putExtra(
+                            ControlsEditingActivity.EXTRA_STRUCTURE,
+                            listOfStructures[structurePager.currentItem].structureName,
+                        )
+                    },
+                    ActivityOptions
+                        .makeSceneTransitionAnimation(this@ControlsFavoritingActivity).toBundle()
+                )
+            }
+        }
         otherAppsButton = requireViewById<Button>(R.id.other_apps).apply {
             setOnClickListener {
                 if (doneButton.isEnabled) {
@@ -335,18 +384,22 @@
             isEnabled = false
             setOnClickListener {
                 if (component == null) return@setOnClickListener
-                listOfStructures.forEach {
-                    val favoritesForStorage = it.model.favorites
-                    controller.replaceFavoritesForStructure(
-                        StructureInfo(component!!, it.structureName, favoritesForStorage)
-                    )
-                }
+                saveFavorites()
                 animateExitAndFinish()
                 openControlsOrigin()
             }
         }
     }
 
+    private fun saveFavorites() {
+        listOfStructures.forEach {
+            val favoritesForStorage = it.model.favorites
+            controller.replaceFavoritesForStructure(
+                StructureInfo(component!!, it.structureName, favoritesForStorage)
+            )
+        }
+    }
+
     private fun openControlsOrigin() {
         startActivity(
             Intent(applicationContext, ControlsActivity::class.java),
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsModel.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsModel.kt
index d65481a..3455e6d 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsModel.kt
@@ -71,6 +71,11 @@
          * Use to notify that the model has changed for the first time
          */
         fun onFirstChange()
+
+        /**
+         * Use to notify that the model has changed
+         */
+        fun onChange()
     }
 
     /**
@@ -132,7 +137,7 @@
         controlInfo: ControlInfo,
         favorite: Boolean,
         customIconGetter: (ComponentName, String) -> Icon?
-    ): this(component, controlInfo, favorite) {
+    ) : this(component, controlInfo, favorite) {
         this.customIconGetter = customIconGetter
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt
index 3808e73..92aff06 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt
@@ -211,7 +211,10 @@
                     putExtra(ControlsFavoritingActivity.EXTRA_APP,
                             listingController.getAppLabel(it))
                     putExtra(Intent.EXTRA_COMPONENT_NAME, it)
-                    putExtra(ControlsFavoritingActivity.EXTRA_FROM_PROVIDER_SELECTOR, true)
+                    putExtra(
+                        ControlsFavoritingActivity.EXTRA_SOURCE,
+                        ControlsFavoritingActivity.EXTRA_SOURCE_VALUE_FROM_PROVIDER_SELECTOR,
+                    )
                 }
                 startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle())
                 animateExitAndFinish()
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt
index 99a10a3..3713811 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt
@@ -44,7 +44,7 @@
 import com.android.systemui.statusbar.VibratorHelper
 import com.android.systemui.statusbar.policy.KeyguardStateController
 import com.android.systemui.util.concurrency.DelayableExecutor
-import com.android.wm.shell.TaskViewFactory
+import com.android.wm.shell.taskview.TaskViewFactory
 import java.util.Optional
 import javax.inject.Inject
 
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
index c20af07..d4ce9b6 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
@@ -79,7 +79,7 @@
 import com.android.systemui.util.asIndenting
 import com.android.systemui.util.concurrency.DelayableExecutor
 import com.android.systemui.util.indentIfPossible
-import com.android.wm.shell.TaskViewFactory
+import com.android.wm.shell.taskview.TaskViewFactory
 import dagger.Lazy
 import java.io.PrintWriter
 import java.text.Collator
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt
index 3d9eee4..5d608c3 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt
@@ -36,7 +36,7 @@
 import com.android.systemui.broadcast.BroadcastSender
 import com.android.systemui.plugins.ActivityStarter
 import com.android.systemui.statusbar.policy.KeyguardStateController
-import com.android.wm.shell.TaskView
+import com.android.wm.shell.taskview.TaskView
 
 /**
  * A dialog that provides an {@link TaskView}, allowing the application to provide
@@ -44,13 +44,13 @@
  * The activity being launched is specified by {@link android.service.controls.Control#getAppIntent}.
  */
 class DetailDialog(
-    val activityContext: Context,
-    val broadcastSender: BroadcastSender,
-    val taskView: TaskView,
-    val pendingIntent: PendingIntent,
-    val cvh: ControlViewHolder,
-    val keyguardStateController: KeyguardStateController,
-    val activityStarter: ActivityStarter
+        val activityContext: Context,
+        val broadcastSender: BroadcastSender,
+        val taskView: TaskView,
+        val pendingIntent: PendingIntent,
+        val cvh: ControlViewHolder,
+        val keyguardStateController: KeyguardStateController,
+        val activityStarter: ActivityStarter
 ) : Dialog(
     activityContext,
     R.style.Theme_SystemUI_Dialog_Control_DetailPanel
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/PanelTaskViewController.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/PanelTaskViewController.kt
index 1f89c91..9a23181 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/PanelTaskViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/PanelTaskViewController.kt
@@ -30,7 +30,7 @@
 import android.os.Trace
 import com.android.systemui.R
 import com.android.systemui.util.boundsOnScreen
-import com.android.wm.shell.TaskView
+import com.android.wm.shell.taskview.TaskView
 import java.util.concurrent.Executor
 
 class PanelTaskViewController(
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java
index 3cf26b3..dba353b 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java
@@ -19,6 +19,7 @@
 import android.app.Activity;
 
 import com.android.systemui.ForegroundServicesDialog;
+import com.android.systemui.contrast.ContrastDialogActivity;
 import com.android.systemui.hdmi.HdmiCecSetMenuLanguageActivity;
 import com.android.systemui.keyguard.WorkLockActivity;
 import com.android.systemui.people.PeopleSpaceActivity;
@@ -73,6 +74,12 @@
     @ClassKey(BrightnessDialog.class)
     public abstract Activity bindBrightnessDialog(BrightnessDialog activity);
 
+    /** Inject into ContrastDialogActivity. */
+    @Binds
+    @IntoMap
+    @ClassKey(ContrastDialogActivity.class)
+    public abstract Activity bindContrastDialogActivity(ContrastDialogActivity activity);
+
     /** Inject into UsbDebuggingActivity. */
     @Binds
     @IntoMap
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
index 625a028..1a0fcea 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
@@ -38,7 +38,6 @@
 import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
 import com.android.systemui.unfold.progress.UnfoldTransitionProgressForwarder;
 import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider;
-import com.android.wm.shell.TaskViewFactory;
 import com.android.wm.shell.back.BackAnimation;
 import com.android.wm.shell.bubbles.Bubbles;
 import com.android.wm.shell.desktopmode.DesktopMode;
@@ -49,16 +48,17 @@
 import com.android.wm.shell.splitscreen.SplitScreen;
 import com.android.wm.shell.startingsurface.StartingSurface;
 import com.android.wm.shell.sysui.ShellInterface;
+import com.android.wm.shell.taskview.TaskViewFactory;
 import com.android.wm.shell.transition.ShellTransitions;
 
+import dagger.BindsInstance;
+import dagger.Subcomponent;
+
 import java.util.Map;
 import java.util.Optional;
 
 import javax.inject.Provider;
 
-import dagger.BindsInstance;
-import dagger.Subcomponent;
-
 /**
  * An example Dagger Subcomponent for Core SysUI.
  *
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
index d756f3a..17d2332 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
@@ -23,7 +23,6 @@
 
 import com.android.systemui.SystemUIInitializerFactory;
 import com.android.systemui.tv.TvWMComponent;
-import com.android.wm.shell.TaskViewFactory;
 import com.android.wm.shell.back.BackAnimation;
 import com.android.wm.shell.bubbles.Bubbles;
 import com.android.wm.shell.common.annotations.ShellMainThread;
@@ -38,13 +37,14 @@
 import com.android.wm.shell.splitscreen.SplitScreen;
 import com.android.wm.shell.startingsurface.StartingSurface;
 import com.android.wm.shell.sysui.ShellInterface;
+import com.android.wm.shell.taskview.TaskViewFactory;
 import com.android.wm.shell.transition.ShellTransitions;
 
-import java.util.Optional;
-
 import dagger.BindsInstance;
 import dagger.Subcomponent;
 
+import java.util.Optional;
+
 /**
  * Dagger Subcomponent for WindowManager.  This class explicitly describes the interfaces exported
  * from the WM component into the SysUI component (in
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeBrightnessHostForwarder.java b/packages/SystemUI/src/com/android/systemui/doze/DozeBrightnessHostForwarder.java
index 0aeb128..cf0dcad 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeBrightnessHostForwarder.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeBrightnessHostForwarder.java
@@ -16,6 +16,8 @@
 
 package com.android.systemui.doze;
 
+import java.util.concurrent.Executor;
+
 /**
  * Forwards the currently used brightness to {@link DozeHost}.
  */
@@ -23,8 +25,9 @@
 
     private final DozeHost mHost;
 
-    public DozeBrightnessHostForwarder(DozeMachine.Service wrappedService, DozeHost host) {
-        super(wrappedService);
+    public DozeBrightnessHostForwarder(DozeMachine.Service wrappedService, DozeHost host,
+            Executor bgExecutor) {
+        super(wrappedService, bgExecutor);
         mHost = host;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
index f0aefb5..7f0b16b 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
@@ -39,6 +39,7 @@
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.concurrent.Executor;
 
 import javax.inject.Inject;
 
@@ -150,7 +151,6 @@
     private final DockManager mDockManager;
     private final Part[] mParts;
     private final UserTracker mUserTracker;
-
     private final ArrayList<State> mQueuedRequests = new ArrayList<>();
     private State mState = State.UNINITIALIZED;
     private int mPulseReason;
@@ -512,9 +512,11 @@
 
         class Delegate implements Service {
             private final Service mDelegate;
+            private final Executor mBgExecutor;
 
-            public Delegate(Service delegate) {
+            public Delegate(Service delegate, Executor bgExecutor) {
                 mDelegate = delegate;
+                mBgExecutor = bgExecutor;
             }
 
             @Override
@@ -534,7 +536,9 @@
 
             @Override
             public void setDozeScreenBrightness(int brightness) {
-                mDelegate.setDozeScreenBrightness(brightness);
+                mBgExecutor.execute(() -> {
+                    mDelegate.setDozeScreenBrightness(brightness);
+                });
             }
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenStatePreventingAdapter.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenStatePreventingAdapter.java
index 25c2c39..8d44472 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenStatePreventingAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenStatePreventingAdapter.java
@@ -22,14 +22,16 @@
 
 import com.android.systemui.statusbar.phone.DozeParameters;
 
+import java.util.concurrent.Executor;
+
 /**
  * Prevents usage of doze screen states on devices that don't support them.
  */
 public class DozeScreenStatePreventingAdapter extends DozeMachine.Service.Delegate {
 
     @VisibleForTesting
-    DozeScreenStatePreventingAdapter(DozeMachine.Service inner) {
-        super(inner);
+    DozeScreenStatePreventingAdapter(DozeMachine.Service inner, Executor bgExecutor) {
+        super(inner, bgExecutor);
     }
 
     @Override
@@ -47,8 +49,8 @@
      * return a new instance of {@link DozeScreenStatePreventingAdapter} wrapping {@code inner}.
      */
     public static DozeMachine.Service wrapIfNeeded(DozeMachine.Service inner,
-            DozeParameters params) {
-        return isNeeded(params) ? new DozeScreenStatePreventingAdapter(inner) : inner;
+            DozeParameters params, Executor bgExecutor) {
+        return isNeeded(params) ? new DozeScreenStatePreventingAdapter(inner, bgExecutor) : inner;
     }
 
     private static boolean isNeeded(DozeParameters params) {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapter.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapter.java
index a0c490951..f7773f1 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapter.java
@@ -22,14 +22,16 @@
 
 import com.android.systemui.statusbar.phone.DozeParameters;
 
+import java.util.concurrent.Executor;
+
 /**
  * Prevents usage of doze screen states on devices that don't support them.
  */
 public class DozeSuspendScreenStatePreventingAdapter extends DozeMachine.Service.Delegate {
 
     @VisibleForTesting
-    DozeSuspendScreenStatePreventingAdapter(DozeMachine.Service inner) {
-        super(inner);
+    DozeSuspendScreenStatePreventingAdapter(DozeMachine.Service inner, Executor bgExecutor) {
+        super(inner, bgExecutor);
     }
 
     @Override
@@ -45,8 +47,9 @@
      * return a new instance of {@link DozeSuspendScreenStatePreventingAdapter} wrapping {@code inner}.
      */
     public static DozeMachine.Service wrapIfNeeded(DozeMachine.Service inner,
-            DozeParameters params) {
-        return isNeeded(params) ? new DozeSuspendScreenStatePreventingAdapter(inner) : inner;
+            DozeParameters params, Executor bgExecutor) {
+        return isNeeded(params) ? new DozeSuspendScreenStatePreventingAdapter(inner, bgExecutor)
+                : inner;
     }
 
     private static boolean isNeeded(DozeParameters params) {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/dagger/DozeModule.java b/packages/SystemUI/src/com/android/systemui/doze/dagger/DozeModule.java
index 069344f..d408472 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/dagger/DozeModule.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/dagger/DozeModule.java
@@ -22,6 +22,7 @@
 
 import com.android.systemui.R;
 import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.dagger.qualifiers.UiBackground;
 import com.android.systemui.doze.DozeAuthRemover;
 import com.android.systemui.doze.DozeBrightnessHostForwarder;
 import com.android.systemui.doze.DozeDockHandler;
@@ -45,13 +46,14 @@
 import com.android.systemui.util.wakelock.DelayedWakeLock;
 import com.android.systemui.util.wakelock.WakeLock;
 
+import dagger.Module;
+import dagger.Provides;
+
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
-
-import dagger.Module;
-import dagger.Provides;
+import java.util.concurrent.Executor;
 
 /** Dagger module for use with {@link com.android.systemui.doze.dagger.DozeComponent}. */
 @Module
@@ -60,13 +62,13 @@
     @DozeScope
     @WrappedService
     static DozeMachine.Service providesWrappedService(DozeMachine.Service dozeMachineService,
-            DozeHost dozeHost, DozeParameters dozeParameters) {
+            DozeHost dozeHost, DozeParameters dozeParameters, @UiBackground Executor bgExecutor) {
         DozeMachine.Service wrappedService = dozeMachineService;
-        wrappedService = new DozeBrightnessHostForwarder(wrappedService, dozeHost);
+        wrappedService = new DozeBrightnessHostForwarder(wrappedService, dozeHost, bgExecutor);
         wrappedService = DozeScreenStatePreventingAdapter.wrapIfNeeded(
-                wrappedService, dozeParameters);
+                wrappedService, dozeParameters, bgExecutor);
         wrappedService = DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded(
-                wrappedService, dozeParameters);
+                wrappedService, dozeParameters, bgExecutor);
 
         return wrappedService;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java
index 4b478cd..7c6a748 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java
@@ -25,6 +25,7 @@
 
 import android.animation.Animator;
 import android.content.res.Resources;
+import android.graphics.Region;
 import android.os.Handler;
 import android.util.MathUtils;
 import android.view.View;
@@ -223,6 +224,9 @@
         mJitterStartTimeMillis = System.currentTimeMillis();
         mHandler.postDelayed(this::updateBurnInOffsets, mBurnInProtectionUpdateInterval);
         mPrimaryBouncerCallbackInteractor.addBouncerExpansionCallback(mBouncerExpansionCallback);
+        final Region emptyRegion = Region.obtain();
+        mView.getRootSurfaceControl().setTouchableRegion(emptyRegion);
+        emptyRegion.recycle();
 
         // Start dream entry animations. Skip animations for low light clock.
         if (!mStateController.isLowLightActive()) {
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java
index 74a49a8..c954f98 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java
@@ -201,8 +201,6 @@
         mStatusBarItemsProvider.addCallback(mStatusBarItemsProviderCallback);
 
         mDreamOverlayStateController.addCallback(mDreamOverlayStateCallback);
-
-        mTouchInsetSession.addViewToTracking(mView);
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java
index 2ea7bce..570132e1 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java
@@ -303,10 +303,6 @@
                 }
 
                 flingToExpansion(verticalVelocity, expansion);
-
-                if (expansion == KeyguardBouncerConstants.EXPANSION_HIDDEN) {
-                    mCurrentScrimController.reset();
-                }
                 break;
             default:
                 mVelocityTracker.addMovement(motionEvent);
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java
index 43e4c62..7f44463 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java
@@ -101,6 +101,10 @@
 
                     completer.set(predecessor);
                 }
+
+                if (mActiveTouchSessions.isEmpty() && mStopMonitoringPending) {
+                    stopMonitoring(false);
+                }
             });
 
             return "DreamOverlayTouchMonitor::pop";
@@ -214,7 +218,12 @@
 
         @Override
         public void onPause(@NonNull LifecycleOwner owner) {
-            stopMonitoring();
+            stopMonitoring(false);
+        }
+
+        @Override
+        public void onDestroy(LifecycleOwner owner) {
+            stopMonitoring(true);
         }
     };
 
@@ -222,7 +231,7 @@
      * When invoked, instantiates a new {@link InputSession} to monitor touch events.
      */
     private void startMonitoring() {
-        stopMonitoring();
+        stopMonitoring(true);
         mCurrentInputSession = mInputSessionFactory.create(
                 "dreamOverlay",
                 mInputEventListener,
@@ -234,11 +243,16 @@
     /**
      * Destroys any active {@link InputSession}.
      */
-    private void stopMonitoring() {
+    private void stopMonitoring(boolean force) {
         if (mCurrentInputSession == null) {
             return;
         }
 
+        if (!mActiveTouchSessions.isEmpty() && !force) {
+            mStopMonitoringPending = true;
+            return;
+        }
+
         // When we stop monitoring touches, we must ensure that all active touch sessions and
         // descendants informed of the removal so any cleanup for active tracking can proceed.
         mExecutor.execute(() -> mActiveTouchSessions.forEach(touchSession -> {
@@ -250,6 +264,7 @@
 
         mCurrentInputSession.dispose();
         mCurrentInputSession = null;
+        mStopMonitoringPending = false;
     }
 
 
@@ -257,6 +272,8 @@
     private final Collection<DreamTouchHandler> mHandlers;
     private final DisplayHelper mDisplayHelper;
 
+    private boolean mStopMonitoringPending;
+
     private InputChannelCompat.InputEventListener mInputEventListener =
             new InputChannelCompat.InputEventListener() {
         @Override
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/ShadeTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/ShadeTouchHandler.java
new file mode 100644
index 0000000..58b70b0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/ShadeTouchHandler.java
@@ -0,0 +1,92 @@
+/*
+ * 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.dreams.touch;
+
+import static com.android.systemui.dreams.touch.dagger.ShadeModule.NOTIFICATION_SHADE_GESTURE_INITIATION_HEIGHT;
+
+import android.graphics.Rect;
+import android.graphics.Region;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+
+import com.android.systemui.shade.NotificationPanelViewController;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
+
+import java.util.Optional;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+/**
+ * {@link ShadeTouchHandler} is responsible for handling swipe down gestures over dream
+ * to bring down the shade.
+ */
+public class ShadeTouchHandler implements DreamTouchHandler {
+    private final Optional<CentralSurfaces> mSurfaces;
+    private final int mInitiationHeight;
+
+    @Inject
+    ShadeTouchHandler(Optional<CentralSurfaces> centralSurfaces,
+            @Named(NOTIFICATION_SHADE_GESTURE_INITIATION_HEIGHT) int initiationHeight) {
+        mSurfaces = centralSurfaces;
+        mInitiationHeight = initiationHeight;
+    }
+
+    @Override
+    public void onSessionStart(TouchSession session) {
+        if (mSurfaces.map(CentralSurfaces::isBouncerShowing).orElse(false)) {
+            session.pop();
+            return;
+        }
+
+        session.registerInputListener(ev -> {
+            final NotificationPanelViewController viewController =
+                    mSurfaces.map(CentralSurfaces::getNotificationPanelViewController).orElse(null);
+
+            if (viewController != null) {
+                viewController.handleExternalTouch((MotionEvent) ev);
+            }
+
+            if (ev instanceof MotionEvent) {
+                if (((MotionEvent) ev).getAction() == MotionEvent.ACTION_UP) {
+                    session.pop();
+                }
+            }
+        });
+
+        session.registerGestureListener(new GestureDetector.SimpleOnGestureListener() {
+            @Override
+            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
+                    float distanceY) {
+                return true;
+            }
+
+            @Override
+            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
+                    float velocityY) {
+                return true;
+            }
+        });
+    }
+
+    @Override
+    public void getTouchInitiationRegion(Rect bounds, Region region) {
+        final Rect outBounds = new Rect(bounds);
+        outBounds.inset(0, 0, 0, outBounds.height() - mInitiationHeight);
+        region.op(outBounds, Region.Op.UNION);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/dagger/DreamTouchModule.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/dagger/DreamTouchModule.java
index dad0004..b719126 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/dagger/DreamTouchModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/dagger/DreamTouchModule.java
@@ -23,6 +23,7 @@
  */
 @Module(includes = {
             BouncerSwipeModule.class,
+            ShadeModule.class,
         }, subcomponents = {
             InputSessionComponent.class,
 })
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/dagger/ShadeModule.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/dagger/ShadeModule.java
new file mode 100644
index 0000000..9e0ae41
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/dagger/ShadeModule.java
@@ -0,0 +1,62 @@
+/*
+ * 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.dreams.touch.dagger;
+
+import android.content.res.Resources;
+
+import com.android.systemui.R;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.dreams.touch.DreamTouchHandler;
+import com.android.systemui.dreams.touch.ShadeTouchHandler;
+
+import dagger.Module;
+import dagger.Provides;
+import dagger.multibindings.IntoSet;
+
+import javax.inject.Named;
+
+/**
+ * Dependencies for swipe down to notification over dream.
+ */
+@Module
+public class ShadeModule {
+    /**
+     * The height, defined in pixels, of the gesture initiation region at the top of the screen for
+     * swiping down notifications.
+     */
+    public static final String NOTIFICATION_SHADE_GESTURE_INITIATION_HEIGHT =
+            "notification_shade_gesture_initiation_height";
+
+    /**
+     * Provides {@link ShadeTouchHandler} to handle notification swipe down over dream.
+     */
+    @Provides
+    @IntoSet
+    public static DreamTouchHandler providesNotificationShadeTouchHandler(
+            ShadeTouchHandler touchHandler) {
+        return touchHandler;
+    }
+
+    /**
+     * Provides the height of the gesture area for notification swipe down.
+     */
+    @Provides
+    @Named(NOTIFICATION_SHADE_GESTURE_INITIATION_HEIGHT)
+    public static int providesNotificationShadeGestureRegionHeight(@Main Resources resources) {
+        return resources.getDimensionPixelSize(R.dimen.dream_overlay_status_bar_height);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
index 79a51d6..0bc8506 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
@@ -101,16 +101,16 @@
         releasedFlag(174148361, "notification_inline_reply_animation")
 
     val FILTER_UNSEEN_NOTIFS_ON_KEYGUARD =
-        releasedFlag(254647461, "filter_unseen_notifs_on_keyguard", teamfood = true)
+        releasedFlag(254647461, "filter_unseen_notifs_on_keyguard")
 
     // TODO(b/263414400): Tracking Bug
     @JvmField
     val NOTIFICATION_ANIMATE_BIG_PICTURE =
-        releasedFlag(120, "notification_animate_big_picture", teamfood = true)
+        releasedFlag(120, "notification_animate_big_picture")
 
     @JvmField
     val ANIMATED_NOTIFICATION_SHADE_INSETS =
-        unreleasedFlag(270682168, "animated_notification_shade_insets", teamfood = true)
+        releasedFlag(270682168, "animated_notification_shade_insets")
 
     // TODO(b/268005230): Tracking Bug
     @JvmField val SENSITIVE_REVEAL_ANIM = unreleasedFlag(268005230, "sensitive_reveal_anim")
@@ -184,7 +184,7 @@
     // flag for controlling auto pin confirmation and material u shapes in bouncer
     @JvmField
     val AUTO_PIN_CONFIRMATION =
-        releasedFlag(224, "auto_pin_confirmation", "auto_pin_confirmation", teamfood = true)
+        releasedFlag(224, "auto_pin_confirmation", "auto_pin_confirmation")
 
     // TODO(b/262859270): Tracking Bug
     @JvmField val FALSING_OFF_FOR_UNFOLDED = releasedFlag(225, "falsing_off_for_unfolded")
@@ -219,12 +219,12 @@
     /** Whether to inflate the bouncer view on a background thread. */
     // TODO(b/272091103): Tracking Bug
     @JvmField
-    val ASYNC_INFLATE_BOUNCER = unreleasedFlag(229, "async_inflate_bouncer", teamfood = true)
+    val ASYNC_INFLATE_BOUNCER = releasedFlag(229, "async_inflate_bouncer")
 
     /** Whether to inflate the bouncer view on a background thread. */
     // TODO(b/273341787): Tracking Bug
     @JvmField
-    val PREVENT_BYPASS_KEYGUARD = unreleasedFlag(230, "prevent_bypass_keyguard", teamfood = true)
+    val PREVENT_BYPASS_KEYGUARD = releasedFlag(230, "prevent_bypass_keyguard")
 
     /** Whether to use a new data source for intents to run on keyguard dismissal. */
     @JvmField
@@ -285,7 +285,7 @@
     /** Enables Font Scaling Quick Settings tile */
     // TODO(b/269341316): Tracking Bug
     @JvmField
-    val ENABLE_FONT_SCALING_TILE = unreleasedFlag(509, "enable_font_scaling_tile", teamfood = false)
+    val ENABLE_FONT_SCALING_TILE = releasedFlag(509, "enable_font_scaling_tile")
 
     /** Enables new QS Edit Mode visual refresh */
     // TODO(b/269787742): Tracking Bug
@@ -417,7 +417,7 @@
 
     // TODO(b/273509374): Tracking Bug
     @JvmField
-    val ALWAYS_SHOW_HOME_CONTROLS_ON_DREAMS = unreleasedFlag(1006,
+    val ALWAYS_SHOW_HOME_CONTROLS_ON_DREAMS = releasedFlag(1006,
         "always_show_home_controls_on_dreams")
 
     // 1100 - windowing
@@ -513,6 +513,11 @@
         sysPropBooleanFlag(
             1116, "persist.wm.debug.enable_move_floating_window_in_tabletop", default = true)
 
+    // TODO(b/273443374): Tracking Bug
+    @Keep
+    @JvmField val LOCKSCREEN_LIVE_WALLPAPER =
+        sysPropBooleanFlag(1117, "persist.wm.debug.lockscreen_live_wallpaper", default = false)
+
     // 1200 - predictive back
     @Keep
     @JvmField
@@ -575,9 +580,6 @@
     // TODO(b/251205791): Tracking Bug
     @JvmField val SCREENSHOT_APP_CLIPS = releasedFlag(1304, "screenshot_app_clips")
 
-    // TODO(b/268484562): Tracking bug
-    @JvmField val SCREENSHOT_METADATA_REFACTOR = releasedFlag(1305, "screenshot_metadata_refactor")
-
     // 1400 - columbus
     // TODO(b/254512756): Tracking Bug
     val QUICK_TAP_IN_PCC = releasedFlag(1400, "quick_tap_in_pcc")
@@ -621,21 +623,21 @@
     @JvmField val NOTE_TASKS = releasedFlag(1900, "keycode_flag")
 
     // 2000 - device controls
-    @Keep @JvmField val USE_APP_PANELS = releasedFlag(2000, "use_app_panels", teamfood = true)
+    @Keep @JvmField val USE_APP_PANELS = releasedFlag(2000, "use_app_panels")
 
     @JvmField
     val APP_PANELS_ALL_APPS_ALLOWED =
-        releasedFlag(2001, "app_panels_all_apps_allowed", teamfood = true)
+        releasedFlag(2001, "app_panels_all_apps_allowed")
 
     @JvmField
     val CONTROLS_MANAGEMENT_NEW_FLOWS =
-        releasedFlag(2002, "controls_management_new_flows", teamfood = true)
+        releasedFlag(2002, "controls_management_new_flows")
 
     // Enables removing app from Home control panel as a part of a new flow
     // TODO(b/269132640): Tracking Bug
     @JvmField
     val APP_PANELS_REMOVE_APPS_ALLOWED =
-        unreleasedFlag(2003, "app_panels_remove_apps_allowed", teamfood = false)
+        unreleasedFlag(2003, "app_panels_remove_apps_allowed", teamfood = true)
 
     // 2100 - Falsing Manager
     @JvmField val FALSING_FOR_LONG_TAPS = releasedFlag(2100, "falsing_for_long_taps")
@@ -697,7 +699,7 @@
     // TODO(b/272036292): Tracking Bug
     @JvmField
     val LARGE_SHADE_GRANULAR_ALPHA_INTERPOLATION =
-            unreleasedFlag(2602, "large_shade_granular_alpha_interpolation", teamfood = true)
+            releasedFlag(2602, "large_shade_granular_alpha_interpolation")
 
     // TODO(b/272805037): Tracking Bug
     @JvmField
diff --git a/packages/SystemUI/src/com/android/systemui/graphics/ImageLoader.kt b/packages/SystemUI/src/com/android/systemui/graphics/ImageLoader.kt
new file mode 100644
index 0000000..801b165
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/graphics/ImageLoader.kt
@@ -0,0 +1,493 @@
+package com.android.systemui.graphics
+
+import android.annotation.AnyThread
+import android.annotation.DrawableRes
+import android.annotation.Px
+import android.annotation.SuppressLint
+import android.annotation.WorkerThread
+import android.content.Context
+import android.content.pm.PackageManager
+import android.content.res.Resources
+import android.content.res.Resources.NotFoundException
+import android.graphics.Bitmap
+import android.graphics.ImageDecoder
+import android.graphics.ImageDecoder.DecodeException
+import android.graphics.drawable.AdaptiveIconDrawable
+import android.graphics.drawable.BitmapDrawable
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.Icon
+import android.util.Log
+import android.util.Size
+import androidx.core.content.res.ResourcesCompat
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Background
+import java.io.IOException
+import javax.inject.Inject
+import kotlin.math.min
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.withContext
+
+/**
+ * Helper class to load images for SystemUI. It allows for memory efficient image loading with size
+ * restriction and attempts to use hardware bitmaps when sensible.
+ */
+@SysUISingleton
+class ImageLoader
+@Inject
+constructor(
+    private val defaultContext: Context,
+    @Background private val backgroundDispatcher: CoroutineDispatcher
+) {
+
+    /** Source of the image data. */
+    sealed interface Source
+
+    /**
+     * Load image from a Resource ID. If the resource is part of another package or if it requires
+     * tinting, pass in a correct [Context].
+     */
+    data class Res(@DrawableRes val resId: Int, val context: Context?) : Source {
+        constructor(@DrawableRes resId: Int) : this(resId, null)
+    }
+
+    /** Load image from a Uri. */
+    data class Uri(val uri: android.net.Uri) : Source {
+        constructor(uri: String) : this(android.net.Uri.parse(uri))
+    }
+
+    /** Load image from a [File]. */
+    data class File(val file: java.io.File) : Source {
+        constructor(path: String) : this(java.io.File(path))
+    }
+
+    /** Load image from an [InputStream]. */
+    data class InputStream(val inputStream: java.io.InputStream, val context: Context?) : Source {
+        constructor(inputStream: java.io.InputStream) : this(inputStream, null)
+    }
+
+    /**
+     * Loads passed [Source] on a background thread and returns the [Bitmap].
+     *
+     * Maximum height and width can be passed as optional parameters - the image decoder will make
+     * sure to keep the decoded drawable size within those passed constraints while keeping aspect
+     * ratio.
+     *
+     * @param maxWidth Maximum width of the returned drawable (if able). 0 means no restriction. Set
+     *   to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param maxHeight Maximum height of the returned drawable (if able). 0 means no restriction.
+     *   Set to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param allocator Allocator to use for the loaded drawable - one of [ImageDecoder] allocator
+     *   ints. Use [ImageDecoder.ALLOCATOR_SOFTWARE] to force software bitmap.
+     * @return loaded [Bitmap] or `null` if loading failed.
+     */
+    @AnyThread
+    suspend fun loadBitmap(
+        source: Source,
+        @Px maxWidth: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        @Px maxHeight: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        allocator: Int = ImageDecoder.ALLOCATOR_DEFAULT
+    ): Bitmap? =
+        withContext(backgroundDispatcher) { loadBitmapSync(source, maxWidth, maxHeight, allocator) }
+
+    /**
+     * Loads passed [Source] synchronously and returns the [Bitmap].
+     *
+     * Maximum height and width can be passed as optional parameters - the image decoder will make
+     * sure to keep the decoded drawable size within those passed constraints while keeping aspect
+     * ratio.
+     *
+     * @param maxWidth Maximum width of the returned drawable (if able). 0 means no restriction. Set
+     *   to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param maxHeight Maximum height of the returned drawable (if able). 0 means no restriction.
+     *   Set to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param allocator Allocator to use for the loaded drawable - one of [ImageDecoder] allocator
+     *   ints. Use [ImageDecoder.ALLOCATOR_SOFTWARE] to force software bitmap.
+     * @return loaded [Bitmap] or `null` if loading failed.
+     */
+    @WorkerThread
+    fun loadBitmapSync(
+        source: Source,
+        @Px maxWidth: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        @Px maxHeight: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        allocator: Int = ImageDecoder.ALLOCATOR_DEFAULT
+    ): Bitmap? {
+        return try {
+            loadBitmapSync(
+                toImageDecoderSource(source, defaultContext),
+                maxWidth,
+                maxHeight,
+                allocator
+            )
+        } catch (e: NotFoundException) {
+            Log.w(TAG, "Couldn't load resource $source", e)
+            null
+        }
+    }
+
+    /**
+     * Loads passed [ImageDecoder.Source] synchronously and returns the drawable.
+     *
+     * Maximum height and width can be passed as optional parameters - the image decoder will make
+     * sure to keep the decoded drawable size within those passed constraints (while keeping aspect
+     * ratio).
+     *
+     * @param maxWidth Maximum width of the returned drawable (if able). 0 means no restriction. Set
+     *   to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param maxHeight Maximum height of the returned drawable (if able). 0 means no restriction.
+     *   Set to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param allocator Allocator to use for the loaded drawable - one of [ImageDecoder] allocator
+     *   ints. Use [ImageDecoder.ALLOCATOR_SOFTWARE] to force software bitmap.
+     * @return loaded [Bitmap] or `null` if loading failed.
+     */
+    @WorkerThread
+    fun loadBitmapSync(
+        source: ImageDecoder.Source,
+        @Px maxWidth: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        @Px maxHeight: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        allocator: Int = ImageDecoder.ALLOCATOR_DEFAULT
+    ): Bitmap? {
+        return try {
+            ImageDecoder.decodeBitmap(source) { decoder, info, _ ->
+                configureDecoderForMaximumSize(decoder, info.size, maxWidth, maxHeight)
+                decoder.allocator = allocator
+            }
+        } catch (e: IOException) {
+            Log.w(TAG, "Failed to load source $source", e)
+            return null
+        } catch (e: DecodeException) {
+            Log.w(TAG, "Failed to decode source $source", e)
+            return null
+        }
+    }
+
+    /**
+     * Loads passed [Source] on a background thread and returns the [Drawable].
+     *
+     * Maximum height and width can be passed as optional parameters - the image decoder will make
+     * sure to keep the decoded drawable size within those passed constraints (while keeping aspect
+     * ratio).
+     *
+     * @param maxWidth Maximum width of the returned drawable (if able). 0 means no restriction. Set
+     *   to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param maxHeight Maximum height of the returned drawable (if able). 0 means no restriction.
+     *   Set to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param allocator Allocator to use for the loaded drawable - one of [ImageDecoder] allocator
+     *   ints. Use [ImageDecoder.ALLOCATOR_SOFTWARE] to force software bitmap.
+     * @return loaded [Drawable] or `null` if loading failed.
+     */
+    @AnyThread
+    suspend fun loadDrawable(
+        source: Source,
+        @Px maxWidth: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        @Px maxHeight: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        allocator: Int = ImageDecoder.ALLOCATOR_DEFAULT
+    ): Drawable? =
+        withContext(backgroundDispatcher) {
+            loadDrawableSync(source, maxWidth, maxHeight, allocator)
+        }
+
+    /**
+     * Loads passed [Icon] on a background thread and returns the drawable.
+     *
+     * Maximum height and width can be passed as optional parameters - the image decoder will make
+     * sure to keep the decoded drawable size within those passed constraints (while keeping aspect
+     * ratio).
+     *
+     * @param context Alternate context to use for resource loading (for e.g. cross-process use)
+     * @param maxWidth Maximum width of the returned drawable (if able). 0 means no restriction. Set
+     *   to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param maxHeight Maximum height of the returned drawable (if able). 0 means no restriction.
+     *   Set to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param allocator Allocator to use for the loaded drawable - one of [ImageDecoder] allocator
+     *   ints. Use [ImageDecoder.ALLOCATOR_SOFTWARE] to force software bitmap.
+     * @return loaded [Drawable] or `null` if loading failed.
+     */
+    @AnyThread
+    suspend fun loadDrawable(
+        icon: Icon,
+        context: Context = defaultContext,
+        @Px maxWidth: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        @Px maxHeight: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        allocator: Int = ImageDecoder.ALLOCATOR_DEFAULT
+    ): Drawable? =
+        withContext(backgroundDispatcher) {
+            loadDrawableSync(icon, context, maxWidth, maxHeight, allocator)
+        }
+
+    /**
+     * Loads passed [Source] synchronously and returns the drawable.
+     *
+     * Maximum height and width can be passed as optional parameters - the image decoder will make
+     * sure to keep the decoded drawable size within those passed constraints (while keeping aspect
+     * ratio).
+     *
+     * @param maxWidth Maximum width of the returned drawable (if able). 0 means no restriction. Set
+     *   to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param maxHeight Maximum height of the returned drawable (if able). 0 means no restriction.
+     *   Set to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param allocator Allocator to use for the loaded drawable - one of [ImageDecoder] allocator
+     *   ints. Use [ImageDecoder.ALLOCATOR_SOFTWARE] to force software bitmap.
+     * @return loaded [Drawable] or `null` if loading failed.
+     */
+    @WorkerThread
+    @SuppressLint("UseCompatLoadingForDrawables")
+    fun loadDrawableSync(
+        source: Source,
+        @Px maxWidth: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        @Px maxHeight: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        allocator: Int = ImageDecoder.ALLOCATOR_DEFAULT
+    ): Drawable? {
+        return try {
+            loadDrawableSync(
+                toImageDecoderSource(source, defaultContext),
+                maxWidth,
+                maxHeight,
+                allocator
+            )
+                ?:
+                // If we have a resource, retry fallback using the "normal" Resource loading system.
+                // This will come into effect in cases like trying to load AnimatedVectorDrawable.
+                if (source is Res) {
+                    val context = source.context ?: defaultContext
+                    ResourcesCompat.getDrawable(context.resources, source.resId, context.theme)
+                } else {
+                    null
+                }
+        } catch (e: NotFoundException) {
+            Log.w(TAG, "Couldn't load resource $source", e)
+            null
+        }
+    }
+
+    /**
+     * Loads passed [ImageDecoder.Source] synchronously and returns the drawable.
+     *
+     * Maximum height and width can be passed as optional parameters - the image decoder will make
+     * sure to keep the decoded drawable size within those passed constraints (while keeping aspect
+     * ratio).
+     *
+     * @param maxWidth Maximum width of the returned drawable (if able). 0 means no restriction. Set
+     *   to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param maxHeight Maximum height of the returned drawable (if able). 0 means no restriction.
+     *   Set to [DEFAULT_MAX_SAFE_BITMAP_SIZE_PX] by default.
+     * @param allocator Allocator to use for the loaded drawable - one of [ImageDecoder] allocator
+     *   ints. Use [ImageDecoder.ALLOCATOR_SOFTWARE] to force software bitmap.
+     * @return loaded [Drawable] or `null` if loading failed.
+     */
+    @WorkerThread
+    fun loadDrawableSync(
+        source: ImageDecoder.Source,
+        @Px maxWidth: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        @Px maxHeight: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        allocator: Int = ImageDecoder.ALLOCATOR_DEFAULT
+    ): Drawable? {
+        return try {
+            ImageDecoder.decodeDrawable(source) { decoder, info, _ ->
+                configureDecoderForMaximumSize(decoder, info.size, maxWidth, maxHeight)
+                decoder.allocator = allocator
+            }
+        } catch (e: IOException) {
+            Log.w(TAG, "Failed to load source $source", e)
+            return null
+        } catch (e: DecodeException) {
+            Log.w(TAG, "Failed to decode source $source", e)
+            return null
+        }
+    }
+
+    /** Loads icon drawable while attempting to size restrict the drawable. */
+    @WorkerThread
+    fun loadDrawableSync(
+        icon: Icon,
+        context: Context = defaultContext,
+        @Px maxWidth: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        @Px maxHeight: Int = DEFAULT_MAX_SAFE_BITMAP_SIZE_PX,
+        allocator: Int = ImageDecoder.ALLOCATOR_DEFAULT
+    ): Drawable? {
+        return when (icon.type) {
+            Icon.TYPE_URI,
+            Icon.TYPE_URI_ADAPTIVE_BITMAP -> {
+                val source = ImageDecoder.createSource(context.contentResolver, icon.uri)
+                loadDrawableSync(source, maxWidth, maxHeight, allocator)
+            }
+            Icon.TYPE_RESOURCE -> {
+                val resources = resolveResourcesForIcon(context, icon)
+                resources?.let {
+                    loadDrawableSync(
+                        ImageDecoder.createSource(it, icon.resId),
+                        maxWidth,
+                        maxHeight,
+                        allocator
+                    )
+                }
+                // Fallback to non-ImageDecoder load if the attempt failed (e.g. the resource
+                // is a Vector drawable which ImageDecoder doesn't support.)
+                ?: icon.loadDrawable(context)
+            }
+            Icon.TYPE_BITMAP -> {
+                BitmapDrawable(context.resources, icon.bitmap)
+            }
+            Icon.TYPE_ADAPTIVE_BITMAP -> {
+                AdaptiveIconDrawable(null, BitmapDrawable(context.resources, icon.bitmap))
+            }
+            Icon.TYPE_DATA -> {
+                loadDrawableSync(
+                    ImageDecoder.createSource(icon.dataBytes, icon.dataOffset, icon.dataLength),
+                    maxWidth,
+                    maxHeight,
+                    allocator
+                )
+            }
+            else -> {
+                // We don't recognize this icon, just fallback.
+                icon.loadDrawable(context)
+            }
+        }?.let { drawable ->
+            // Icons carry tint which we need to propagate down to a Drawable.
+            tintDrawable(icon, drawable)
+            drawable
+        }
+    }
+
+    companion object {
+        const val TAG = "ImageLoader"
+
+        // 4096 is a reasonable default - most devices will support 4096x4096 texture size for
+        // Canvas rendering and by default we SystemUI has no need to render larger bitmaps.
+        // This prevents exceptions and crashes if the code accidentally loads larger Bitmap
+        // and then attempts to render it on Canvas.
+        // It can always be overridden by the parameters.
+        const val DEFAULT_MAX_SAFE_BITMAP_SIZE_PX = 4096
+
+        /**
+         * This constant signals that ImageLoader shouldn't attempt to resize the passed bitmap in a
+         * given dimension.
+         *
+         * Set both maxWidth and maxHeight to [DO_NOT_RESIZE] if you wish to prevent resizing.
+         */
+        const val DO_NOT_RESIZE = 0
+
+        /** Maps [Source] to [ImageDecoder.Source]. */
+        private fun toImageDecoderSource(source: Source, defaultContext: Context) =
+            when (source) {
+                is Res -> {
+                    val context = source.context ?: defaultContext
+                    ImageDecoder.createSource(context.resources, source.resId)
+                }
+                is File -> ImageDecoder.createSource(source.file)
+                is Uri -> ImageDecoder.createSource(defaultContext.contentResolver, source.uri)
+                is InputStream -> {
+                    val context = source.context ?: defaultContext
+                    ImageDecoder.createSource(context.resources, source.inputStream)
+                }
+            }
+
+        /**
+         * This sets target size on the image decoder to conform to the maxWidth / maxHeight
+         * parameters. The parameters are chosen to keep the existing drawable aspect ratio.
+         */
+        @AnyThread
+        private fun configureDecoderForMaximumSize(
+            decoder: ImageDecoder,
+            imgSize: Size,
+            @Px maxWidth: Int,
+            @Px maxHeight: Int
+        ) {
+            if (maxWidth == DO_NOT_RESIZE && maxHeight == DO_NOT_RESIZE) {
+                return
+            }
+
+            if (imgSize.width <= maxWidth && imgSize.height <= maxHeight) {
+                return
+            }
+
+            // Determine the scale factor for each dimension so it fits within the set constraint
+            val wScale =
+                if (maxWidth <= 0) {
+                    1.0f
+                } else {
+                    maxWidth.toFloat() / imgSize.width.toFloat()
+                }
+
+            val hScale =
+                if (maxHeight <= 0) {
+                    1.0f
+                } else {
+                    maxHeight.toFloat() / imgSize.height.toFloat()
+                }
+
+            // Scale down to the dimension that demands larger scaling (smaller scale factor).
+            // Use the same scale for both dimensions to keep the aspect ratio.
+            val scale = min(wScale, hScale)
+            if (scale < 1.0f) {
+                val targetWidth = (imgSize.width * scale).toInt()
+                val targetHeight = (imgSize.height * scale).toInt()
+                if (Log.isLoggable(TAG, Log.DEBUG)) {
+                    Log.d(TAG, "Configured image size to $targetWidth x $targetHeight")
+                }
+
+                decoder.setTargetSize(targetWidth, targetHeight)
+            }
+        }
+
+        /**
+         * Attempts to retrieve [Resources] class required to load the passed icon. Icons can
+         * originate from other processes so we need to make sure we load them from the right
+         * package source.
+         *
+         * @return [Resources] to load the icon drawble or null if icon doesn't carry a resource or
+         *   the resource package couldn't be resolved.
+         */
+        @WorkerThread
+        private fun resolveResourcesForIcon(context: Context, icon: Icon): Resources? {
+            if (icon.type != Icon.TYPE_RESOURCE) {
+                return null
+            }
+
+            val resources = icon.resources
+            if (resources != null) {
+                return resources
+            }
+
+            val resPackage = icon.resPackage
+            if (
+                resPackage == null || resPackage.isEmpty() || context.packageName.equals(resPackage)
+            ) {
+                return context.resources
+            }
+
+            if ("android" == resPackage) {
+                return Resources.getSystem()
+            }
+
+            val pm = context.packageManager
+            try {
+                val ai =
+                    pm.getApplicationInfo(
+                        resPackage,
+                        PackageManager.MATCH_UNINSTALLED_PACKAGES or
+                            PackageManager.GET_SHARED_LIBRARY_FILES
+                    )
+                if (ai != null) {
+                    return pm.getResourcesForApplication(ai)
+                } else {
+                    Log.w(TAG, "Failed to resolve application info for $resPackage")
+                }
+            } catch (e: PackageManager.NameNotFoundException) {
+                Log.w(TAG, "Failed to resolve resource package", e)
+                return null
+            }
+            return null
+        }
+
+        /** Applies tinting from [Icon] to the passed [Drawable]. */
+        @AnyThread
+        private fun tintDrawable(icon: Icon, drawable: Drawable) {
+            if (icon.hasTint()) {
+                drawable.mutate()
+                drawable.setTintList(icon.tintList)
+                drawable.setTintBlendMode(icon.tintBlendMode)
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt b/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt
index a173f8b..2ef5e19 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt
@@ -90,9 +90,9 @@
 
     private fun updateResources() {
         context.resources.apply {
-            filledRectangleColor = getColor(R.color.backlight_indicator_step_filled)
-            emptyRectangleColor = getColor(R.color.backlight_indicator_step_empty)
-            backgroundColor = getColor(R.color.backlight_indicator_background)
+            filledRectangleColor = getColor(R.color.backlight_indicator_step_filled, context.theme)
+            emptyRectangleColor = getColor(R.color.backlight_indicator_step_empty, context.theme)
+            backgroundColor = getColor(R.color.backlight_indicator_background, context.theme)
             rootProperties =
                 RootProperties(
                     cornerRadius =
@@ -224,7 +224,6 @@
 
     private fun setWindowTitle() {
         val attrs = window.attributes
-        // TODO(b/271796169): check if title needs to be a translatable resource.
         attrs.title = "KeyboardBacklightDialog"
         attrs?.y = dialogBottomMargin
         window.attributes = attrs
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
index eef7ccc..107e685 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
@@ -231,22 +231,20 @@
                 );
             }
 
-            public void mergeAnimation(IBinder transition, TransitionInfo info,
-                    SurfaceControl.Transaction t, IBinder mergeTarget,
-                    IRemoteTransitionFinishedCallback finishCallback) {
+            public void mergeAnimation(IBinder candidateTransition, TransitionInfo candidateInfo,
+                    SurfaceControl.Transaction candidateT, IBinder currentTransition,
+                    IRemoteTransitionFinishedCallback candidateFinishCallback) {
                 try {
-                    final IRemoteTransitionFinishedCallback origFinishCB;
+                    final IRemoteTransitionFinishedCallback currentFinishCB;
                     synchronized (mFinishCallbacks) {
-                        origFinishCB = mFinishCallbacks.remove(transition);
+                        currentFinishCB = mFinishCallbacks.remove(currentTransition);
                     }
-                    info.releaseAllSurfaces();
-                    t.close();
-                    if (origFinishCB == null) {
-                        // already finished (or not started yet), so do nothing.
+                    if (currentFinishCB == null) {
+                        Slog.e(TAG, "Called mergeAnimation, but finish callback is missing");
                         return;
                     }
                     runner.onAnimationCancelled(false /* isKeyguardOccluded */);
-                    origFinishCB.onTransitionFinished(null /* wct */, null /* t */);
+                    currentFinishCB.onTransitionFinished(null /* wct */, null /* t */);
                 } catch (RemoteException e) {
                     // nothing, we'll just let it finish on its own I guess.
                 }
@@ -304,13 +302,13 @@
         Slog.d(TAG, "KeyguardService registerRemote: TRANSIT_KEYGUARD_GOING_AWAY");
         TransitionFilter f = new TransitionFilter();
         f.mFlags = TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
-        mShellTransitions.registerRemote(f,
-                new RemoteTransition(wrap(mExitAnimationRunner), getIApplicationThread()));
+        mShellTransitions.registerRemote(f, new RemoteTransition(
+                wrap(mExitAnimationRunner), getIApplicationThread(), "ExitKeyguard"));
 
         Slog.d(TAG, "KeyguardService registerRemote: TRANSIT_KEYGUARD_(UN)OCCLUDE");
         // Register for occluding
         final RemoteTransition occludeTransition = new RemoteTransition(
-                mOccludeAnimation, getIApplicationThread());
+                mOccludeAnimation, getIApplicationThread(), "KeyguardOcclude");
         f = new TransitionFilter();
         f.mFlags = TRANSIT_FLAG_KEYGUARD_LOCKED;
         f.mRequirements = new TransitionFilter.Requirement[]{
@@ -329,7 +327,7 @@
 
         // Now register for un-occlude.
         final RemoteTransition unoccludeTransition = new RemoteTransition(
-                mUnoccludeAnimation, getIApplicationThread());
+                mUnoccludeAnimation, getIApplicationThread(), "KeyguardUnocclude");
         f = new TransitionFilter();
         f.mFlags = TRANSIT_FLAG_KEYGUARD_LOCKED;
         f.mRequirements = new TransitionFilter.Requirement[]{
@@ -384,7 +382,7 @@
         f.mRequirements[1].mModes = new int[]{TRANSIT_CLOSE, TRANSIT_TO_BACK};
         mShellTransitions.registerRemote(f, new RemoteTransition(
                 wrap(mKeyguardViewMediator.getOccludeByDreamAnimationRunner()),
-                getIApplicationThread()));
+                getIApplicationThread(), "KeyguardOccludeByDream"));
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 0825435..c102c5b5 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -953,10 +953,15 @@
 
                 @Override
                 public void onAnimationCancelled(boolean isKeyguardOccluded) {
-                    if (mOccludeByDreamAnimator != null) {
-                        mOccludeByDreamAnimator.cancel();
-                    }
-                    setOccluded(isKeyguardOccluded /* isOccluded */, false /* animate */);
+                    mContext.getMainExecutor().execute(() -> {
+                        if (mOccludeByDreamAnimator != null) {
+                            mOccludeByDreamAnimator.cancel();
+                        }
+                    });
+                    // The value of isKeyguardOccluded here may come from mergeAnimation, which
+                    // isn't reliable. In all cases, after running or cancelling this animation,
+                    // keyguard should be occluded.
+                    setOccluded(true /* isOccluded */, false /* animate */);
                     if (DEBUG) {
                         Log.d(TAG, "Occlude by Dream animation cancelled. Occluded state is now: "
                                 + mOccluded);
@@ -2851,14 +2856,14 @@
                         + " wasShowing=" + wasShowing);
             }
 
+            mKeyguardUnlockAnimationControllerLazy.get()
+                    .notifyFinishedKeyguardExitAnimation(cancelled);
             finishSurfaceBehindRemoteAnimation(cancelled);
 
             // Dispatch the callback on animation finishes.
             mUpdateMonitor.dispatchKeyguardDismissAnimationFinished();
         });
 
-        mKeyguardUnlockAnimationControllerLazy.get().notifyFinishedKeyguardExitAnimation(
-                cancelled);
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
index cb89106..6ac51cd 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
@@ -43,6 +43,7 @@
 import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
 import com.android.systemui.keyguard.KeyguardViewMediator;
 import com.android.systemui.keyguard.data.quickaffordance.KeyguardDataQuickAffordanceModule;
+import com.android.systemui.keyguard.data.repository.KeyguardFaceAuthModule;
 import com.android.systemui.keyguard.data.repository.KeyguardRepositoryModule;
 import com.android.systemui.keyguard.domain.interactor.StartKeyguardTransitionModule;
 import com.android.systemui.keyguard.domain.quickaffordance.KeyguardQuickAffordanceModule;
@@ -66,8 +67,6 @@
 import dagger.Lazy;
 import dagger.Module;
 import dagger.Provides;
-import kotlinx.coroutines.CoroutineDispatcher;
-import kotlinx.coroutines.CoroutineScope;
 
 /**
  * Dagger Module providing keyguard.
@@ -82,6 +81,7 @@
             KeyguardDataQuickAffordanceModule.class,
             KeyguardQuickAffordanceModule.class,
             KeyguardRepositoryModule.class,
+            KeyguardFaceAuthModule.class,
             StartKeyguardTransitionModule.class,
         })
 public class KeyguardModule {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt
index d5129a6..09002fd 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt
@@ -87,6 +87,13 @@
      */
     val isStrongBiometricAllowed: StateFlow<Boolean>
 
+    /**
+     * Whether the current user is allowed to use a convenience biometric for device entry based on
+     * Android Security policies. If false, the user may be able to use strong biometric or primary
+     * authentication for device entry.
+     */
+    val isNonStrongBiometricAllowed: StateFlow<Boolean>
+
     /** Whether fingerprint feature is enabled for the current user by the DevicePolicy */
     val isFingerprintEnabledByDevicePolicy: StateFlow<Boolean>
 
@@ -276,6 +283,16 @@
             )
         )
 
+    override val isNonStrongBiometricAllowed: StateFlow<Boolean> =
+        strongAuthTracker.isNonStrongBiometricAllowed.stateIn(
+            scope,
+            SharingStarted.Eagerly,
+            strongAuthTracker.isBiometricAllowedForUser(
+                false,
+                userRepository.getSelectedUserInfo().id
+            )
+        )
+
     override val isFingerprintEnabledByDevicePolicy: StateFlow<Boolean> =
         selectedUserId
             .flatMapLatest { userId ->
@@ -297,40 +314,62 @@
 private class StrongAuthTracker(private val userRepository: UserRepository, context: Context?) :
     LockPatternUtils.StrongAuthTracker(context) {
 
-    private val _authFlags =
+    // Backing field for onStrongAuthRequiredChanged
+    private val _strongAuthFlags =
         MutableStateFlow(
             StrongAuthenticationFlags(currentUserId, getStrongAuthForUser(currentUserId))
         )
 
+    // Backing field for onIsNonStrongBiometricAllowedChanged
+    private val _nonStrongBiometricAllowed =
+        MutableStateFlow(
+            Pair(currentUserId, isNonStrongBiometricAllowedAfterIdleTimeout(currentUserId))
+        )
+
     val currentUserAuthFlags: Flow<StrongAuthenticationFlags> =
         userRepository.selectedUserInfo
             .map { it.id }
             .distinctUntilChanged()
-            .flatMapLatest { currUserId ->
-                _authFlags
-                    .filter { it.userId == currUserId }
+            .flatMapLatest { userId ->
+                _strongAuthFlags
+                    .filter { it.userId == userId }
                     .onEach { Log.d(TAG, "currentUser authFlags changed, new value: $it") }
                     .onStart {
-                        emit(
-                            StrongAuthenticationFlags(
-                                currentUserId,
-                                getStrongAuthForUser(currentUserId)
-                            )
-                        )
+                        emit(StrongAuthenticationFlags(userId, getStrongAuthForUser(userId)))
                     }
             }
 
+    /** isStrongBiometricAllowed for the current user. */
     val isStrongBiometricAllowed: Flow<Boolean> =
         currentUserAuthFlags.map { isBiometricAllowedForUser(true, it.userId) }
 
+    /** isNonStrongBiometricAllowed for the current user. */
+    val isNonStrongBiometricAllowed: Flow<Boolean> =
+        userRepository.selectedUserInfo
+            .map { it.id }
+            .distinctUntilChanged()
+            .flatMapLatest { userId ->
+                _nonStrongBiometricAllowed
+                    .filter { it.first == userId }
+                    .map { it.second }
+                    .onEach { Log.d(TAG, "isNonStrongBiometricAllowed changed for current user") }
+                    .onStart { emit(isNonStrongBiometricAllowedAfterIdleTimeout(userId)) }
+            }
+
     private val currentUserId
         get() = userRepository.getSelectedUserInfo().id
 
     override fun onStrongAuthRequiredChanged(userId: Int) {
         val newFlags = getStrongAuthForUser(userId)
-        _authFlags.value = StrongAuthenticationFlags(userId, newFlags)
+        _strongAuthFlags.value = StrongAuthenticationFlags(userId, newFlags)
         Log.d(TAG, "onStrongAuthRequiredChanged for userId: $userId, flag value: $newFlags")
     }
+
+    override fun onIsNonStrongBiometricAllowedChanged(userId: Int) {
+        val allowed = isNonStrongBiometricAllowedAfterIdleTimeout(userId)
+        _nonStrongBiometricAllowed.value = Pair(userId, allowed)
+        Log.d(TAG, "onIsNonStrongBiometricAllowedChanged for userId: $userId, $allowed")
+    }
 }
 
 private fun DevicePolicyManager.isFaceDisabled(userId: Int): Boolean =
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt
new file mode 100644
index 0000000..56e7398
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt
@@ -0,0 +1,540 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.keyguard.data.repository
+
+import android.app.StatusBarManager
+import android.content.Context
+import android.hardware.face.FaceAuthenticateOptions
+import android.hardware.face.FaceManager
+import android.os.CancellationSignal
+import com.android.internal.logging.InstanceId
+import com.android.internal.logging.UiEventLogger
+import com.android.keyguard.FaceAuthUiEvent
+import com.android.systemui.Dumpable
+import com.android.systemui.R
+import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
+import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.dump.DumpManager
+import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.shared.model.AcquiredAuthenticationStatus
+import com.android.systemui.keyguard.shared.model.AuthenticationStatus
+import com.android.systemui.keyguard.shared.model.DetectionStatus
+import com.android.systemui.keyguard.shared.model.ErrorAuthenticationStatus
+import com.android.systemui.keyguard.shared.model.FailedAuthenticationStatus
+import com.android.systemui.keyguard.shared.model.HelpAuthenticationStatus
+import com.android.systemui.keyguard.shared.model.SuccessAuthenticationStatus
+import com.android.systemui.keyguard.shared.model.WakefulnessModel
+import com.android.systemui.log.FaceAuthenticationLogger
+import com.android.systemui.log.SessionTracker
+import com.android.systemui.statusbar.phone.KeyguardBypassController
+import com.android.systemui.user.data.repository.UserRepository
+import java.io.PrintWriter
+import java.util.Arrays
+import java.util.stream.Collectors
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.merge
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+/**
+ * API to run face authentication and detection for device entry / on keyguard (as opposed to the
+ * biometric prompt).
+ */
+interface DeviceEntryFaceAuthRepository {
+    /** Provide the current face authentication state for device entry. */
+    val isAuthenticated: Flow<Boolean>
+
+    /** Whether face auth can run at this point. */
+    val canRunFaceAuth: Flow<Boolean>
+
+    /** Provide the current status of face authentication. */
+    val authenticationStatus: Flow<AuthenticationStatus>
+
+    /** Provide the current status of face detection. */
+    val detectionStatus: Flow<DetectionStatus>
+
+    /** Current state of whether face authentication is locked out or not. */
+    val isLockedOut: Flow<Boolean>
+
+    /** Current state of whether face authentication is running. */
+    val isAuthRunning: Flow<Boolean>
+
+    /**
+     * Trigger face authentication.
+     *
+     * [uiEvent] provided should be logged whenever face authentication runs. Invocation should be
+     * ignored if face authentication is already running. Results should be propagated through
+     * [authenticationStatus]
+     *
+     * Run only face detection when [fallbackToDetection] is true and [canRunFaceAuth] is false.
+     */
+    suspend fun authenticate(uiEvent: FaceAuthUiEvent, fallbackToDetection: Boolean = false)
+
+    /** Stop currently running face authentication or detection. */
+    fun cancel()
+}
+
+@SysUISingleton
+class DeviceEntryFaceAuthRepositoryImpl
+@Inject
+constructor(
+    context: Context,
+    private val faceManager: FaceManager? = null,
+    private val userRepository: UserRepository,
+    private val keyguardBypassController: KeyguardBypassController? = null,
+    @Application private val applicationScope: CoroutineScope,
+    @Main private val mainDispatcher: CoroutineDispatcher,
+    private val sessionTracker: SessionTracker,
+    private val uiEventsLogger: UiEventLogger,
+    private val faceAuthLogger: FaceAuthenticationLogger,
+    private val biometricSettingsRepository: BiometricSettingsRepository,
+    private val deviceEntryFingerprintAuthRepository: DeviceEntryFingerprintAuthRepository,
+    private val trustRepository: TrustRepository,
+    private val keyguardRepository: KeyguardRepository,
+    private val keyguardInteractor: KeyguardInteractor,
+    private val alternateBouncerInteractor: AlternateBouncerInteractor,
+    dumpManager: DumpManager,
+) : DeviceEntryFaceAuthRepository, Dumpable {
+    private var authCancellationSignal: CancellationSignal? = null
+    private var detectCancellationSignal: CancellationSignal? = null
+    private var faceAcquiredInfoIgnoreList: Set<Int>
+
+    private var cancelNotReceivedHandlerJob: Job? = null
+
+    private val _authenticationStatus: MutableStateFlow<AuthenticationStatus?> =
+        MutableStateFlow(null)
+    override val authenticationStatus: Flow<AuthenticationStatus>
+        get() = _authenticationStatus.filterNotNull()
+
+    private val _detectionStatus = MutableStateFlow<DetectionStatus?>(null)
+    override val detectionStatus: Flow<DetectionStatus>
+        get() = _detectionStatus.filterNotNull()
+
+    private val _isLockedOut = MutableStateFlow(false)
+    override val isLockedOut: StateFlow<Boolean> = _isLockedOut
+
+    val isDetectionSupported =
+        faceManager?.sensorPropertiesInternal?.firstOrNull()?.supportsFaceDetection ?: false
+
+    private val _isAuthRunning = MutableStateFlow(false)
+    override val isAuthRunning: StateFlow<Boolean>
+        get() = _isAuthRunning
+
+    private val keyguardSessionId: InstanceId?
+        get() = sessionTracker.getSessionId(StatusBarManager.SESSION_KEYGUARD)
+
+    private val _canRunFaceAuth = MutableStateFlow(true)
+    override val canRunFaceAuth: StateFlow<Boolean>
+        get() = _canRunFaceAuth
+
+    private val canRunDetection = MutableStateFlow(false)
+
+    private val _isAuthenticated = MutableStateFlow(false)
+    override val isAuthenticated: Flow<Boolean>
+        get() = _isAuthenticated
+
+    private val bypassEnabled: Flow<Boolean> =
+        keyguardBypassController?.let {
+            conflatedCallbackFlow {
+                val callback =
+                    object : KeyguardBypassController.OnBypassStateChangedListener {
+                        override fun onBypassStateChanged(isEnabled: Boolean) {
+                            trySendWithFailureLogging(isEnabled, TAG, "BypassStateChanged")
+                        }
+                    }
+                it.registerOnBypassStateChangedListener(callback)
+                trySendWithFailureLogging(it.bypassEnabled, TAG, "BypassStateChanged")
+                awaitClose { it.unregisterOnBypassStateChangedListener(callback) }
+            }
+        }
+            ?: flowOf(false)
+
+    private val faceLockoutResetCallback =
+        object : FaceManager.LockoutResetCallback() {
+            override fun onLockoutReset(sensorId: Int) {
+                _isLockedOut.value = false
+            }
+        }
+
+    init {
+        faceManager?.addLockoutResetCallback(faceLockoutResetCallback)
+        faceAcquiredInfoIgnoreList =
+            Arrays.stream(
+                    context.resources.getIntArray(
+                        R.array.config_face_acquire_device_entry_ignorelist
+                    )
+                )
+                .boxed()
+                .collect(Collectors.toSet())
+        dumpManager.registerCriticalDumpable("DeviceEntryFaceAuthRepositoryImpl", this)
+
+        observeFaceAuthGatingChecks()
+        observeFaceDetectGatingChecks()
+        observeFaceAuthResettingConditions()
+    }
+
+    private fun observeFaceAuthResettingConditions() {
+        // Clear auth status when keyguard is going away or when the user is switching.
+        merge(keyguardRepository.isKeyguardGoingAway, userRepository.userSwitchingInProgress)
+            .onEach { goingAwayOrUserSwitchingInProgress ->
+                if (goingAwayOrUserSwitchingInProgress) {
+                    _isAuthenticated.value = false
+                }
+            }
+            .launchIn(applicationScope)
+    }
+
+    private fun observeFaceDetectGatingChecks() {
+        // Face detection can run only when lockscreen bypass is enabled
+        // & detection is supported & biometric unlock is not allowed.
+        listOf(
+                canFaceAuthOrDetectRun(),
+                logAndObserve(bypassEnabled, "bypassEnabled"),
+                logAndObserve(
+                    biometricSettingsRepository.isNonStrongBiometricAllowed.isFalse(),
+                    "nonStrongBiometricIsNotAllowed"
+                ),
+                // We don't want to run face detect if it's not possible to authenticate with FP
+                // from the bouncer. UDFPS is the only fp sensor type that won't support this.
+                logAndObserve(
+                    and(isUdfps(), deviceEntryFingerprintAuthRepository.isRunning).isFalse(),
+                    "udfpsAuthIsNotPossibleAnymore"
+                )
+            )
+            .reduce(::and)
+            .distinctUntilChanged()
+            .onEach {
+                faceAuthLogger.canRunDetectionChanged(it)
+                canRunDetection.value = it
+                if (!it) {
+                    cancelDetection()
+                }
+            }
+            .launchIn(applicationScope)
+    }
+
+    private fun isUdfps() =
+        deviceEntryFingerprintAuthRepository.availableFpSensorType.map {
+            it == BiometricType.UNDER_DISPLAY_FINGERPRINT
+        }
+
+    private fun canFaceAuthOrDetectRun(): Flow<Boolean> {
+        return listOf(
+                logAndObserve(biometricSettingsRepository.isFaceEnrolled, "isFaceEnrolled"),
+                logAndObserve(
+                    biometricSettingsRepository.isFaceAuthenticationEnabled,
+                    "isFaceAuthenticationEnabled"
+                ),
+                logAndObserve(
+                    userRepository.userSwitchingInProgress.isFalse(),
+                    "userSwitchingNotInProgress"
+                ),
+                logAndObserve(
+                    keyguardRepository.isKeyguardGoingAway.isFalse(),
+                    "keyguardNotGoingAway"
+                ),
+                logAndObserve(
+                    keyguardRepository.wakefulness
+                        .map { WakefulnessModel.isSleepingOrStartingToSleep(it) }
+                        .isFalse(),
+                    "deviceNotSleepingOrNotStartingToSleep"
+                ),
+                logAndObserve(
+                    combine(
+                        keyguardInteractor.isSecureCameraActive,
+                        alternateBouncerInteractor.isVisible,
+                    ) { a, b ->
+                        !a || b
+                    },
+                    "secureCameraNotActiveOrAltBouncerIsShowing"
+                ),
+                logAndObserve(
+                    biometricSettingsRepository.isFaceAuthSupportedInCurrentPosture,
+                    "isFaceAuthSupportedInCurrentPosture"
+                ),
+                logAndObserve(
+                    biometricSettingsRepository.isCurrentUserInLockdown.isFalse(),
+                    "userHasNotLockedDownDevice"
+                )
+            )
+            .reduce(::and)
+    }
+
+    private fun observeFaceAuthGatingChecks() {
+        // Face auth can run only if all of the gating conditions are true.
+        listOf(
+                canFaceAuthOrDetectRun(),
+                logAndObserve(isLockedOut.isFalse(), "isNotLocked"),
+                logAndObserve(
+                    deviceEntryFingerprintAuthRepository.isLockedOut.isFalse(),
+                    "fpLockedOut"
+                ),
+                logAndObserve(trustRepository.isCurrentUserTrusted.isFalse(), "currentUserTrusted"),
+                logAndObserve(
+                    biometricSettingsRepository.isNonStrongBiometricAllowed,
+                    "nonStrongBiometricIsAllowed"
+                ),
+                logAndObserve(
+                    userRepository.selectedUserInfo.map { it.isPrimary },
+                    "userIsPrimaryUser"
+                ),
+            )
+            .reduce(::and)
+            .distinctUntilChanged()
+            .onEach {
+                faceAuthLogger.canFaceAuthRunChanged(it)
+                _canRunFaceAuth.value = it
+                if (!it) {
+                    // Cancel currently running auth if any of the gating checks are false.
+                    faceAuthLogger.cancellingFaceAuth()
+                    cancel()
+                }
+            }
+            .launchIn(applicationScope)
+    }
+
+    private val faceAuthCallback =
+        object : FaceManager.AuthenticationCallback() {
+            override fun onAuthenticationFailed() {
+                _authenticationStatus.value = FailedAuthenticationStatus
+                _isAuthenticated.value = false
+                faceAuthLogger.authenticationFailed()
+                onFaceAuthRequestCompleted()
+            }
+
+            override fun onAuthenticationAcquired(acquireInfo: Int) {
+                _authenticationStatus.value = AcquiredAuthenticationStatus(acquireInfo)
+                faceAuthLogger.authenticationAcquired(acquireInfo)
+            }
+
+            override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) {
+                val errorStatus = ErrorAuthenticationStatus(errorCode, errString.toString())
+                if (errorStatus.isLockoutError()) {
+                    _isLockedOut.value = true
+                }
+                _authenticationStatus.value = errorStatus
+                _isAuthenticated.value = false
+                if (errorStatus.isCancellationError()) {
+                    cancelNotReceivedHandlerJob?.cancel()
+                    applicationScope.launch {
+                        faceAuthLogger.launchingQueuedFaceAuthRequest(
+                            faceAuthRequestedWhileCancellation
+                        )
+                        faceAuthRequestedWhileCancellation?.let { authenticate(it) }
+                        faceAuthRequestedWhileCancellation = null
+                    }
+                }
+                faceAuthLogger.authenticationError(
+                    errorCode,
+                    errString,
+                    errorStatus.isLockoutError(),
+                    errorStatus.isCancellationError()
+                )
+                onFaceAuthRequestCompleted()
+            }
+
+            override fun onAuthenticationHelp(code: Int, helpStr: CharSequence?) {
+                if (faceAcquiredInfoIgnoreList.contains(code)) {
+                    return
+                }
+                _authenticationStatus.value = HelpAuthenticationStatus(code, helpStr.toString())
+            }
+
+            override fun onAuthenticationSucceeded(result: FaceManager.AuthenticationResult) {
+                _authenticationStatus.value = SuccessAuthenticationStatus(result)
+                _isAuthenticated.value = true
+                faceAuthLogger.faceAuthSuccess(result)
+                onFaceAuthRequestCompleted()
+            }
+        }
+
+    private fun onFaceAuthRequestCompleted() {
+        cancellationInProgress = false
+        _isAuthRunning.value = false
+        authCancellationSignal = null
+    }
+
+    private val detectionCallback =
+        FaceManager.FaceDetectionCallback { sensorId, userId, isStrong ->
+            faceAuthLogger.faceDetected()
+            _detectionStatus.value = DetectionStatus(sensorId, userId, isStrong)
+        }
+
+    private var cancellationInProgress = false
+    private var faceAuthRequestedWhileCancellation: FaceAuthUiEvent? = null
+
+    override suspend fun authenticate(uiEvent: FaceAuthUiEvent, fallbackToDetection: Boolean) {
+        if (_isAuthRunning.value) {
+            faceAuthLogger.ignoredFaceAuthTrigger(uiEvent)
+            return
+        }
+
+        if (cancellationInProgress) {
+            faceAuthLogger.queuingRequestWhileCancelling(
+                faceAuthRequestedWhileCancellation,
+                uiEvent
+            )
+            faceAuthRequestedWhileCancellation = uiEvent
+            return
+        } else {
+            faceAuthRequestedWhileCancellation = null
+        }
+
+        if (canRunFaceAuth.value) {
+            withContext(mainDispatcher) {
+                // We always want to invoke face auth in the main thread.
+                authCancellationSignal = CancellationSignal()
+                _isAuthRunning.value = true
+                uiEventsLogger.logWithInstanceIdAndPosition(
+                    uiEvent,
+                    0,
+                    null,
+                    keyguardSessionId,
+                    uiEvent.extraInfo
+                )
+                faceAuthLogger.authenticating(uiEvent)
+                faceManager?.authenticate(
+                    null,
+                    authCancellationSignal,
+                    faceAuthCallback,
+                    null,
+                    FaceAuthenticateOptions.Builder().setUserId(currentUserId).build()
+                )
+            }
+        } else if (fallbackToDetection && canRunDetection.value) {
+            detect()
+        }
+    }
+
+    suspend fun detect() {
+        if (!isDetectionSupported) {
+            faceAuthLogger.detectionNotSupported(faceManager, faceManager?.sensorPropertiesInternal)
+            return
+        }
+        if (_isAuthRunning.value || detectCancellationSignal != null) {
+            faceAuthLogger.skippingDetection(_isAuthRunning.value, detectCancellationSignal != null)
+            return
+        }
+
+        detectCancellationSignal = CancellationSignal()
+        withContext(mainDispatcher) {
+            // We always want to invoke face detect in the main thread.
+            faceAuthLogger.faceDetectionStarted()
+            faceManager?.detectFace(
+                detectCancellationSignal,
+                detectionCallback,
+                FaceAuthenticateOptions.Builder().setUserId(currentUserId).build()
+            )
+        }
+    }
+
+    private val currentUserId: Int
+        get() = userRepository.getSelectedUserInfo().id
+
+    fun cancelDetection() {
+        detectCancellationSignal?.cancel()
+        detectCancellationSignal = null
+    }
+
+    override fun cancel() {
+        if (authCancellationSignal == null) return
+
+        authCancellationSignal?.cancel()
+        cancelNotReceivedHandlerJob =
+            applicationScope.launch {
+                delay(DEFAULT_CANCEL_SIGNAL_TIMEOUT)
+                faceAuthLogger.cancelSignalNotReceived(
+                    _isAuthRunning.value,
+                    _isLockedOut.value,
+                    cancellationInProgress,
+                    faceAuthRequestedWhileCancellation
+                )
+                onFaceAuthRequestCompleted()
+            }
+        cancellationInProgress = true
+        _isAuthRunning.value = false
+    }
+
+    private fun logAndObserve(cond: Flow<Boolean>, loggingContext: String): Flow<Boolean> {
+        return cond.distinctUntilChanged().onEach {
+            faceAuthLogger.observedConditionChanged(it, loggingContext)
+        }
+    }
+
+    companion object {
+        const val TAG = "DeviceEntryFaceAuthRepository"
+
+        /**
+         * If no cancel signal has been received after this amount of time, assume that it is
+         * cancelled.
+         */
+        const val DEFAULT_CANCEL_SIGNAL_TIMEOUT = 3000L
+    }
+
+    override fun dump(pw: PrintWriter, args: Array<out String>) {
+        pw.println("DeviceEntryFaceAuthRepositoryImpl state:")
+        pw.println("  cancellationInProgress: $cancellationInProgress")
+        pw.println("  _isLockedOut.value: ${_isLockedOut.value}")
+        pw.println("  _isAuthRunning.value: ${_isAuthRunning.value}")
+        pw.println("  isDetectionSupported: $isDetectionSupported")
+        pw.println("  FaceManager state:")
+        pw.println("    faceManager: $faceManager")
+        pw.println("    sensorPropertiesInternal: ${faceManager?.sensorPropertiesInternal}")
+        pw.println(
+            "    supportsFaceDetection: " +
+                "${faceManager?.sensorPropertiesInternal?.firstOrNull()?.supportsFaceDetection}"
+        )
+        pw.println(
+            "  faceAuthRequestedWhileCancellation: ${faceAuthRequestedWhileCancellation?.reason}"
+        )
+        pw.println("  authCancellationSignal: $authCancellationSignal")
+        pw.println("  detectCancellationSignal: $detectCancellationSignal")
+        pw.println("  faceAcquiredInfoIgnoreList: $faceAcquiredInfoIgnoreList")
+        pw.println("  _authenticationStatus: ${_authenticationStatus.value}")
+        pw.println("  _detectionStatus: ${_detectionStatus.value}")
+        pw.println("  currentUserId: $currentUserId")
+        pw.println("  keyguardSessionId: $keyguardSessionId")
+        pw.println("  lockscreenBypassEnabled: ${keyguardBypassController?.bypassEnabled ?: false}")
+    }
+}
+/** Combine two boolean flows by and-ing both of them */
+private fun and(flow: Flow<Boolean>, anotherFlow: Flow<Boolean>) =
+    flow.combine(anotherFlow) { a, b -> a && b }
+
+/** "Not" the given flow. The return [Flow] will be true when [this] flow is false. */
+private fun Flow<Boolean>.isFalse(): Flow<Boolean> {
+    return this.map { !it }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepository.kt
index 4fa56ee..52234b3 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepository.kt
@@ -16,6 +16,8 @@
 
 package com.android.systemui.keyguard.data.repository
 
+import android.hardware.biometrics.BiometricAuthenticator
+import android.hardware.biometrics.BiometricAuthenticator.Modality
 import android.hardware.biometrics.BiometricSourceType
 import com.android.keyguard.KeyguardUpdateMonitor
 import com.android.keyguard.KeyguardUpdateMonitorCallback
@@ -33,6 +35,7 @@
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.stateIn
 
 /** Encapsulates state about device entry fingerprint auth mechanism. */
@@ -49,7 +52,7 @@
     /**
      * Fingerprint sensor type present on the device, null if fingerprint sensor is not available.
      */
-    val availableFpSensorType: BiometricType?
+    val availableFpSensorType: Flow<BiometricType?>
 }
 
 /**
@@ -77,11 +80,39 @@
         pw.println("isLockedOut=${isLockedOut.value}")
     }
 
-    override val availableFpSensorType: BiometricType?
-        get() =
-            if (authController.isUdfpsSupported) BiometricType.UNDER_DISPLAY_FINGERPRINT
-            else if (authController.isSfpsSupported) BiometricType.SIDE_FINGERPRINT
-            else if (authController.isRearFpsSupported) BiometricType.REAR_FINGERPRINT else null
+    override val availableFpSensorType: Flow<BiometricType?>
+        get() {
+            return if (authController.areAllFingerprintAuthenticatorsRegistered()) {
+                flowOf(getFpSensorType())
+            } else {
+                conflatedCallbackFlow {
+                    val callback =
+                        object : AuthController.Callback {
+                            override fun onAllAuthenticatorsRegistered(@Modality modality: Int) {
+                                if (modality == BiometricAuthenticator.TYPE_FINGERPRINT)
+                                    trySendWithFailureLogging(
+                                        getFpSensorType(),
+                                        TAG,
+                                        "onAllAuthenticatorsRegistered, emitting fpSensorType"
+                                    )
+                            }
+                        }
+                    authController.addCallback(callback)
+                    trySendWithFailureLogging(
+                        getFpSensorType(),
+                        TAG,
+                        "initial value for fpSensorType"
+                    )
+                    awaitClose { authController.removeCallback(callback) }
+                }
+            }
+        }
+
+    private fun getFpSensorType(): BiometricType? {
+        return if (authController.isUdfpsSupported) BiometricType.UNDER_DISPLAY_FINGERPRINT
+        else if (authController.isSfpsSupported) BiometricType.SIDE_FINGERPRINT
+        else if (authController.isRearFpsSupported) BiometricType.REAR_FINGERPRINT else null
+    }
 
     override val isLockedOut: StateFlow<Boolean> =
         conflatedCallbackFlow {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt
index 64e2a2cb..0b506cf 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt
@@ -65,8 +65,6 @@
     val keyguardAuthenticated: StateFlow<Boolean?>
     val showMessage: StateFlow<BouncerShowMessageModel?>
     val resourceUpdateRequests: StateFlow<Boolean>
-    val bouncerPromptReason: Int
-    val bouncerErrorMessage: CharSequence?
     val alternateBouncerVisible: StateFlow<Boolean>
     val alternateBouncerUIAvailable: StateFlow<Boolean>
     val sideFpsShowing: StateFlow<Boolean>
@@ -145,11 +143,6 @@
     override val showMessage = _showMessage.asStateFlow()
     private val _resourceUpdateRequests = MutableStateFlow(false)
     override val resourceUpdateRequests = _resourceUpdateRequests.asStateFlow()
-    override val bouncerPromptReason: Int
-        get() = viewMediatorCallback.bouncerPromptReason
-    override val bouncerErrorMessage: CharSequence?
-        get() = viewMediatorCallback.consumeCustomMessage()
-
     /** Values associated with the AlternateBouncer */
     private val _alternateBouncerVisible = MutableStateFlow(false)
     override val alternateBouncerVisible = _alternateBouncerVisible.asStateFlow()
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardFaceAuthManager.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardFaceAuthManager.kt
deleted file mode 100644
index a326840..0000000
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardFaceAuthManager.kt
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.keyguard.data.repository
-
-import android.app.StatusBarManager
-import android.content.Context
-import android.hardware.face.FaceAuthenticateOptions
-import android.hardware.face.FaceManager
-import android.os.CancellationSignal
-import com.android.internal.logging.InstanceId
-import com.android.internal.logging.UiEventLogger
-import com.android.keyguard.FaceAuthUiEvent
-import com.android.systemui.Dumpable
-import com.android.systemui.R
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.keyguard.shared.model.AcquiredAuthenticationStatus
-import com.android.systemui.keyguard.shared.model.AuthenticationStatus
-import com.android.systemui.keyguard.shared.model.DetectionStatus
-import com.android.systemui.keyguard.shared.model.ErrorAuthenticationStatus
-import com.android.systemui.keyguard.shared.model.FailedAuthenticationStatus
-import com.android.systemui.keyguard.shared.model.HelpAuthenticationStatus
-import com.android.systemui.keyguard.shared.model.SuccessAuthenticationStatus
-import com.android.systemui.log.FaceAuthenticationLogger
-import com.android.systemui.log.SessionTracker
-import com.android.systemui.statusbar.phone.KeyguardBypassController
-import com.android.systemui.user.data.repository.UserRepository
-import java.io.PrintWriter
-import java.util.Arrays
-import java.util.stream.Collectors
-import javax.inject.Inject
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.filterNotNull
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
-
-/**
- * API to run face authentication and detection for device entry / on keyguard (as opposed to the
- * biometric prompt).
- */
-interface KeyguardFaceAuthManager {
-    /**
-     * Trigger face authentication.
-     *
-     * [uiEvent] provided should be logged whenever face authentication runs. Invocation should be
-     * ignored if face authentication is already running. Results should be propagated through
-     * [authenticationStatus]
-     */
-    suspend fun authenticate(uiEvent: FaceAuthUiEvent)
-
-    /**
-     * Trigger face detection.
-     *
-     * Invocation should be ignored if face authentication is currently running.
-     */
-    suspend fun detect()
-
-    /** Stop currently running face authentication or detection. */
-    fun cancel()
-
-    /** Provide the current status of face authentication. */
-    val authenticationStatus: Flow<AuthenticationStatus>
-
-    /** Provide the current status of face detection. */
-    val detectionStatus: Flow<DetectionStatus>
-
-    /** Current state of whether face authentication is locked out or not. */
-    val isLockedOut: Flow<Boolean>
-
-    /** Current state of whether face authentication is running. */
-    val isAuthRunning: Flow<Boolean>
-
-    /** Is face detection supported. */
-    val isDetectionSupported: Boolean
-}
-
-@SysUISingleton
-class KeyguardFaceAuthManagerImpl
-@Inject
-constructor(
-    context: Context,
-    private val faceManager: FaceManager? = null,
-    private val userRepository: UserRepository,
-    private val keyguardBypassController: KeyguardBypassController? = null,
-    @Application private val applicationScope: CoroutineScope,
-    @Main private val mainDispatcher: CoroutineDispatcher,
-    private val sessionTracker: SessionTracker,
-    private val uiEventsLogger: UiEventLogger,
-    private val faceAuthLogger: FaceAuthenticationLogger,
-    dumpManager: DumpManager,
-) : KeyguardFaceAuthManager, Dumpable {
-    private var cancellationSignal: CancellationSignal? = null
-    private val lockscreenBypassEnabled: Boolean
-        get() = keyguardBypassController?.bypassEnabled ?: false
-    private var faceAcquiredInfoIgnoreList: Set<Int>
-
-    private val faceLockoutResetCallback =
-        object : FaceManager.LockoutResetCallback() {
-            override fun onLockoutReset(sensorId: Int) {
-                _isLockedOut.value = false
-            }
-        }
-
-    init {
-        faceManager?.addLockoutResetCallback(faceLockoutResetCallback)
-        faceAcquiredInfoIgnoreList =
-            Arrays.stream(
-                    context.resources.getIntArray(
-                        R.array.config_face_acquire_device_entry_ignorelist
-                    )
-                )
-                .boxed()
-                .collect(Collectors.toSet())
-        dumpManager.registerCriticalDumpable("KeyguardFaceAuthManagerImpl", this)
-    }
-
-    private val faceAuthCallback =
-        object : FaceManager.AuthenticationCallback() {
-            override fun onAuthenticationFailed() {
-                _authenticationStatus.value = FailedAuthenticationStatus
-                faceAuthLogger.authenticationFailed()
-                onFaceAuthRequestCompleted()
-            }
-
-            override fun onAuthenticationAcquired(acquireInfo: Int) {
-                _authenticationStatus.value = AcquiredAuthenticationStatus(acquireInfo)
-                faceAuthLogger.authenticationAcquired(acquireInfo)
-            }
-
-            override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) {
-                val errorStatus = ErrorAuthenticationStatus(errorCode, errString.toString())
-                if (errorStatus.isLockoutError()) {
-                    _isLockedOut.value = true
-                }
-                _authenticationStatus.value = errorStatus
-                if (errorStatus.isCancellationError()) {
-                    cancelNotReceivedHandlerJob?.cancel()
-                    applicationScope.launch {
-                        faceAuthLogger.launchingQueuedFaceAuthRequest(
-                            faceAuthRequestedWhileCancellation
-                        )
-                        faceAuthRequestedWhileCancellation?.let { authenticate(it) }
-                        faceAuthRequestedWhileCancellation = null
-                    }
-                }
-                faceAuthLogger.authenticationError(
-                    errorCode,
-                    errString,
-                    errorStatus.isLockoutError(),
-                    errorStatus.isCancellationError()
-                )
-                onFaceAuthRequestCompleted()
-            }
-
-            override fun onAuthenticationHelp(code: Int, helpStr: CharSequence?) {
-                if (faceAcquiredInfoIgnoreList.contains(code)) {
-                    return
-                }
-                _authenticationStatus.value = HelpAuthenticationStatus(code, helpStr.toString())
-            }
-
-            override fun onAuthenticationSucceeded(result: FaceManager.AuthenticationResult) {
-                _authenticationStatus.value = SuccessAuthenticationStatus(result)
-                faceAuthLogger.faceAuthSuccess(result)
-                onFaceAuthRequestCompleted()
-            }
-        }
-
-    private fun onFaceAuthRequestCompleted() {
-        cancellationInProgress = false
-        _isAuthRunning.value = false
-        cancellationSignal = null
-    }
-
-    private val detectionCallback =
-        FaceManager.FaceDetectionCallback { sensorId, userId, isStrong ->
-            faceAuthLogger.faceDetected()
-            _detectionStatus.value = DetectionStatus(sensorId, userId, isStrong)
-        }
-
-    private var cancellationInProgress = false
-    private var faceAuthRequestedWhileCancellation: FaceAuthUiEvent? = null
-
-    override suspend fun authenticate(uiEvent: FaceAuthUiEvent) {
-        if (_isAuthRunning.value) {
-            faceAuthLogger.ignoredFaceAuthTrigger(uiEvent)
-            return
-        }
-
-        if (cancellationInProgress) {
-            faceAuthLogger.queuingRequestWhileCancelling(
-                faceAuthRequestedWhileCancellation,
-                uiEvent
-            )
-            faceAuthRequestedWhileCancellation = uiEvent
-            return
-        } else {
-            faceAuthRequestedWhileCancellation = null
-        }
-
-        withContext(mainDispatcher) {
-            // We always want to invoke face auth in the main thread.
-            cancellationSignal = CancellationSignal()
-            _isAuthRunning.value = true
-            uiEventsLogger.logWithInstanceIdAndPosition(
-                uiEvent,
-                0,
-                null,
-                keyguardSessionId,
-                uiEvent.extraInfo
-            )
-            faceAuthLogger.authenticating(uiEvent)
-            faceManager?.authenticate(
-                null,
-                cancellationSignal,
-                faceAuthCallback,
-                null,
-                FaceAuthenticateOptions.Builder().setUserId(currentUserId).build()
-            )
-        }
-    }
-
-    override suspend fun detect() {
-        if (!isDetectionSupported) {
-            faceAuthLogger.detectionNotSupported(faceManager, faceManager?.sensorPropertiesInternal)
-            return
-        }
-        if (_isAuthRunning.value) {
-            faceAuthLogger.skippingBecauseAlreadyRunning("detection")
-            return
-        }
-
-        cancellationSignal = CancellationSignal()
-        withContext(mainDispatcher) {
-            // We always want to invoke face detect in the main thread.
-            faceAuthLogger.faceDetectionStarted()
-            faceManager?.detectFace(
-                cancellationSignal,
-                detectionCallback,
-                FaceAuthenticateOptions.Builder().setUserId(currentUserId).build()
-            )
-        }
-    }
-
-    private val currentUserId: Int
-        get() = userRepository.getSelectedUserInfo().id
-
-    override fun cancel() {
-        if (cancellationSignal == null) return
-
-        cancellationSignal?.cancel()
-        cancelNotReceivedHandlerJob =
-            applicationScope.launch {
-                delay(DEFAULT_CANCEL_SIGNAL_TIMEOUT)
-                faceAuthLogger.cancelSignalNotReceived(
-                    _isAuthRunning.value,
-                    _isLockedOut.value,
-                    cancellationInProgress,
-                    faceAuthRequestedWhileCancellation
-                )
-                onFaceAuthRequestCompleted()
-            }
-        cancellationInProgress = true
-        _isAuthRunning.value = false
-    }
-
-    private var cancelNotReceivedHandlerJob: Job? = null
-
-    private val _authenticationStatus: MutableStateFlow<AuthenticationStatus?> =
-        MutableStateFlow(null)
-    override val authenticationStatus: Flow<AuthenticationStatus>
-        get() = _authenticationStatus.filterNotNull()
-
-    private val _detectionStatus = MutableStateFlow<DetectionStatus?>(null)
-    override val detectionStatus: Flow<DetectionStatus>
-        get() = _detectionStatus.filterNotNull()
-
-    private val _isLockedOut = MutableStateFlow(false)
-    override val isLockedOut: Flow<Boolean> = _isLockedOut
-
-    override val isDetectionSupported =
-        faceManager?.sensorPropertiesInternal?.firstOrNull()?.supportsFaceDetection ?: false
-
-    private val _isAuthRunning = MutableStateFlow(false)
-    override val isAuthRunning: Flow<Boolean>
-        get() = _isAuthRunning
-
-    private val keyguardSessionId: InstanceId?
-        get() = sessionTracker.getSessionId(StatusBarManager.SESSION_KEYGUARD)
-
-    companion object {
-        const val TAG = "KeyguardFaceAuthManager"
-
-        /**
-         * If no cancel signal has been received after this amount of time, assume that it is
-         * cancelled.
-         */
-        const val DEFAULT_CANCEL_SIGNAL_TIMEOUT = 3000L
-    }
-
-    override fun dump(pw: PrintWriter, args: Array<out String>) {
-        pw.println("KeyguardFaceAuthManagerImpl state:")
-        pw.println("  cancellationInProgress: $cancellationInProgress")
-        pw.println("  _isLockedOut.value: ${_isLockedOut.value}")
-        pw.println("  _isAuthRunning.value: ${_isAuthRunning.value}")
-        pw.println("  isDetectionSupported: $isDetectionSupported")
-        pw.println("  FaceManager state:")
-        pw.println("    faceManager: $faceManager")
-        pw.println("    sensorPropertiesInternal: ${faceManager?.sensorPropertiesInternal}")
-        pw.println(
-            "    supportsFaceDetection: " +
-                "${faceManager?.sensorPropertiesInternal?.firstOrNull()?.supportsFaceDetection}"
-        )
-        pw.println(
-            "  faceAuthRequestedWhileCancellation: ${faceAuthRequestedWhileCancellation?.reason}"
-        )
-        pw.println("  cancellationSignal: $cancellationSignal")
-        pw.println("  faceAcquiredInfoIgnoreList: $faceAcquiredInfoIgnoreList")
-        pw.println("  _authenticationStatus: ${_authenticationStatus.value}")
-        pw.println("  _detectionStatus: ${_detectionStatus.value}")
-        pw.println("  currentUserId: $currentUserId")
-        pw.println("  keyguardSessionId: $keyguardSessionId")
-        pw.println("  lockscreenBypassEnabled: $lockscreenBypassEnabled")
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardFaceAuthModule.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardFaceAuthModule.kt
new file mode 100644
index 0000000..3c66f24
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardFaceAuthModule.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.systemui.keyguard.data.repository
+
+import dagger.Binds
+import dagger.Module
+
+@Module
+interface KeyguardFaceAuthModule {
+    @Binds
+    fun deviceEntryFaceAuthRepository(
+        impl: DeviceEntryFaceAuthRepositoryImpl
+    ): DeviceEntryFaceAuthRepository
+
+    @Binds fun trustRepository(impl: TrustRepositoryImpl): TrustRepository
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt
index 76f20d25..3567d81 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt
@@ -25,6 +25,7 @@
 import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
 import com.android.systemui.common.shared.model.Position
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.doze.DozeHost
 import com.android.systemui.doze.DozeMachine
 import com.android.systemui.doze.DozeTransitionCallback
@@ -43,12 +44,14 @@
 import com.android.systemui.statusbar.phone.DozeParameters
 import com.android.systemui.statusbar.policy.KeyguardStateController
 import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.channels.awaitClose
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flowOn
 
 /** Defines interface for classes that encapsulate application state for the keyguard. */
 interface KeyguardRepository {
@@ -195,6 +198,7 @@
     private val dozeParameters: DozeParameters,
     private val authController: AuthController,
     private val dreamOverlayCallbackController: DreamOverlayCallbackController,
+    @Main private val mainDispatcher: CoroutineDispatcher
 ) : KeyguardRepository {
     private val _animateBottomAreaDozingTransitions = MutableStateFlow(false)
     override val animateBottomAreaDozingTransitions =
@@ -387,6 +391,7 @@
 
                 awaitClose { keyguardUpdateMonitor.removeCallback(callback) }
             }
+            .flowOn(mainDispatcher)
             .distinctUntilChanged()
 
     override val linearDozeAmount: Flow<Float> = conflatedCallbackFlow {
@@ -466,7 +471,7 @@
         }
 
         val callback =
-            object : BiometricUnlockController.BiometricModeListener {
+            object : BiometricUnlockController.BiometricUnlockEventsListener {
                 override fun onModeChanged(@WakeAndUnlockMode mode: Int) {
                     dispatchUpdate()
                 }
@@ -476,10 +481,10 @@
                 }
             }
 
-        biometricUnlockController.addBiometricModeListener(callback)
+        biometricUnlockController.addListener(callback)
         dispatchUpdate()
 
-        awaitClose { biometricUnlockController.removeBiometricModeListener(callback) }
+        awaitClose { biometricUnlockController.removeListener(callback) }
     }
 
     override val wakefulness: Flow<WakefulnessModel> = conflatedCallbackFlow {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractor.kt
index 77541e9..970d004 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractor.kt
@@ -21,15 +21,12 @@
 import android.hardware.biometrics.BiometricSourceType
 import android.os.Handler
 import android.os.Trace
-import android.os.UserHandle
-import android.os.UserManager
 import android.util.Log
 import android.view.View
 import com.android.keyguard.KeyguardConstants
 import com.android.keyguard.KeyguardSecurityModel
 import com.android.keyguard.KeyguardUpdateMonitor
 import com.android.keyguard.KeyguardUpdateMonitorCallback
-import com.android.settingslib.Utils
 import com.android.systemui.DejankUtils
 import com.android.systemui.R
 import com.android.systemui.classifier.FalsingCollector
@@ -44,12 +41,12 @@
 import com.android.systemui.shared.system.SysUiStatsLog
 import com.android.systemui.statusbar.phone.KeyguardBypassController
 import com.android.systemui.statusbar.policy.KeyguardStateController
-import javax.inject.Inject
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.flow.map
+import javax.inject.Inject
 
 /**
  * Encapsulates business logic for interacting with the lock-screen primary (pin/pattern/password)
@@ -84,12 +81,6 @@
     /** Runnable to show the primary bouncer. */
     val showRunnable = Runnable {
         repository.setPrimaryShow(true)
-        primaryBouncerView.delegate?.showPromptReason(repository.bouncerPromptReason)
-        (repository.bouncerErrorMessage as? String)?.let {
-            repository.setShowMessage(
-                BouncerShowMessageModel(message = it, Utils.getColorError(context))
-            )
-        }
         repository.setPrimaryShowingSoon(false)
         primaryBouncerCallbackInteractor.dispatchVisibilityChanged(View.VISIBLE)
     }
@@ -106,10 +97,9 @@
     val panelExpansionAmount: Flow<Float> = repository.panelExpansionAmount
     /** 0f = bouncer fully hidden. 1f = bouncer fully visible. */
     val bouncerExpansion: Flow<Float> =
-        combine(
-            repository.panelExpansionAmount,
-            repository.primaryBouncerShow
-        ) { panelExpansion, primaryBouncerIsShowing ->
+        combine(repository.panelExpansionAmount, repository.primaryBouncerShow) {
+            panelExpansion,
+            primaryBouncerIsShowing ->
             if (primaryBouncerIsShowing) {
                 1f - panelExpansion
             } else {
@@ -152,22 +142,18 @@
             (isBouncerShowing() || repository.primaryBouncerShowingSoon.value) &&
                 needsFullscreenBouncer()
 
-        if (!resumeBouncer && isBouncerShowing()) {
-            // If bouncer is visible, the bouncer is already showing.
-            return
-        }
-
         Trace.beginSection("KeyguardBouncer#show")
         repository.setPrimaryScrimmed(isScrimmed)
         if (isScrimmed) {
             setPanelExpansion(KeyguardBouncerConstants.EXPANSION_VISIBLE)
         }
 
+        // In this special case, we want to hide the bouncer and show it again. We want to emit
+        // show(true) again so that we can reinflate the new view.
         if (resumeBouncer) {
-            primaryBouncerView.delegate?.resume()
-            // Bouncer is showing the next security screen and we just need to prompt a resume.
-            return
+            repository.setPrimaryShow(false)
         }
+
         if (primaryBouncerView.delegate?.showNextSecurityScreenOrFinish() == true) {
             // Keyguard is done.
             return
@@ -195,6 +181,7 @@
             dismissCallbackRegistry.notifyDismissCancelled()
         }
 
+        repository.setPrimaryStartDisappearAnimation(null)
         falsingCollector.onBouncerHidden()
         keyguardStateController.notifyPrimaryBouncerShowing(false /* showing */)
         cancelShowRunnable()
@@ -306,11 +293,8 @@
             runnable.run()
             return
         }
-        val finishRunnable = Runnable {
-            runnable.run()
-            repository.setPrimaryStartDisappearAnimation(null)
-        }
-        repository.setPrimaryStartDisappearAnimation(finishRunnable)
+
+        repository.setPrimaryStartDisappearAnimation(runnable)
     }
 
     /** Determine whether to show the side fps animation. */
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FaceAuthenticationModels.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FaceAuthenticationModels.kt
index b1c5f8f..eded9c1 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FaceAuthenticationModels.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FaceAuthenticationModels.kt
@@ -18,7 +18,10 @@
 
 import android.hardware.face.FaceManager
 
-/** Authentication status provided by [com.android.keyguard.faceauth.KeyguardFaceAuthManager] */
+/**
+ * Authentication status provided by
+ * [com.android.systemui.keyguard.data.repository.DeviceEntryFaceAuthRepository]
+ */
 sealed class AuthenticationStatus
 
 /** Success authentication status. */
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt
index 468a6b5..72dc7a4 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt
@@ -110,24 +110,25 @@
                     viewModel.setBouncerViewDelegate(delegate)
                     launch {
                         viewModel.isShowing.collect { isShowing ->
+                            view.visibility = if (isShowing) View.VISIBLE else View.INVISIBLE
                             if (isShowing) {
                                 // Reset Security Container entirely.
+                                view.visibility = View.VISIBLE
                                 securityContainerController.reinflateViewFlipper {
                                     // Reset Security Container entirely.
-                                    view.visibility = View.VISIBLE
                                     securityContainerController.onBouncerVisibilityChanged(
                                         /* isVisible= */ true
                                     )
                                     securityContainerController.showPrimarySecurityScreen(
                                         /* turningOff= */ false
                                     )
+                                    securityContainerController.setInitialMessage()
                                     securityContainerController.appear()
                                     securityContainerController.onResume(
                                         KeyguardSecurityView.SCREEN_ON
                                     )
                                 }
                             } else {
-                                view.visibility = View.INVISIBLE
                                 securityContainerController.onBouncerVisibilityChanged(
                                     /* isVisible= */ false
                                 )
diff --git a/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt b/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt
index 647e3a1..f7355d5 100644
--- a/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt
@@ -7,17 +7,17 @@
 import com.android.systemui.log.dagger.FaceAuthLog
 import com.android.systemui.plugins.log.LogBuffer
 import com.android.systemui.plugins.log.LogLevel.DEBUG
-import com.google.errorprone.annotations.CompileTimeConstant
 import javax.inject.Inject
 
-private const val TAG = "KeyguardFaceAuthManagerLog"
+private const val TAG = "DeviceEntryFaceAuthRepositoryLog"
 
 /**
- * Helper class for logging for [com.android.keyguard.faceauth.KeyguardFaceAuthManager]
+ * Helper class for logging for
+ * [com.android.systemui.keyguard.data.repository.DeviceEntryFaceAuthRepository]
  *
  * To enable logcat echoing for an entire buffer:
  * ```
- *   adb shell settings put global systemui/buffer/KeyguardFaceAuthManagerLog <logLevel>
+ *   adb shell settings put global systemui/buffer/DeviceEntryFaceAuthRepositoryLog <logLevel>
  *
  * ```
  */
@@ -82,8 +82,19 @@
         )
     }
 
-    fun skippingBecauseAlreadyRunning(@CompileTimeConstant operation: String) {
-        logBuffer.log(TAG, DEBUG, "isAuthRunning is true, skipping $operation")
+    fun skippingDetection(isAuthRunning: Boolean, detectCancellationNotNull: Boolean) {
+        logBuffer.log(
+            TAG,
+            DEBUG,
+            {
+                bool1 = isAuthRunning
+                bool2 = detectCancellationNotNull
+            },
+            {
+                "Skipping running detection: isAuthRunning: $bool1, " +
+                    "detectCancellationNotNull: $bool2"
+            }
+        )
     }
 
     fun faceDetectionStarted() {
@@ -177,4 +188,33 @@
             { "Face authenticated successfully: userId: $int1, isStrongBiometric: $bool1" }
         )
     }
+
+    fun observedConditionChanged(newValue: Boolean, context: String) {
+        logBuffer.log(
+            TAG,
+            DEBUG,
+            {
+                bool1 = newValue
+                str1 = context
+            },
+            { "Observed condition changed: $str1, new value: $bool1" }
+        )
+    }
+
+    fun canFaceAuthRunChanged(canRun: Boolean) {
+        logBuffer.log(TAG, DEBUG, { bool1 = canRun }, { "canFaceAuthRun value changed to $bool1" })
+    }
+
+    fun canRunDetectionChanged(canRunDetection: Boolean) {
+        logBuffer.log(
+            TAG,
+            DEBUG,
+            { bool1 = canRunDetection },
+            { "canRunDetection value changed to $bool1" }
+        )
+    }
+
+    fun cancellingFaceAuth() {
+        logBuffer.log(TAG, DEBUG, "cancelling face auth because a gating condition became false")
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/log/SessionTracker.java b/packages/SystemUI/src/com/android/systemui/log/SessionTracker.java
index b98a92f..d848b43 100644
--- a/packages/SystemUI/src/com/android/systemui/log/SessionTracker.java
+++ b/packages/SystemUI/src/com/android/systemui/log/SessionTracker.java
@@ -28,6 +28,8 @@
 
 import com.android.internal.logging.InstanceId;
 import com.android.internal.logging.InstanceIdSequence;
+import com.android.internal.logging.UiEvent;
+import com.android.internal.logging.UiEventLogger;
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.keyguard.KeyguardUpdateMonitorCallback;
@@ -60,6 +62,7 @@
     private final AuthController mAuthController;
     private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     private final KeyguardStateController mKeyguardStateController;
+    private final UiEventLogger mUiEventLogger;
     private final Map<Integer, InstanceId> mSessionToInstanceId = new HashMap<>();
 
     private boolean mKeyguardSessionStarted;
@@ -69,12 +72,14 @@
             IStatusBarService statusBarService,
             AuthController authController,
             KeyguardUpdateMonitor keyguardUpdateMonitor,
-            KeyguardStateController keyguardStateController
+            KeyguardStateController keyguardStateController,
+            UiEventLogger uiEventLogger
     ) {
         mStatusBarManagerService = statusBarService;
         mAuthController = authController;
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mKeyguardStateController = keyguardStateController;
+        mUiEventLogger = uiEventLogger;
     }
 
     @Override
@@ -116,6 +121,10 @@
     }
 
     private void endSession(int type) {
+        endSession(type, null);
+    }
+
+    private void endSession(int type, @Nullable SessionUiEvent endSessionUiEvent) {
         if (mSessionToInstanceId.getOrDefault(type, null) == null) {
             Log.e(TAG, "session [" + getString(type) + "] was not started");
             return;
@@ -127,6 +136,9 @@
             if (DEBUG) {
                 Log.d(TAG, "Session end for [" + getString(type) + "] id=" + instanceId);
             }
+            if (endSessionUiEvent != null) {
+                mUiEventLogger.log(endSessionUiEvent, instanceId);
+            }
             mStatusBarManagerService.onSessionEnded(type, instanceId);
         } catch (RemoteException e) {
             Log.e(TAG, "Unable to send onSessionEnded for session="
@@ -139,7 +151,7 @@
         @Override
         public void onStartedGoingToSleep(int why) {
             if (mKeyguardSessionStarted) {
-                endSession(SESSION_KEYGUARD);
+                endSession(SESSION_KEYGUARD, SessionUiEvent.KEYGUARD_SESSION_END_GOING_TO_SLEEP);
             }
 
             // Start a new session whenever the device goes to sleep
@@ -162,7 +174,8 @@
                 startSession(SESSION_KEYGUARD);
             } else if (!keyguardShowing && wasSessionStarted) {
                 mKeyguardSessionStarted = false;
-                endSession(SESSION_KEYGUARD);
+                endSession(SESSION_KEYGUARD,
+                        SessionUiEvent.KEYGUARD_SESSION_END_KEYGUARD_GOING_AWAY);
             }
         }
     };
@@ -200,4 +213,22 @@
 
         return "unknownType=" + sessionType;
     }
+
+    enum SessionUiEvent implements UiEventLogger.UiEventEnum {
+        @UiEvent(doc = "A keyguard session ended due to the keyguard going away.")
+        KEYGUARD_SESSION_END_KEYGUARD_GOING_AWAY(1354),
+
+        @UiEvent(doc = "A keyguard session ended due to display going to sleep.")
+        KEYGUARD_SESSION_END_GOING_TO_SLEEP(1355);
+
+        private final int mId;
+        SessionUiEvent(int id) {
+            mId = id;
+        }
+
+        @Override
+        public int getId() {
+            return mId;
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
index 5704f886..3775e2c 100644
--- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
@@ -119,15 +119,6 @@
         return factory.create("ShadeLog", 500, false);
     }
 
-    /** Provides a logging buffer for Shade height messages. */
-    @Provides
-    @SysUISingleton
-    @ShadeHeightLog
-    public static LogBuffer provideShadeHeightLogBuffer(LogBufferFactory factory) {
-        return factory.create("ShadeHeightLog", 500 /* maxSize */);
-    }
-
-
     /** Provides a logging buffer for all logs related to managing notification sections. */
     @Provides
     @SysUISingleton
@@ -376,13 +367,13 @@
 
     /**
      * Provides a {@link LogBuffer} for use by
-     *  {@link com.android.keyguard.faceauth.KeyguardFaceAuthManagerImpl}.
+     *  {@link com.android.systemui.keyguard.data.repository.DeviceEntryFaceAuthRepositoryImpl}.
      */
     @Provides
     @SysUISingleton
     @FaceAuthLog
     public static LogBuffer provideFaceAuthLog(LogBufferFactory factory) {
-        return factory.create("KeyguardFaceAuthManagerLog", 300);
+        return factory.create("DeviceEntryFaceAuthRepositoryLog", 300);
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeHeightLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeHeightLog.java
deleted file mode 100644
index 6fe8686..0000000
--- a/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeHeightLog.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.log.dagger;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import com.android.systemui.plugins.log.LogBuffer;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-
-import javax.inject.Qualifier;
-
-/** A {@link LogBuffer} for Shade height changes. */
-@Qualifier
-@Documented
-@Retention(RUNTIME)
-public @interface ShadeHeightLog {
-}
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java
index c4e76b2..ccddd1d 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java
@@ -60,7 +60,7 @@
 import dagger.Lazy;
 
 public class MediaProjectionPermissionActivity extends Activity
-        implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
+        implements DialogInterface.OnClickListener {
     private static final String TAG = "MediaProjectionPermissionActivity";
     private static final float MAX_APP_NAME_SIZE_PX = 500f;
     private static final String ELLIPSIS = "\u2026";
@@ -215,7 +215,8 @@
         SystemUIDialog.applyFlags(dialog);
         SystemUIDialog.setDialogSize(dialog);
 
-        dialog.setOnCancelListener(this);
+        dialog.setOnCancelListener(this::onDialogDismissedOrCancelled);
+        dialog.setOnDismissListener(this::onDialogDismissedOrCancelled);
         dialog.create();
         dialog.getButton(DialogInterface.BUTTON_POSITIVE).setFilterTouchesWhenObscured(true);
 
@@ -283,9 +284,10 @@
         return intent;
     }
 
-    @Override
-    public void onCancel(DialogInterface dialog) {
-        finish();
+    private void onDialogDismissedOrCancelled(DialogInterface dialogInterface) {
+        if (!isFinishing()) {
+            finish();
+        }
     }
 
     private boolean isPartialScreenSharingEnabled() {
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/KeyguardMediaController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/KeyguardMediaController.kt
index 8f1c904..30ee147 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/KeyguardMediaController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/KeyguardMediaController.kt
@@ -63,6 +63,10 @@
                 override fun onStateChanged(newState: Int) {
                     refreshMediaPosition()
                 }
+
+                override fun onDozingChanged(isDozing: Boolean) {
+                    refreshMediaPosition()
+                }
             }
         )
         configurationController.addCallback(
@@ -198,7 +202,8 @@
             mediaHost.visible &&
                 !bypassController.bypassEnabled &&
                 keyguardOrUserSwitcher &&
-                allowMediaPlayerOnLockScreen
+                allowMediaPlayerOnLockScreen &&
+                shouldBeVisibleForSplitShade()
         if (visible) {
             showMediaPlayer()
         } else {
@@ -206,6 +211,19 @@
         }
     }
 
+    private fun shouldBeVisibleForSplitShade(): Boolean {
+        if (!useSplitShade) {
+            return true
+        }
+        // We have to explicitly hide media for split shade when on AOD, as it is a child view of
+        // keyguard status view, and nothing hides keyguard status view on AOD.
+        // When using the double-line clock, it is not an issue, as media gets implicitly hidden
+        // by the clock. This is not the case for single-line clock though.
+        // For single shade, we don't need to do it, because media is a child of NSSL, which already
+        // gets hidden on AOD.
+        return !statusBarStateController.isDozing
+    }
+
     private fun showMediaPlayer() {
         if (useSplitShade) {
             setVisibility(splitShadeContainer, View.VISIBLE)
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 9928c4f..f50a7a8 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
@@ -205,7 +205,8 @@
                         && mController.isSubStatusSupported()
                         && mController.isAdvancedLayoutSupported() && device.hasSubtext()) {
                     boolean isActiveWithOngoingSession =
-                            (device.hasOngoingSession() && currentlyConnected);
+                            (device.hasOngoingSession() && (currentlyConnected || isDeviceIncluded(
+                                    mController.getSelectedMediaDevice(), device)));
                     boolean isHost = device.isHostForOngoingSession()
                             && isActiveWithOngoingSession;
                     if (isHost) {
@@ -224,10 +225,17 @@
                         if (isActiveWithOngoingSession) {
                             //Selected device which has ongoing session, disable seekbar since we
                             //only allow volume control on Host
-                            initSeekbar(device, isCurrentSeekbarInvisible);
                             mCurrentActivePosition = position;
                         }
-                        setUpDeviceIcon(device);
+                        boolean showSeekbar =
+                                (!device.hasOngoingSession() && currentlyConnected);
+                        if (showSeekbar) {
+                            updateTitleIcon(R.drawable.media_output_icon_volume,
+                                    mController.getColorItemContent());
+                            initSeekbar(device, isCurrentSeekbarInvisible);
+                        } else {
+                            setUpDeviceIcon(device);
+                        }
                         mSubTitleText.setText(device.getSubtextString());
                         Drawable deviceStatusIcon =
                                 device.hasOngoingSession() ? mContext.getDrawable(
@@ -241,8 +249,8 @@
                         updateTwoLineLayoutContentAlpha(
                                 updateClickActionBasedOnSelectionBehavior(device)
                                         ? DEVICE_CONNECTED_ALPHA : DEVICE_DISCONNECTED_ALPHA);
-                        setTwoLineLayout(device, isActiveWithOngoingSession /* bFocused */,
-                                isActiveWithOngoingSession /* showSeekBar */,
+                        setTwoLineLayout(device, currentlyConnected /* bFocused */,
+                                showSeekbar  /* showSeekBar */,
                                 false /* showProgressBar */, true /* showSubtitle */,
                                 deviceStatusIcon != null /* showStatus */,
                                 isActiveWithOngoingSession /* isFakeActive */);
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java
index f92a5ab..73ab5272 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java
@@ -66,6 +66,8 @@
 
     protected final MediaOutputController mController;
 
+    private static final int UNMUTE_DEFAULT_VOLUME = 2;
+
     Context mContext;
     View mHolderView;
     boolean mIsDragging;
@@ -193,10 +195,6 @@
             mTwoLineTitleText.setTextColor(mController.getColorItemContent());
             if (mController.isAdvancedLayoutSupported()) {
                 mVolumeValueText.setTextColor(mController.getColorItemContent());
-                mTitleIcon.setOnTouchListener(((v, event) -> {
-                    mSeekBar.dispatchTouchEvent(event);
-                    return false;
-                }));
             }
             mSeekBar.setProgressTintList(
                     ColorStateList.valueOf(mController.getColorSeekbarProgress()));
@@ -272,10 +270,10 @@
             final Drawable backgroundDrawable;
             if (mController.isAdvancedLayoutSupported() && mController.isSubStatusSupported()) {
                 backgroundDrawable = mContext.getDrawable(
-                        showSeekBar ? R.drawable.media_output_item_background_active
+                        showSeekBar || isFakeActive ? R.drawable.media_output_item_background_active
                                 : R.drawable.media_output_item_background).mutate();
                 backgroundDrawable.setTint(
-                        showSeekBar ? mController.getColorConnectedItemBackground()
+                        showSeekBar || isFakeActive ? mController.getColorConnectedItemBackground()
                                 : mController.getColorItemBackground());
                 mIconAreaLayout.setBackgroundTintList(
                         ColorStateList.valueOf(showProgressBar || isFakeActive
@@ -546,13 +544,21 @@
         private void enableSeekBar(MediaDevice device) {
             mSeekBar.setEnabled(true);
             mSeekBar.setOnTouchListener((v, event) -> false);
-            if (mController.isAdvancedLayoutSupported()) {
-                updateIconAreaClickListener((v) -> {
+            updateIconAreaClickListener((v) -> {
+                if (device.getCurrentVolume() == 0) {
+                    mController.adjustVolume(device, UNMUTE_DEFAULT_VOLUME);
+                    updateUnmutedVolumeIcon();
+                    mTitleIcon.setOnTouchListener(((iconV, event) -> false));
+                } else {
                     mSeekBar.resetVolume();
                     mController.adjustVolume(device, 0);
                     updateMutedVolumeIcon();
-                });
-            }
+                    mTitleIcon.setOnTouchListener(((iconV, event) -> {
+                        mSeekBar.dispatchTouchEvent(event);
+                        return false;
+                    }));
+                }
+            });
         }
 
         protected void setUpDeviceIcon(MediaDevice device) {
diff --git a/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt b/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt
index e352c61..1894bc4 100644
--- a/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt
@@ -20,12 +20,16 @@
 import android.view.MotionEvent
 import android.view.ViewConfiguration
 import com.android.systemui.classifier.Classifier
+import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.flags.Flags
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.multishade.shared.math.isZero
 import com.android.systemui.multishade.shared.model.ProxiedInputModel
 import com.android.systemui.plugins.FalsingManager
+import com.android.systemui.shade.ShadeController
 import javax.inject.Inject
 import kotlin.math.abs
 import kotlinx.coroutines.CoroutineScope
@@ -33,6 +37,7 @@
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.launch
 
 /**
  * Encapsulates business logic to handle [MotionEvent]-based user input.
@@ -40,15 +45,31 @@
  * This class is meant purely for the legacy `View`-based system to be able to pass `MotionEvent`s
  * into the newer multi-shade framework for processing.
  */
+@SysUISingleton
 class MultiShadeMotionEventInteractor
 @Inject
 constructor(
     @Application private val applicationContext: Context,
     @Application private val applicationScope: CoroutineScope,
     private val multiShadeInteractor: MultiShadeInteractor,
+    featureFlags: FeatureFlags,
     keyguardTransitionInteractor: KeyguardTransitionInteractor,
     private val falsingManager: FalsingManager,
+    private val shadeController: ShadeController,
 ) {
+    init {
+        if (featureFlags.isEnabled(Flags.DUAL_SHADE)) {
+            applicationScope.launch {
+                multiShadeInteractor.isAnyShadeExpanded.collect {
+                    if (!it && !shadeController.isKeyguard) {
+                        shadeController.makeExpandedInvisible()
+                    } else {
+                        shadeController.makeExpandedVisible(false)
+                    }
+                }
+            }
+        }
+    }
 
     private val isAnyShadeExpanded: StateFlow<Boolean> =
         multiShadeInteractor.isAnyShadeExpanded.stateIn(
@@ -56,6 +77,7 @@
             started = SharingStarted.Eagerly,
             initialValue = false,
         )
+
     private val isBouncerShowing: StateFlow<Boolean> =
         keyguardTransitionInteractor
             .transitionValue(state = KeyguardState.PRIMARY_BOUNCER)
@@ -102,23 +124,7 @@
                 false
             }
             MotionEvent.ACTION_MOVE -> {
-                interactionState?.let {
-                    val pointerIndex = event.findPointerIndex(it.pointerId)
-                    val currentX = event.getX(pointerIndex)
-                    val currentY = event.getY(pointerIndex)
-                    if (!it.isDraggingHorizontally && !it.isDraggingShade) {
-                        val xDistanceTravelled = currentX - it.initialX
-                        val yDistanceTravelled = currentY - it.initialY
-                        val touchSlop = ViewConfiguration.get(applicationContext).scaledTouchSlop
-                        interactionState =
-                            when {
-                                yDistanceTravelled > touchSlop -> it.copy(isDraggingShade = true)
-                                abs(xDistanceTravelled) > touchSlop ->
-                                    it.copy(isDraggingHorizontally = true)
-                                else -> interactionState
-                            }
-                    }
-                }
+                onMove(event)
 
                 // We want to intercept the rest of the gesture if we're dragging the shade.
                 isDraggingShade()
@@ -162,7 +168,8 @@
                         }
                         true
                     } else {
-                        false
+                        onMove(event)
+                        isDraggingShade()
                     }
                 }
                     ?: false
@@ -225,6 +232,32 @@
         }
     }
 
+    /**
+     * Handles [MotionEvent.ACTION_MOVE] and sets whether or not we are dragging shade in our
+     * current interaction
+     *
+     * @param event The [MotionEvent] to handle.
+     */
+    private fun onMove(event: MotionEvent) {
+        interactionState?.let {
+            val pointerIndex = event.findPointerIndex(it.pointerId)
+            val currentX = event.getX(pointerIndex)
+            val currentY = event.getY(pointerIndex)
+            if (!it.isDraggingHorizontally && !it.isDraggingShade) {
+                val xDistanceTravelled = currentX - it.initialX
+                val yDistanceTravelled = currentY - it.initialY
+                val touchSlop = ViewConfiguration.get(applicationContext).scaledTouchSlop
+                interactionState =
+                    when {
+                        yDistanceTravelled > touchSlop -> it.copy(isDraggingShade = true)
+                        abs(xDistanceTravelled) > touchSlop ->
+                            it.copy(isDraggingHorizontally = true)
+                        else -> interactionState
+                    }
+            }
+        }
+    }
+
     private data class InteractionState(
         val initialX: Float,
         val initialY: Float,
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index 44c718f..e8ef612 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -1732,6 +1732,11 @@
         final int gestureHeight = userContext.getResources().getDimensionPixelSize(
                 com.android.internal.R.dimen.navigation_bar_gesture_height);
         final boolean handlingGesture = mEdgeBackGestureHandler.isHandlingGestures();
+        final InsetsFrameProvider mandatoryGestureProvider = new InsetsFrameProvider(
+                mInsetsSourceOwner, 0, WindowInsets.Type.mandatorySystemGestures());
+        if (handlingGesture) {
+            mandatoryGestureProvider.setInsetsSize(Insets.of(0, 0, 0, gestureHeight));
+        }
         final int gestureInsetsLeft = handlingGesture
                 ? mEdgeBackGestureHandler.getEdgeWidthLeft() + safeInsetsLeft : 0;
         final int gestureInsetsRight = handlingGesture
@@ -1739,9 +1744,7 @@
         return new InsetsFrameProvider[] {
                 navBarProvider,
                 tappableElementProvider,
-                new InsetsFrameProvider(
-                        mInsetsSourceOwner, 0, WindowInsets.Type.mandatorySystemGestures())
-                        .setInsetsSize(Insets.of(0, 0, 0, gestureHeight)),
+                mandatoryGestureProvider,
                 new InsetsFrameProvider(mInsetsSourceOwner, 0, WindowInsets.Type.systemGestures())
                         .setSource(InsetsFrameProvider.SOURCE_DISPLAY)
                         .setInsetsSize(Insets.of(gestureInsetsLeft, 0, 0, 0)),
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
index 5b0a4bb..580facd 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
@@ -226,6 +226,18 @@
         }
     }
 
+    private boolean shouldCreateNavBarAndTaskBar(int displayId) {
+        final IWindowManager wms = WindowManagerGlobal.getWindowManagerService();
+
+        try {
+            return wms.hasNavigationBar(displayId);
+        } catch (RemoteException e) {
+            // Cannot get wms, just return false with warning message.
+            Log.w(TAG, "Cannot get WindowManager.");
+            return false;
+        }
+    }
+
     /** @see #initializeTaskbarIfNecessary() */
     private boolean updateNavbarForTaskbar() {
         boolean taskbarShown = initializeTaskbarIfNecessary();
@@ -238,8 +250,8 @@
     /** @return {@code true} if taskbar is enabled, false otherwise */
     private boolean initializeTaskbarIfNecessary() {
         // Enable for large screens or (phone AND flag is set); assuming phone = !mIsLargeScreen
-        boolean taskbarEnabled = mIsLargeScreen || mFeatureFlags.isEnabled(
-                Flags.HIDE_NAVBAR_WINDOW);
+        boolean taskbarEnabled = (mIsLargeScreen || mFeatureFlags.isEnabled(
+                Flags.HIDE_NAVBAR_WINDOW)) && shouldCreateNavBarAndTaskBar(mContext.getDisplayId());
 
         if (taskbarEnabled) {
             Trace.beginSection("NavigationBarController#initializeTaskbarIfNecessary");
@@ -331,23 +343,16 @@
         final int displayId = display.getDisplayId();
         final boolean isOnDefaultDisplay = displayId == mDisplayTracker.getDefaultDisplayId();
 
+        if (!shouldCreateNavBarAndTaskBar(displayId)) {
+            return;
+        }
+
         // We may show TaskBar on the default display for large screen device. Don't need to create
         // navigation bar for this case.
         if (isOnDefaultDisplay && initializeTaskbarIfNecessary()) {
             return;
         }
 
-        final IWindowManager wms = WindowManagerGlobal.getWindowManagerService();
-
-        try {
-            if (!wms.hasNavigationBar(displayId)) {
-                return;
-            }
-        } catch (RemoteException e) {
-            // Cannot get wms, just return with warning message.
-            Log.w(TAG, "Cannot get WindowManager.");
-            return;
-        }
         final Context context = isOnDefaultDisplay
                 ? mContext
                 : mContext.createDisplayContext(display);
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt
index 70040c7..c804df8 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt
@@ -363,12 +363,8 @@
     }
 
     fun popOffEdge(startingVelocity: Float) {
-        val heightStretchAmount = startingVelocity * 50
-        val widthStretchAmount = startingVelocity * 150
-        val scaleStretchAmount = startingVelocity * 0.8f
-        backgroundHeight.stretchTo(stretchAmount = 0f, startingVelocity = -heightStretchAmount)
-        backgroundWidth.stretchTo(stretchAmount = 0f, startingVelocity = widthStretchAmount)
-        scale.stretchTo(stretchAmount = 0f, startingVelocity = -scaleStretchAmount)
+        scale.stretchTo(stretchAmount = 0f, startingVelocity = startingVelocity * -.8f)
+        horizontalTranslation.stretchTo(stretchAmount = 0f, startingVelocity * 200f)
     }
 
     fun popScale(startingVelocity: Float) {
@@ -410,7 +406,7 @@
         arrowAlpha.updateRestingPosition(restingParams.arrowDimens.alpha, animate)
         arrowLength.updateRestingPosition(restingParams.arrowDimens.length, animate)
         arrowHeight.updateRestingPosition(restingParams.arrowDimens.height, animate)
-        scalePivotX.updateRestingPosition(restingParams.backgroundDimens.width, animate)
+        scalePivotX.updateRestingPosition(restingParams.scalePivotX, animate)
         backgroundWidth.updateRestingPosition(restingParams.backgroundDimens.width, animate)
         backgroundHeight.updateRestingPosition(restingParams.backgroundDimens.height, animate)
         backgroundEdgeCornerRadius.updateRestingPosition(
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt
index a29eb3b..3770b28 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt
@@ -49,6 +49,7 @@
 
 private const val TAG = "BackPanelController"
 private const val ENABLE_FAILSAFE = true
+private const val FAILSAFE_DELAY_MS = 350L
 
 private const val PX_PER_SEC = 1000
 private const val PX_PER_MS = 1
@@ -64,9 +65,9 @@
 private const val MIN_DURATION_ENTRY_TO_ACTIVE_CONSIDERED_AS_FLING = 100L
 private const val MIN_DURATION_INACTIVE_TO_ACTIVE_CONSIDERED_AS_FLING = 400L
 
-private const val FAILSAFE_DELAY_MS = 350L
-private const val POP_ON_FLING_DELAY = 50L
-private const val POP_ON_FLING_SCALE = 3f
+private const val POP_ON_FLING_DELAY = 60L
+private const val POP_ON_FLING_SCALE = 2f
+private const val POP_ON_COMMITTED_SCALE = 3f
 
 internal val VIBRATE_ACTIVATED_EFFECT =
         VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK)
@@ -774,7 +775,9 @@
                             GestureState.ENTRY,
                             GestureState.INACTIVE,
                             GestureState.CANCELLED -> params.preThresholdIndicator.scalePivotX
-                            else -> params.committedIndicator.scalePivotX
+                            GestureState.ACTIVE -> params.activeIndicator.scalePivotX
+                            GestureState.FLUNG,
+                            GestureState.COMMITTED -> params.committedIndicator.scalePivotX
                         },
                         horizontalTranslation = when (currentState) {
                             GestureState.GONE -> {
@@ -921,7 +924,7 @@
                     mainHandler.postDelayed(onEndSetGoneStateListener.runnable,
                             MIN_DURATION_COMMITTED_AFTER_FLING_ANIMATION)
                 } else {
-                    mView.popScale(POP_ON_FLING_SCALE)
+                    mView.popScale(POP_ON_COMMITTED_SCALE)
                     mainHandler.postDelayed(onAlphaEndSetGoneStateListener.runnable,
                             MIN_DURATION_COMMITTED_ANIMATION)
                 }
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
index 5817b3e..26b0e8d 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
@@ -82,6 +82,7 @@
 import com.android.systemui.shared.system.TaskStackChangeListener;
 import com.android.systemui.shared.system.TaskStackChangeListeners;
 import com.android.systemui.shared.tracing.ProtoTraceable;
+import com.android.systemui.statusbar.phone.LightBarController;
 import com.android.systemui.tracing.ProtoTracer;
 import com.android.systemui.tracing.nano.EdgeBackGestureHandlerProto;
 import com.android.systemui.tracing.nano.SystemUiTraceProto;
@@ -207,6 +208,7 @@
     private final Provider<BackGestureTfClassifierProvider>
             mBackGestureTfClassifierProviderProvider;
     private final FeatureFlags mFeatureFlags;
+    private final Provider<LightBarController> mLightBarControllerProvider;
 
     // The left side edge width where touch down is allowed
     private int mEdgeWidthLeft;
@@ -352,7 +354,8 @@
             FalsingManager falsingManager,
             Provider<NavigationBarEdgePanel> navigationBarEdgePanelProvider,
             Provider<BackGestureTfClassifierProvider> backGestureTfClassifierProviderProvider,
-            FeatureFlags featureFlags) {
+            FeatureFlags featureFlags,
+            Provider<LightBarController> lightBarControllerProvider) {
         mContext = context;
         mDisplayId = context.getDisplayId();
         mMainExecutor = executor;
@@ -372,6 +375,7 @@
         mNavBarEdgePanelProvider = navigationBarEdgePanelProvider;
         mBackGestureTfClassifierProviderProvider = backGestureTfClassifierProviderProvider;
         mFeatureFlags = featureFlags;
+        mLightBarControllerProvider = lightBarControllerProvider;
         mLastReportedConfig.setTo(mContext.getResources().getConfiguration());
         ComponentName recentsComponentName = ComponentName.unflattenFromString(
                 context.getString(com.android.internal.R.string.config_recentsComponentName));
@@ -1055,6 +1059,7 @@
         if (DEBUG_MISSING_GESTURE) {
             Log.d(DEBUG_MISSING_GESTURE_TAG, "Update display size: mDisplaySize=" + mDisplaySize);
         }
+
         if (mEdgeBackPlugin != null) {
             mEdgeBackPlugin.setDisplaySize(mDisplaySize);
         }
@@ -1148,6 +1153,13 @@
     public void setBackAnimation(BackAnimation backAnimation) {
         mBackAnimation = backAnimation;
         updateBackAnimationThresholds();
+        if (mLightBarControllerProvider.get() != null) {
+            mBackAnimation.setStatusBarCustomizer((appearance) -> {
+                mMainExecutor.execute(() ->
+                        mLightBarControllerProvider.get()
+                                .customizeStatusBarAppearance(appearance));
+            });
+        }
     }
 
     /**
@@ -1175,6 +1187,7 @@
         private final Provider<BackGestureTfClassifierProvider>
                 mBackGestureTfClassifierProviderProvider;
         private final FeatureFlags mFeatureFlags;
+        private final Provider<LightBarController> mLightBarControllerProvider;
 
         @Inject
         public Factory(OverviewProxyService overviewProxyService,
@@ -1194,7 +1207,8 @@
                        Provider<NavigationBarEdgePanel> navBarEdgePanelProvider,
                        Provider<BackGestureTfClassifierProvider>
                                backGestureTfClassifierProviderProvider,
-                       FeatureFlags featureFlags) {
+                       FeatureFlags featureFlags,
+                       Provider<LightBarController> lightBarControllerProvider) {
             mOverviewProxyService = overviewProxyService;
             mSysUiState = sysUiState;
             mPluginManager = pluginManager;
@@ -1212,6 +1226,7 @@
             mNavBarEdgePanelProvider = navBarEdgePanelProvider;
             mBackGestureTfClassifierProviderProvider = backGestureTfClassifierProviderProvider;
             mFeatureFlags = featureFlags;
+            mLightBarControllerProvider = lightBarControllerProvider;
         }
 
         /** Construct a {@link EdgeBackGestureHandler}. */
@@ -1234,7 +1249,8 @@
                     mFalsingManager,
                     mNavBarEdgePanelProvider,
                     mBackGestureTfClassifierProviderProvider,
-                    mFeatureFlags);
+                    mFeatureFlags,
+                    mLightBarControllerProvider);
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt
index 6ce6f0d..c9d8c84 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt
@@ -35,7 +35,7 @@
     data class BackIndicatorDimens(
             val horizontalTranslation: Float? = 0f,
             val scale: Float = 0f,
-            val scalePivotX: Float = 0f,
+            val scalePivotX: Float? = null,
             val arrowDimens: ArrowDimens,
             val backgroundDimens: BackgroundDimens,
             val verticalTranslationSpring: SpringForce? = null,
@@ -203,7 +203,8 @@
                 horizontalTranslation = getDimen(R.dimen.navigation_edge_active_margin),
                 scale = getDimenFloat(R.dimen.navigation_edge_active_scale),
                 horizontalTranslationSpring = entryActiveHorizontalTranslationSpring,
-                scaleSpring = createSpring(450f, 0.415f),
+                scaleSpring = createSpring(450f, 0.39f),
+                scalePivotX = getDimen(R.dimen.navigation_edge_active_background_width),
                 arrowDimens = ArrowDimens(
                         length = getDimen(R.dimen.navigation_edge_active_arrow_length),
                         height = getDimen(R.dimen.navigation_edge_active_arrow_height),
@@ -258,6 +259,7 @@
 
         committedIndicator = activeIndicator.copy(
                 horizontalTranslation = null,
+                scalePivotX = null,
                 arrowDimens = activeIndicator.arrowDimens.copy(
                         lengthSpring = activeCommittedArrowLengthSpring,
                         heightSpring = activeCommittedArrowHeightSpring,
diff --git a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt
index f5c0a94..334c70b 100644
--- a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt
+++ b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt
@@ -296,7 +296,8 @@
 
         // EXTRA_USE_STYLUS_MODE does not mean a stylus is in-use, but a stylus entrypoint
         // was used to start the note task.
-        putExtra(Intent.EXTRA_USE_STYLUS_MODE, true)
+        val useStylusMode = info.entryPoint != NoteTaskEntryPoint.KEYBOARD_SHORTCUT
+        putExtra(Intent.EXTRA_USE_STYLUS_MODE, useStylusMode)
 
         addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
         // We should ensure the note experience can be opened both as a full screen (lockscreen)
diff --git a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskEntryPoint.kt b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskEntryPoint.kt
index 2fa8f9a..fae325c 100644
--- a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskEntryPoint.kt
+++ b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskEntryPoint.kt
@@ -25,7 +25,8 @@
  * An entry point represents where the note task has ben called from. In rare cases, it may
  * represent a "re-entry" (i.e., [APP_CLIPS]).
  */
-enum class NoteTaskEntryPoint {
+enum class
+NoteTaskEntryPoint {
 
     /** @see [LaunchNoteTaskActivity] */
     WIDGET_PICKER_SHORTCUT,
@@ -38,4 +39,7 @@
 
     /** @see [AppClipsTrampolineActivity] */
     APP_CLIPS,
+
+    /** @see [NoteTaskInitializer.callbacks] */
+    KEYBOARD_SHORTCUT,
 }
diff --git a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskEventLogger.kt b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskEventLogger.kt
index 16dd16e..48a5933 100644
--- a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskEventLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskEventLogger.kt
@@ -18,6 +18,7 @@
 import com.android.internal.logging.UiEvent
 import com.android.internal.logging.UiEventLogger
 import com.android.systemui.notetask.NoteTaskEntryPoint.APP_CLIPS
+import com.android.systemui.notetask.NoteTaskEntryPoint.KEYBOARD_SHORTCUT
 import com.android.systemui.notetask.NoteTaskEntryPoint.QUICK_AFFORDANCE
 import com.android.systemui.notetask.NoteTaskEntryPoint.TAIL_BUTTON
 import com.android.systemui.notetask.NoteTaskEntryPoint.WIDGET_PICKER_SHORTCUT
@@ -51,6 +52,7 @@
                 WIDGET_PICKER_SHORTCUT -> NOTE_OPENED_VIA_SHORTCUT
                 QUICK_AFFORDANCE -> NOTE_OPENED_VIA_KEYGUARD_QUICK_AFFORDANCE
                 APP_CLIPS -> return
+                KEYBOARD_SHORTCUT -> return
                 null -> return
             }
         uiEventLogger.log(event, info.uid, info.packageName)
@@ -70,6 +72,7 @@
                 WIDGET_PICKER_SHORTCUT -> return
                 QUICK_AFFORDANCE -> return
                 APP_CLIPS -> return
+                KEYBOARD_SHORTCUT -> return
                 null -> return
             }
         uiEventLogger.log(event, info.uid, info.packageName)
diff --git a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskInitializer.kt b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskInitializer.kt
index 04ed08b..23ee13b 100644
--- a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskInitializer.kt
+++ b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskInitializer.kt
@@ -41,9 +41,12 @@
     @VisibleForTesting
     val callbacks =
         object : CommandQueue.Callbacks {
-            override fun handleSystemKey(keyCode: Int) {
-                if (keyCode == KeyEvent.KEYCODE_STYLUS_BUTTON_TAIL) {
+            override fun handleSystemKey(key: KeyEvent) {
+                if (key.keyCode == KeyEvent.KEYCODE_STYLUS_BUTTON_TAIL) {
                     controller.showNoteTask(NoteTaskEntryPoint.TAIL_BUTTON)
+                } else if (key.keyCode == KeyEvent.KEYCODE_N && key.isMetaPressed &&
+                        key.isCtrlPressed) {
+                    controller.showNoteTask(NoteTaskEntryPoint.KEYBOARD_SHORTCUT)
                 }
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/notetask/shortcut/LaunchNoteTaskActivity.kt b/packages/SystemUI/src/com/android/systemui/notetask/shortcut/LaunchNoteTaskActivity.kt
index 44855fb..0f38d32 100644
--- a/packages/SystemUI/src/com/android/systemui/notetask/shortcut/LaunchNoteTaskActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/notetask/shortcut/LaunchNoteTaskActivity.kt
@@ -18,9 +18,11 @@
 
 import android.content.Context
 import android.content.Intent
-import android.content.pm.UserInfo
+import android.os.Build
 import android.os.Bundle
+import android.os.UserHandle
 import android.os.UserManager
+import android.util.Log
 import androidx.activity.ComponentActivity
 import com.android.systemui.notetask.NoteTaskController
 import com.android.systemui.notetask.NoteTaskEntryPoint
@@ -63,9 +65,13 @@
         //        | Bubble#showOrHideAppBubble |   <--------------
         //        |      (with WP user ID)     |
         //         ----------------------------
-        val mainUser: UserInfo? = userTracker.userProfiles.firstOrNull { it.isMain }
-        if (userManager.isManagedProfile && mainUser != null) {
-            controller.startNoteTaskProxyActivityForUser(mainUser.userHandle)
+        val mainUser: UserHandle? = userManager.mainUser
+        if (userManager.isManagedProfile) {
+            if (mainUser == null) {
+                logDebug { "Can't find the main user. Skipping the notes app launch." }
+            } else {
+                controller.startNoteTaskProxyActivityForUser(mainUser)
+            }
         } else {
             controller.showNoteTask(entryPoint = NoteTaskEntryPoint.WIDGET_PICKER_SHORTCUT)
         }
@@ -83,3 +89,8 @@
         }
     }
 }
+
+/** [Log.println] a [Log.DEBUG] message, only when [Build.IS_DEBUGGABLE]. */
+private inline fun Any.logDebug(message: () -> String) {
+    if (Build.IS_DEBUGGABLE) Log.d(this::class.java.simpleName.orEmpty(), message())
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt
index 5355865..0641eec 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt
@@ -47,7 +47,6 @@
 import androidx.recyclerview.widget.DiffUtil
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
-import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED
 import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.TASK_MANAGER_INFORM_JOB_SCHEDULER_OF_PENDING_APP_STOP
 import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.TASK_MANAGER_SHOW_FOOTER_DOT
 import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.TASK_MANAGER_SHOW_STOP_BUTTON_FOR_USER_ALLOWLISTED_APPS
@@ -80,8 +79,6 @@
 
 /** A controller for the dealing with services running in the foreground. */
 interface FgsManagerController {
-    /** Whether the TaskManager (and therefore this controller) is actually available. */
-    val isAvailable: StateFlow<Boolean>
 
     /** The number of packages with a service running in the foreground. */
     val numRunningPackages: Int
@@ -155,7 +152,6 @@
 
     companion object {
         private const val INTERACTION_JANK_TAG = "active_background_apps"
-        private const val DEFAULT_TASK_MANAGER_ENABLED = true
         private const val DEFAULT_TASK_MANAGER_SHOW_FOOTER_DOT = false
         private const val DEFAULT_TASK_MANAGER_SHOW_STOP_BUTTON_FOR_USER_ALLOWLISTED_APPS = true
         private const val DEFAULT_TASK_MANAGER_SHOW_USER_VISIBLE_JOBS = true
@@ -165,9 +161,6 @@
     override var newChangesSinceDialogWasDismissed = false
         private set
 
-    val _isAvailable = MutableStateFlow(false)
-    override val isAvailable: StateFlow<Boolean> = _isAvailable.asStateFlow()
-
     val _showFooterDot = MutableStateFlow(false)
     override val showFooterDot: StateFlow<Boolean> = _showFooterDot.asStateFlow()
 
@@ -264,7 +257,6 @@
                 NAMESPACE_SYSTEMUI,
                 backgroundExecutor
             ) {
-                _isAvailable.value = it.getBoolean(TASK_MANAGER_ENABLED, _isAvailable.value)
                 _showFooterDot.value =
                     it.getBoolean(TASK_MANAGER_SHOW_FOOTER_DOT, _showFooterDot.value)
                 showStopBtnForUserAllowlistedApps = it.getBoolean(
@@ -280,11 +272,6 @@
                     TASK_MANAGER_SHOW_STOP_BUTTON_FOR_USER_ALLOWLISTED_APPS,
                     informJobSchedulerOfPendingAppStop)
             }
-
-            _isAvailable.value = deviceConfigProxy.getBoolean(
-                NAMESPACE_SYSTEMUI,
-                TASK_MANAGER_ENABLED, DEFAULT_TASK_MANAGER_ENABLED
-            )
             _showFooterDot.value = deviceConfigProxy.getBoolean(
                 NAMESPACE_SYSTEMUI,
                 TASK_MANAGER_SHOW_FOOTER_DOT, DEFAULT_TASK_MANAGER_SHOW_FOOTER_DOT
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
index 9ece72d..ce690e2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
@@ -26,6 +26,7 @@
 import com.android.systemui.plugins.qs.QSFactory;
 import com.android.systemui.plugins.qs.QSTile;
 import com.android.systemui.plugins.qs.QSTileView;
+import com.android.systemui.qs.pipeline.data.repository.CustomTileAddedRepository;
 import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor;
 import com.android.systemui.util.leak.GarbageMonitor;
 
@@ -34,19 +35,18 @@
 import java.util.Collection;
 import java.util.List;
 
-public interface QSHost extends PanelInteractor {
+public interface QSHost extends PanelInteractor, CustomTileAddedRepository {
     String TILES_SETTING = Settings.Secure.QS_TILES;
     int POSITION_AT_END = -1;
 
     /**
      * Returns the default QS tiles for the context.
-     * @param context the context to obtain the resources from
+     * @param res the resources to use to determine the default tiles
      * @return a list of specs of the default tiles
      */
-    static List<String> getDefaultSpecs(Context context) {
+    static List<String> getDefaultSpecs(Resources res) {
         final ArrayList<String> tiles = new ArrayList();
 
-        final Resources res = context.getResources();
         final String defaultTileList = res.getString(R.string.quick_settings_tiles_default);
 
         tiles.addAll(Arrays.asList(defaultTileList.split(",")));
@@ -103,9 +103,6 @@
     void removeTileByUser(ComponentName tile);
     void changeTilesByUser(List<String> previousTiles, List<String> newTiles);
 
-    boolean isTileAdded(ComponentName componentName, int userId);
-    void setTileAdded(ComponentName componentName, int userId, boolean added);
-
     int indexOf(String tileSpec);
 
     InstanceId getNewInstanceId();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
index 0ead979..8bbdeed 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
@@ -600,7 +600,7 @@
             if (tile.isEmpty()) continue;
             if (tile.equals("default")) {
                 if (!addedDefault) {
-                    List<String> defaultSpecs = QSHost.getDefaultSpecs(context);
+                    List<String> defaultSpecs = QSHost.getDefaultSpecs(context.getResources());
                     for (String spec : defaultSpecs) {
                         if (!addedSpecs.contains(spec)) {
                             tiles.add(spec);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java
index a319fb8..4002ac3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java
@@ -175,7 +175,7 @@
 
 
     private void reset() {
-        mTileAdapter.resetTileSpecs(QSHost.getDefaultSpecs(getContext()));
+        mTileAdapter.resetTileSpecs(QSHost.getDefaultSpecs(getContext().getResources()));
     }
 
     public boolean isCustomizing() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSHostModule.kt b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSHostModule.kt
index 958fa71..964fe710 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSHostModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSHostModule.kt
@@ -20,6 +20,8 @@
 import com.android.systemui.flags.Flags
 import com.android.systemui.qs.QSHost
 import com.android.systemui.qs.QSTileHost
+import com.android.systemui.qs.pipeline.data.repository.CustomTileAddedRepository
+import com.android.systemui.qs.pipeline.data.repository.CustomTileAddedSharedPrefsRepository
 import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor
 import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractorImpl
 import dagger.Binds
@@ -46,5 +48,19 @@
                 qsHost
             }
         }
+
+        @Provides
+        @JvmStatic
+        fun provideCustomTileAddedRepository(
+            featureFlags: FeatureFlags,
+            qsHost: QSHost,
+            customTileAddedRepository: CustomTileAddedSharedPrefsRepository
+        ): CustomTileAddedRepository {
+            return if (featureFlags.isEnabled(Flags.QS_PIPELINE_NEW_HOST)) {
+                customTileAddedRepository
+            } else {
+                qsHost
+            }
+        }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java
index cfe9313..dffe7fd 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java
@@ -29,6 +29,7 @@
 import com.android.systemui.qs.QSHost;
 import com.android.systemui.qs.ReduceBrightColorsController;
 import com.android.systemui.qs.external.QSExternalModule;
+import com.android.systemui.qs.pipeline.dagger.QSPipelineModule;
 import com.android.systemui.qs.tileimpl.QSTileImpl;
 import com.android.systemui.statusbar.phone.AutoTileManager;
 import com.android.systemui.statusbar.phone.ManagedProfileController;
@@ -40,14 +41,14 @@
 import com.android.systemui.statusbar.policy.WalletController;
 import com.android.systemui.util.settings.SecureSettings;
 
-import java.util.Map;
-
-import javax.inject.Named;
-
 import dagger.Module;
 import dagger.Provides;
 import dagger.multibindings.Multibinds;
 
+import java.util.Map;
+
+import javax.inject.Named;
+
 /**
  * Module for QS dependencies
  */
@@ -56,7 +57,8 @@
                 MediaModule.class,
                 QSExternalModule.class,
                 QSFlagsModule.class,
-                QSHostModule.class
+                QSHostModule.class,
+                QSPipelineModule.class,
         }
 )
 public interface QSModule {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
index 9f93e49..7a10a27 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
@@ -33,6 +33,7 @@
 
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener;
+import com.android.systemui.qs.pipeline.data.repository.CustomTileAddedRepository;
 import com.android.systemui.settings.UserTracker;
 
 import java.util.List;
@@ -59,6 +60,7 @@
     private final TileLifecycleManager mStateManager;
     private final Handler mHandler;
     private final UserTracker mUserTracker;
+    private final CustomTileAddedRepository mCustomTileAddedRepository;
     private boolean mBindRequested;
     private boolean mBindAllowed;
     private boolean mBound;
@@ -72,9 +74,10 @@
     private boolean mStarted = false;
 
     TileServiceManager(TileServices tileServices, Handler handler, ComponentName component,
-            BroadcastDispatcher broadcastDispatcher, UserTracker userTracker) {
-        this(tileServices, handler, userTracker, new TileLifecycleManager(handler,
-                tileServices.getContext(), tileServices,
+            BroadcastDispatcher broadcastDispatcher, UserTracker userTracker,
+            CustomTileAddedRepository customTileAddedRepository) {
+        this(tileServices, handler, userTracker, customTileAddedRepository,
+                new TileLifecycleManager(handler, tileServices.getContext(), tileServices,
                 new PackageManagerAdapter(tileServices.getContext()), broadcastDispatcher,
                 new Intent(TileService.ACTION_QS_TILE).setComponent(component),
                 userTracker.getUserHandle()));
@@ -82,11 +85,13 @@
 
     @VisibleForTesting
     TileServiceManager(TileServices tileServices, Handler handler, UserTracker userTracker,
+            CustomTileAddedRepository customTileAddedRepository,
             TileLifecycleManager tileLifecycleManager) {
         mServices = tileServices;
         mHandler = handler;
         mStateManager = tileLifecycleManager;
         mUserTracker = userTracker;
+        mCustomTileAddedRepository = customTileAddedRepository;
 
         IntentFilter filter = new IntentFilter();
         filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
@@ -111,8 +116,8 @@
         mStarted = true;
         ComponentName component = mStateManager.getComponent();
         final int userId = mStateManager.getUserId();
-        if (!mServices.getHost().isTileAdded(component, userId)) {
-            mServices.getHost().setTileAdded(component, userId, true);
+        if (!mCustomTileAddedRepository.isTileAdded(component, userId)) {
+            mCustomTileAddedRepository.setTileAdded(component, userId, true);
             mStateManager.onTileAdded();
             mStateManager.flushMessagesAndUnbind();
         }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
index 5e4f531..121955c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
@@ -30,6 +30,7 @@
 import android.service.quicksettings.Tile;
 import android.util.ArrayMap;
 import android.util.Log;
+import android.util.SparseArrayMap;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -40,6 +41,7 @@
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.qs.QSHost;
+import com.android.systemui.qs.pipeline.data.repository.CustomTileAddedRepository;
 import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor;
 import com.android.systemui.settings.UserTracker;
 import com.android.systemui.statusbar.CommandQueue;
@@ -64,7 +66,7 @@
     private static final String TAG = "TileServices";
 
     private final ArrayMap<CustomTile, TileServiceManager> mServices = new ArrayMap<>();
-    private final ArrayMap<ComponentName, CustomTile> mTiles = new ArrayMap<>();
+    private final SparseArrayMap<ComponentName, CustomTile> mTiles = new SparseArrayMap<>();
     private final ArrayMap<IBinder, CustomTile> mTokenMap = new ArrayMap<>();
     private final Context mContext;
     private final Handler mMainHandler;
@@ -76,6 +78,7 @@
     private final UserTracker mUserTracker;
     private final StatusBarIconController mStatusBarIconController;
     private final PanelInteractor mPanelInteractor;
+    private final CustomTileAddedRepository mCustomTileAddedRepository;
 
     private int mMaxBound = DEFAULT_MAX_BOUND;
 
@@ -88,7 +91,8 @@
             KeyguardStateController keyguardStateController,
             CommandQueue commandQueue,
             StatusBarIconController statusBarIconController,
-            PanelInteractor panelInteractor) {
+            PanelInteractor panelInteractor,
+            CustomTileAddedRepository customTileAddedRepository) {
         mHost = host;
         mKeyguardStateController = keyguardStateController;
         mContext = mHost.getContext();
@@ -100,6 +104,7 @@
         mStatusBarIconController = statusBarIconController;
         mCommandQueue.addCallback(mRequestListeningCallback);
         mPanelInteractor = panelInteractor;
+        mCustomTileAddedRepository = customTileAddedRepository;
     }
 
     public Context getContext() {
@@ -112,10 +117,11 @@
 
     public TileServiceManager getTileWrapper(CustomTile tile) {
         ComponentName component = tile.getComponent();
+        int userId = tile.getUser();
         TileServiceManager service = onCreateTileService(component, mBroadcastDispatcher);
         synchronized (mServices) {
             mServices.put(tile, service);
-            mTiles.put(component, tile);
+            mTiles.add(userId, component, tile);
             mTokenMap.put(service.getToken(), tile);
         }
         // Makes sure binding only happens after the maps have been populated
@@ -126,7 +132,7 @@
     protected TileServiceManager onCreateTileService(ComponentName component,
             BroadcastDispatcher broadcastDispatcher) {
         return new TileServiceManager(this, mHandlerProvider.get(), component,
-                broadcastDispatcher, mUserTracker);
+                broadcastDispatcher, mUserTracker, mCustomTileAddedRepository);
     }
 
     public void freeService(CustomTile tile, TileServiceManager service) {
@@ -135,7 +141,7 @@
             service.handleDestroy();
             mServices.remove(tile);
             mTokenMap.remove(service.getToken());
-            mTiles.remove(tile.getComponent());
+            mTiles.delete(tile.getUser(), tile.getComponent());
             final String slot = getStatusBarIconSlotName(tile.getComponent());
             mMainHandler.post(() -> mStatusBarIconController.removeIconForTile(slot));
         }
@@ -188,9 +194,10 @@
 
     private void requestListening(ComponentName component) {
         synchronized (mServices) {
-            CustomTile customTile = getTileForComponent(component);
+            int userId = mUserTracker.getUserId();
+            CustomTile customTile = getTileForUserAndComponent(userId, component);
             if (customTile == null) {
-                Log.d("TileServices", "Couldn't find tile for " + component);
+                Log.d(TAG, "Couldn't find tile for " + component + "(" + userId + ")");
                 return;
             }
             TileServiceManager service = mServices.get(customTile);
@@ -362,9 +369,9 @@
     }
 
     @Nullable
-    private CustomTile getTileForComponent(ComponentName component) {
+    private CustomTile getTileForUserAndComponent(int userId, ComponentName component) {
         synchronized (mServices) {
-            return mTiles.get(component);
+            return mTiles.get(userId, component);
         }
     }
 
@@ -395,4 +402,5 @@
             return -Integer.compare(left.getBindPriority(), right.getBindPriority());
         }
     };
+
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/footer/data/repository/ForegroundServicesRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/footer/data/repository/ForegroundServicesRepository.kt
index 37a9c40..bd9d70c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/footer/data/repository/ForegroundServicesRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/footer/data/repository/ForegroundServicesRepository.kt
@@ -32,8 +32,6 @@
 interface ForegroundServicesRepository {
     /**
      * The number of packages with a service running in the foreground.
-     *
-     * Note that this will be equal to 0 if [FgsManagerController.isAvailable] is false.
      */
     val foregroundServicesCount: Flow<Int>
 
@@ -52,32 +50,24 @@
     fgsManagerController: FgsManagerController,
 ) : ForegroundServicesRepository {
     override val foregroundServicesCount: Flow<Int> =
-        fgsManagerController.isAvailable
-            .flatMapLatest { isAvailable ->
-                if (!isAvailable) {
-                    return@flatMapLatest flowOf(0)
+            conflatedCallbackFlow<Int> {
+                fun updateState(numberOfPackages: Int) {
+                    trySendWithFailureLogging(numberOfPackages, TAG)
                 }
 
-                conflatedCallbackFlow {
-                    fun updateState(numberOfPackages: Int) {
-                        trySendWithFailureLogging(numberOfPackages, TAG)
-                    }
-
-                    val listener =
+                val listener =
                         object : FgsManagerController.OnNumberOfPackagesChangedListener {
                             override fun onNumberOfPackagesChanged(numberOfPackages: Int) {
                                 updateState(numberOfPackages)
                             }
                         }
 
-                    fgsManagerController.addOnNumberOfPackagesChangedListener(listener)
-                    updateState(fgsManagerController.numRunningPackages)
-                    awaitClose {
-                        fgsManagerController.removeOnNumberOfPackagesChangedListener(listener)
-                    }
+                fgsManagerController.addOnNumberOfPackagesChangedListener(listener)
+                updateState(fgsManagerController.numRunningPackages)
+                awaitClose {
+                    fgsManagerController.removeOnNumberOfPackagesChangedListener(listener)
                 }
-            }
-            .distinctUntilChanged()
+            }.distinctUntilChanged()
 
     override val hasNewChanges: Flow<Boolean> =
         fgsManagerController.showFooterDot.flatMapLatest { showFooterDot ->
diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt
new file mode 100644
index 0000000..00f0a67
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.pipeline.dagger
+
+import com.android.systemui.CoreStartable
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.log.LogBufferFactory
+import com.android.systemui.plugins.log.LogBuffer
+import com.android.systemui.qs.pipeline.data.repository.TileSpecRepository
+import com.android.systemui.qs.pipeline.data.repository.TileSpecSettingsRepository
+import com.android.systemui.qs.pipeline.prototyping.PrototypeCoreStartable
+import com.android.systemui.qs.pipeline.shared.logging.QSPipelineLogger
+import dagger.Binds
+import dagger.Module
+import dagger.Provides
+import dagger.multibindings.ClassKey
+import dagger.multibindings.IntoMap
+
+@Module
+abstract class QSPipelineModule {
+
+    /** Implementation for [TileSpecRepository] */
+    @Binds
+    abstract fun provideTileSpecRepository(impl: TileSpecSettingsRepository): TileSpecRepository
+
+    @Binds
+    @IntoMap
+    @ClassKey(PrototypeCoreStartable::class)
+    abstract fun providePrototypeCoreStartable(startable: PrototypeCoreStartable): CoreStartable
+
+    companion object {
+        /**
+         * Provides a logging buffer for all logs related to the new Quick Settings pipeline to log
+         * the list of current tiles.
+         */
+        @Provides
+        @SysUISingleton
+        @QSTileListLog
+        fun provideQSTileListLogBuffer(factory: LogBufferFactory): LogBuffer {
+            return factory.create(QSPipelineLogger.TILE_LIST_TAG, maxSize = 700, systrace = false)
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSTileListLog.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSTileListLog.kt
new file mode 100644
index 0000000..ad8bfea
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSTileListLog.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.qs.pipeline.dagger
+
+import java.lang.annotation.Retention
+import java.lang.annotation.RetentionPolicy
+import javax.inject.Qualifier
+
+/** A {@link LogBuffer} for the new QS Pipeline for logging changes to the set of current tiles. */
+@Qualifier @MustBeDocumented @Retention(RetentionPolicy.RUNTIME) annotation class QSTileListLog
diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/CustomTileAddedRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/CustomTileAddedRepository.kt
new file mode 100644
index 0000000..7fc906b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/CustomTileAddedRepository.kt
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.pipeline.data.repository
+
+import android.content.ComponentName
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.settings.UserFileManager
+import javax.inject.Inject
+
+/**
+ * Repository for keeping track of whether a given [CustomTile] [ComponentName] has been added to
+ * the set of current tiles for a user. This is used to determine when lifecycle methods in
+ * `TileService` about the tile being added/removed need to be called.
+ */
+interface CustomTileAddedRepository {
+    /**
+     * Check if a particular [CustomTile] associated with [componentName] has been added for
+     * [userId] and has not been removed since.
+     */
+    fun isTileAdded(componentName: ComponentName, userId: Int): Boolean
+
+    /**
+     * Persists whether a particular [CustomTile] associated with [componentName] has been added and
+     * it's currently in the set of selected tiles for [userId].
+     */
+    fun setTileAdded(componentName: ComponentName, userId: Int, added: Boolean)
+}
+
+@SysUISingleton
+class CustomTileAddedSharedPrefsRepository
+@Inject
+constructor(private val userFileManager: UserFileManager) : CustomTileAddedRepository {
+
+    override fun isTileAdded(componentName: ComponentName, userId: Int): Boolean {
+        return userFileManager
+            .getSharedPreferences(TILES, 0, userId)
+            .getBoolean(componentName.flattenToString(), false)
+    }
+
+    override fun setTileAdded(componentName: ComponentName, userId: Int, added: Boolean) {
+        userFileManager
+            .getSharedPreferences(TILES, 0, userId)
+            .edit()
+            .putBoolean(componentName.flattenToString(), added)
+            .apply()
+    }
+
+    companion object {
+        private const val TILES = "tiles_prefs"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TileSpecRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TileSpecRepository.kt
new file mode 100644
index 0000000..d254e1b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TileSpecRepository.kt
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.pipeline.data.repository
+
+import android.annotation.UserIdInt
+import android.content.res.Resources
+import android.database.ContentObserver
+import android.provider.Settings
+import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.qs.QSHost
+import com.android.systemui.qs.pipeline.shared.TileSpec
+import com.android.systemui.qs.pipeline.shared.logging.QSPipelineLogger
+import com.android.systemui.util.settings.SecureSettings
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.flow.onStart
+import kotlinx.coroutines.withContext
+
+/** Repository that tracks the current tiles. */
+interface TileSpecRepository {
+
+    /**
+     * Returns a flow of the current list of [TileSpec] for a given [userId].
+     *
+     * Tiles will never be [TileSpec.Invalid] in the list and it will never be empty.
+     */
+    fun tilesSpecs(@UserIdInt userId: Int): Flow<List<TileSpec>>
+
+    /**
+     * Adds a [tile] for a given [userId] at [position]. Using [POSITION_AT_END] will add the tile
+     * at the end of the list.
+     *
+     * Passing [TileSpec.Invalid] is a noop.
+     */
+    suspend fun addTile(@UserIdInt userId: Int, tile: TileSpec, position: Int = POSITION_AT_END)
+
+    /**
+     * Removes a [tile] for a given [userId].
+     *
+     * Passing [TileSpec.Invalid] or a non present tile is a noop.
+     */
+    suspend fun removeTile(@UserIdInt userId: Int, tile: TileSpec)
+
+    /**
+     * Sets the list of current [tiles] for a given [userId].
+     *
+     * [TileSpec.Invalid] will be ignored, and an effectively empty list will not be stored.
+     */
+    suspend fun setTiles(@UserIdInt userId: Int, tiles: List<TileSpec>)
+
+    companion object {
+        /** Position to indicate the end of the list */
+        const val POSITION_AT_END = -1
+    }
+}
+
+/**
+ * Implementation of [TileSpecRepository] that persist the values of tiles in
+ * [Settings.Secure.QS_TILES].
+ *
+ * All operations against [Settings] will be performed in a background thread.
+ */
+@SysUISingleton
+class TileSpecSettingsRepository
+@Inject
+constructor(
+    private val secureSettings: SecureSettings,
+    @Main private val resources: Resources,
+    private val logger: QSPipelineLogger,
+    @Background private val backgroundDispatcher: CoroutineDispatcher,
+) : TileSpecRepository {
+    override fun tilesSpecs(userId: Int): Flow<List<TileSpec>> {
+        return conflatedCallbackFlow {
+                val observer =
+                    object : ContentObserver(null) {
+                        override fun onChange(selfChange: Boolean) {
+                            trySend(Unit)
+                        }
+                    }
+
+                secureSettings.registerContentObserverForUser(SETTING, observer, userId)
+
+                awaitClose { secureSettings.unregisterContentObserver(observer) }
+            }
+            .onStart { emit(Unit) }
+            .map { secureSettings.getStringForUser(SETTING, userId) ?: "" }
+            .onEach { logger.logTilesChangedInSettings(it, userId) }
+            .map { parseTileSpecs(it, userId) }
+            .flowOn(backgroundDispatcher)
+    }
+
+    override suspend fun addTile(userId: Int, tile: TileSpec, position: Int) {
+        if (tile == TileSpec.Invalid) {
+            return
+        }
+        val tilesList = loadTiles(userId).toMutableList()
+        if (tile !in tilesList) {
+            if (position < 0) {
+                tilesList.add(tile)
+            } else {
+                tilesList.add(position, tile)
+            }
+            storeTiles(userId, tilesList)
+        }
+    }
+
+    override suspend fun removeTile(userId: Int, tile: TileSpec) {
+        if (tile == TileSpec.Invalid) {
+            return
+        }
+        val tilesList = loadTiles(userId).toMutableList()
+        if (tilesList.remove(tile)) {
+            storeTiles(userId, tilesList.toList())
+        }
+    }
+
+    override suspend fun setTiles(userId: Int, tiles: List<TileSpec>) {
+        val filtered = tiles.filter { it != TileSpec.Invalid }
+        if (filtered.isNotEmpty()) {
+            storeTiles(userId, filtered)
+        }
+    }
+
+    private suspend fun loadTiles(@UserIdInt forUser: Int): List<TileSpec> {
+        return withContext(backgroundDispatcher) {
+            (secureSettings.getStringForUser(SETTING, forUser) ?: "")
+                .split(DELIMITER)
+                .map(TileSpec::create)
+                .filter { it !is TileSpec.Invalid }
+        }
+    }
+
+    private suspend fun storeTiles(@UserIdInt forUser: Int, tiles: List<TileSpec>) {
+        val toStore =
+            tiles
+                .filter { it !is TileSpec.Invalid }
+                .joinToString(DELIMITER, transform = TileSpec::spec)
+        withContext(backgroundDispatcher) {
+            secureSettings.putStringForUser(
+                SETTING,
+                toStore,
+                null,
+                false,
+                forUser,
+                true,
+            )
+        }
+    }
+
+    private fun parseTileSpecs(tilesFromSettings: String, user: Int): List<TileSpec> {
+        val fromSettings =
+            tilesFromSettings.split(DELIMITER).map(TileSpec::create).filter {
+                it != TileSpec.Invalid
+            }
+        return if (fromSettings.isNotEmpty()) {
+            fromSettings.also { logger.logParsedTiles(it, false, user) }
+        } else {
+            QSHost.getDefaultSpecs(resources)
+                .map(TileSpec::create)
+                .filter { it != TileSpec.Invalid }
+                .also { logger.logParsedTiles(it, true, user) }
+        }
+    }
+
+    companion object {
+        private const val SETTING = Settings.Secure.QS_TILES
+        private const val DELIMITER = ","
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/prototyping/PrototypeCoreStartable.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/prototyping/PrototypeCoreStartable.kt
new file mode 100644
index 0000000..69d8248
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/prototyping/PrototypeCoreStartable.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.pipeline.prototyping
+
+import com.android.systemui.CoreStartable
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.flags.Flags
+import com.android.systemui.qs.pipeline.data.repository.TileSpecRepository
+import com.android.systemui.qs.pipeline.shared.TileSpec
+import com.android.systemui.statusbar.commandline.Command
+import com.android.systemui.statusbar.commandline.CommandRegistry
+import com.android.systemui.user.data.repository.UserRepository
+import java.io.PrintWriter
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.launch
+
+/**
+ * Class for observing results while prototyping.
+ *
+ * The flows do their own logging, so we just need to make sure that they collect.
+ *
+ * This will be torn down together with the last of the new pipeline flags remaining here.
+ */
+// TODO(b/270385608)
+@SysUISingleton
+class PrototypeCoreStartable
+@Inject
+constructor(
+    private val tileSpecRepository: TileSpecRepository,
+    private val userRepository: UserRepository,
+    private val featureFlags: FeatureFlags,
+    @Application private val scope: CoroutineScope,
+    private val commandRegistry: CommandRegistry,
+) : CoreStartable {
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    override fun start() {
+        if (featureFlags.isEnabled(Flags.QS_PIPELINE_NEW_HOST)) {
+            scope.launch {
+                userRepository.selectedUserInfo
+                    .flatMapLatest { user -> tileSpecRepository.tilesSpecs(user.id) }
+                    .collect {}
+            }
+            commandRegistry.registerCommand(COMMAND, ::CommandExecutor)
+        }
+    }
+
+    private inner class CommandExecutor : Command {
+        override fun execute(pw: PrintWriter, args: List<String>) {
+            if (args.size < 2) {
+                pw.println("Error: needs at least two arguments")
+                return
+            }
+            val spec = TileSpec.create(args[1])
+            if (spec == TileSpec.Invalid) {
+                pw.println("Error: Invalid tile spec ${args[1]}")
+            }
+            if (args[0] == "add") {
+                performAdd(args, spec)
+                pw.println("Requested tile added")
+            } else if (args[0] == "remove") {
+                performRemove(args, spec)
+                pw.println("Requested tile removed")
+            } else {
+                pw.println("Error: unknown command")
+            }
+        }
+
+        private fun performAdd(args: List<String>, spec: TileSpec) {
+            val position = args.getOrNull(2)?.toInt() ?: TileSpecRepository.POSITION_AT_END
+            val user = args.getOrNull(3)?.toInt() ?: userRepository.getSelectedUserInfo().id
+            scope.launch { tileSpecRepository.addTile(user, spec, position) }
+        }
+
+        private fun performRemove(args: List<String>, spec: TileSpec) {
+            val user = args.getOrNull(2)?.toInt() ?: userRepository.getSelectedUserInfo().id
+            scope.launch { tileSpecRepository.removeTile(user, spec) }
+        }
+
+        override fun help(pw: PrintWriter) {
+            pw.println("Usage: adb shell cmd statusbar $COMMAND:")
+            pw.println("  add <spec> [position] [user]")
+            pw.println("  remove <spec> [user]")
+        }
+    }
+
+    companion object {
+        private const val COMMAND = "qs-pipeline"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt
new file mode 100644
index 0000000..c691c2f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.pipeline.shared
+
+import android.content.ComponentName
+import android.text.TextUtils
+import com.android.systemui.qs.external.CustomTile
+
+/**
+ * Container for the spec that identifies a tile.
+ *
+ * A tile's [spec] is one of two options:
+ * * `custom(<componentName>)`: A [ComponentName] surrounded by [CustomTile.PREFIX] and terminated
+ *   by `)`, represents a tile provided by an app, corresponding to a `TileService`.
+ * * a string not starting with [CustomTile.PREFIX], representing a tile provided by SystemUI.
+ */
+sealed class TileSpec private constructor(open val spec: String) {
+
+    /** Represents a spec that couldn't be parsed into a valid type of tile. */
+    object Invalid : TileSpec("") {
+        override fun toString(): String {
+            return "TileSpec.INVALID"
+        }
+    }
+
+    /** Container for the spec of a tile provided by SystemUI. */
+    data class PlatformTileSpec
+    internal constructor(
+        override val spec: String,
+    ) : TileSpec(spec)
+
+    /**
+     * Container for the spec of a tile provided by an app.
+     *
+     * [componentName] indicates the associated `TileService`.
+     */
+    data class CustomTileSpec
+    internal constructor(
+        override val spec: String,
+        val componentName: ComponentName,
+    ) : TileSpec(spec)
+
+    companion object {
+        /** Create a [TileSpec] from the string [spec]. */
+        fun create(spec: String): TileSpec {
+            return if (TextUtils.isEmpty(spec)) {
+                Invalid
+            } else if (!spec.isCustomTileSpec) {
+                PlatformTileSpec(spec)
+            } else {
+                spec.componentName?.let { CustomTileSpec(spec, it) } ?: Invalid
+            }
+        }
+
+        private val String.isCustomTileSpec: Boolean
+            get() = startsWith(CustomTile.PREFIX)
+
+        private val String.componentName: ComponentName?
+            get() =
+                if (!isCustomTileSpec) {
+                    null
+                } else {
+                    if (endsWith(")")) {
+                        val extracted = substring(CustomTile.PREFIX.length, length - 1)
+                        ComponentName.unflattenFromString(extracted)
+                    } else {
+                        null
+                    }
+                }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt
new file mode 100644
index 0000000..200f743
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.pipeline.shared.logging
+
+import android.annotation.UserIdInt
+import com.android.systemui.plugins.log.LogBuffer
+import com.android.systemui.plugins.log.LogLevel
+import com.android.systemui.qs.pipeline.dagger.QSTileListLog
+import com.android.systemui.qs.pipeline.shared.TileSpec
+import javax.inject.Inject
+
+/**
+ * Logger for the new pipeline.
+ *
+ * This may log to different buffers depending of the function of the log.
+ */
+class QSPipelineLogger
+@Inject
+constructor(
+    @QSTileListLog private val tileListLogBuffer: LogBuffer,
+) {
+
+    companion object {
+        const val TILE_LIST_TAG = "QSTileListLog"
+    }
+
+    /**
+     * Log the tiles that are parsed in the repo. This is effectively what is surfaces in the flow.
+     *
+     * [usesDefault] indicates if the default tiles were used (due to the setting being empty or
+     * invalid).
+     */
+    fun logParsedTiles(tiles: List<TileSpec>, usesDefault: Boolean, user: Int) {
+        tileListLogBuffer.log(
+            TILE_LIST_TAG,
+            LogLevel.DEBUG,
+            {
+                str1 = tiles.toString()
+                bool1 = usesDefault
+                int1 = user
+            },
+            { "Parsed tiles (default=$bool1, user=$int1): $str1" }
+        )
+    }
+
+    /**
+     * Logs when the tiles change in Settings.
+     *
+     * This could be caused by SystemUI, or restore.
+     */
+    fun logTilesChangedInSettings(newTiles: String, @UserIdInt user: Int) {
+        tileListLogBuffer.log(
+            TILE_LIST_TAG,
+            LogLevel.VERBOSE,
+            {
+                str1 = newTiles
+                int1 = user
+            },
+            { "Tiles changed in settings for user $int1: $str1" }
+        )
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
index 3090b79..4a31998 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
@@ -496,7 +496,7 @@
         }
 
         // Colors
-        if (state.state != lastState || state.disabledByPolicy || lastDisabledByPolicy) {
+        if (state.state != lastState || state.disabledByPolicy != lastDisabledByPolicy) {
             singleAnimator.cancel()
             mQsLogger?.logTileBackgroundColorUpdateIfInternetTile(
                     state.spec,
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 80eea81..630f6b4 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -28,15 +28,16 @@
 import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNFOLD_ANIMATION_FORWARDER;
 import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNLOCK_ANIMATION_CONTROLLER;
 import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_WINDOW_CORNER_RADIUS;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_AWAKE;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DOZING;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DREAMING;
-import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_ON;
-import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_TRANSITION;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_GOING_AWAY;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_TRACING_ENABLED;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_WAKEFULNESS_TRANSITION;
 
 import android.annotation.FloatRange;
 import android.app.ActivityTaskManager;
@@ -85,6 +86,7 @@
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
 import com.android.systemui.keyguard.ScreenLifecycle;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
 import com.android.systemui.model.SysUiState;
 import com.android.systemui.navigationbar.NavigationBar;
 import com.android.systemui.navigationbar.NavigationBarController;
@@ -112,6 +114,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
 import java.util.function.Supplier;
 
@@ -336,7 +339,8 @@
         @Override
         public void expandNotificationPanel() {
             verifyCallerAndClearCallingIdentity("expandNotificationPanel",
-                    () -> mCommandQueue.handleSystemKey(KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN));
+                    () -> mCommandQueue.handleSystemKey(new KeyEvent(KeyEvent.ACTION_DOWN,
+                            KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN)));
         }
 
         @Override
@@ -445,6 +449,10 @@
             notifySystemUiStateFlags(mSysUiState.getFlags());
 
             notifyConnectionChanged();
+            if (mLatchForOnUserChanging != null) {
+                mLatchForOnUserChanging.countDown();
+                mLatchForOnUserChanging = null;
+            }
         }
 
         @Override
@@ -499,11 +507,14 @@
         }
     };
 
+    private CountDownLatch mLatchForOnUserChanging;
     private final UserTracker.Callback mUserChangedCallback =
             new UserTracker.Callback() {
                 @Override
-                public void onUserChanged(int newUser, @NonNull Context userContext) {
+                public void onUserChanging(int newUser, @NonNull Context userContext,
+                        CountDownLatch latch) {
                     mConnectionBackoffAttempts = 0;
+                    mLatchForOnUserChanging = latch;
                     internalConnectToCurrentUser("User changed");
                 }
             };
@@ -520,6 +531,7 @@
             NotificationShadeWindowController statusBarWinController, SysUiState sysUiState,
             UserTracker userTracker,
             ScreenLifecycle screenLifecycle,
+            WakefulnessLifecycle wakefulnessLifecycle,
             UiEventLogger uiEventLogger,
             DisplayTracker displayTracker,
             KeyguardUnlockAnimationController sysuiUnlockAnimationController,
@@ -597,8 +609,8 @@
         // Listen for user setup
         mUserTracker.addCallback(mUserChangedCallback, mMainExecutor);
 
-        screenLifecycle.addObserver(mLifecycleObserver);
-
+        screenLifecycle.addObserver(mScreenLifecycleObserver);
+        wakefulnessLifecycle.addObserver(mWakefulnessLifecycleObserver);
         // Connect to the service
         updateEnabledState();
         startConnectionToCurrentUser();
@@ -673,11 +685,14 @@
     }
 
     private void onStatusBarStateChanged(boolean keyguardShowing, boolean keyguardOccluded,
-            boolean bouncerShowing, boolean isDozing, boolean panelExpanded, boolean isDreaming) {
+            boolean keyguardGoingAway, boolean bouncerShowing, boolean isDozing,
+            boolean panelExpanded, boolean isDreaming) {
         mSysUiState.setFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING,
                         keyguardShowing && !keyguardOccluded)
                 .setFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED,
                         keyguardShowing && keyguardOccluded)
+                .setFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_GOING_AWAY,
+                        keyguardGoingAway)
                 .setFlag(SYSUI_STATE_BOUNCER_SHOWING, bouncerShowing)
                 .setFlag(SYSUI_STATE_DEVICE_DOZING, isDozing)
                 .setFlag(SYSUI_STATE_DEVICE_DREAMING, isDreaming)
@@ -788,7 +803,8 @@
 
     private void disconnectFromLauncherService(String disconnectReason) {
         Log.d(TAG_OPS, "disconnectFromLauncherService bound?: " + mBound +
-                " currentProxy: " + mOverviewProxy + " disconnectReason: " + disconnectReason);
+                " currentProxy: " + mOverviewProxy + " disconnectReason: " + disconnectReason,
+                new Throwable());
         if (mBound) {
             // Always unbind the service (ie. if called through onNullBinding or onBindingDied)
             mContext.unbindService(mOverviewServiceConnection);
@@ -862,81 +878,94 @@
         }
     }
 
-    private final ScreenLifecycle.Observer mLifecycleObserver = new ScreenLifecycle.Observer() {
-        /**
-         * Notifies the Launcher that screen turned on and ready to use
-         */
-        @Override
-        public void onScreenTurnedOn() {
-            mSysUiState
-                .setFlag(SYSUI_STATE_SCREEN_ON, true)
-                .setFlag(SYSUI_STATE_SCREEN_TRANSITION, false)
-                .commitUpdate(mContext.getDisplayId());
-
-            try {
-                if (mOverviewProxy != null) {
-                    mOverviewProxy.onScreenTurnedOn();
-                } else {
-                    Log.e(TAG_OPS, "Failed to get overview proxy for screen turned on event.");
+    private final ScreenLifecycle.Observer mScreenLifecycleObserver =
+            new ScreenLifecycle.Observer() {
+                /**
+                 * Notifies the Launcher that screen turned on and ready to use
+                 */
+                @Override
+                public void onScreenTurnedOn() {
+                    try {
+                        if (mOverviewProxy != null) {
+                            mOverviewProxy.onScreenTurnedOn();
+                        } else {
+                            Log.e(TAG_OPS,
+                                    "Failed to get overview proxy for screen turned on event.");
+                        }
+                    } catch (RemoteException e) {
+                        Log.e(TAG_OPS, "Failed to call onScreenTurnedOn()", e);
+                    }
                 }
-            } catch (RemoteException e) {
-                Log.e(TAG_OPS, "Failed to call onScreenTurnedOn()", e);
-            }
-        }
 
-        /**
-         * Notifies the Launcher that screen turned off.
-         */
-        @Override
-        public void onScreenTurnedOff() {
-            mSysUiState
-                .setFlag(SYSUI_STATE_SCREEN_ON, false)
-                .setFlag(SYSUI_STATE_SCREEN_TRANSITION, false)
-                .commitUpdate(mContext.getDisplayId());
-        }
-
-        /**
-         * Notifies the Launcher that screen is starting to turn on.
-         */
-        @Override
-        public void onScreenTurningOff() {
-            mSysUiState
-                .setFlag(SYSUI_STATE_SCREEN_ON, false)
-                .setFlag(SYSUI_STATE_SCREEN_TRANSITION, true)
-                .commitUpdate(mContext.getDisplayId());
-
-            try {
-                if (mOverviewProxy != null) {
-                    mOverviewProxy.onScreenTurningOff();
-                } else {
-                    Log.e(TAG_OPS, "Failed to get overview proxy for screen turning off event.");
+                /**
+                 * Notifies the Launcher that screen is starting to turn on.
+                 */
+                @Override
+                public void onScreenTurningOff() {
+                    try {
+                        if (mOverviewProxy != null) {
+                            mOverviewProxy.onScreenTurningOff();
+                        } else {
+                            Log.e(TAG_OPS,
+                                    "Failed to get overview proxy for screen turning off event.");
+                        }
+                    } catch (RemoteException e) {
+                        Log.e(TAG_OPS, "Failed to call onScreenTurningOff()", e);
+                    }
                 }
-            } catch (RemoteException e) {
-                Log.e(TAG_OPS, "Failed to call onScreenTurningOff()", e);
-            }
-        }
 
-        /**
-         * Notifies the Launcher that screen is starting to turn on.
-         */
-        @Override
-        public void onScreenTurningOn() {
-            mSysUiState
-                .setFlag(SYSUI_STATE_SCREEN_ON, true)
-                .setFlag(SYSUI_STATE_SCREEN_TRANSITION, true)
-                .commitUpdate(mContext.getDisplayId());
-
-            try {
-                if (mOverviewProxy != null) {
-                    mOverviewProxy.onScreenTurningOn();
-                } else {
-                    Log.e(TAG_OPS, "Failed to get overview proxy for screen turning on event.");
+                /**
+                 * Notifies the Launcher that screen is starting to turn on.
+                 */
+                @Override
+                public void onScreenTurningOn() {
+                    try {
+                        if (mOverviewProxy != null) {
+                            mOverviewProxy.onScreenTurningOn();
+                        } else {
+                            Log.e(TAG_OPS,
+                                    "Failed to get overview proxy for screen turning on event.");
+                        }
+                    } catch (RemoteException e) {
+                        Log.e(TAG_OPS, "Failed to call onScreenTurningOn()", e);
+                    }
                 }
-            } catch (RemoteException e) {
-                Log.e(TAG_OPS, "Failed to call onScreenTurningOn()", e);
-            }
-        }
-    };
+            };
+
+    private final WakefulnessLifecycle.Observer mWakefulnessLifecycleObserver =
+            new WakefulnessLifecycle.Observer() {
+                @Override
+                public void onStartedWakingUp() {
+                    mSysUiState
+                            .setFlag(SYSUI_STATE_AWAKE, true)
+                            .setFlag(SYSUI_STATE_WAKEFULNESS_TRANSITION, true)
+                            .commitUpdate(mContext.getDisplayId());
+                }
+
+                @Override
+                public void onFinishedWakingUp() {
+                    mSysUiState
+                            .setFlag(SYSUI_STATE_AWAKE, true)
+                            .setFlag(SYSUI_STATE_WAKEFULNESS_TRANSITION, false)
+                            .commitUpdate(mContext.getDisplayId());
+                }
+
+                @Override
+                public void onStartedGoingToSleep() {
+                    mSysUiState
+                            .setFlag(SYSUI_STATE_AWAKE, false)
+                            .setFlag(SYSUI_STATE_WAKEFULNESS_TRANSITION, true)
+                            .commitUpdate(mContext.getDisplayId());
+                }
+
+                @Override
+                public void onFinishedGoingToSleep() {
+                    mSysUiState
+                            .setFlag(SYSUI_STATE_AWAKE, false)
+                            .setFlag(SYSUI_STATE_WAKEFULNESS_TRANSITION, false)
+                            .commitUpdate(mContext.getDisplayId());
+                }
+            };
 
     void notifyToggleRecentApps() {
         for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
index efd79d7..3227ef4 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
@@ -190,9 +190,7 @@
         } catch (Exception e) {
             // IOException/UnsupportedOperationException may be thrown if external storage is
             // not mounted
-            if (DEBUG_STORAGE) {
-                Log.d(TAG, "Failed to store screenshot", e);
-            }
+            Log.d(TAG, "Failed to store screenshot", e);
             mParams.clearImage();
             mImageData.reset();
             mQuickShareData.reset();
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
index b2ae4a0..6f85c45 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
@@ -44,7 +44,6 @@
 import android.app.Notification;
 import android.app.assist.AssistContent;
 import android.content.BroadcastReceiver;
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -488,10 +487,6 @@
                     });
         }
 
-        if (DEBUG_WINDOW) {
-            Log.d(TAG, "setContentView: " + mScreenshotView);
-        }
-        setContentView(mScreenshotView);
         // ignore system bar insets for the purpose of window layout
         mWindow.getDecorView().setOnApplyWindowInsetsListener(
                 (v, insets) -> WindowInsets.CONSUMED);
@@ -529,39 +524,6 @@
                 mWindowManager.getCurrentWindowMetrics().getWindowInsets());
     }
 
-    @MainThread
-    void takeScreenshotFullscreen(ComponentName topComponent, Consumer<Uri> finisher,
-            RequestCallback requestCallback) {
-        Assert.isMainThread();
-        mCurrentRequestCallback = requestCallback;
-        takeScreenshotInternal(topComponent, finisher, getFullScreenRect());
-    }
-
-    @MainThread
-    void handleImageAsScreenshot(Bitmap screenshot, Rect screenshotScreenBounds,
-            Insets visibleInsets, int taskId, int userId, ComponentName topComponent,
-            Consumer<Uri> finisher, RequestCallback requestCallback) {
-        Assert.isMainThread();
-        if (screenshot == null) {
-            Log.e(TAG, "Got null bitmap from screenshot message");
-            mNotificationsController.notifyScreenshotError(
-                    R.string.screenshot_failed_to_capture_text);
-            requestCallback.reportError();
-            return;
-        }
-
-        boolean showFlash = false;
-        if (screenshotScreenBounds == null
-                || !aspectRatiosMatch(screenshot, visibleInsets, screenshotScreenBounds)) {
-            showFlash = true;
-            visibleInsets = Insets.NONE;
-            screenshotScreenBounds = new Rect(0, 0, screenshot.getWidth(), screenshot.getHeight());
-        }
-        mCurrentRequestCallback = requestCallback;
-        saveScreenshot(screenshot, finisher, screenshotScreenBounds, visibleInsets, topComponent,
-                showFlash, UserHandle.of(userId));
-    }
-
     /**
      * Clears current screenshot
      */
@@ -699,107 +661,6 @@
         setContentView(mScreenshotView);
     }
 
-    /**
-     * Takes a screenshot of the current display and shows an animation.
-     */
-    private void takeScreenshotInternal(ComponentName topComponent, Consumer<Uri> finisher,
-            Rect crop) {
-        mScreenshotTakenInPortrait =
-                mContext.getResources().getConfiguration().orientation == ORIENTATION_PORTRAIT;
-
-        // copy the input Rect, since SurfaceControl.screenshot can mutate it
-        Rect screenRect = new Rect(crop);
-        Bitmap screenshot = mImageCapture.captureDisplay(mDisplayTracker.getDefaultDisplayId(),
-                crop);
-
-        if (screenshot == null) {
-            Log.e(TAG, "takeScreenshotInternal: Screenshot bitmap was null");
-            mNotificationsController.notifyScreenshotError(
-                    R.string.screenshot_failed_to_capture_text);
-            if (mCurrentRequestCallback != null) {
-                mCurrentRequestCallback.reportError();
-            }
-            return;
-        }
-
-        saveScreenshot(screenshot, finisher, screenRect, Insets.NONE, topComponent, true,
-                Process.myUserHandle());
-
-        mBroadcastSender.sendBroadcast(new Intent(ClipboardOverlayController.SCREENSHOT_ACTION),
-                ClipboardOverlayController.SELF_PERMISSION);
-    }
-
-    private void saveScreenshot(Bitmap screenshot, Consumer<Uri> finisher, Rect screenRect,
-            Insets screenInsets, ComponentName topComponent, boolean showFlash, UserHandle owner) {
-        withWindowAttached(() -> {
-            if (mUserManager.isManagedProfile(owner.getIdentifier())) {
-                mScreenshotView.announceForAccessibility(mContext.getResources().getString(
-                        R.string.screenshot_saving_work_profile_title));
-            } else {
-                mScreenshotView.announceForAccessibility(
-                        mContext.getResources().getString(R.string.screenshot_saving_title));
-            }
-        });
-
-        mScreenshotView.reset();
-
-        if (mScreenshotView.isAttachedToWindow()) {
-            // if we didn't already dismiss for another reason
-            if (!mScreenshotView.isDismissing()) {
-                mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_REENTERED, 0, mPackageName);
-            }
-            if (DEBUG_WINDOW) {
-                Log.d(TAG, "saveScreenshot: screenshotView is already attached, resetting. "
-                        + "(dismissing=" + mScreenshotView.isDismissing() + ")");
-            }
-        }
-        mPackageName = topComponent == null ? "" : topComponent.getPackageName();
-        mScreenshotView.setPackageName(mPackageName);
-
-        mScreenshotView.updateOrientation(
-                mWindowManager.getCurrentWindowMetrics().getWindowInsets());
-
-        mScreenBitmap = screenshot;
-
-        if (!isUserSetupComplete(owner)) {
-            Log.w(TAG, "User setup not complete, displaying toast only");
-            // User setup isn't complete, so we don't want to show any UI beyond a toast, as editing
-            // and sharing shouldn't be exposed to the user.
-            saveScreenshotAndToast(owner, finisher);
-            return;
-        }
-
-        // Optimizations
-        mScreenBitmap.setHasAlpha(false);
-        mScreenBitmap.prepareToDraw();
-
-        saveScreenshotInWorkerThread(owner, finisher, this::showUiOnActionsReady,
-                this::showUiOnQuickShareActionReady);
-
-        // The window is focusable by default
-        setWindowFocusable(true);
-        mScreenshotView.requestFocus();
-
-        enqueueScrollCaptureRequest(owner);
-
-        attachWindow();
-        prepareAnimation(screenRect, showFlash, () -> {
-            mMessageContainerController.onScreenshotTaken(owner);
-        });
-
-        mScreenshotView.badgeScreenshot(mContext.getPackageManager().getUserBadgedIcon(
-                mContext.getDrawable(R.drawable.overlay_badge_background), owner));
-        mScreenshotView.setScreenshot(mScreenBitmap, screenInsets);
-        if (DEBUG_WINDOW) {
-            Log.d(TAG, "setContentView: " + mScreenshotView);
-        }
-        setContentView(mScreenshotView);
-        // ignore system bar insets for the purpose of window layout
-        mWindow.getDecorView().setOnApplyWindowInsetsListener(
-                (v, insets) -> WindowInsets.CONSUMED);
-        mScreenshotHandler.cancelTimeout(); // restarted after animation
-    }
-
     private void prepareAnimation(Rect screenRect, boolean showFlash,
             Runnable onAnimationComplete) {
         mScreenshotView.getViewTreeObserver().addOnPreDrawListener(
@@ -1119,9 +980,7 @@
 
     /** Reset screenshot view and then call onCompleteRunnable */
     private void finishDismiss() {
-        if (DEBUG_DISMISS) {
-            Log.d(TAG, "finishDismiss");
-        }
+        Log.d(TAG, "finishDismiss");
         if (mLastScrollCaptureRequest != null) {
             mLastScrollCaptureRequest.cancel(true);
             mLastScrollCaptureRequest = null;
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
index 7ac0fd5..1cdad83 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
@@ -36,9 +36,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.graphics.Bitmap;
-import android.graphics.Insets;
-import android.graphics.Rect;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.IBinder;
@@ -49,7 +46,6 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.Log;
-import android.view.WindowManager;
 import android.widget.Toast;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -58,7 +54,6 @@
 import com.android.systemui.R;
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.flags.FeatureFlags;
-import com.android.systemui.flags.Flags;
 
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
@@ -222,30 +217,17 @@
             return;
         }
 
-        if (mFeatureFlags.isEnabled(Flags.SCREENSHOT_METADATA_REFACTOR)) {
-            Log.d(TAG, "Processing screenshot data");
-            ScreenshotData screenshotData = ScreenshotData.fromRequest(request);
-            try {
-                mProcessor.processAsync(screenshotData,
-                        (data) -> dispatchToController(data, onSaved, callback));
-            } catch (IllegalStateException e) {
-                Log.e(TAG, "Failed to process screenshot request!", e);
-                logFailedRequest(request);
-                mNotificationsController.notifyScreenshotError(
-                        R.string.screenshot_failed_to_capture_text);
-                callback.reportError();
-            }
-        } else {
-            try {
-                mProcessor.processAsync(request,
-                        (r) -> dispatchToController(r, onSaved, callback));
-            } catch (IllegalStateException e) {
-                Log.e(TAG, "Failed to process screenshot request!", e);
-                logFailedRequest(request);
-                mNotificationsController.notifyScreenshotError(
-                        R.string.screenshot_failed_to_capture_text);
-                callback.reportError();
-            }
+        Log.d(TAG, "Processing screenshot data");
+        ScreenshotData screenshotData = ScreenshotData.fromRequest(request);
+        try {
+            mProcessor.processAsync(screenshotData,
+                    (data) -> dispatchToController(data, onSaved, callback));
+        } catch (IllegalStateException e) {
+            Log.e(TAG, "Failed to process screenshot request!", e);
+            logFailedRequest(request);
+            mNotificationsController.notifyScreenshotError(
+                    R.string.screenshot_failed_to_capture_text);
+            callback.reportError();
         }
     }
 
@@ -253,41 +235,10 @@
             Consumer<Uri> uriConsumer, RequestCallback callback) {
         mUiEventLogger.log(ScreenshotEvent.getScreenshotSource(screenshot.getSource()), 0,
                 screenshot.getPackageNameString());
+        Log.d(TAG, "Screenshot request: " + screenshot);
         mScreenshot.handleScreenshot(screenshot, uriConsumer, callback);
     }
 
-    private void dispatchToController(ScreenshotRequest request,
-            Consumer<Uri> uriConsumer, RequestCallback callback) {
-        ComponentName topComponent = request.getTopComponent();
-        String packageName = topComponent == null ? "" : topComponent.getPackageName();
-        mUiEventLogger.log(
-                ScreenshotEvent.getScreenshotSource(request.getSource()), 0, packageName);
-
-        switch (request.getType()) {
-            case WindowManager.TAKE_SCREENSHOT_FULLSCREEN:
-                if (DEBUG_SERVICE) {
-                    Log.d(TAG, "handleMessage: TAKE_SCREENSHOT_FULLSCREEN");
-                }
-                mScreenshot.takeScreenshotFullscreen(topComponent, uriConsumer, callback);
-                break;
-            case WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE:
-                if (DEBUG_SERVICE) {
-                    Log.d(TAG, "handleMessage: TAKE_SCREENSHOT_PROVIDED_IMAGE");
-                }
-                Bitmap screenshot = request.getBitmap();
-                Rect screenBounds = request.getBoundsInScreen();
-                Insets insets = request.getInsets();
-                int taskId = request.getTaskId();
-                int userId = request.getUserId();
-
-                mScreenshot.handleImageAsScreenshot(screenshot, screenBounds, insets,
-                        taskId, userId, topComponent, uriConsumer, callback);
-                break;
-            default:
-                Log.wtf(TAG, "Invalid screenshot option: " + request.getType());
-        }
-    }
-
     private void logFailedRequest(ScreenshotRequest request) {
         ComponentName topComponent = request.getTopComponent();
         String packageName = topComponent == null ? "" : topComponent.getPackageName();
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/appclips/AppClipsService.java b/packages/SystemUI/src/com/android/systemui/screenshot/appclips/AppClipsService.java
index d0b7ad3..3949492 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/appclips/AppClipsService.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/appclips/AppClipsService.java
@@ -27,9 +27,15 @@
 import android.content.Intent;
 import android.content.res.Resources;
 import android.os.IBinder;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 
+import com.android.internal.infra.AndroidFuture;
+import com.android.internal.infra.ServiceConnector;
 import com.android.internal.statusbar.IAppClipsService;
 import com.android.systemui.R;
 import com.android.systemui.dagger.qualifiers.Application;
@@ -37,6 +43,7 @@
 import com.android.wm.shell.bubbles.Bubbles;
 
 import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 
 import javax.inject.Inject;
 
@@ -46,21 +53,63 @@
  */
 public class AppClipsService extends Service {
 
+    private static final String TAG = AppClipsService.class.getSimpleName();
+
     @Application private final Context mContext;
     private final FeatureFlags mFeatureFlags;
     private final Optional<Bubbles> mOptionalBubbles;
     private final DevicePolicyManager mDevicePolicyManager;
+    private final UserManager mUserManager;
+
     private final boolean mAreTaskAndTimeIndependentPrerequisitesMet;
 
+    @VisibleForTesting()
+    @Nullable ServiceConnector<IAppClipsService> mProxyConnectorToMainProfile;
+
     @Inject
     public AppClipsService(@Application Context context, FeatureFlags featureFlags,
-            Optional<Bubbles> optionalBubbles, DevicePolicyManager devicePolicyManager) {
+            Optional<Bubbles> optionalBubbles, DevicePolicyManager devicePolicyManager,
+            UserManager userManager) {
         mContext = context;
         mFeatureFlags = featureFlags;
         mOptionalBubbles = optionalBubbles;
         mDevicePolicyManager = devicePolicyManager;
+        mUserManager = userManager;
+
+        // The consumer of this service are apps that call through StatusBarManager API to query if
+        // it can use app clips API. Since these apps can be launched as work profile users, this
+        // service will start as work profile user. SysUI doesn't share injected instances for
+        // different users. This is why the bubbles instance injected will be incorrect. As the apps
+        // don't generally have permission to connect to a service running as different user, we
+        // start a proxy connection to communicate with the main user's version of this service.
+        if (mUserManager.isManagedProfile()) {
+            // No need to check for prerequisites in this case as those are incorrect for work
+            // profile user instance of the service and the main user version of the service will
+            // take care of this check.
+            mAreTaskAndTimeIndependentPrerequisitesMet = false;
+
+            // Get the main user so that we can connect to the main user's version of the service.
+            UserHandle mainUser = mUserManager.getMainUser();
+            if (mainUser == null) {
+                // If main user is not available there isn't much we can do, no apps can use app
+                // clips.
+                return;
+            }
+
+            // Set up the connection to be used later during onBind callback.
+            mProxyConnectorToMainProfile =
+                    new ServiceConnector.Impl<>(
+                            context,
+                            new Intent(context, AppClipsService.class),
+                            Context.BIND_AUTO_CREATE | Context.BIND_WAIVE_PRIORITY
+                                    | Context.BIND_NOT_VISIBLE,
+                            mainUser.getIdentifier(),
+                            IAppClipsService.Stub::asInterface);
+            return;
+        }
 
         mAreTaskAndTimeIndependentPrerequisitesMet = checkIndependentVariables();
+        mProxyConnectorToMainProfile = null;
     }
 
     private boolean checkIndependentVariables() {
@@ -95,6 +144,13 @@
         return new IAppClipsService.Stub() {
             @Override
             public boolean canLaunchCaptureContentActivityForNote(int taskId) {
+                // In case of managed profile, use the main user's instance of the service. Callers
+                // cannot directly connect to the main user's instance as they may not have the
+                // permission to interact across users.
+                if (mUserManager.isManagedProfile()) {
+                    return canLaunchCaptureContentActivityForNoteFromMainUser(taskId);
+                }
+
                 if (!mAreTaskAndTimeIndependentPrerequisitesMet) {
                     return false;
                 }
@@ -107,4 +163,21 @@
             }
         };
     }
+
+    /** Returns whether the app clips API can be used by querying the service as the main user. */
+    private boolean canLaunchCaptureContentActivityForNoteFromMainUser(int taskId) {
+        if (mProxyConnectorToMainProfile == null) {
+            return false;
+        }
+
+        try {
+            AndroidFuture<Boolean> future = mProxyConnectorToMainProfile.postForResult(
+                    service -> service.canLaunchCaptureContentActivityForNote(taskId));
+            return future.get();
+        } catch (ExecutionException | InterruptedException e) {
+            Log.d(TAG, "Exception from service\n" + e);
+        }
+
+        return false;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/appclips/AppClipsTrampolineActivity.java b/packages/SystemUI/src/com/android/systemui/screenshot/appclips/AppClipsTrampolineActivity.java
index 3cb1a34..0487cbc 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/appclips/AppClipsTrampolineActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/appclips/AppClipsTrampolineActivity.java
@@ -40,6 +40,8 @@
 import android.os.Handler;
 import android.os.Parcel;
 import android.os.ResultReceiver;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.util.Log;
 
 import androidx.annotation.Nullable;
@@ -79,13 +81,10 @@
 
     private static final String TAG = AppClipsTrampolineActivity.class.getSimpleName();
     static final String PERMISSION_SELF = "com.android.systemui.permission.SELF";
-    @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
-    public static final String EXTRA_SCREENSHOT_URI = TAG + "SCREENSHOT_URI";
+    static final String EXTRA_SCREENSHOT_URI = TAG + "SCREENSHOT_URI";
     static final String ACTION_FINISH_FROM_TRAMPOLINE = TAG + "FINISH_FROM_TRAMPOLINE";
-    @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
-    public static final String EXTRA_RESULT_RECEIVER = TAG + "RESULT_RECEIVER";
-    @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
-    public static final String EXTRA_CALLING_PACKAGE_NAME = TAG + "CALLING_PACKAGE_NAME";
+    static final String EXTRA_RESULT_RECEIVER = TAG + "RESULT_RECEIVER";
+    static final String EXTRA_CALLING_PACKAGE_NAME = TAG + "CALLING_PACKAGE_NAME";
     private static final ApplicationInfoFlags APPLICATION_INFO_FLAGS = ApplicationInfoFlags.of(0);
 
     private final DevicePolicyManager mDevicePolicyManager;
@@ -95,6 +94,7 @@
     private final PackageManager mPackageManager;
     private final UserTracker mUserTracker;
     private final UiEventLogger mUiEventLogger;
+    private final UserManager mUserManager;
     private final ResultReceiver mResultReceiver;
 
     private Intent mKillAppClipsBroadcastIntent;
@@ -103,7 +103,7 @@
     public AppClipsTrampolineActivity(DevicePolicyManager devicePolicyManager, FeatureFlags flags,
             Optional<Bubbles> optionalBubbles, NoteTaskController noteTaskController,
             PackageManager packageManager, UserTracker userTracker, UiEventLogger uiEventLogger,
-            @Main Handler mainHandler) {
+            UserManager userManager, @Main Handler mainHandler) {
         mDevicePolicyManager = devicePolicyManager;
         mFeatureFlags = flags;
         mOptionalBubbles = optionalBubbles;
@@ -111,6 +111,7 @@
         mPackageManager = packageManager;
         mUserTracker = userTracker;
         mUiEventLogger = uiEventLogger;
+        mUserManager = userManager;
 
         mResultReceiver = createResultReceiver(mainHandler);
     }
@@ -123,6 +124,12 @@
             return;
         }
 
+        if (mUserManager.isManagedProfile()) {
+            maybeStartActivityForWPUser();
+            finish();
+            return;
+        }
+
         if (!mFeatureFlags.isEnabled(SCREENSHOT_APP_CLIPS)) {
             finish();
             return;
@@ -191,6 +198,19 @@
         }
     }
 
+    private void maybeStartActivityForWPUser() {
+        UserHandle mainUser = mUserManager.getMainUser();
+        if (mainUser == null) {
+            setErrorResultAndFinish(CAPTURE_CONTENT_FOR_NOTE_FAILED);
+            return;
+        }
+
+        // Start the activity as the main user with activity result forwarding.
+        startActivityAsUser(
+                new Intent(this, AppClipsTrampolineActivity.class)
+                        .addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT), mainUser);
+    }
+
     private void setErrorResultAndFinish(int errorCode) {
         setResult(RESULT_OK,
                 new Intent().putExtra(EXTRA_CAPTURE_CONTENT_FOR_NOTE_STATUS_CODE, errorCode));
diff --git a/packages/SystemUI/src/com/android/systemui/shade/DebugDrawable.java b/packages/SystemUI/src/com/android/systemui/shade/DebugDrawable.java
index fb2ddc1..2336673 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/DebugDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/DebugDrawable.java
@@ -93,7 +93,7 @@
         drawDebugInfo(canvas, (int) mLockIconViewController.getTop(), Color.GRAY,
                 "mLockIconViewController.getTop()");
 
-        if (mNotificationPanelViewController.getKeyguardShowing()) {
+        if (mNotificationPanelViewController.isKeyguardShowing()) {
             // Notifications have the space between those two lines.
             drawDebugInfo(canvas,
                     mNotificationStackScrollLayoutController.getTop()
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index bf93c10..79d3b26 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -18,6 +18,7 @@
 
 import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
 import static android.view.MotionEvent.CLASSIFICATION_MULTI_FINGER_SWIPE;
+import static android.view.MotionEvent.CLASSIFICATION_TWO_FINGER_SWIPE;
 import static android.view.View.INVISIBLE;
 import static android.view.View.VISIBLE;
 
@@ -157,10 +158,11 @@
 import com.android.systemui.media.controls.ui.KeyguardMediaController;
 import com.android.systemui.media.controls.ui.MediaHierarchyManager;
 import com.android.systemui.model.SysUiState;
+import com.android.systemui.multishade.domain.interactor.MultiShadeInteractor;
 import com.android.systemui.navigationbar.NavigationBarController;
 import com.android.systemui.navigationbar.NavigationBarView;
 import com.android.systemui.navigationbar.NavigationModeController;
-import com.android.systemui.plugins.ClockAnimations;
+import com.android.systemui.plugins.ClockController;
 import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.FalsingManager.FalsingTapListener;
 import com.android.systemui.plugins.qs.QS;
@@ -249,13 +251,14 @@
 import kotlinx.coroutines.CoroutineDispatcher;
 
 @CentralSurfacesComponent.CentralSurfacesScope
-public final class NotificationPanelViewController implements Dumpable {
+public final class NotificationPanelViewController implements ShadeSurface, Dumpable {
 
     public static final String TAG = NotificationPanelView.class.getSimpleName();
     public static final float FLING_MAX_LENGTH_SECONDS = 0.6f;
     public static final float FLING_SPEED_UP_FACTOR = 0.6f;
     public static final float FLING_CLOSING_MAX_LENGTH_SECONDS = 0.6f;
     public static final float FLING_CLOSING_SPEED_UP_FACTOR = 0.6f;
+    public static final int WAKEUP_ANIMATION_DELAY_MS = 250;
     private static final boolean DEBUG_LOGCAT = Compile.IS_DEBUG && Log.isLoggable(TAG, Log.DEBUG);
     private static final boolean SPEW_LOGCAT = Compile.IS_DEBUG && Log.isLoggable(TAG, Log.VERBOSE);
     private static final boolean DEBUG_DRAWABLE = false;
@@ -278,6 +281,7 @@
     private static final int NO_FIXED_DURATION = -1;
     private static final long SHADE_OPEN_SPRING_OUT_DURATION = 350L;
     private static final long SHADE_OPEN_SPRING_BACK_DURATION = 400L;
+
     /**
      * The factor of the usual high velocity that is needed in order to reach the maximum overshoot
      * when flinging. A low value will make it that most flings will reach the maximum overshoot.
@@ -308,7 +312,7 @@
      */
 
     public final boolean mAnimateBack;
-    private final boolean mTrackpadGestureBack;
+    private final boolean mTrackpadGestureFeaturesEnabled;
     /**
      * The minimum scale to "squish" the Shade and associated elements down to, for Back gesture
      */
@@ -389,6 +393,7 @@
     private KeyguardBottomAreaView mKeyguardBottomArea;
     private boolean mExpanding;
     private boolean mSplitShadeEnabled;
+    private boolean mDualShadeEnabled;
     /** The bottom padding reserved for elements of the keyguard measuring notifications. */
     private float mKeyguardNotificationBottomPadding;
     /**
@@ -440,8 +445,6 @@
             new KeyguardClockPositionAlgorithm.Result();
     private boolean mIsExpanding;
 
-    private String mHeaderDebugInfo;
-
     /**
      * Indicates drag starting height when swiping down or up on heads-up notifications.
      * This usually serves as a threshold from when shade expansion should really start. Otherwise
@@ -457,6 +460,10 @@
     private boolean mHeadsUpAnimatingAway;
     private final FalsingManager mFalsingManager;
     private final FalsingCollector mFalsingCollector;
+    private final ShadeHeadsUpTrackerImpl mShadeHeadsUpTracker = new ShadeHeadsUpTrackerImpl();
+    private final ShadeFoldAnimator mShadeFoldAnimator = new ShadeFoldAnimatorImpl();
+    private final ShadeNotificationPresenterImpl mShadeNotificationPresenter =
+            new ShadeNotificationPresenterImpl();
 
     private boolean mShowIconsWhenExpanded;
     private int mIndicationBottomPadding;
@@ -560,7 +567,6 @@
     private final KeyguardBottomAreaViewModel mKeyguardBottomAreaViewModel;
     private final KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor;
     private float mMinExpandHeight;
-    private final ShadeHeightLogger mShadeHeightLogger;
     private boolean mPanelUpdateWhenAnimatorEnds;
     private boolean mHasVibratedOnOpen = false;
     private int mFixedDuration = NO_FIXED_DURATION;
@@ -605,6 +611,12 @@
     private boolean mGestureWaitForTouchSlop;
     private boolean mIgnoreXTouchSlop;
     private boolean mExpandLatencyTracking;
+    /**
+     * Whether we're waking up and will play the delayed doze animation in
+     * {@link NotificationWakeUpCoordinator}. If so, we'll want to keep the clock centered until the
+     * delayed doze animation starts.
+     */
+    private boolean mWillPlayDelayedDozeAmountAnimation = false;
     private final DreamingToLockscreenTransitionViewModel mDreamingToLockscreenTransitionViewModel;
     private final OccludedToLockscreenTransitionViewModel mOccludedToLockscreenTransitionViewModel;
     private final LockscreenToDreamingTransitionViewModel mLockscreenToDreamingTransitionViewModel;
@@ -613,7 +625,9 @@
 
     private final KeyguardTransitionInteractor mKeyguardTransitionInteractor;
     private final KeyguardInteractor mKeyguardInteractor;
+    private final @Nullable MultiShadeInteractor mMultiShadeInteractor;
     private final CoroutineDispatcher mMainDispatcher;
+    private boolean mIsAnyMultiShadeExpanded;
     private boolean mIsOcclusionTransitionRunning = false;
     private int mDreamingToLockscreenTransitionTranslationY;
     private int mOccludedToLockscreenTransitionTranslationY;
@@ -627,7 +641,7 @@
             () -> mKeyguardBottomArea.setVisibility(View.GONE);
     private final Runnable mHeadsUpExistenceChangedRunnable = () -> {
         setHeadsUpAnimatingAway(false);
-        updatePanelExpansionAndVisibility();
+        updateExpansionAndVisibility();
     };
     private final Runnable mMaybeHideExpandedRunnable = () -> {
         if (getExpandedFraction() == 0.0f) {
@@ -635,6 +649,9 @@
         }
     };
 
+    private final Consumer<Boolean> mMultiShadeExpansionConsumer =
+            (Boolean expanded) -> mIsAnyMultiShadeExpanded = expanded;
+
     private final Consumer<TransitionStep> mDreamingToLockscreenTransition =
             (TransitionStep step) -> {
                 mIsOcclusionTransitionRunning =
@@ -698,7 +715,6 @@
             KeyguardUpdateMonitor keyguardUpdateMonitor,
             MetricsLogger metricsLogger,
             ShadeLogger shadeLogger,
-            ShadeHeightLogger shadeHeightLogger,
             ConfigurationController configurationController,
             Provider<FlingAnimationUtils.Builder> flingAnimationUtilsBuilder,
             StatusBarTouchableRegionManager statusBarTouchableRegionManager,
@@ -752,6 +768,7 @@
             LockscreenToOccludedTransitionViewModel lockscreenToOccludedTransitionViewModel,
             @Main CoroutineDispatcher mainDispatcher,
             KeyguardTransitionInteractor keyguardTransitionInteractor,
+            Provider<MultiShadeInteractor> multiShadeInteractorProvider,
             DumpManager dumpManager,
             KeyguardLongPressViewModel keyguardLongPressViewModel,
             KeyguardInteractor keyguardInteractor) {
@@ -768,7 +785,6 @@
         mLockscreenGestureLogger = lockscreenGestureLogger;
         mShadeExpansionStateManager = shadeExpansionStateManager;
         mShadeLog = shadeLogger;
-        mShadeHeightLogger = shadeHeightLogger;
         mGutsManager = gutsManager;
         mDreamingToLockscreenTransitionViewModel = dreamingToLockscreenTransitionViewModel;
         mOccludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel;
@@ -852,14 +868,16 @@
         mLayoutInflater = layoutInflater;
         mFeatureFlags = featureFlags;
         mAnimateBack = mFeatureFlags.isEnabled(Flags.WM_SHADE_ANIMATE_BACK_GESTURE);
-        mTrackpadGestureBack = mFeatureFlags.isEnabled(Flags.TRACKPAD_GESTURE_FEATURES);
+        mTrackpadGestureFeaturesEnabled = mFeatureFlags.isEnabled(Flags.TRACKPAD_GESTURE_FEATURES);
+        mDualShadeEnabled = mFeatureFlags.isEnabled(Flags.DUAL_SHADE);
+        mMultiShadeInteractor = mDualShadeEnabled ? multiShadeInteractorProvider.get() : null;
         mFalsingCollector = falsingCollector;
         mPowerManager = powerManager;
         mWakeUpCoordinator = coordinator;
         mMainDispatcher = mainDispatcher;
         mAccessibilityManager = accessibilityManager;
         mView.setAccessibilityPaneTitle(determineAccessibilityPaneTitle());
-        setPanelAlpha(255, false /* animate */);
+        setAlpha(255, false /* animate */);
         mCommandQueue = commandQueue;
         mDisplayId = displayId;
         mPulseExpansionHandler = pulseExpansionHandler;
@@ -1043,7 +1061,8 @@
                 mOnEmptySpaceClickListener);
         mQsController.initNotificationStackScrollLayoutController();
         mShadeExpansionStateManager.addQsExpansionListener(this::onQsExpansionChanged);
-        addTrackingHeadsUpListener(mNotificationStackScrollLayoutController::setTrackingHeadsUp);
+        mShadeHeadsUpTracker.addTrackingHeadsUpListener(
+                mNotificationStackScrollLayoutController::setTrackingHeadsUp);
         setKeyguardBottomArea(mView.findViewById(R.id.keyguard_bottom_area));
 
         initBottomArea();
@@ -1063,6 +1082,12 @@
                     requestScrollerTopPaddingUpdate(false /* animate */);
                 }
             }
+
+            @Override
+            public void onDelayedDozeAmountAnimationRunning(boolean running) {
+                // On running OR finished, the animation is no longer waiting to play
+                setWillPlayDelayedDozeAmountAnimation(false);
+            }
         });
 
         mView.setRtlChangeListener(layoutDirection -> {
@@ -1082,6 +1107,11 @@
         mNotificationPanelUnfoldAnimationController.ifPresent(controller ->
                 controller.setup(mNotificationContainerParent));
 
+        if (mDualShadeEnabled) {
+            collectFlow(mView, mMultiShadeInteractor.isAnyShadeExpanded(),
+                    mMultiShadeExpansionConsumer, mMainDispatcher);
+        }
+
         // Dreaming->Lockscreen
         collectFlow(mView, mKeyguardTransitionInteractor.getDreamingToLockscreenTransition(),
                 mDreamingToLockscreenTransition, mMainDispatcher);
@@ -1203,6 +1233,7 @@
         }
     }
 
+    @Override
     public void updateResources() {
         final boolean newSplitShadeEnabled =
                 LargeScreenUtils.shouldUseSplitNotificationShade(mResources);
@@ -1383,7 +1414,7 @@
             if (SPEW_LOGCAT) Log.d(TAG, "Skipping computeMaxKeyguardNotifications() by request");
         }
 
-        if (getKeyguardShowing() && !mKeyguardBypassController.getBypassEnabled()) {
+        if (isKeyguardShowing() && !mKeyguardBypassController.getBypassEnabled()) {
             mNotificationStackScrollLayoutController.setMaxDisplayedNotifications(
                     mMaxAllowedKeyguardNotifications);
             mNotificationStackScrollLayoutController.setKeyguardBottomPaddingForDebug(
@@ -1544,7 +1575,7 @@
         updateClock();
     }
 
-    public KeyguardClockPositionAlgorithm.Result getClockPositionResult() {
+    KeyguardClockPositionAlgorithm.Result getClockPositionResult() {
         return mClockPositionResult;
     }
 
@@ -1596,9 +1627,9 @@
                 transition.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
                 transition.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
 
-                ClockAnimations clockAnims = mKeyguardStatusViewController.getClockAnimations();
-                boolean customClockAnimation = clockAnims != null
-                        && clockAnims.getHasCustomPositionUpdatedAnimation();
+                ClockController clock = mKeyguardStatusViewController.getClockController();
+                boolean customClockAnimation = clock != null
+                        && clock.getConfig().getHasCustomPositionUpdatedAnimation();
 
                 if (mFeatureFlags.isEnabled(Flags.STEP_CLOCK_ANIMATION) && customClockAnimation) {
                     // Find the clock, so we can exclude it from this transition.
@@ -1655,15 +1686,32 @@
             // overlap.
             return true;
         }
-        if (hasPulsingNotifications()) {
+        if (mNotificationListContainer.hasPulsingNotifications()) {
             // Pulsing notification appears on the right. Move clock left to avoid overlap.
             return false;
         }
+        if (mWillPlayDelayedDozeAmountAnimation) {
+            return true;
+        }
         // "Visible" notifications are actually not visible on AOD (unless pulsing), so it is safe
         // to center the clock without overlap.
         return isOnAod();
     }
 
+    /**
+     * Notify us that {@link NotificationWakeUpCoordinator} is going to play the doze wakeup
+     * animation after a delay. If so, we'll keep the clock centered until that animation starts.
+     */
+    public void setWillPlayDelayedDozeAmountAnimation(boolean willPlay) {
+        if (mWillPlayDelayedDozeAmountAnimation == willPlay) return;
+
+        mWillPlayDelayedDozeAmountAnimation = willPlay;
+        mWakeUpCoordinator.logDelayingClockWakeUpAnimation(willPlay);
+
+        // Once changing this value, see if we should move the clock.
+        positionClockAndNotifications();
+    }
+
     private boolean isOnAod() {
         return mDozing && mDozeParameters.getAlwaysOn();
     }
@@ -1785,27 +1833,28 @@
         }
     }
 
-    public void animateToFullShade(long delay) {
+    @Override
+    public void transitionToExpandedShade(long delay) {
         mNotificationStackScrollLayoutController.goToFullShade(delay);
         mView.requestLayout();
         mAnimateNextPositionUpdate = true;
     }
 
-    /** Animate QS closing. */
-    public void animateCloseQs(boolean animateAway) {
+    @Override
+    public void animateCollapseQs(boolean fullyCollapse) {
         if (mSplitShadeEnabled) {
-            collapsePanel(true, false, 1.0f);
+            collapse(true, false, 1.0f);
         } else {
-            mQsController.animateCloseQs(animateAway);
+            mQsController.animateCloseQs(fullyCollapse);
         }
-
     }
 
+    @Override
     public void resetViews(boolean animate) {
         mGutsManager.closeAndSaveGuts(true /* leavebehind */, true /* force */,
                 true /* controls */, -1 /* x */, -1 /* y */, true /* resetMenu */);
         if (animate && !isFullyCollapsed()) {
-            animateCloseQs(true);
+            animateCollapseQs(true);
         } else {
             closeQsIfPossible();
         }
@@ -1814,15 +1863,14 @@
         mNotificationStackScrollLayoutController.resetScrollPosition();
     }
 
-    /** Collapses the panel. */
-    public void collapsePanel(boolean animate, boolean delayed, float speedUpFactor) {
+    @Override
+    public void collapse(boolean animate, boolean delayed, float speedUpFactor) {
         boolean waiting = false;
         if (animate && !isFullyCollapsed()) {
             collapse(delayed, speedUpFactor);
             waiting = true;
         } else {
             resetViews(false /* animate */);
-            mShadeHeightLogger.logFunctionCall("collapsePanel");
             setExpandedFraction(0); // just in case
         }
         if (!waiting) {
@@ -1833,8 +1881,9 @@
         }
     }
 
+    @Override
     public void collapse(boolean delayed, float speedUpFactor) {
-        if (!canPanelBeCollapsed()) {
+        if (!canBeCollapsed()) {
             return;
         }
 
@@ -1843,7 +1892,7 @@
             setShowShelfOnly(true);
         }
         debugLog("collapse: %s", this);
-        if (canPanelBeCollapsed()) {
+        if (canBeCollapsed()) {
             cancelHeightAnimator();
             notifyExpandingStarted();
 
@@ -1874,11 +1923,13 @@
         endClosing();
     }
 
+    @Override
     public void cancelAnimation() {
         mView.animate().cancel();
     }
 
-    public void expandWithQs() {
+    @Override
+    public void expandToQs() {
         if (mQsController.isExpansionEnabled()) {
             mQsController.setExpandImmediate(true);
             setShowShelfOnly(true);
@@ -1901,15 +1952,9 @@
         }
     }
 
-    /**
-     * Expand shade so that notifications are visible.
-     * Non-split shade: just expanding shade or collapsing QS when they're expanded.
-     * Split shade: only expanding shade, notifications are always visible
-     *
-     * Called when `adb shell cmd statusbar expand-notifications` is executed.
-     */
-    public void expandShadeToNotifications() {
-        if (mSplitShadeEnabled && (isShadeFullyOpen() || isExpanding())) {
+    @Override
+    public void expandToNotifications() {
+        if (mSplitShadeEnabled && (isShadeFullyExpanded() || isExpanding())) {
             return;
         }
         if (mQsController.getExpanded()) {
@@ -2046,7 +2091,7 @@
         } else {
             mQsController.cancelJankMonitoring();
         }
-        updatePanelExpansionAndVisibility();
+        updateExpansionAndVisibility();
         mNotificationStackScrollLayoutController.setPanelFlinging(false);
     }
 
@@ -2120,12 +2165,12 @@
     }
 
     /** Return whether a touch is near the gesture handle at the bottom of screen */
-    public boolean isInGestureNavHomeHandleArea(float x, float y) {
+    boolean isInGestureNavHomeHandleArea(float x, float y) {
         return mIsGestureNavigation && y > mView.getHeight() - mNavigationBarBottomHeight;
     }
 
-    /** Input focus transfer is about to happen. */
-    public void startWaitingForOpenPanelGesture() {
+    @Override
+    public void startWaitingForExpandGesture() {
         if (!isFullyCollapsed()) {
             return;
         }
@@ -2134,21 +2179,8 @@
         updatePanelExpanded();
     }
 
-    /**
-     * Called when this view is no longer waiting for input focus transfer.
-     *
-     * There are two scenarios behind this function call. First, input focus transfer
-     * has successfully happened and this view already received synthetic DOWN event.
-     * (mExpectingSynthesizedDown == false). Do nothing.
-     *
-     * Second, before input focus transfer finished, user may have lifted finger
-     * in previous window and this window never received synthetic DOWN event.
-     * (mExpectingSynthesizedDown == true).
-     * In this case, we use the velocity to trigger fling event.
-     *
-     * @param velocity unit is in px / millis
-     */
-    public void stopWaitingForOpenPanelGesture(boolean cancel, final float velocity) {
+    @Override
+    public void stopWaitingForExpandGesture(boolean cancel, final float velocity) {
         if (mExpectingSynthesizedDown) {
             mExpectingSynthesizedDown = false;
             if (cancel) {
@@ -2233,7 +2265,7 @@
      * as the shade ends up in its half-expanded state (with QQS above), it is back at 100% scale.
      * Without this, the shade would collapse, and stay squished.
      */
-    public void adjustBackAnimationScale(float expansionFraction) {
+    void adjustBackAnimationScale(float expansionFraction) {
         if (expansionFraction > 0.0f) { // collapsing
             float animatedFraction = expansionFraction * mCurrentBackProgress;
             applyBackScaling(animatedFraction);
@@ -2244,11 +2276,12 @@
     }
 
     //TODO(b/270981268): allow cancelling back animation mid-flight
-    /** Called when Back gesture has been committed (i.e. a back event has definitely occurred) */
+    @Override
     public void onBackPressed() {
         closeQsIfPossible();
     }
-    /** Sets back progress. */
+
+    @Override
     public void onBackProgressed(float progressFraction) {
         // TODO: non-linearly transform progress fraction into squish amount (ease-in, linear out)
         mCurrentBackProgress = progressFraction;
@@ -2256,16 +2289,17 @@
     }
 
     /** Resets back progress. */
-    public void resetBackTransformation() {
+    private void resetBackTransformation() {
         mCurrentBackProgress = 0.0f;
         applyBackScaling(0.0f);
     }
 
-    /** Scales multiple elements in tandem to achieve the illusion of the QS+Shade shrinking
-     *  as a single visual element (used by the Predictive Back Gesture preview animation).
-     *  fraction = 0 implies "no scaling", and 1 means "scale down to minimum size (90%)".
+    /**
+     * Scales multiple elements in tandem to achieve the illusion of the QS+Shade shrinking
+     * as a single visual element (used by the Predictive Back Gesture preview animation).
+     * fraction = 0 implies "no scaling", and 1 means "scale down to minimum size (90%)".
      */
-    public void applyBackScaling(float fraction) {
+    private void applyBackScaling(float fraction) {
         if (mNotificationContainerParent == null) {
             return;
         }
@@ -2273,15 +2307,6 @@
         mNotificationContainerParent.applyBackScaling(scale, mSplitShadeEnabled);
         mScrimController.applyBackScaling(scale);
     }
-    /** */
-    public float getLockscreenShadeDragProgress() {
-        // mTransitioningToFullShadeProgress > 0 means we're doing regular lockscreen to shade
-        // transition. If that's not the case we should follow QS expansion fraction for when
-        // user is pulling from the same top to go directly to expanded QS
-        return mQsController.getTransitioningToFullShadeProgress() > 0
-                ? mLockscreenShadeTransitionController.getQSDragProgress()
-                : mQsController.computeExpansionFraction();
-    }
 
     String determineAccessibilityPaneTitle() {
         if (mQsController != null && mQsController.isCustomizing()) {
@@ -2304,8 +2329,8 @@
     }
 
     /** Returns the topPadding of notifications when on keyguard not respecting QS expansion. */
-    public int getKeyguardNotificationStaticPadding() {
-        if (!getKeyguardShowing()) {
+    int getKeyguardNotificationStaticPadding() {
+        if (!isKeyguardShowing()) {
             return 0;
         }
         if (!mKeyguardBypassController.getBypassEnabled()) {
@@ -2322,15 +2347,15 @@
         }
     }
 
-    public boolean getKeyguardShowing() {
+    boolean isKeyguardShowing() {
         return mBarState == KEYGUARD;
     }
 
-    public float getKeyguardNotificationTopPadding() {
+    float getKeyguardNotificationTopPadding() {
         return mKeyguardNotificationTopPadding;
     }
 
-    public float getKeyguardNotificationBottomPadding() {
+    float getKeyguardNotificationBottomPadding() {
         return mKeyguardNotificationBottomPadding;
     }
 
@@ -2338,17 +2363,14 @@
         mNotificationStackScrollLayoutController.updateTopPadding(
                 mQsController.calculateNotificationsTopPadding(mIsExpanding,
                         getKeyguardNotificationStaticPadding(), mExpandedFraction), animate);
-        if (getKeyguardShowing()
+        if (isKeyguardShowing()
                 && mKeyguardBypassController.getBypassEnabled()) {
             // update the position of the header
             mQsController.updateExpansion();
         }
     }
 
-    /**
-     * Set the alpha and translationY of the keyguard elements which only show on the lockscreen,
-     * but not in shade locked / shade. This is used when dragging down to the full shade.
-     */
+    @Override
     public void setKeyguardTransitionProgress(float keyguardAlpha, int keyguardTranslationY) {
         mKeyguardOnlyContentAlpha = Interpolators.ALPHA_IN.getInterpolation(keyguardAlpha);
         mKeyguardOnlyTransitionTranslationY = keyguardTranslationY;
@@ -2360,17 +2382,13 @@
         updateClock();
     }
 
-    /**
-     * Sets the alpha value to be set on the keyguard status bar.
-     *
-     * @param alpha value between 0 and 1. -1 if the value is to be reset.
-     */
+    @Override
     public void setKeyguardStatusBarAlpha(float alpha) {
         mKeyguardStatusBarViewController.setAlpha(alpha);
     }
 
     /** */
-    public float getKeyguardOnlyContentAlpha() {
+    float getKeyguardOnlyContentAlpha() {
         return mKeyguardOnlyContentAlpha;
     }
 
@@ -2451,7 +2469,7 @@
             float qsExpansionFraction;
             if (mSplitShadeEnabled) {
                 qsExpansionFraction = 1;
-            } else if (getKeyguardShowing()) {
+            } else if (isKeyguardShowing()) {
                 // On Keyguard, interpolate the QS expansion linearly to the panel expansion
                 qsExpansionFraction = expandedHeight / (getMaxPanelHeight());
             } else {
@@ -2588,31 +2606,19 @@
         }
         setShowShelfOnly(false);
         mQsController.setTwoFingerExpandPossible(false);
-        updateTrackingHeadsUp(null);
+        mShadeHeadsUpTracker.updateTrackingHeadsUp(null);
         mExpandingFromHeadsUp = false;
         setPanelScrimMinFraction(0.0f);
         // Reset status bar alpha so alpha can be calculated upon updating view state.
         setKeyguardStatusBarAlpha(-1f);
     }
 
-    private void updateTrackingHeadsUp(@Nullable ExpandableNotificationRow pickedChild) {
-        mTrackedHeadsUpNotification = pickedChild;
-        for (int i = 0; i < mTrackingHeadsUpListeners.size(); i++) {
-            Consumer<ExpandableNotificationRow> listener = mTrackingHeadsUpListeners.get(i);
-            listener.accept(pickedChild);
-        }
-    }
-
-    @Nullable
-    public ExpandableNotificationRow getTrackedHeadsUpNotification() {
-        return mTrackedHeadsUpNotification;
-    }
-
     private void setListening(boolean listening) {
         mKeyguardStatusBarViewController.setBatteryListening(listening);
         mQsController.setListening(listening);
     }
 
+    @Override
     public void expand(boolean animate) {
         if (isFullyCollapsed() || isCollapsing()) {
             mInstantExpanding = true;
@@ -2626,7 +2632,7 @@
             if (mExpanding) {
                 notifyExpandingFinished();
             }
-            updatePanelExpansionAndVisibility();
+            updateExpansionAndVisibility();
             // Wait for window manager to pickup the change, so we know the maximum height of the
             // panel then.
             this.mView.getViewTreeObserver().addOnGlobalLayoutListener(
@@ -2647,7 +2653,6 @@
                                     mQsController.beginJankMonitoring(isFullyCollapsed());
                                     fling(0  /* expand */);
                                 } else {
-                                    mShadeHeightLogger.logFunctionCall("expand");
                                     setExpandedFraction(1f);
                                 }
                                 mInstantExpanding = false;
@@ -2666,7 +2671,8 @@
         mTouchSlopExceeded = isTouchSlopExceeded;
     }
 
-    public void setOverExpansion(float overExpansion) {
+    @VisibleForTesting
+    void setOverExpansion(float overExpansion) {
         if (overExpansion == mOverExpansion) {
             return;
         }
@@ -2706,20 +2712,20 @@
         mTracking = true;
         mTrackingStartedListener.onTrackingStarted();
         notifyExpandingStarted();
-        updatePanelExpansionAndVisibility();
+        updateExpansionAndVisibility();
         mScrimController.onTrackingStarted();
         if (mQsController.getFullyExpanded()) {
             mQsController.setExpandImmediate(true);
             setShowShelfOnly(true);
         }
         mNotificationStackScrollLayoutController.onPanelTrackingStarted();
-        cancelPendingPanelCollapse();
+        cancelPendingCollapse();
     }
 
     private void onTrackingStopped(boolean expand) {
         mFalsingCollector.onTrackingStopped();
         mTracking = false;
-        updatePanelExpansionAndVisibility();
+        updateExpansionAndVisibility();
         if (expand) {
             mNotificationStackScrollLayoutController.setOverScrollAmount(0.0f, true /* onTop */,
                     true /* animate */);
@@ -2805,6 +2811,7 @@
         }
     }
 
+    @Override
     public void setIsLaunchAnimationRunning(boolean running) {
         boolean wasRunning = mIsLaunchAnimationRunning;
         mIsLaunchAnimationRunning = running;
@@ -2829,6 +2836,7 @@
         }
     }
 
+    @Override
     public void onScreenTurningOn() {
         mKeyguardStatusViewController.dozeTimeTick();
     }
@@ -2864,7 +2872,8 @@
         }
     }
 
-    public void setPanelAlpha(int alpha, boolean animate) {
+    @Override
+    public void setAlpha(int alpha, boolean animate) {
         if (mPanelAlpha != alpha) {
             mPanelAlpha = alpha;
             PropertyAnimator.setProperty(mView, mPanelAlphaAnimator, alpha, alpha == 255
@@ -2873,17 +2882,18 @@
         }
     }
 
-    public void setPanelAlphaEndAction(Runnable r) {
+    @Override
+    public void setAlphaChangeAnimationEndAction(Runnable r) {
         mPanelAlphaEndAction = r;
     }
 
-    public void setHeadsUpAnimatingAway(boolean headsUpAnimatingAway) {
+    private void setHeadsUpAnimatingAway(boolean headsUpAnimatingAway) {
         mHeadsUpAnimatingAway = headsUpAnimatingAway;
         mNotificationStackScrollLayoutController.setHeadsUpAnimatingAway(headsUpAnimatingAway);
         updateVisibility();
     }
 
-    /** Set whether the bouncer is showing. */
+    @Override
     public void setBouncerShowing(boolean bouncerShowing) {
         mBouncerShowing = bouncerShowing;
         updateVisibility();
@@ -2894,7 +2904,7 @@
         return headsUpVisible || isExpanded() || mBouncerShowing;
     }
 
-    public void setHeadsUpManager(HeadsUpManagerPhone headsUpManager) {
+    private void setHeadsUpManager(HeadsUpManagerPhone headsUpManager) {
         mHeadsUpManager = headsUpManager;
         mHeadsUpManager.addListener(mOnHeadsUpChangedListener);
         mHeadsUpTouchHelper = new HeadsUpTouchHelper(headsUpManager,
@@ -2938,6 +2948,7 @@
         }
     }
 
+    @Override
     public int getBarState() {
         return mBarState;
     }
@@ -2987,7 +2998,8 @@
                 && mBarState == StatusBarState.SHADE;
     }
 
-    public boolean hideStatusBarIconsWhenExpanded() {
+    @Override
+    public boolean shouldHideStatusBarIconsWhenExpanded() {
         if (mIsLaunchAnimationRunning) {
             return mHideIconsDuringLaunchAnimation;
         }
@@ -2998,6 +3010,7 @@
         return !mShowIconsWhenExpanded;
     }
 
+    @Override
     public void setTouchAndAnimationDisabled(boolean disabled) {
         mTouchDisabled = disabled;
         if (mTouchDisabled) {
@@ -3010,12 +3023,7 @@
         mNotificationStackScrollLayoutController.setAnimationsEnabled(!disabled);
     }
 
-    /**
-     * Sets the dozing state.
-     *
-     * @param dozing  {@code true} when dozing.
-     * @param animate if transition should be animated.
-     */
+    @Override
     public void setDozing(boolean dozing, boolean animate) {
         if (dozing == mDozing) return;
         mView.setDozing(dozing);
@@ -3040,6 +3048,7 @@
         updateKeyguardStatusViewAlignment(animate);
     }
 
+    @Override
     public void setPulsing(boolean pulsing) {
         mPulsing = pulsing;
         final boolean
@@ -3058,6 +3067,7 @@
         updateKeyguardStatusViewAlignment(/* animate= */ true);
     }
 
+    @Override
     public void setAmbientIndicationTop(int ambientIndicationTop, boolean ambientTextVisible) {
         int ambientIndicationBottomPadding = 0;
         if (ambientTextVisible) {
@@ -3070,6 +3080,7 @@
         }
     }
 
+    @Override
     public void dozeTimeTick() {
         mLockIconViewController.dozeTimeTick();
         mKeyguardStatusViewController.dozeTimeTick();
@@ -3078,15 +3089,17 @@
         }
     }
 
-    public void setStatusAccessibilityImportance(int mode) {
+    void setStatusAccessibilityImportance(int mode) {
         mKeyguardStatusViewController.setStatusAccessibilityImportance(mode);
     }
 
     //TODO(b/254875405): this should be removed.
+    @Override
     public KeyguardBottomAreaView getKeyguardBottomAreaView() {
         return mKeyguardBottomArea;
     }
 
+    @Override
     public void applyLaunchAnimationProgress(float linearProgress) {
         boolean hideIcons = LaunchAnimator.getProgress(ActivityLaunchAnimator.TIMINGS,
                 linearProgress, ANIMATION_DELAY_ICON_FADE_IN, 100) == 0.0f;
@@ -3098,20 +3111,43 @@
         }
     }
 
-    public void addTrackingHeadsUpListener(Consumer<ExpandableNotificationRow> listener) {
-        mTrackingHeadsUpListeners.add(listener);
+    private class ShadeHeadsUpTrackerImpl implements ShadeHeadsUpTracker {
+        @Override
+        public void addTrackingHeadsUpListener(Consumer<ExpandableNotificationRow> listener) {
+            mTrackingHeadsUpListeners.add(listener);
+        }
+
+        @Override
+        public void removeTrackingHeadsUpListener(Consumer<ExpandableNotificationRow> listener) {
+            mTrackingHeadsUpListeners.remove(listener);
+        }
+
+        @Override
+        public void setHeadsUpAppearanceController(
+                HeadsUpAppearanceController headsUpAppearanceController) {
+            mHeadsUpAppearanceController = headsUpAppearanceController;
+        }
+
+        @Override
+        @Nullable public ExpandableNotificationRow getTrackedHeadsUpNotification() {
+            return mTrackedHeadsUpNotification;
+        }
+
+        private void updateTrackingHeadsUp(@Nullable ExpandableNotificationRow pickedChild) {
+            mTrackedHeadsUpNotification = pickedChild;
+            for (int i = 0; i < mTrackingHeadsUpListeners.size(); i++) {
+                Consumer<ExpandableNotificationRow> listener = mTrackingHeadsUpListeners.get(i);
+                listener.accept(pickedChild);
+            }
+        }
     }
 
-    public void removeTrackingHeadsUpListener(Consumer<ExpandableNotificationRow> listener) {
-        mTrackingHeadsUpListeners.remove(listener);
+    @Override
+    public ShadeHeadsUpTracker getShadeHeadsUpTracker() {
+        return mShadeHeadsUpTracker;
     }
 
-    public void setHeadsUpAppearanceController(
-            HeadsUpAppearanceController headsUpAppearanceController) {
-        mHeadsUpAppearanceController = headsUpAppearanceController;
-    }
-
-    /** Called before animating Keyguard dismissal, i.e. the animation dismissing the bouncer. */
+    @Override
     public void startBouncerPreHideAnimation() {
         if (mKeyguardQsUserSwitchController != null) {
             mKeyguardQsUserSwitchController.setKeyguardQsUserSwitchVisibility(
@@ -3129,74 +3165,90 @@
         }
     }
 
-    /** Updates the views to the initial state for the fold to AOD animation. */
-    public void prepareFoldToAodAnimation() {
-        // Force show AOD UI even if we are not locked
-        showAodUi();
-
-        // Move the content of the AOD all the way to the left
-        // so we can animate to the initial position
-        final int translationAmount = mView.getResources().getDimensionPixelSize(
-                R.dimen.below_clock_padding_start);
-        mView.setTranslationX(-translationAmount);
-        mView.setAlpha(0);
+    @Override
+    public ShadeFoldAnimator getShadeFoldAnimator() {
+        return mShadeFoldAnimator;
     }
 
-    /**
-     * Starts fold to AOD animation.
-     *
-     * @param startAction  invoked when the animation starts.
-     * @param endAction    invoked when the animation finishes, also if it was cancelled.
-     * @param cancelAction invoked when the animation is cancelled, before endAction.
-     */
-    public void startFoldToAodAnimation(Runnable startAction, Runnable endAction,
-            Runnable cancelAction) {
-        final ViewPropertyAnimator viewAnimator = mView.animate();
-        viewAnimator.cancel();
-        viewAnimator
-                .translationX(0)
-                .alpha(1f)
-                .setDuration(ANIMATION_DURATION_FOLD_TO_AOD)
-                .setInterpolator(EMPHASIZED_DECELERATE)
-                .setListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationStart(Animator animation) {
-                        startAction.run();
-                    }
+    private final class ShadeFoldAnimatorImpl implements ShadeFoldAnimator {
+        /** Updates the views to the initial state for the fold to AOD animation. */
+        @Override
+        public void prepareFoldToAodAnimation() {
+            // Force show AOD UI even if we are not locked
+            showAodUi();
 
-                    @Override
-                    public void onAnimationCancel(Animator animation) {
-                        cancelAction.run();
-                    }
+            // Move the content of the AOD all the way to the left
+            // so we can animate to the initial position
+            final int translationAmount = mView.getResources().getDimensionPixelSize(
+                    R.dimen.below_clock_padding_start);
+            mView.setTranslationX(-translationAmount);
+            mView.setAlpha(0);
+        }
 
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        endAction.run();
+        /**
+         * Starts fold to AOD animation.
+         *
+         * @param startAction  invoked when the animation starts.
+         * @param endAction    invoked when the animation finishes, also if it was cancelled.
+         * @param cancelAction invoked when the animation is cancelled, before endAction.
+         */
+        @Override
+        public void startFoldToAodAnimation(Runnable startAction, Runnable endAction,
+                Runnable cancelAction) {
+            final ViewPropertyAnimator viewAnimator = mView.animate();
+            viewAnimator.cancel();
+            viewAnimator
+                    .translationX(0)
+                    .alpha(1f)
+                    .setDuration(ANIMATION_DURATION_FOLD_TO_AOD)
+                    .setInterpolator(EMPHASIZED_DECELERATE)
+                    .setListener(new AnimatorListenerAdapter() {
+                        @Override
+                        public void onAnimationStart(Animator animation) {
+                            startAction.run();
+                        }
 
-                        viewAnimator.setListener(null);
-                        viewAnimator.setUpdateListener(null);
-                    }
-                })
-                .setUpdateListener(anim ->
-                        mKeyguardStatusViewController.animateFoldToAod(anim.getAnimatedFraction()))
-                .start();
+                        @Override
+                        public void onAnimationCancel(Animator animation) {
+                            cancelAction.run();
+                        }
+
+                        @Override
+                        public void onAnimationEnd(Animator animation) {
+                            endAction.run();
+
+                            viewAnimator.setListener(null);
+                            viewAnimator.setUpdateListener(null);
+                        }
+                    })
+                    .setUpdateListener(anim ->
+                            mKeyguardStatusViewController.animateFoldToAod(
+                                    anim.getAnimatedFraction()))
+                    .start();
+        }
+
+        /** Cancels fold to AOD transition and resets view state. */
+        @Override
+        public void cancelFoldToAodAnimation() {
+            cancelAnimation();
+            resetAlpha();
+            resetTranslation();
+        }
+
+        /** Returns the NotificationPanelView. */
+        @Override
+        public ViewGroup getView() {
+            // TODO(b/254878364): remove this method, or at least reduce references to it.
+            return mView;
+        }
     }
 
-    /** Cancels fold to AOD transition and resets view state. */
-    public void cancelFoldToAodAnimation() {
-        cancelAnimation();
-        resetAlpha();
-        resetTranslation();
-    }
-
+    @Override
     public void setImportantForAccessibility(int mode) {
         mView.setImportantForAccessibility(mode);
     }
 
-    /**
-     * Do not let the user drag the shade up and down for the current touch session.
-     * This is necessary to avoid shade expansion while/after the bouncer is dismissed.
-     */
+    @Override
     public void blockExpansionForCurrentTouch() {
         mBlockingExpansionForCurrentTouch = mTracking;
     }
@@ -3238,7 +3290,6 @@
         ipw.print("mDisplayRightInset="); ipw.println(mDisplayRightInset);
         ipw.print("mDisplayLeftInset="); ipw.println(mDisplayLeftInset);
         ipw.print("mIsExpanding="); ipw.println(mIsExpanding);
-        ipw.print("mHeaderDebugInfo="); ipw.println(mHeaderDebugInfo);
         ipw.print("mHeadsUpStartHeight="); ipw.println(mHeadsUpStartHeight);
         ipw.print("mListenForHeadsUp="); ipw.println(mListenForHeadsUp);
         ipw.print("mNavigationBarBottomHeight="); ipw.println(mNavigationBarBottomHeight);
@@ -3327,37 +3378,41 @@
         ).printTableData(ipw);
     }
 
+    private final class ShadeNotificationPresenterImpl implements ShadeNotificationPresenter{
+        @Override
+        public RemoteInputController.Delegate createRemoteInputDelegate() {
+            return mNotificationStackScrollLayoutController.createDelegate();
+        }
 
-    public RemoteInputController.Delegate createRemoteInputDelegate() {
-        return mNotificationStackScrollLayoutController.createDelegate();
+        @Override
+        public boolean hasPulsingNotifications() {
+            return mNotificationListContainer.hasPulsingNotifications();
+        }
+
+        @Override
+        public ActivatableNotificationView getActivatedChild() {
+            return mNotificationStackScrollLayoutController.getActivatedChild();
+        }
+
+        @Override
+        public void setActivatedChild(ActivatableNotificationView o) {
+            mNotificationStackScrollLayoutController.setActivatedChild(o);
+        }
     }
 
-    public boolean hasPulsingNotifications() {
-        return mNotificationListContainer.hasPulsingNotifications();
+    @Override
+    public ShadeNotificationPresenter getShadeNotificationPresenter() {
+        return mShadeNotificationPresenter;
     }
 
-    public ActivatableNotificationView getActivatedChild() {
-        return mNotificationStackScrollLayoutController.getActivatedChild();
-    }
-
-    public void setActivatedChild(ActivatableNotificationView o) {
-        mNotificationStackScrollLayoutController.setActivatedChild(o);
-    }
-
-    public void runAfterAnimationFinished(Runnable r) {
-        mNotificationStackScrollLayoutController.runAfterAnimationFinished(r);
-    }
-
-    /**
-     * Initialize objects instead of injecting to avoid circular dependencies.
-     *
-     * @param hideExpandedRunnable a runnable to run when we need to hide the expanded panel.
-     */
+    @Override
     public void initDependencies(
             CentralSurfaces centralSurfaces,
             GestureRecorder recorder,
             Runnable hideExpandedRunnable,
-            NotificationShelfController notificationShelfController) {
+            NotificationShelfController notificationShelfController,
+            HeadsUpManagerPhone headsUpManager) {
+        setHeadsUpManager(headsUpManager);
         // TODO(b/254859580): this can be injected.
         mCentralSurfaces = centralSurfaces;
 
@@ -3369,14 +3424,17 @@
         updateMaxDisplayedNotifications(true);
     }
 
+    @Override
     public void resetTranslation() {
         mView.setTranslationX(0f);
     }
 
+    @Override
     public void resetAlpha() {
         mView.setAlpha(1f);
     }
 
+    @Override
     public ViewPropertyAnimator fadeOut(long startDelayMs, long durationMs, Runnable endAction) {
         mView.animate().cancel();
         return mView.animate().alpha(0).setStartDelay(startDelayMs).setDuration(
@@ -3384,6 +3442,7 @@
                 endAction);
     }
 
+    @Override
     public void resetViewGroupFade() {
         ViewGroupFadeHelper.reset(mView);
     }
@@ -3396,14 +3455,11 @@
         mView.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
     }
 
-    public void setHeaderDebugInfo(String text) {
-        if (DEBUG_DRAWABLE) mHeaderDebugInfo = text;
+    String getHeaderDebugInfo() {
+        return "USER " + mHeadsUpManager.getUser();
     }
 
-    public String getHeaderDebugInfo() {
-        return mHeaderDebugInfo;
-    }
-
+    @Override
     public void onThemeChanged() {
         mConfigurationListener.onThemeChanged();
     }
@@ -3413,22 +3469,17 @@
         return mTouchHandler;
     }
 
+    @Override
     public NotificationStackScrollLayoutController getNotificationStackScrollLayoutController() {
         return mNotificationStackScrollLayoutController;
     }
 
-    public void disable(int state1, int state2, boolean animated) {
+    @Override
+    public void disableHeader(int state1, int state2, boolean animated) {
         mShadeHeaderController.disable(state1, state2, animated);
     }
 
-    /**
-     * Close the keyguard user switcher if it is open and capable of closing.
-     *
-     * Has no effect if user switcher isn't supported, if the user switcher is already closed, or
-     * if the user switcher uses "simple" mode. The simple user switcher cannot be closed.
-     *
-     * @return true if the keyguard user switcher was open, and is now closed
-     */
+    @Override
     public boolean closeUserSwitcherIfOpen() {
         if (mKeyguardUserSwitcherController != null) {
             return mKeyguardUserSwitcherController.closeSwitcherIfOpenAndNotSimple(
@@ -3453,7 +3504,7 @@
         );
     }
 
-    /** Updates notification panel-specific flags on {@link SysUiState}. */
+    @Override
     public void updateSystemUiStateFlags() {
         if (SysUiState.DEBUG) {
             Log.d(TAG, "Updating panel sysui state flags: fullyExpanded="
@@ -3507,7 +3558,7 @@
         event.offsetLocation(-deltaX, -deltaY);
     }
 
-    /** If the latency tracker is enabled, begins tracking expand latency. */
+    @Override
     public void startExpandLatencyTracking() {
         if (mLatencyTracker.isEnabled()) {
             mLatencyTracker.onActionStart(LatencyTracker.ACTION_EXPAND_PANEL);
@@ -3516,7 +3567,7 @@
     }
 
     private void startOpening(MotionEvent event) {
-        updatePanelExpansionAndVisibility();
+        updateExpansionAndVisibility();
         //TODO: keyguard opens QS a different way; log that too?
 
         // Log the position of the swipe that opened the panel
@@ -3561,7 +3612,7 @@
     }
 
     /** Called when a MotionEvent is about to trigger Shade expansion. */
-    public void startExpandMotion(float newX, float newY, boolean startTracking,
+    private void startExpandMotion(float newX, float newY, boolean startTracking,
             float expandedHeight) {
         if (!mHandlingPointerUp && !mStatusBarStateController.isDozing()) {
             mQsController.beginJankMonitoring(isFullyCollapsed());
@@ -3576,7 +3627,6 @@
         mInitialTouchFromKeyguard = mKeyguardStateController.isShowing();
         if (startTracking) {
             mTouchSlopExceeded = true;
-            mShadeHeightLogger.logFunctionCall("startExpandMotion");
             setExpandedHeight(mInitialOffsetOnTouch);
             onTrackingStarted();
         }
@@ -3728,7 +3778,6 @@
     @VisibleForTesting
     void setExpandedHeight(float height) {
         debugLog("setExpandedHeight(%.1f)", height);
-        mShadeHeightLogger.logFunctionCall("setExpandedHeight");
         setExpandedHeightInternal(height);
     }
 
@@ -3754,13 +3803,10 @@
             return;
         }
 
-        mShadeHeightLogger.logFunctionCall("updateExpandedHeightToMaxHeight");
         setExpandedHeight(currentMaxPanelHeight);
     }
 
     private void setExpandedHeightInternal(float h) {
-        mShadeHeightLogger.logSetExpandedHeightInternal(h, mSystemClock.currentTimeMillis());
-
         if (isNaN(h)) {
             Log.wtf(TAG, "ExpandedHeight set to NaN");
         }
@@ -3793,7 +3839,7 @@
             mExpansionDragDownAmountPx = h;
             mAmbientState.setExpansionFraction(mExpandedFraction);
             onHeightUpdated(mExpandedHeight);
-            updatePanelExpansionAndVisibility();
+            updateExpansionAndVisibility();
         });
     }
 
@@ -3817,9 +3863,9 @@
     }
 
     /** Sets the expanded height relative to a number from 0 to 1. */
-    public void setExpandedFraction(float frac) {
+    @VisibleForTesting
+    void setExpandedFraction(float frac) {
         final int maxDist = getMaxPanelTransitionDistance();
-        mShadeHeightLogger.logFunctionCall("setExpandedFraction");
         setExpandedHeight(maxDist * frac);
     }
 
@@ -3831,27 +3877,13 @@
         return mExpandedFraction;
     }
 
-    /**
-     * This method should not be used anymore, you should probably use {@link #isShadeFullyOpen()}
-     * instead. It was overused as indicating if shade is open or we're on keyguard/AOD.
-     * Moving forward we should be explicit about the what state we're checking.
-     * @return if panel is covering the screen, which means we're in expanded shade or keyguard/AOD
-     *
-     * @deprecated depends on the state you check, use {@link #isShadeFullyOpen()},
-     * {@link #isOnAod()}, {@link #isOnKeyguard()} instead.
-     */
-    @Deprecated
+    @Override
     public boolean isFullyExpanded() {
         return mExpandedHeight >= getMaxPanelTransitionDistance();
     }
 
-    /**
-     * Returns true if shade is fully opened, that is we're actually in the notification shade
-     * with QQS or QS. It's different from {@link #isFullyExpanded()} that it will not report
-     * shade as always expanded if we're on keyguard/AOD. It will return true only when user goes
-     * from keyguard to shade.
-     */
-    public boolean isShadeFullyOpen() {
+    @Override
+    public boolean isShadeFullyExpanded() {
         if (mBarState == SHADE) {
             return isFullyExpanded();
         } else if (mBarState == SHADE_LOCKED) {
@@ -3862,10 +3894,12 @@
         }
     }
 
+    @Override
     public boolean isFullyCollapsed() {
         return mExpandedFraction <= 0.0f;
     }
 
+    @Override
     public boolean isCollapsing() {
         return mClosing || mIsLaunchAnimationRunning;
     }
@@ -3874,22 +3908,21 @@
         return mTracking;
     }
 
-    /** Returns whether the shade can be collapsed. */
-    public boolean canPanelBeCollapsed() {
+    @Override
+    public boolean canBeCollapsed() {
         return !isFullyCollapsed() && !mTracking && !mClosing;
     }
 
     /** Collapses the shade instantly without animation. */
-    public void instantCollapse() {
+    void instantCollapse() {
         abortAnimations();
-        mShadeHeightLogger.logFunctionCall("instantCollapse");
         setExpandedFraction(0f);
         if (mExpanding) {
             notifyExpandingFinished();
         }
         if (mInstantExpanding) {
             mInstantExpanding = false;
-            updatePanelExpansionAndVisibility();
+            updateExpansionAndVisibility();
         }
     }
 
@@ -3898,6 +3931,7 @@
         mView.removeCallbacks(mFlingCollapseRunnable);
     }
 
+    @Override
     public boolean isUnlockHintRunning() {
         return mHintAnimationRunning;
     }
@@ -3956,7 +3990,7 @@
     }
 
     /** Returns whether a shade or QS expansion animation is running */
-    public boolean isShadeOrQsHeightAnimationRunning() {
+    private boolean isShadeOrQsHeightAnimationRunning() {
         return mHeightAnimator != null && !mHintAnimationRunning && !mIsSpringBackAnimation;
     }
 
@@ -3972,7 +4006,7 @@
             public void onAnimationEnd(Animator animation) {
                 setAnimator(null);
                 onAnimationFinished.run();
-                updatePanelExpansionAndVisibility();
+                updateExpansionAndVisibility();
             }
         });
         animator.start();
@@ -4004,7 +4038,6 @@
                                         animator.getAnimatedFraction()));
                         setOverExpansionInternal(expansion, false /* isFromGesture */);
                     }
-                    mShadeHeightLogger.logFunctionCall("height animator update");
                     setExpandedHeightInternal((float) animation.getAnimatedValue());
                 });
         return animator;
@@ -4015,19 +4048,16 @@
         mView.setVisibility(shouldPanelBeVisible() ? VISIBLE : INVISIBLE);
     }
 
-    /**
-     * Updates the panel expansion and {@link NotificationPanelView} visibility if necessary.
-     *
-     * TODO(b/200063118): Could public calls to this method be replaced with calls to
-     *   {@link #updateVisibility()}? That would allow us to make this method private.
-     */
-    public void updatePanelExpansionAndVisibility() {
+
+    @Override
+    public void updateExpansionAndVisibility() {
         mShadeExpansionStateManager.onPanelExpansionChanged(
                 mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx);
 
         updateVisibility();
     }
 
+    @Override
     public boolean isExpanded() {
         return mExpandedFraction > 0f
                 || mInstantExpanding
@@ -4049,45 +4079,41 @@
         return mClosing;
     }
 
-    /** Collapses the shade with an animation duration in milliseconds. */
+    @Override
     public void collapseWithDuration(int animationDuration) {
         mFixedDuration = animationDuration;
         collapse(false /* delayed */, 1.0f /* speedUpFactor */);
         mFixedDuration = NO_FIXED_DURATION;
     }
 
-    /** Returns the NotificationPanelView. */
-    public ViewGroup getView() {
-        // TODO(b/254878364): remove this method, or at least reduce references to it.
-        return mView;
-    }
-
     /** */
-    public boolean postToView(Runnable action) {
+    boolean postToView(Runnable action) {
         return mView.post(action);
     }
 
     /** Sends an external (e.g. Status Bar) intercept touch event to the Shade touch handler. */
-    public boolean handleExternalInterceptTouch(MotionEvent event) {
+    boolean handleExternalInterceptTouch(MotionEvent event) {
         return mTouchHandler.onInterceptTouchEvent(event);
     }
 
-    /** Sends an external (e.g. Status Bar) touch event to the Shade touch handler. */
+    @Override
     public boolean handleExternalTouch(MotionEvent event) {
         return mTouchHandler.onTouchEvent(event);
     }
 
-    /** */
-    public void requestLayoutOnView() {
+    @Override
+    public void updateTouchableRegion() {
+        //A layout will ensure that onComputeInternalInsets will be called and after that we can
+        // resize the layout. Make sure that the window stays small for one frame until the
+        // touchableRegion is set.
         mView.requestLayout();
+        mNotificationShadeWindowController.setForceWindowCollapsed(true);
+        postToView(() -> {
+            mNotificationShadeWindowController.setForceWindowCollapsed(false);
+        });
     }
 
-    /** */
-    public void resetViewAlphas() {
-        ViewGroupFadeHelper.reset(mView);
-    }
-
-    /** */
+    @Override
     public boolean isViewEnabled() {
         return mView.isEnabled();
     }
@@ -4115,13 +4141,13 @@
      * shade QS are always expanded
      */
     private void closeQsIfPossible() {
-        boolean openOrOpening = isShadeFullyOpen() || isExpanding();
+        boolean openOrOpening = isShadeFullyExpanded() || isExpanding();
         if (!(mSplitShadeEnabled && openOrOpening)) {
             mQsController.closeQs();
         }
     }
 
-    /** TODO: remove need for this delegate (b/254870148) */
+    @Override
     public void setQsScrimEnabled(boolean qsScrimEnabled) {
         mQsController.setScrimEnabled(qsScrimEnabled);
     }
@@ -4224,7 +4250,7 @@
                     == firstRow))) {
                 requestScrollerTopPaddingUpdate(false /* animate */);
             }
-            if (getKeyguardShowing()) {
+            if (isKeyguardShowing()) {
                 updateMaxDisplayedNotifications(true);
             }
             updateExpandedHeightToMaxHeight();
@@ -4470,7 +4496,7 @@
 
                 @Override
                 public float getLockscreenShadeDragProgress() {
-                    return NotificationPanelViewController.this.getLockscreenShadeDragProgress();
+                    return mQsController.getLockscreenShadeDragProgress();
                 }
             };
 
@@ -4480,16 +4506,16 @@
      * to the KEYGUARD state, which is a heavy transition that causes jank as 10+ files react to the
      * change.
      */
+    @VisibleForTesting
     public void showAodUi() {
         setDozing(true /* dozing */, false /* animate */);
         mStatusBarStateController.setUpcomingState(KEYGUARD);
         mStatusBarStateListener.onStateChanged(KEYGUARD);
         mStatusBarStateListener.onDozeAmountChanged(1f, 1f);
-        mShadeHeightLogger.logFunctionCall("showAodUi");
         setExpandedFraction(1f);
     }
 
-    /** Sets the overstretch amount in raw pixels when dragging down. */
+    @Override
     public void setOverStretchAmount(float amount) {
         float progress = amount / mView.getHeight();
         float overStretch = Interpolators.getOvershootInterpolation(progress);
@@ -4581,8 +4607,8 @@
         return insets;
     }
 
-    /** Removes any pending runnables that would collapse the panel. */
-    public void cancelPendingPanelCollapse() {
+    @Override
+    public void cancelPendingCollapse() {
         mView.removeCallbacks(mMaybeHideExpandedRunnable);
     }
 
@@ -4606,7 +4632,9 @@
             mQsController.setExpandImmediate(false);
             // Close the status bar in the next frame so we can show the end of the
             // animation.
-            mView.post(mMaybeHideExpandedRunnable);
+            if (!mIsAnyMultiShadeExpanded) {
+                mView.post(mMaybeHideExpandedRunnable);
+            }
         }
         mCurrentPanelState = state;
     }
@@ -4655,7 +4683,7 @@
     private void onStatusBarWindowStateChanged(@StatusBarManager.WindowVisibleState int state) {
         if (state != WINDOW_STATE_SHOWING
                 && mStatusBarStateController.getState() == StatusBarState.SHADE) {
-            collapsePanel(
+            collapse(
                     false /* animate */,
                     false /* delayed */,
                     1.0f /* speedUpFactor */);
@@ -4667,6 +4695,7 @@
         private long mLastTouchDownTime = -1L;
 
         /** @see ViewGroup#onInterceptTouchEvent(MotionEvent) */
+        @Override
         public boolean onInterceptTouchEvent(MotionEvent event) {
             mShadeLog.logMotionEvent(event, "NPVC onInterceptTouchEvent");
             if (mQsController.disallowTouches()) {
@@ -4926,9 +4955,10 @@
             }
 
             // On expanding, single mouse click expands the panel instead of dragging.
-            if (isFullyCollapsed() && event.isFromSource(InputDevice.SOURCE_MOUSE)) {
+            if (isFullyCollapsed() && (event.isFromSource(InputDevice.SOURCE_MOUSE)
+                    && !isTrackpadMotionEvent(event))) {
                 if (event.getAction() == MotionEvent.ACTION_UP) {
-                    expand(true);
+                    expand(true /* animate */);
                 }
                 return true;
             }
@@ -5058,7 +5088,6 @@
                         // otherwise {@link NotificationStackScrollLayout}
                         // wrongly enables stack height updates at the start of lockscreen swipe-up
                         mAmbientState.setSwipingUp(h <= 0);
-                        mShadeHeightLogger.logFunctionCall("ACTION_MOVE");
                         setExpandedHeightInternal(newHeight);
                     }
                     break;
@@ -5082,8 +5111,9 @@
         }
 
         private boolean isTrackpadMotionEvent(MotionEvent ev) {
-            return mTrackpadGestureBack
-                    && ev.getClassification() == CLASSIFICATION_MULTI_FINGER_SWIPE;
+            return mTrackpadGestureFeaturesEnabled && (
+                    ev.getClassification() == CLASSIFICATION_MULTI_FINGER_SWIPE
+                            || ev.getClassification() == CLASSIFICATION_TWO_FINGER_SWIPE);
         }
     }
 
@@ -5129,12 +5159,12 @@
             Rect to = (Rect) endValues.values.get(PROP_BOUNDS);
 
             anim.addUpdateListener(animation -> {
-                ClockAnimations clockAnims = mController.getClockAnimations();
-                if (clockAnims == null) {
+                ClockController clock = mController.getClockController();
+                if (clock == null) {
                     return;
                 }
 
-                clockAnims.onPositionUpdated(from, to, animation.getAnimatedFraction());
+                clock.getAnimations().onPositionUpdated(from, to, animation.getAnimatedFraction());
             });
 
             return anim;
@@ -5156,7 +5186,7 @@
         @Override
         public void setTrackedHeadsUp(ExpandableNotificationRow pickedChild) {
             if (pickedChild != null) {
-                updateTrackingHeadsUp(pickedChild);
+                mShadeHeadsUpTracker.updateTrackingHeadsUp(pickedChild);
                 mExpandingFromHeadsUp = true;
             }
             // otherwise we update the state when the expansion is finished
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java
index 156e4fd..af74c27 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java
@@ -561,6 +561,7 @@
         for (StatusBarWindowCallback cb : activeCallbacks) {
             cb.onStateChanged(mCurrentState.keyguardShowing,
                     mCurrentState.keyguardOccluded,
+                    mCurrentState.keyguardGoingAway,
                     mCurrentState.bouncerShowing,
                     mCurrentState.dozing,
                     mCurrentState.panelExpanded,
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
index 0318fa5..2f4cc14 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
@@ -283,11 +283,15 @@
                 }
                 mLockIconViewController.onTouchEvent(
                         ev,
-                        () -> mService.wakeUpIfDozing(
-                                mClock.uptimeMillis(),
-                                mView,
-                                "LOCK_ICON_TOUCH",
-                                PowerManager.WAKE_REASON_GESTURE)
+                        /* onGestureDetectedRunnable */
+                        () -> {
+                            mService.userActivity();
+                            mService.wakeUpIfDozing(
+                                    mClock.uptimeMillis(),
+                                    mView,
+                                    "LOCK_ICON_TOUCH",
+                                    PowerManager.WAKE_REASON_GESTURE);
+                        }
                 );
 
                 // In case we start outside of the view bounds (below the status bar), we need to
diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java
index 07c8e52..b31ec33 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java
@@ -766,7 +766,7 @@
     /** TODO(b/269742565) Remove this logging */
     private void checkCorrectSplitShadeState(float height) {
         if (mSplitShadeEnabled && height == 0
-                && mPanelViewControllerLazy.get().isShadeFullyOpen()) {
+                && mPanelViewControllerLazy.get().isShadeFullyExpanded()) {
             Log.wtfStack(TAG, "qsExpansion set to 0 while split shade is expanding or open");
         }
     }
@@ -989,13 +989,22 @@
 
         // TODO (b/265193930): remove dependency on NPVC
         float shadeExpandedFraction = mBarState == KEYGUARD
-                ? mPanelViewControllerLazy.get().getLockscreenShadeDragProgress()
+                ? getLockscreenShadeDragProgress()
                 : mShadeExpandedFraction;
         mShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction);
         mShadeHeaderController.setQsExpandedFraction(qsExpansionFraction);
         mShadeHeaderController.setQsVisible(mVisible);
     }
 
+    float getLockscreenShadeDragProgress() {
+        // mTransitioningToFullShadeProgress > 0 means we're doing regular lockscreen to shade
+        // transition. If that's not the case we should follow QS expansion fraction for when
+        // user is pulling from the same top to go directly to expanded QS
+        return getTransitioningToFullShadeProgress() > 0
+                ? mLockscreenShadeTransitionController.getQSDragProgress()
+                : computeExpansionFraction();
+    }
+
     /** */
     public void updateExpansionEnabledAmbient() {
         final float scrollRangeToTop = mAmbientState.getTopPadding() - mQuickQsHeaderHeight;
@@ -1309,8 +1318,9 @@
             logNotificationsTopPadding("keyguard", topPadding);
             return topPadding;
         } else {
-            topPadding = mQsFrameTranslateController.getNotificationsTopPadding(
-                    mExpansionHeight, mNotificationStackScrollLayoutController);
+            topPadding = Math.max(mQsFrameTranslateController.getNotificationsTopPadding(
+                    mExpansionHeight, mNotificationStackScrollLayoutController),
+                    mQuickQsHeaderHeight);
             logNotificationsTopPadding("default case", topPadding);
             return topPadding;
         }
@@ -1521,7 +1531,7 @@
         if (scrollY > 0 && !mFullyExpanded) {
             // TODO (b/265193930): remove dependency on NPVC
             // If we are scrolling QS, we should be fully expanded.
-            mPanelViewControllerLazy.get().expandWithQs();
+            mPanelViewControllerLazy.get().expandToQs();
         }
     }
 
@@ -1726,7 +1736,7 @@
                     return true;
                 }
                 // TODO (b/265193930): remove dependency on NPVC
-                if (mPanelViewControllerLazy.get().getKeyguardShowing()
+                if (mPanelViewControllerLazy.get().isKeyguardShowing()
                         && shouldQuickSettingsIntercept(mInitialTouchX, mInitialTouchY, 0)) {
                     // Dragging down on the lockscreen statusbar should prohibit other interactions
                     // immediately, otherwise we'll wait on the touchslop. This is to allow
@@ -1790,7 +1800,7 @@
                     return true;
                 } else {
                     mShadeLog.logQsTrackingNotStarted(mInitialTouchY, y, h, touchSlop,
-                            getExpanded(), mPanelViewControllerLazy.get().getKeyguardShowing(),
+                            getExpanded(), mPanelViewControllerLazy.get().isKeyguardShowing(),
                             isExpansionEnabled());
                 }
                 break;
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeController.java b/packages/SystemUI/src/com/android/systemui/shade/ShadeController.java
index ad5a68e4d..e08bc33 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeController.java
@@ -64,6 +64,11 @@
     boolean closeShadeIfOpen();
 
     /**
+     * Returns whether the shade state is the keyguard or not.
+     */
+    boolean isKeyguard();
+
+    /**
      * Returns whether the shade is currently open.
      * Even though in the current implementation shade is in expanded state on keyguard, this
      * method makes distinction between shade being truly open and plain keyguard state:
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java
index c136993..c71467b 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java
@@ -35,12 +35,12 @@
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.statusbar.window.StatusBarWindowController;
 
+import dagger.Lazy;
+
 import java.util.ArrayList;
 
 import javax.inject.Inject;
 
-import dagger.Lazy;
-
 /** An implementation of {@link ShadeController}. */
 @SysUISingleton
 public final class ShadeControllerImpl implements ShadeController {
@@ -132,13 +132,13 @@
                     "animateCollapse(): mExpandedVisible=" + mExpandedVisible + "flags=" + flags);
         }
         if (getNotificationShadeWindowView() != null
-                && mNotificationPanelViewController.canPanelBeCollapsed()
+                && mNotificationPanelViewController.canBeCollapsed()
                 && (flags & CommandQueue.FLAG_EXCLUDE_NOTIFICATION_PANEL) == 0) {
             // release focus immediately to kick off focus change transition
             mNotificationShadeWindowController.setNotificationShadeFocusable(false);
 
             mNotificationShadeWindowViewController.cancelExpandHelper();
-            mNotificationPanelViewController.collapsePanel(true, delayed, speedUpFactor);
+            mNotificationPanelViewController.collapse(true, delayed, speedUpFactor);
         }
     }
 
@@ -154,8 +154,13 @@
     }
 
     @Override
+    public boolean isKeyguard() {
+        return mStatusBarStateController.getState() == StatusBarState.KEYGUARD;
+    }
+
+    @Override
     public boolean isShadeFullyOpen() {
-        return mNotificationPanelViewController.isShadeFullyOpen();
+        return mNotificationPanelViewController.isShadeFullyExpanded();
     }
 
     @Override
@@ -268,7 +273,7 @@
         }
 
         // Ensure the panel is fully collapsed (just in case; bug 6765842, 7260868)
-        mNotificationPanelViewController.collapsePanel(false, false, 1.0f);
+        mNotificationPanelViewController.collapse(false, false, 1.0f);
 
         mExpandedVisible = false;
         notifyVisibilityChanged(false);
@@ -290,7 +295,7 @@
         notifyExpandedVisibleChanged(false);
         mCommandQueue.recomputeDisableFlags(
                 mDisplayId,
-                mNotificationPanelViewController.hideStatusBarIconsWhenExpanded() /* animate */);
+                mNotificationPanelViewController.shouldHideStatusBarIconsWhenExpanded());
 
         // Trimming will happen later if Keyguard is showing - doing it here might cause a jank in
         // the bouncer appear animation.
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeightLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeightLogger.kt
deleted file mode 100644
index e610b98..0000000
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeightLogger.kt
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-package com.android.systemui.shade
-
-import com.android.systemui.log.dagger.ShadeHeightLog
-import com.android.systemui.plugins.log.LogBuffer
-import com.android.systemui.plugins.log.LogLevel.DEBUG
-import java.text.SimpleDateFormat
-import javax.inject.Inject
-
-private const val TAG = "ShadeHeightLogger"
-
-/**
- * Log the call stack for [NotificationPanelViewController] setExpandedHeightInternal.
- *
- * Tracking bug: b/261593829
- */
-class ShadeHeightLogger
-@Inject constructor(
-    @ShadeHeightLog private val buffer: LogBuffer,
-) {
-
-    private val dateFormat = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS")
-
-    fun logFunctionCall(functionName: String) {
-        buffer.log(TAG, DEBUG, {
-            str1 = functionName
-        }, {
-            "$str1"
-        })
-    }
-
-    fun logSetExpandedHeightInternal(h: Float, time: Long) {
-        buffer.log(TAG, DEBUG, {
-            double1 = h.toDouble()
-            long1 = time
-        }, {
-            "setExpandedHeightInternal=$double1 time=${dateFormat.format(long1)}"
-        })
-    }
-}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeSurface.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeSurface.kt
new file mode 100644
index 0000000..b698bd3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeSurface.kt
@@ -0,0 +1,140 @@
+/*
+ * 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.shade
+
+import android.view.ViewPropertyAnimator
+import com.android.systemui.statusbar.GestureRecorder
+import com.android.systemui.statusbar.NotificationShelfController
+import com.android.systemui.statusbar.phone.CentralSurfaces
+import com.android.systemui.statusbar.phone.HeadsUpManagerPhone
+
+/**
+ * Allows CentralSurfacesImpl to interact with the shade. Only CentralSurfacesImpl should reference
+ * this class. If any method in this class is needed outside of CentralSurfacesImpl, it must be
+ * pulled up into ShadeViewController.
+ */
+interface ShadeSurface : ShadeViewController {
+    /** Initialize objects instead of injecting to avoid circular dependencies. */
+    fun initDependencies(
+        centralSurfaces: CentralSurfaces,
+        recorder: GestureRecorder,
+        hideExpandedRunnable: Runnable,
+        notificationShelfController: NotificationShelfController,
+        headsUpManager: HeadsUpManagerPhone
+    )
+
+    /**
+     * Animate QS collapse by flinging it. If QS is expanded, it will collapse into QQS and stop. If
+     * in split shade, it will collapse the whole shade.
+     *
+     * @param fullyCollapse Do not stop when QS becomes QQS. Fling until QS isn't visible anymore.
+     */
+    fun animateCollapseQs(fullyCollapse: Boolean)
+
+    /** Returns whether the shade can be collapsed. */
+    fun canBeCollapsed(): Boolean
+
+    /** Cancels any pending collapses. */
+    fun cancelPendingCollapse()
+
+    /** Cancels the views current animation. */
+    fun cancelAnimation()
+
+    /**
+     * Close the keyguard user switcher if it is open and capable of closing.
+     *
+     * Has no effect if user switcher isn't supported, if the user switcher is already closed, or if
+     * the user switcher uses "simple" mode. The simple user switcher cannot be closed.
+     *
+     * @return true if the keyguard user switcher was open, and is now closed
+     */
+    fun closeUserSwitcherIfOpen(): Boolean
+
+    /** Input focus transfer is about to happen. */
+    fun startWaitingForExpandGesture()
+
+    /**
+     * Called when this view is no longer waiting for input focus transfer.
+     *
+     * There are two scenarios behind this function call. First, input focus transfer has
+     * successfully happened and this view already received synthetic DOWN event.
+     * (mExpectingSynthesizedDown == false). Do nothing.
+     *
+     * Second, before input focus transfer finished, user may have lifted finger in previous window
+     * and this window never received synthetic DOWN event. (mExpectingSynthesizedDown == true). In
+     * this case, we use the velocity to trigger fling event.
+     *
+     * @param velocity unit is in px / millis
+     */
+    fun stopWaitingForExpandGesture(cancel: Boolean, velocity: Float)
+
+    /** Animates the view from its current alpha to zero then runs the runnable. */
+    fun fadeOut(startDelayMs: Long, durationMs: Long, endAction: Runnable): ViewPropertyAnimator
+
+    /** Set whether the bouncer is showing. */
+    fun setBouncerShowing(bouncerShowing: Boolean)
+
+    /**
+     * Sets whether the shade can handle touches and/or animate, canceling any touch handling or
+     * animations in progress.
+     */
+    fun setTouchAndAnimationDisabled(disabled: Boolean)
+
+    /**
+     * Sets the dozing state.
+     *
+     * @param dozing `true` when dozing.
+     * @param animate if transition should be animated.
+     */
+    fun setDozing(dozing: Boolean, animate: Boolean)
+
+    /** @see view.setImportantForAccessibility */
+    fun setImportantForAccessibility(mode: Int)
+
+    /** Sets Qs ScrimEnabled and updates QS state. */
+    fun setQsScrimEnabled(qsScrimEnabled: Boolean)
+
+    /** Sets the view's X translation to zero. */
+    fun resetTranslation()
+
+    /** Sets the view's alpha to max. */
+    fun resetAlpha()
+
+    /** @see ViewGroupFadeHelper.reset */
+    fun resetViewGroupFade()
+
+    /** Called when Back gesture has been committed (i.e. a back event has definitely occurred) */
+    fun onBackPressed()
+
+    /** Sets progress of the predictive back animation. */
+    fun onBackProgressed(progressFraction: Float)
+
+    /** @see com.android.systemui.keyguard.ScreenLifecycle.Observer.onScreenTurningOn */
+    fun onScreenTurningOn()
+
+    /**
+     * Called when the device's theme changes.
+     *
+     * TODO(b/274655539) delete?
+     */
+    fun onThemeChanged()
+
+    /** Updates the shade expansion and [NotificationPanelView] visibility if necessary. */
+    fun updateExpansionAndVisibility()
+
+    /** Updates all field values drawn from Resources. */
+    fun updateResources()
+}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt
new file mode 100644
index 0000000..34c9f6d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt
@@ -0,0 +1,260 @@
+/*
+ * 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.shade
+
+import android.view.MotionEvent
+import android.view.ViewGroup
+import com.android.systemui.statusbar.RemoteInputController
+import com.android.systemui.statusbar.notification.row.ActivatableNotificationView
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
+import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
+import com.android.systemui.statusbar.phone.HeadsUpAppearanceController
+import com.android.systemui.statusbar.phone.KeyguardBottomAreaView
+import java.util.function.Consumer
+
+/**
+ * Controller for the top level shade view
+ *
+ * @see NotificationPanelViewController
+ */
+interface ShadeViewController {
+    /** Expand the shade either animated or instantly. */
+    fun expand(animate: Boolean)
+
+    /** Animates to an expanded shade with QS expanded. If the shade starts expanded, expands QS. */
+    fun expandToQs()
+
+    /**
+     * Expand shade so that notifications are visible. Non-split shade: just expanding shade or
+     * collapsing QS when they're expanded. Split shade: only expanding shade, notifications are
+     * always visible
+     *
+     * Called when `adb shell cmd statusbar expand-notifications` is executed.
+     */
+    fun expandToNotifications()
+
+    /** Returns whether the shade is expanding or collapsing itself or quick settings. */
+    val isExpanding: Boolean
+
+    /**
+     * Returns whether the shade height is greater than zero (i.e. partially or fully expanded),
+     * there is a HUN, the shade is animating, or the shade is instantly expanding.
+     */
+    val isExpanded: Boolean
+
+    /**
+     * Returns whether the shade height is greater than zero or the shade is expecting a synthesized
+     * down event.
+     */
+    @get:Deprecated("use {@link #isExpanded()} instead") val isPanelExpanded: Boolean
+
+    /** Returns whether the shade is fully expanded in either QS or QQS. */
+    val isShadeFullyExpanded: Boolean
+
+    /**
+     * Animates the collapse of a shade with the given delay and the default duration divided by
+     * speedUpFactor.
+     */
+    fun collapse(delayed: Boolean, speedUpFactor: Float)
+
+    /** Collapses the shade. */
+    fun collapse(animate: Boolean, delayed: Boolean, speedUpFactor: Float)
+
+    /** Collapses the shade with an animation duration in milliseconds. */
+    fun collapseWithDuration(animationDuration: Int)
+
+    /** Returns whether the shade is in the process of collapsing. */
+    val isCollapsing: Boolean
+
+    /** Returns whether shade's height is zero. */
+    val isFullyCollapsed: Boolean
+
+    /** Returns whether the shade is tracking touches for expand/collapse of the shade or QS. */
+    val isTracking: Boolean
+
+    /** Returns whether the shade's top level view is enabled. */
+    val isViewEnabled: Boolean
+
+    /** Returns whether status bar icons should be hidden when the shade is expanded. */
+    fun shouldHideStatusBarIconsWhenExpanded(): Boolean
+
+    /**
+     * Do not let the user drag the shade up and down for the current touch session. This is
+     * necessary to avoid shade expansion while/after the bouncer is dismissed.
+     */
+    fun blockExpansionForCurrentTouch()
+
+    /**
+     * Disables the shade header.
+     *
+     * @see ShadeHeaderController.disable
+     */
+    fun disableHeader(state1: Int, state2: Int, animated: Boolean)
+
+    /** If the latency tracker is enabled, begins tracking expand latency. */
+    fun startExpandLatencyTracking()
+
+    /** Called before animating Keyguard dismissal, i.e. the animation dismissing the bouncer. */
+    fun startBouncerPreHideAnimation()
+
+    /** Called once every minute while dozing. */
+    fun dozeTimeTick()
+
+    /** Close guts, notification menus, and QS. Set scroll and overscroll to 0. */
+    fun resetViews(animate: Boolean)
+
+    /** Returns the StatusBarState. */
+    val barState: Int
+
+    /**
+     * Returns the bottom part of the keyguard, which contains quick affordances.
+     *
+     * TODO(b/275550429): this should be removed.
+     */
+    val keyguardBottomAreaView: KeyguardBottomAreaView?
+
+    /** Returns the NSSL controller. */
+    val notificationStackScrollLayoutController: NotificationStackScrollLayoutController
+
+    /** Sets the amount of progress in the status bar launch animation. */
+    fun applyLaunchAnimationProgress(linearProgress: Float)
+
+    /** Sets whether the status bar launch animation is currently running. */
+    fun setIsLaunchAnimationRunning(running: Boolean)
+
+    /** Sets the alpha value of the shade to a value between 0 and 255. */
+    fun setAlpha(alpha: Int, animate: Boolean)
+
+    /**
+     * Sets the runnable to run after the alpha change animation completes.
+     *
+     * @see .setAlpha
+     */
+    fun setAlphaChangeAnimationEndAction(r: Runnable)
+
+    /** Sets whether the screen has temporarily woken up to display notifications. */
+    fun setPulsing(pulsing: Boolean)
+
+    /** Sets the top spacing for the ambient indicator. */
+    fun setAmbientIndicationTop(ambientIndicationTop: Int, ambientTextVisible: Boolean)
+
+    /** Updates notification panel-specific flags on [SysUiState]. */
+    fun updateSystemUiStateFlags()
+
+    /** Ensures that the touchable region is updated. */
+    fun updateTouchableRegion()
+
+    // ******* Begin Keyguard Section *********
+    /** Animate to expanded shade after a delay in ms. Used for lockscreen to shade transition. */
+    fun transitionToExpandedShade(delay: Long)
+
+    /**
+     * Returns whether the unlock hint animation is running. The unlock hint animation is when the
+     * user taps the lock screen, causing the contents of the lock screen visually bounce.
+     */
+    val isUnlockHintRunning: Boolean
+
+    /**
+     * Set the alpha and translationY of the keyguard elements which only show on the lockscreen,
+     * but not in shade locked / shade. This is used when dragging down to the full shade.
+     */
+    fun setKeyguardTransitionProgress(keyguardAlpha: Float, keyguardTranslationY: Int)
+
+    /** Sets the overstretch amount in raw pixels when dragging down. */
+    fun setOverStretchAmount(amount: Float)
+
+    /**
+     * Sets the alpha value to be set on the keyguard status bar.
+     *
+     * @param alpha value between 0 and 1. -1 if the value is to be reset.
+     */
+    fun setKeyguardStatusBarAlpha(alpha: Float)
+
+    /**
+     * This method should not be used anymore, you should probably use [.isShadeFullyOpen] instead.
+     * It was overused as indicating if shade is open or we're on keyguard/AOD. Moving forward we
+     * should be explicit about the what state we're checking.
+     *
+     * @return if panel is covering the screen, which means we're in expanded shade or keyguard/AOD
+     */
+    @Deprecated(
+        "depends on the state you check, use {@link #isShadeFullyExpanded()},\n" +
+            "{@link #isOnAod()}, {@link #isOnKeyguard()} instead."
+    )
+    fun isFullyExpanded(): Boolean
+
+    /** Sends an external (e.g. Status Bar) touch event to the Shade touch handler. */
+    fun handleExternalTouch(event: MotionEvent): Boolean
+
+    // ******* End Keyguard Section *********
+
+    /** Returns the ShadeHeadsUpTracker. */
+    val shadeHeadsUpTracker: ShadeHeadsUpTracker
+
+    /** Returns the ShadeFoldAnimator. */
+    val shadeFoldAnimator: ShadeFoldAnimator
+
+    /** Returns the ShadeNotificationPresenter. */
+    val shadeNotificationPresenter: ShadeNotificationPresenter
+}
+
+/** Manages listeners for when users begin expanding the shade from a HUN. */
+interface ShadeHeadsUpTracker {
+    /** Add a listener for when the user starts expanding the shade from a HUN. */
+    fun addTrackingHeadsUpListener(listener: Consumer<ExpandableNotificationRow>)
+
+    /** Remove a listener for when the user starts expanding the shade from a HUN. */
+    fun removeTrackingHeadsUpListener(listener: Consumer<ExpandableNotificationRow>)
+
+    /** Set the controller for the appearance of HUNs in the icon area and the header itself. */
+    fun setHeadsUpAppearanceController(headsUpAppearanceController: HeadsUpAppearanceController?)
+
+    /** The notification row that was touched to initiate shade expansion. */
+    val trackedHeadsUpNotification: ExpandableNotificationRow?
+}
+
+/** Handles the lifecycle of the shade's animation that happens when folding a foldable. */
+interface ShadeFoldAnimator {
+    /** Updates the views to the initial state for the fold to AOD animation. */
+    fun prepareFoldToAodAnimation()
+
+    /**
+     * Starts fold to AOD animation.
+     *
+     * @param startAction invoked when the animation starts.
+     * @param endAction invoked when the animation finishes, also if it was cancelled.
+     * @param cancelAction invoked when the animation is cancelled, before endAction.
+     */
+    fun startFoldToAodAnimation(startAction: Runnable, endAction: Runnable, cancelAction: Runnable)
+
+    /** Cancels fold to AOD transition and resets view state. */
+    fun cancelFoldToAodAnimation()
+
+    /** Returns the main view of the shade. */
+    val view: ViewGroup
+}
+
+/** Handles the shade's interactions with StatusBarNotificationPresenter. */
+interface ShadeNotificationPresenter {
+    /** Returns a new delegate for some view controller pieces of the remote input process. */
+    fun createRemoteInputDelegate(): RemoteInputController.Delegate
+
+    /** Returns whether the screen has temporarily woken up to display notifications. */
+    fun hasPulsingNotifications(): Boolean
+
+    /** The current activated notification. */
+    var activatedChild: ActivatableNotificationView?
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt b/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt
index fbb51ae..07b6869 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt
@@ -19,6 +19,7 @@
 import android.app.ActivityManager
 import android.content.res.Resources
 import android.os.SystemProperties
+import android.os.Trace
 import android.util.IndentingPrintWriter
 import android.util.MathUtils
 import android.view.CrossWindowBlurListeners
@@ -42,7 +43,7 @@
 ) : Dumpable {
     val minBlurRadius = resources.getDimensionPixelSize(R.dimen.min_window_blur_radius)
     val maxBlurRadius = resources.getDimensionPixelSize(R.dimen.max_window_blur_radius)
-
+    private val traceCookie = System.identityHashCode(this)
     private var lastAppliedBlur = 0
 
     init {
@@ -85,10 +86,13 @@
             if (supportsBlursOnWindows()) {
                 it.setBackgroundBlurRadius(viewRootImpl.surfaceControl, radius)
                 if (lastAppliedBlur == 0 && radius != 0) {
+                    Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_APP, TRACK_NAME,
+                            EARLY_WAKEUP_SLICE_NAME, traceCookie)
                     it.setEarlyWakeupStart()
                 }
                 if (lastAppliedBlur != 0 && radius == 0) {
                     it.setEarlyWakeupEnd()
+                    Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_APP, TRACK_NAME, traceCookie)
                 }
                 lastAppliedBlur = radius
             }
@@ -125,4 +129,9 @@
             it.println("isHighEndGfx: ${ActivityManager.isHighEndGfx()}")
         }
     }
+
+    companion object {
+        const val TRACK_NAME = "BlurUtils"
+        const val EARLY_WAKEUP_SLICE_NAME = "eEarlyWakeup"
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index c435799..fb4feb8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -53,6 +53,7 @@
 import android.os.RemoteException;
 import android.util.Pair;
 import android.util.SparseArray;
+import android.view.KeyEvent;
 import android.view.WindowInsets.Type.InsetsType;
 import android.view.WindowInsetsController.Appearance;
 import android.view.WindowInsetsController.Behavior;
@@ -302,7 +303,7 @@
         default void remQsTile(ComponentName tile) { }
         default void clickTile(ComponentName tile) { }
 
-        default void handleSystemKey(int arg1) { }
+        default void handleSystemKey(KeyEvent arg1) { }
         default void showPinningEnterExitToast(boolean entering) { }
         default void showPinningEscapeToast() { }
         default void handleShowGlobalActionsMenu() { }
@@ -891,9 +892,9 @@
     }
 
     @Override
-    public void handleSystemKey(int key) {
+    public void handleSystemKey(KeyEvent key) {
         synchronized (mLock) {
-            mHandler.obtainMessage(MSG_HANDLE_SYSTEM_KEY, key, 0).sendToTarget();
+            mHandler.obtainMessage(MSG_HANDLE_SYSTEM_KEY, key).sendToTarget();
         }
     }
 
@@ -1534,7 +1535,7 @@
                     break;
                 case MSG_HANDLE_SYSTEM_KEY:
                     for (int i = 0; i < mCallbacks.size(); i++) {
-                        mCallbacks.get(i).handleSystemKey(msg.arg1);
+                        mCallbacks.get(i).handleSystemKey((KeyEvent) msg.obj);
                     }
                     break;
                 case MSG_SHOW_GLOBAL_ACTIONS:
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index fda2277..765c93ed 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -869,12 +869,9 @@
         // Walk down a precedence-ordered list of what indication
         // should be shown based on device state
         if (mDozing) {
+            boolean useMisalignmentColor = false;
             mLockScreenIndicationView.setVisibility(View.GONE);
             mTopIndicationView.setVisibility(VISIBLE);
-            // When dozing we ignore any text color and use white instead, because
-            // colors can be hard to read in low brightness.
-            mTopIndicationView.setTextColor(Color.WHITE);
-
             CharSequence newIndication;
             if (!TextUtils.isEmpty(mBiometricMessage)) {
                 newIndication = mBiometricMessage; // note: doesn't show mBiometricMessageFollowUp
@@ -885,8 +882,8 @@
                 mIndicationArea.setVisibility(GONE);
                 return;
             } else if (!TextUtils.isEmpty(mAlignmentIndication)) {
+                useMisalignmentColor = true;
                 newIndication = mAlignmentIndication;
-                mTopIndicationView.setTextColor(mContext.getColor(R.color.misalignment_text_color));
             } else if (mPowerPluggedIn || mEnableBatteryDefender) {
                 newIndication = computePowerIndication();
             } else {
@@ -896,7 +893,14 @@
 
             if (!TextUtils.equals(mTopIndicationView.getText(), newIndication)) {
                 mWakeLock.setAcquired(true);
-                mTopIndicationView.switchIndication(newIndication, null,
+                mTopIndicationView.switchIndication(newIndication,
+                        new KeyguardIndication.Builder()
+                                .setMessage(newIndication)
+                                .setTextColor(ColorStateList.valueOf(
+                                        useMisalignmentColor
+                                                ? mContext.getColor(R.color.misalignment_text_color)
+                                                : Color.WHITE))
+                                .build(),
                         true, () -> mWakeLock.setAcquired(false));
             }
             return;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
index 9a9503c..63e29d1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
@@ -320,7 +320,7 @@
                             startingChild.onExpandedByGesture(
                                     true /* drag down is always an open */)
                         }
-                        notificationPanelController.animateToFullShade(delay)
+                        notificationPanelController.transitionToExpandedShade(delay)
                         callbacks.forEach { it.setTransitionToFullShadeAmount(0f,
                                 true /* animated */, delay) }
 
@@ -531,7 +531,7 @@
             } else {
                 // Let's only animate notifications
                 animationHandler = { delay: Long ->
-                    notificationPanelController.animateToFullShade(delay)
+                    notificationPanelController.transitionToExpandedShade(delay)
                 }
             }
             goToLockedShadeInternal(expandedView, animationHandler,
@@ -649,7 +649,7 @@
      */
     private fun performDefaultGoToFullShadeAnimation(delay: Long) {
         logger.logDefaultGoToFullShadeAnimation(delay)
-        notificationPanelController.animateToFullShade(delay)
+        notificationPanelController.transitionToExpandedShade(delay)
         animateAppear(delay)
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
index 8874f59..20af6ca 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
@@ -16,14 +16,17 @@
 
 package com.android.systemui.statusbar.notification
 
-import android.animation.ObjectAnimator
 import android.util.FloatProperty
+import android.view.animation.Interpolator
 import androidx.annotation.VisibleForTesting
+import androidx.core.animation.ObjectAnimator
 import com.android.systemui.Dumpable
 import com.android.systemui.animation.Interpolators
+import com.android.systemui.animation.InterpolatorsAndroidX
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.shade.NotificationPanelViewController.WAKEUP_ANIMATION_DELAY_MS
 import com.android.systemui.shade.ShadeExpansionChangeEvent
 import com.android.systemui.shade.ShadeExpansionListener
 import com.android.systemui.statusbar.StatusBarState
@@ -36,12 +39,17 @@
 import com.android.systemui.statusbar.phone.ScreenOffAnimationController
 import com.android.systemui.statusbar.policy.HeadsUpManager
 import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener
+import com.android.systemui.util.doOnEnd
+import com.android.systemui.util.doOnStart
 import java.io.PrintWriter
 import javax.inject.Inject
+import kotlin.math.max
 import kotlin.math.min
 
 @SysUISingleton
-class NotificationWakeUpCoordinator @Inject constructor(
+class NotificationWakeUpCoordinator
+@Inject
+constructor(
     dumpManager: DumpManager,
     private val mHeadsUpManager: HeadsUpManager,
     private val statusBarStateController: StatusBarStateController,
@@ -49,27 +57,25 @@
     private val dozeParameters: DozeParameters,
     private val screenOffAnimationController: ScreenOffAnimationController,
     private val logger: NotificationWakeUpCoordinatorLogger,
-) : OnHeadsUpChangedListener, StatusBarStateController.StateListener, ShadeExpansionListener,
+) :
+    OnHeadsUpChangedListener,
+    StatusBarStateController.StateListener,
+    ShadeExpansionListener,
     Dumpable {
-
-    private val mNotificationVisibility = object : FloatProperty<NotificationWakeUpCoordinator>(
-        "notificationVisibility") {
-
-        override fun setValue(coordinator: NotificationWakeUpCoordinator, value: Float) {
-            coordinator.setVisibilityAmount(value)
-        }
-
-        override fun get(coordinator: NotificationWakeUpCoordinator): Float? {
-            return coordinator.mLinearVisibilityAmount
-        }
-    }
     private lateinit var mStackScrollerController: NotificationStackScrollLayoutController
     private var mVisibilityInterpolator = Interpolators.FAST_OUT_SLOW_IN_REVERSE
 
-    private var mLinearDozeAmount: Float = 0.0f
-    private var mDozeAmount: Float = 0.0f
-    private var mDozeAmountSource: String = "init"
-    private var mNotifsHiddenByDozeAmountOverride: Boolean = false
+    private var inputLinearDozeAmount: Float = 0.0f
+    private var inputEasedDozeAmount: Float = 0.0f
+    private var delayedDozeAmountOverride: Float = 0.0f
+    private var delayedDozeAmountAnimator: ObjectAnimator? = null
+    /** Valid values: {1f, 0f, null} null => use input */
+    private var hardDozeAmountOverride: Float? = null
+    private var hardDozeAmountOverrideSource: String = "n/a"
+    private var outputLinearDozeAmount: Float = 0.0f
+    private var outputEasedDozeAmount: Float = 0.0f
+    @VisibleForTesting val dozeAmountInterpolator: Interpolator = Interpolators.FAST_OUT_SLOW_IN
+
     private var mNotificationVisibleAmount = 0.0f
     private var mNotificationsVisible = false
     private var mNotificationsVisibleForExpansion = false
@@ -84,27 +90,32 @@
     var fullyAwake: Boolean = false
 
     var wakingUp = false
-        set(value) {
+        private set(value) {
             field = value
             willWakeUp = false
             if (value) {
-                if (mNotificationsVisible && !mNotificationsVisibleForExpansion &&
-                    !bypassController.bypassEnabled) {
+                if (
+                    mNotificationsVisible &&
+                        !mNotificationsVisibleForExpansion &&
+                        !bypassController.bypassEnabled
+                ) {
                     // We're waking up while pulsing, let's make sure the animation looks nice
                     mStackScrollerController.wakeUpFromPulse()
                 }
                 if (bypassController.bypassEnabled && !mNotificationsVisible) {
                     // Let's make sure our huns become visible once we are waking up in case
                     // they were blocked by the proximity sensor
-                    updateNotificationVisibility(animate = shouldAnimateVisibility(),
-                            increaseSpeed = false)
+                    updateNotificationVisibility(
+                        animate = shouldAnimateVisibility(),
+                        increaseSpeed = false
+                    )
                 }
             }
         }
 
     var willWakeUp = false
         set(value) {
-            if (!value || mDozeAmount != 0.0f) {
+            if (!value || outputLinearDozeAmount != 0.0f) {
                 field = value
             }
         }
@@ -118,8 +129,10 @@
                 // Only when setting pulsing to true we want an immediate update, since we get
                 // this already when the doze service finishes which is usually before we get
                 // the waking up callback
-                updateNotificationVisibility(animate = shouldAnimateVisibility(),
-                        increaseSpeed = false)
+                updateNotificationVisibility(
+                    animate = shouldAnimateVisibility(),
+                    increaseSpeed = false
+                )
             }
         }
 
@@ -133,17 +146,17 @@
             }
         }
 
-    /**
-     * True if we can show pulsing heads up notifications
-     */
+    /** True if we can show pulsing heads up notifications */
     var canShowPulsingHuns: Boolean = false
         private set
         get() {
             var canShow = pulsing
             if (bypassController.bypassEnabled) {
                 // We also allow pulsing on the lock screen!
-                canShow = canShow || (wakingUp || willWakeUp || fullyAwake) &&
-                    statusBarStateController.state == StatusBarState.KEYGUARD
+                canShow =
+                    canShow ||
+                        (wakingUp || willWakeUp || fullyAwake) &&
+                            statusBarStateController.state == StatusBarState.KEYGUARD
                 // We want to hide the notifications when collapsed too much
                 if (collapsedEnoughToHide) {
                     canShow = false
@@ -152,30 +165,38 @@
             return canShow
         }
 
-    private val bypassStateChangedListener = object : OnBypassStateChangedListener {
-        override fun onBypassStateChanged(isEnabled: Boolean) {
-            // When the bypass state changes, we have to check whether we should re-show the
-            // notifications by clearing the doze amount override which hides them.
-            maybeClearDozeAmountOverrideHidingNotifs()
+    private val bypassStateChangedListener =
+        object : OnBypassStateChangedListener {
+            override fun onBypassStateChanged(isEnabled: Boolean) {
+                // When the bypass state changes, we have to check whether we should re-show the
+                // notifications by clearing the doze amount override which hides them.
+                maybeClearHardDozeAmountOverrideHidingNotifs()
+            }
         }
-    }
 
     init {
         dumpManager.registerDumpable(this)
         mHeadsUpManager.addListener(this)
         statusBarStateController.addCallback(this)
         bypassController.registerOnBypassStateChangedListener(bypassStateChangedListener)
-        addListener(object : WakeUpListener {
-            override fun onFullyHiddenChanged(isFullyHidden: Boolean) {
-                if (isFullyHidden && mNotificationsVisibleForExpansion) {
-                    // When the notification becomes fully invisible, let's make sure our expansion
-                    // flag also changes. This can happen if the bouncer shows when dragging down
-                    // and then the screen turning off, where we don't reset this state.
-                    setNotificationsVisibleForExpansion(visible = false, animate = false,
-                            increaseSpeed = false)
+        addListener(
+            object : WakeUpListener {
+                override fun onFullyHiddenChanged(isFullyHidden: Boolean) {
+                    if (isFullyHidden && mNotificationsVisibleForExpansion) {
+                        // When the notification becomes fully invisible, let's make sure our
+                        // expansion
+                        // flag also changes. This can happen if the bouncer shows when dragging
+                        // down
+                        // and then the screen turning off, where we don't reset this state.
+                        setNotificationsVisibleForExpansion(
+                            visible = false,
+                            animate = false,
+                            increaseSpeed = false
+                        )
+                    }
                 }
             }
-        })
+        )
     }
 
     fun setStackScroller(stackScrollerController: NotificationStackScrollLayoutController) {
@@ -221,15 +242,17 @@
         wakeUpListeners.remove(listener)
     }
 
-    private fun updateNotificationVisibility(
-        animate: Boolean,
-        increaseSpeed: Boolean
-    ) {
+    private fun updateNotificationVisibility(animate: Boolean, increaseSpeed: Boolean) {
         // TODO: handle Lockscreen wakeup for bypass when we're not pulsing anymore
         var visible = mNotificationsVisibleForExpansion || mHeadsUpManager.hasNotifications()
         visible = visible && canShowPulsingHuns
 
-        if (!visible && mNotificationsVisible && (wakingUp || willWakeUp) && mDozeAmount != 0.0f) {
+        if (
+            !visible &&
+                mNotificationsVisible &&
+                (wakingUp || willWakeUp) &&
+                outputLinearDozeAmount != 0.0f
+        ) {
             // let's not make notifications invisible while waking up, otherwise the animation
             // is strange
             return
@@ -257,7 +280,9 @@
 
     override fun onDozeAmountChanged(linear: Float, eased: Float) {
         logger.logOnDozeAmountChanged(linear = linear, eased = eased)
-        if (overrideDozeAmountIfAnimatingScreenOff(linear)) {
+        inputLinearDozeAmount = linear
+        inputEasedDozeAmount = eased
+        if (overrideDozeAmountIfAnimatingScreenOff()) {
             return
         }
 
@@ -265,33 +290,109 @@
             return
         }
 
-        if (linear != 1.0f && linear != 0.0f &&
-            (mLinearDozeAmount == 0.0f || mLinearDozeAmount == 1.0f)) {
-            // Let's notify the scroller that an animation started
-            notifyAnimationStart(mLinearDozeAmount == 1.0f)
+        if (clearHardDozeAmountOverride()) {
+            return
         }
-        setDozeAmount(linear, eased, source = "StatusBar")
+
+        updateDozeAmount()
     }
 
-    fun setDozeAmount(
-        linear: Float,
-        eased: Float,
-        source: String,
-        hidesNotifsByOverride: Boolean = false
-    ) {
-        val changed = linear != mLinearDozeAmount
-        logger.logSetDozeAmount(linear, eased, source, statusBarStateController.state, changed)
-        mLinearDozeAmount = linear
-        mDozeAmount = eased
-        mDozeAmountSource = source
-        mNotifsHiddenByDozeAmountOverride = hidesNotifsByOverride
-        mStackScrollerController.setDozeAmount(mDozeAmount)
-        updateHideAmount()
-        if (changed && linear == 0.0f) {
-            setNotificationsVisible(visible = false, animate = false, increaseSpeed = false)
-            setNotificationsVisibleForExpansion(visible = false, animate = false,
-                    increaseSpeed = false)
+    private fun setHardDozeAmountOverride(dozing: Boolean, source: String) {
+        logger.logSetDozeAmountOverride(dozing = dozing, source = source)
+        hardDozeAmountOverride = if (dozing) 1f else 0f
+        hardDozeAmountOverrideSource = source
+        updateDozeAmount()
+    }
+
+    private fun clearHardDozeAmountOverride(): Boolean {
+        if (hardDozeAmountOverride == null) return false
+        hardDozeAmountOverride = null
+        hardDozeAmountOverrideSource = "Cleared: $hardDozeAmountOverrideSource"
+        updateDozeAmount()
+        return true
+    }
+
+    private fun updateDozeAmount() {
+        // Calculate new doze amount (linear)
+        val newOutputLinearDozeAmount =
+            hardDozeAmountOverride ?: max(inputLinearDozeAmount, delayedDozeAmountOverride)
+        val changed = outputLinearDozeAmount != newOutputLinearDozeAmount
+
+        // notify when the animation is starting
+        if (
+            newOutputLinearDozeAmount != 1.0f &&
+                newOutputLinearDozeAmount != 0.0f &&
+                (outputLinearDozeAmount == 0.0f || outputLinearDozeAmount == 1.0f)
+        ) {
+            // Let's notify the scroller that an animation started
+            notifyAnimationStart(outputLinearDozeAmount == 1.0f)
         }
+
+        // Update output doze amount
+        outputLinearDozeAmount = newOutputLinearDozeAmount
+        outputEasedDozeAmount = dozeAmountInterpolator.getInterpolation(outputLinearDozeAmount)
+        logger.logUpdateDozeAmount(
+            inputLinear = inputLinearDozeAmount,
+            delayLinear = delayedDozeAmountOverride,
+            hardOverride = hardDozeAmountOverride,
+            outputLinear = outputLinearDozeAmount,
+            state = statusBarStateController.state,
+            changed = changed
+        )
+        mStackScrollerController.setDozeAmount(outputEasedDozeAmount)
+        updateHideAmount()
+        if (changed && outputLinearDozeAmount == 0.0f) {
+            setNotificationsVisible(visible = false, animate = false, increaseSpeed = false)
+            setNotificationsVisibleForExpansion(
+                visible = false,
+                animate = false,
+                increaseSpeed = false
+            )
+        }
+    }
+
+    /**
+     * Notifies the wakeup coordinator that we're waking up.
+     *
+     * [requestDelayedAnimation] is used to request that we delay the start of the wakeup animation
+     * in order to wait for a potential fingerprint authentication to arrive, since unlocking during
+     * the wakeup animation looks chaotic.
+     *
+     * If called with [wakingUp] and [requestDelayedAnimation] both `true`, the [WakeUpListener]s
+     * are guaranteed to receive at least one [WakeUpListener.onDelayedDozeAmountAnimationRunning]
+     * call with `false` at some point in the near future. A call with `true` before that will
+     * happen if the animation is not already running.
+     */
+    fun setWakingUp(
+        wakingUp: Boolean,
+        requestDelayedAnimation: Boolean,
+    ) {
+        logger.logSetWakingUp(wakingUp, requestDelayedAnimation)
+        this.wakingUp = wakingUp
+        if (wakingUp && requestDelayedAnimation) {
+            scheduleDelayedDozeAmountAnimation()
+        }
+    }
+
+    private fun scheduleDelayedDozeAmountAnimation() {
+        val alreadyRunning = delayedDozeAmountAnimator != null
+        logger.logStartDelayedDozeAmountAnimation(alreadyRunning)
+        if (alreadyRunning) return
+        delayedDozeAmount.setValue(this, 1.0f)
+        delayedDozeAmountAnimator =
+            ObjectAnimator.ofFloat(this, delayedDozeAmount, 0.0f).apply {
+                interpolator = InterpolatorsAndroidX.LINEAR
+                duration = StackStateAnimator.ANIMATION_DURATION_WAKEUP.toLong()
+                startDelay = WAKEUP_ANIMATION_DELAY_MS.toLong()
+                doOnStart {
+                    wakeUpListeners.forEach { it.onDelayedDozeAmountAnimationRunning(true) }
+                }
+                doOnEnd {
+                    delayedDozeAmountAnimator = null
+                    wakeUpListeners.forEach { it.onDelayedDozeAmountAnimationRunning(false) }
+                }
+                start()
+            }
     }
 
     override fun onStateChanged(newState: Int) {
@@ -302,12 +403,15 @@
             // undefined state, so it's an indication that we should do state cleanup. We override
             // the doze amount to 0f (not dozing) so that the notifications are no longer hidden.
             // See: UnlockedScreenOffAnimationController.onFinishedWakingUp()
-            setDozeAmount(0f, 0f, source = "Override: Shade->Shade (lock cancelled by unlock)")
+            setHardDozeAmountOverride(
+                dozing = false,
+                source = "Override: Shade->Shade (lock cancelled by unlock)"
+            )
             this.state = newState
             return
         }
 
-        if (overrideDozeAmountIfAnimatingScreenOff(mLinearDozeAmount)) {
+        if (overrideDozeAmountIfAnimatingScreenOff()) {
             this.state = newState
             return
         }
@@ -317,7 +421,7 @@
             return
         }
 
-        maybeClearDozeAmountOverrideHidingNotifs()
+        maybeClearHardDozeAmountOverrideHidingNotifs()
 
         this.state = newState
     }
@@ -340,15 +444,14 @@
 
     /**
      * @return Whether the doze amount was overridden because bypass is enabled. If true, the
-     * original doze amount should be ignored.
+     *   original doze amount should be ignored.
      */
     private fun overrideDozeAmountIfBypass(): Boolean {
         if (bypassController.bypassEnabled) {
             if (statusBarStateController.state == StatusBarState.KEYGUARD) {
-                setDozeAmount(1f, 1f, source = "Override: bypass (keyguard)",
-                        hidesNotifsByOverride = true)
+                setHardDozeAmountOverride(dozing = true, source = "Override: bypass (keyguard)")
             } else {
-                setDozeAmount(0f, 0f, source = "Override: bypass (shade)")
+                setHardDozeAmountOverride(dozing = false, source = "Override: bypass (shade)")
             }
             return true
         }
@@ -362,26 +465,28 @@
      * This fixes bugs where the bypass state changing could result in stale overrides, hiding
      * notifications either on the inside screen or even after unlock.
      */
-    private fun maybeClearDozeAmountOverrideHidingNotifs() {
-        if (mNotifsHiddenByDozeAmountOverride) {
+    private fun maybeClearHardDozeAmountOverrideHidingNotifs() {
+        if (hardDozeAmountOverride == 1f) {
             val onKeyguard = statusBarStateController.state == StatusBarState.KEYGUARD
             val dozing = statusBarStateController.isDozing
             val bypass = bypassController.bypassEnabled
             val animating =
-                    screenOffAnimationController.overrideNotificationsFullyDozingOnKeyguard()
+                screenOffAnimationController.overrideNotificationsFullyDozingOnKeyguard()
             // Overrides are set by [overrideDozeAmountIfAnimatingScreenOff] and
             // [overrideDozeAmountIfBypass] based on 'animating' and 'bypass' respectively, so only
             // clear the override if both those conditions are cleared.  But also require either
             // !dozing or !onKeyguard because those conditions should indicate that we intend
             // notifications to be visible, and thus it is safe to unhide them.
             val willRemove = (!onKeyguard || !dozing) && !bypass && !animating
-            logger.logMaybeClearDozeAmountOverrideHidingNotifs(
-                    willRemove = willRemove,
-                    onKeyguard = onKeyguard, dozing = dozing,
-                    bypass = bypass, animating = animating,
+            logger.logMaybeClearHardDozeAmountOverrideHidingNotifs(
+                willRemove = willRemove,
+                onKeyguard = onKeyguard,
+                dozing = dozing,
+                bypass = bypass,
+                animating = animating,
             )
             if (willRemove) {
-                setDozeAmount(0f, 0f, source = "Removed: $mDozeAmountSource")
+                clearHardDozeAmountOverride()
             }
         }
     }
@@ -392,12 +497,11 @@
      * off and dozeAmount goes from 1f to 0f.
      *
      * @return Whether the doze amount was overridden because we are playing the screen off
-     * animation. If true, the original doze amount should be ignored.
+     *   animation. If true, the original doze amount should be ignored.
      */
-    private fun overrideDozeAmountIfAnimatingScreenOff(linearDozeAmount: Float): Boolean {
+    private fun overrideDozeAmountIfAnimatingScreenOff(): Boolean {
         if (screenOffAnimationController.overrideNotificationsFullyDozingOnKeyguard()) {
-            setDozeAmount(1f, 1f, source = "Override: animating screen off",
-                    hidesNotifsByOverride = true)
+            setHardDozeAmountOverride(dozing = true, source = "Override: animating screen off")
             return true
         }
 
@@ -406,41 +510,41 @@
 
     private fun startVisibilityAnimation(increaseSpeed: Boolean) {
         if (mNotificationVisibleAmount == 0f || mNotificationVisibleAmount == 1f) {
-            mVisibilityInterpolator = if (mNotificationsVisible)
-                Interpolators.TOUCH_RESPONSE
-            else
-                Interpolators.FAST_OUT_SLOW_IN_REVERSE
+            mVisibilityInterpolator =
+                if (mNotificationsVisible) Interpolators.TOUCH_RESPONSE
+                else Interpolators.FAST_OUT_SLOW_IN_REVERSE
         }
         val target = if (mNotificationsVisible) 1.0f else 0.0f
-        val visibilityAnimator = ObjectAnimator.ofFloat(this, mNotificationVisibility, target)
-        visibilityAnimator.setInterpolator(Interpolators.LINEAR)
+        val visibilityAnimator = ObjectAnimator.ofFloat(this, notificationVisibility, target)
+        visibilityAnimator.interpolator = InterpolatorsAndroidX.LINEAR
         var duration = StackStateAnimator.ANIMATION_DURATION_WAKEUP.toLong()
         if (increaseSpeed) {
             duration = (duration.toFloat() / 1.5F).toLong()
         }
-        visibilityAnimator.setDuration(duration)
+        visibilityAnimator.duration = duration
         visibilityAnimator.start()
         mVisibilityAnimator = visibilityAnimator
     }
 
     private fun setVisibilityAmount(visibilityAmount: Float) {
+        logger.logSetVisibilityAmount(visibilityAmount)
         mLinearVisibilityAmount = visibilityAmount
-        mVisibilityAmount = mVisibilityInterpolator.getInterpolation(
-                visibilityAmount)
+        mVisibilityAmount = mVisibilityInterpolator.getInterpolation(visibilityAmount)
         handleAnimationFinished()
         updateHideAmount()
     }
 
     private fun handleAnimationFinished() {
-        if (mLinearDozeAmount == 0.0f || mLinearVisibilityAmount == 0.0f) {
+        if (outputLinearDozeAmount == 0.0f || mLinearVisibilityAmount == 0.0f) {
             mEntrySetToClearWhenFinished.forEach { it.setHeadsUpAnimatingAway(false) }
             mEntrySetToClearWhenFinished.clear()
         }
     }
 
     private fun updateHideAmount() {
-        val linearAmount = min(1.0f - mLinearVisibilityAmount, mLinearDozeAmount)
-        val amount = min(1.0f - mVisibilityAmount, mDozeAmount)
+        val linearAmount = min(1.0f - mLinearVisibilityAmount, outputLinearDozeAmount)
+        val amount = min(1.0f - mVisibilityAmount, outputEasedDozeAmount)
+        logger.logSetHideAmount(linearAmount)
         mStackScrollerController.setHideAmount(linearAmount, amount)
         notificationsFullyHidden = linearAmount == 1.0f
     }
@@ -458,7 +562,7 @@
     override fun onHeadsUpStateChanged(entry: NotificationEntry, isHeadsUp: Boolean) {
         var animate = shouldAnimateVisibility()
         if (!isHeadsUp) {
-            if (mLinearDozeAmount != 0.0f && mLinearVisibilityAmount != 0.0f) {
+            if (outputLinearDozeAmount != 0.0f && mLinearVisibilityAmount != 0.0f) {
                 if (entry.isRowDismissed) {
                     // if we animate, we see the shelf briefly visible. Instead we fully animate
                     // the notification and its background out
@@ -477,13 +581,16 @@
     }
 
     private fun shouldAnimateVisibility() =
-            dozeParameters.alwaysOn && !dozeParameters.displayNeedsBlanking
+        dozeParameters.alwaysOn && !dozeParameters.displayNeedsBlanking
 
     override fun dump(pw: PrintWriter, args: Array<out String>) {
-        pw.println("mLinearDozeAmount: $mLinearDozeAmount")
-        pw.println("mDozeAmount: $mDozeAmount")
-        pw.println("mDozeAmountSource: $mDozeAmountSource")
-        pw.println("mNotifsHiddenByDozeAmountOverride: $mNotifsHiddenByDozeAmountOverride")
+        pw.println("inputLinearDozeAmount: $inputLinearDozeAmount")
+        pw.println("inputEasedDozeAmount: $inputEasedDozeAmount")
+        pw.println("delayedDozeAmountOverride: $delayedDozeAmountOverride")
+        pw.println("hardDozeAmountOverride: $hardDozeAmountOverride")
+        pw.println("hardDozeAmountOverrideSource: $hardDozeAmountOverrideSource")
+        pw.println("outputLinearDozeAmount: $outputLinearDozeAmount")
+        pw.println("outputEasedDozeAmount: $outputEasedDozeAmount")
         pw.println("mNotificationVisibleAmount: $mNotificationVisibleAmount")
         pw.println("mNotificationsVisible: $mNotificationsVisible")
         pw.println("mNotificationsVisibleForExpansion: $mNotificationsVisibleForExpansion")
@@ -500,16 +607,53 @@
         pw.println("canShowPulsingHuns: $canShowPulsingHuns")
     }
 
+    fun logDelayingClockWakeUpAnimation(delayingAnimation: Boolean) {
+        logger.logDelayingClockWakeUpAnimation(delayingAnimation)
+    }
+
     interface WakeUpListener {
-        /**
-         * Called whenever the notifications are fully hidden or shown
-         */
+        /** Called whenever the notifications are fully hidden or shown */
         @JvmDefault fun onFullyHiddenChanged(isFullyHidden: Boolean) {}
 
         /**
          * Called whenever the pulseExpansion changes
+         *
          * @param expandingChanged if the user has started or stopped expanding
          */
         @JvmDefault fun onPulseExpansionChanged(expandingChanged: Boolean) {}
+
+        /**
+         * Called when the animator started by [scheduleDelayedDozeAmountAnimation] begins running
+         * after the start delay, or after it ends/is cancelled.
+         */
+        @JvmDefault fun onDelayedDozeAmountAnimationRunning(running: Boolean) {}
+    }
+
+    companion object {
+        private val notificationVisibility =
+            object : FloatProperty<NotificationWakeUpCoordinator>("notificationVisibility") {
+
+                override fun setValue(coordinator: NotificationWakeUpCoordinator, value: Float) {
+                    coordinator.setVisibilityAmount(value)
+                }
+
+                override fun get(coordinator: NotificationWakeUpCoordinator): Float {
+                    return coordinator.mLinearVisibilityAmount
+                }
+            }
+
+        private val delayedDozeAmount =
+            object : FloatProperty<NotificationWakeUpCoordinator>("delayedDozeAmount") {
+
+                override fun setValue(coordinator: NotificationWakeUpCoordinator, value: Float) {
+                    coordinator.delayedDozeAmountOverride = value
+                    coordinator.logger.logSetDelayDozeAmountOverride(value)
+                    coordinator.updateDozeAmount()
+                }
+
+                override fun get(coordinator: NotificationWakeUpCoordinator): Float {
+                    return coordinator.delayedDozeAmountOverride
+                }
+            }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt
index 88d9ffc..dd3c2a9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt
@@ -22,50 +22,75 @@
 class NotificationWakeUpCoordinatorLogger
 @Inject
 constructor(@NotificationLockscreenLog private val buffer: LogBuffer) {
-    private var lastSetDozeAmountLogWasFractional = false
+    private var allowThrottle = true
+    private var lastSetDozeAmountLogInputWasFractional = false
+    private var lastSetDozeAmountLogDelayWasFractional = false
     private var lastSetDozeAmountLogState = -1
-    private var lastSetDozeAmountLogSource = "undefined"
+    private var lastSetHardOverride: Float? = null
     private var lastOnDozeAmountChangedLogWasFractional = false
+    private var lastSetDelayDozeAmountOverrideLogWasFractional = false
+    private var lastSetVisibilityAmountLogWasFractional = false
+    private var lastSetHideAmountLogWasFractional = false
+    private var lastSetHideAmount = -1f
 
-    fun logSetDozeAmount(
-        linear: Float,
-        eased: Float,
-        source: String,
+    fun logUpdateDozeAmount(
+        inputLinear: Float,
+        delayLinear: Float,
+        hardOverride: Float?,
+        outputLinear: Float,
         state: Int,
         changed: Boolean,
     ) {
         // Avoid logging on every frame of the animation if important values are not changing
-        val isFractional = linear != 1f && linear != 0f
+        val isInputFractional = inputLinear != 1f && inputLinear != 0f
+        val isDelayFractional = delayLinear != 1f && delayLinear != 0f
         if (
-            lastSetDozeAmountLogWasFractional &&
-                isFractional &&
+            (isInputFractional || isDelayFractional) &&
+                lastSetDozeAmountLogInputWasFractional == isInputFractional &&
+                lastSetDozeAmountLogDelayWasFractional == isDelayFractional &&
                 lastSetDozeAmountLogState == state &&
-                lastSetDozeAmountLogSource == source
+                lastSetHardOverride == hardOverride &&
+                allowThrottle
         ) {
             return
         }
-        lastSetDozeAmountLogWasFractional = isFractional
+        lastSetDozeAmountLogInputWasFractional = isInputFractional
+        lastSetDozeAmountLogDelayWasFractional = isDelayFractional
         lastSetDozeAmountLogState = state
-        lastSetDozeAmountLogSource = source
+        lastSetHardOverride = hardOverride
 
         buffer.log(
             TAG,
             DEBUG,
             {
-                double1 = linear.toDouble()
-                str2 = eased.toString()
-                str3 = source
+                double1 = inputLinear.toDouble()
+                str1 = hardOverride.toString()
+                str2 = outputLinear.toString()
+                str3 = delayLinear.toString()
                 int1 = state
                 bool1 = changed
             },
             {
-                "setDozeAmount(linear=$double1, eased=$str2, source=$str3)" +
+                "updateDozeAmount() inputLinear=$double1 delayLinear=$str3" +
+                    " hardOverride=$str1 outputLinear=$str2" +
                     " state=${StatusBarState.toString(int1)} changed=$bool1"
             }
         )
     }
 
-    fun logMaybeClearDozeAmountOverrideHidingNotifs(
+    fun logSetDozeAmountOverride(dozing: Boolean, source: String) {
+        buffer.log(
+            TAG,
+            DEBUG,
+            {
+                bool1 = dozing
+                str1 = source
+            },
+            { "setDozeAmountOverride(dozing=$bool1, source=\"$str1\")" }
+        )
+    }
+
+    fun logMaybeClearHardDozeAmountOverrideHidingNotifs(
         willRemove: Boolean,
         onKeyguard: Boolean,
         dozing: Boolean,
@@ -80,14 +105,14 @@
                     "willRemove=$willRemove onKeyguard=$onKeyguard dozing=$dozing" +
                         " bypass=$bypass animating=$animating"
             },
-            { "maybeClearDozeAmountOverrideHidingNotifs() $str1" }
+            { "maybeClearHardDozeAmountOverrideHidingNotifs() $str1" }
         )
     }
 
     fun logOnDozeAmountChanged(linear: Float, eased: Float) {
         // Avoid logging on every frame of the animation when values are fractional
         val isFractional = linear != 1f && linear != 0f
-        if (lastOnDozeAmountChangedLogWasFractional && isFractional) return
+        if (lastOnDozeAmountChangedLogWasFractional && isFractional && allowThrottle) return
         lastOnDozeAmountChangedLogWasFractional = isFractional
         buffer.log(
             TAG,
@@ -100,6 +125,47 @@
         )
     }
 
+    fun logSetDelayDozeAmountOverride(linear: Float) {
+        // Avoid logging on every frame of the animation when values are fractional
+        val isFractional = linear != 1f && linear != 0f
+        if (lastSetDelayDozeAmountOverrideLogWasFractional && isFractional && allowThrottle) return
+        lastSetDelayDozeAmountOverrideLogWasFractional = isFractional
+        buffer.log(
+            TAG,
+            DEBUG,
+            { double1 = linear.toDouble() },
+            { "setDelayDozeAmountOverride($double1)" }
+        )
+    }
+
+    fun logSetVisibilityAmount(linear: Float) {
+        // Avoid logging on every frame of the animation when values are fractional
+        val isFractional = linear != 1f && linear != 0f
+        if (lastSetVisibilityAmountLogWasFractional && isFractional && allowThrottle) return
+        lastSetVisibilityAmountLogWasFractional = isFractional
+        buffer.log(TAG, DEBUG, { double1 = linear.toDouble() }, { "setVisibilityAmount($double1)" })
+    }
+
+    fun logSetHideAmount(linear: Float) {
+        // Avoid logging the same value repeatedly
+        if (lastSetHideAmount == linear && allowThrottle) return
+        lastSetHideAmount = linear
+        // Avoid logging on every frame of the animation when values are fractional
+        val isFractional = linear != 1f && linear != 0f
+        if (lastSetHideAmountLogWasFractional && isFractional && allowThrottle) return
+        lastSetHideAmountLogWasFractional = isFractional
+        buffer.log(TAG, DEBUG, { double1 = linear.toDouble() }, { "setHideAmount($double1)" })
+    }
+
+    fun logStartDelayedDozeAmountAnimation(alreadyRunning: Boolean) {
+        buffer.log(
+            TAG,
+            DEBUG,
+            { bool1 = alreadyRunning },
+            { "startDelayedDozeAmountAnimation() alreadyRunning=$bool1" }
+        )
+    }
+
     fun logOnStateChanged(newState: Int, storedState: Int) {
         buffer.log(
             TAG,
@@ -114,6 +180,27 @@
             }
         )
     }
+
+    fun logSetWakingUp(wakingUp: Boolean, requestDelayedAnimation: Boolean) {
+        buffer.log(
+            TAG,
+            DEBUG,
+            {
+                bool1 = wakingUp
+                bool2 = requestDelayedAnimation
+            },
+            { "setWakingUp(wakingUp=$bool1, requestDelayedAnimation=$bool2)" }
+        )
+    }
+
+    fun logDelayingClockWakeUpAnimation(delayingAnimation: Boolean) {
+        buffer.log(
+            TAG,
+            DEBUG,
+            { bool1 = delayingAnimation },
+            { "logDelayingClockWakeUpAnimation($bool1)" }
+        )
+    }
 }
 
 private const val TAG = "NotificationWakeUpCoordinator"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java
index c9f31ba..8aeefee 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java
@@ -307,7 +307,7 @@
             }
 
             entriesToLocallyDismiss.add(entry);
-            if (!isCanceled(entry)) {
+            if (!entry.isCanceled()) {
                 // send message to system server if this notification hasn't already been cancelled
                 mBgExecutor.execute(() -> {
                     try {
@@ -387,7 +387,7 @@
             entry.setDismissState(DISMISSED);
             mLogger.logNotifDismissed(entry);
 
-            if (isCanceled(entry)) {
+            if (entry.isCanceled()) {
                 canceledEntries.add(entry);
             } else {
                 // Mark any children as dismissed as system server will auto-dismiss them as well
@@ -396,7 +396,7 @@
                         if (shouldAutoDismissChildren(otherEntry, entry.getSbn().getGroupKey())) {
                             otherEntry.setDismissState(PARENT_DISMISSED);
                             mLogger.logChildDismissed(otherEntry);
-                            if (isCanceled(otherEntry)) {
+                            if (otherEntry.isCanceled()) {
                                 canceledEntries.add(otherEntry);
                             }
                         }
@@ -523,7 +523,7 @@
                             + logKey(entry)));
         }
 
-        if (!isCanceled(entry)) {
+        if (!entry.isCanceled()) {
             throw mEulogizer.record(
                     new IllegalStateException("Cannot remove notification " + logKey(entry)
                             + ": has not been marked for removal"));
@@ -587,7 +587,7 @@
     private void applyRanking(@NonNull RankingMap rankingMap) {
         ArrayMap<String, NotificationEntry> currentEntriesWithoutRankings = null;
         for (NotificationEntry entry : mNotificationSet.values()) {
-            if (!isCanceled(entry)) {
+            if (!entry.isCanceled()) {
 
                 // TODO: (b/148791039) We should crash if we are ever handed a ranking with
                 //  incomplete entries. Right now, there's a race condition in NotificationListener
@@ -815,15 +815,6 @@
         return ranking;
     }
 
-    /**
-     * True if the notification has been canceled by system server. Usually, such notifications are
-     * immediately removed from the collection, but can sometimes stick around due to lifetime
-     * extenders.
-     */
-    private boolean isCanceled(NotificationEntry entry) {
-        return entry.mCancellationReason != REASON_NOT_CANCELED;
-    }
-
     private boolean cannotBeLifetimeExtended(NotificationEntry entry) {
         final boolean locallyDismissedByUser = entry.getDismissState() != NOT_DISMISSED;
         final boolean systemServerReportedUserCancel =
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 3399f9d..7898736 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
@@ -22,7 +22,6 @@
 import static android.app.Notification.CATEGORY_MESSAGE;
 import static android.app.Notification.CATEGORY_REMINDER;
 import static android.app.Notification.FLAG_BUBBLE;
-import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
 import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_AMBIENT;
 import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_BADGE;
 import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT;
@@ -321,6 +320,15 @@
         mDismissState = requireNonNull(dismissState);
     }
 
+    /**
+     * True if the notification has been canceled by system server. Usually, such notifications are
+     * immediately removed from the collection, but can sometimes stick around due to lifetime
+     * extenders.
+     */
+    public boolean isCanceled() {
+        return mCancellationReason != REASON_NOT_CANCELED;
+    }
+
     @Nullable public NotifFilter getExcludingFilter() {
         return getAttachState().getExcludingFilter();
     }
@@ -816,8 +824,7 @@
             return false;
         }
 
-        if ((mSbn.getNotification().flags
-                & FLAG_FOREGROUND_SERVICE) != 0) {
+        if (mSbn.getNotification().isFgsOrUij()) {
             return true;
         }
         if (mSbn.getNotification().isMediaNotification()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java
index 6c84fef..ea5cb30 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java
@@ -190,7 +190,9 @@
             "DndSuppressingVisualEffects") {
         @Override
         public boolean shouldFilterOut(NotificationEntry entry, long now) {
-            if (mStatusBarStateController.isDozing() && entry.shouldSuppressAmbient()) {
+            if ((mStatusBarStateController.isDozing()
+                    || mStatusBarStateController.getDozeAmount() == 1f)
+                    && entry.shouldSuppressAmbient()) {
                 return true;
             }
 
@@ -200,6 +202,20 @@
 
     private final StatusBarStateController.StateListener mStatusBarStateCallback =
             new StatusBarStateController.StateListener() {
+                private boolean mPrevDozeAmountIsOne = false;
+
+                @Override
+                public void onDozeAmountChanged(float linear, float eased) {
+                    StatusBarStateController.StateListener.super.onDozeAmountChanged(linear, eased);
+
+                    boolean dozeAmountIsOne = linear == 1f;
+                    if (mPrevDozeAmountIsOne != dozeAmountIsOne) {
+                        mDndVisualEffectsFilter.invalidateList("dozeAmount changed to "
+                                + (dozeAmountIsOne ? "one" : "not one"));
+                        mPrevDozeAmountIsOne = dozeAmountIsOne;
+                    }
+                }
+
                 @Override
                 public void onDozingChanged(boolean isDozing) {
                     mDndVisualEffectsFilter.invalidateList("onDozingChanged to " + isDozing);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt
index 0d9a654..0585456 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt
@@ -46,7 +46,7 @@
     private val userTracker: UserTracker
 ) {
     private val dirtyListeners = ListenerSet<Runnable>()
-    private var isSnoozeEnabled = false
+    private var isSnoozeSettingsEnabled = false
 
     /**
      *  Update the snooze enabled value on user switch
@@ -95,7 +95,7 @@
     }
 
     private fun updateSnoozeEnabled() {
-        isSnoozeEnabled =
+        isSnoozeSettingsEnabled =
             secureSettings.getIntForUser(SHOW_NOTIFICATION_SNOOZE, 0, UserHandle.USER_CURRENT) == 1
     }
 
@@ -118,7 +118,7 @@
         smartActions = entry.ranking.smartActions,
         smartReplies = entry.ranking.smartReplies,
         isConversation = entry.ranking.isConversation,
-        isSnoozeEnabled = isSnoozeEnabled,
+        isSnoozeEnabled = isSnoozeSettingsEnabled && !entry.isCanceled,
         isMinimized = isEntryMinimized(entry),
         needsRedaction = lockscreenUserManager.needsRedaction(entry),
     )
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
index ca762fc..a48870b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
@@ -630,6 +630,11 @@
             return false;
         }
 
+        if (notification.isUserInitiatedJob()) {
+            if (log) mLogger.logMaybeHeadsUpDespiteOldWhen(entry, when, age, "user initiated job");
+            return false;
+        }
+
         if (log) mLogger.logNoHeadsUpOldWhen(entry, when, age);
         final int uid = entry.getSbn().getUid();
         final String packageName = entry.getSbn().getPackageName();
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 46f1bb5..e6e6b99 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
@@ -65,6 +65,7 @@
 import com.android.systemui.statusbar.notification.collection.render.NotifGutsViewManager;
 import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
 import com.android.systemui.statusbar.phone.CentralSurfaces;
+import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.wmshell.BubblesManager;
 
@@ -119,6 +120,7 @@
     private final UiEventLogger mUiEventLogger;
     private final ShadeController mShadeController;
     private NotifGutsViewListener mGutsListener;
+    private final HeadsUpManagerPhone mHeadsUpManagerPhone;
 
     @Inject
     public NotificationGutsManager(Context context,
@@ -141,7 +143,8 @@
             NotificationLockscreenUserManager notificationLockscreenUserManager,
             StatusBarStateController statusBarStateController,
             DeviceProvisionedController deviceProvisionedController,
-            MetricsLogger metricsLogger) {
+            MetricsLogger metricsLogger,
+            HeadsUpManagerPhone headsUpManagerPhone) {
         mContext = context;
         mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
         mMainHandler = mainHandler;
@@ -163,6 +166,7 @@
         mStatusBarStateController = statusBarStateController;
         mDeviceProvisionedController = deviceProvisionedController;
         mMetricsLogger = metricsLogger;
+        mHeadsUpManagerPhone = headsUpManagerPhone;
     }
 
     public void setUpWithPresenter(NotificationPresenter presenter,
@@ -259,7 +263,7 @@
             if (mGutsListener != null) {
                 mGutsListener.onGutsClose(entry);
             }
-            String key = entry.getKey();
+            mHeadsUpManagerPhone.setGutsShown(row.getEntry(), false);
         });
 
         View gutsView = item.getGutsView();
@@ -420,7 +424,7 @@
     }
 
     /**
-     * Sets up the {@link ConversationInfo} inside the notification row's guts.
+     * Sets up the {@link NotificationConversationInfo} inside the notification row's guts.
      * @param row view to set up the guts for
      * @param notificationInfoView view to set up/bind within {@code row}
      */
@@ -641,6 +645,7 @@
                 row.closeRemoteInput();
                 mListContainer.onHeightChanged(row, true /* needsAnimation */);
                 mGutsMenuItem = menuItem;
+                mHeadsUpManagerPhone.setGutsShown(row.getEntry(), true);
             }
         };
         guts.post(mOpenRunnable);
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 a2de3c3..e47e414 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
@@ -5638,6 +5638,7 @@
     public void setDozeAmount(float dozeAmount) {
         mAmbientState.setDozeAmount(dozeAmount);
         updateContinuousBackgroundDrawing();
+        updateStackPosition();
         requestChildrenUpdate();
     }
 
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 1b49717..792746c 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
@@ -370,11 +370,6 @@
             if (translatingParentView != null && row == translatingParentView) {
                 mSwipeHelper.clearExposedMenuView();
                 mSwipeHelper.clearTranslatingParentView();
-                if (row instanceof ExpandableNotificationRow) {
-                    mHeadsUpManager.setMenuShown(
-                            ((ExpandableNotificationRow) row).getEntry(), false);
-
-                }
             }
         }
 
@@ -385,7 +380,6 @@
                 mMetricsLogger.write(notificationRow.getEntry().getSbn().getLogMaker()
                         .setCategory(MetricsEvent.ACTION_REVEAL_GEAR)
                         .setType(MetricsEvent.TYPE_ACTION));
-                mHeadsUpManager.setMenuShown(notificationRow.getEntry(), true);
                 mSwipeHelper.onMenuShown(row);
                 mNotificationGutsManager.closeAndSaveGuts(true /* removeLeavebehind */,
                         false /* force */, false /* removeControls */, -1 /* x */, -1 /* y */,
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 cf5ecdd..6742e4f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -163,7 +163,7 @@
     private PendingAuthenticated mPendingAuthenticated = null;
     private boolean mHasScreenTurnedOnSinceAuthenticating;
     private boolean mFadedAwayAfterWakeAndUnlock;
-    private Set<BiometricModeListener> mBiometricModeListeners = new HashSet<>();
+    private Set<BiometricUnlockEventsListener> mBiometricUnlockEventsListeners = new HashSet<>();
 
     private final MetricsLogger mMetricsLogger;
     private final AuthController mAuthController;
@@ -314,14 +314,14 @@
         mKeyguardViewController = keyguardViewController;
     }
 
-    /** Adds a {@link BiometricModeListener}. */
-    public void addBiometricModeListener(BiometricModeListener listener) {
-        mBiometricModeListeners.add(listener);
+    /** Adds a {@link BiometricUnlockEventsListener}. */
+    public void addListener(BiometricUnlockEventsListener listener) {
+        mBiometricUnlockEventsListeners.add(listener);
     }
 
-    /** Removes a {@link BiometricModeListener}. */
-    public void removeBiometricModeListener(BiometricModeListener listener) {
-        mBiometricModeListeners.remove(listener);
+    /** Removes a {@link BiometricUnlockEventsListener}. */
+    public void removeListener(BiometricUnlockEventsListener listener) {
+        mBiometricUnlockEventsListeners.remove(listener);
     }
 
     private final Runnable mReleaseBiometricWakeLockRunnable = new Runnable() {
@@ -387,7 +387,7 @@
     @Override
     public void onBiometricAuthenticated(int userId, BiometricSourceType biometricSourceType,
             boolean isStrongBiometric) {
-        Trace.beginSection("BiometricUnlockController#onBiometricAuthenticated");
+        Trace.beginSection("BiometricUnlockController#onBiometricUnlocked");
         if (mUpdateMonitor.isGoingToSleep()) {
             mLogger.deferringAuthenticationDueToSleep(userId,
                     biometricSourceType,
@@ -411,10 +411,15 @@
             mKeyguardViewMediator.userActivity();
             startWakeAndUnlock(biometricSourceType, isStrongBiometric);
         } else {
-            mLogger.d("onBiometricAuthenticated aborted by bypass controller");
+            mLogger.d("onBiometricUnlocked aborted by bypass controller");
         }
     }
 
+    /**
+     * Wake and unlock the device in response to successful authentication using biometrics.
+     * @param biometricSourceType Biometric source that was used to authenticate.
+     * @param isStrongBiometric
+     */
     public void startWakeAndUnlock(BiometricSourceType biometricSourceType,
                                    boolean isStrongBiometric) {
         int mode = calculateMode(biometricSourceType, isStrongBiometric);
@@ -422,6 +427,7 @@
                 || mode == MODE_WAKE_AND_UNLOCK_PULSING || mode == MODE_UNLOCK_COLLAPSING
                 || mode == MODE_WAKE_AND_UNLOCK_FROM_DREAM || mode == MODE_DISMISS_BOUNCER) {
             vibrateSuccess(biometricSourceType);
+            onBiometricUnlockedWithKeyguardDismissal(biometricSourceType);
         }
         startWakeAndUnlock(mode);
     }
@@ -502,11 +508,17 @@
     }
 
     private void onModeChanged(@WakeAndUnlockMode int mode) {
-        for (BiometricModeListener listener : mBiometricModeListeners) {
+        for (BiometricUnlockEventsListener listener : mBiometricUnlockEventsListeners) {
             listener.onModeChanged(mode);
         }
     }
 
+    private void onBiometricUnlockedWithKeyguardDismissal(BiometricSourceType biometricSourceType) {
+        for (BiometricUnlockEventsListener listener : mBiometricUnlockEventsListeners) {
+            listener.onBiometricUnlockedWithKeyguardDismissal(biometricSourceType);
+        }
+    }
+
     public boolean hasPendingAuthentication() {
         return mPendingAuthenticated != null
                 && mUpdateMonitor
@@ -777,7 +789,7 @@
         mMode = MODE_NONE;
         mBiometricType = null;
         mNotificationShadeWindowController.setForceDozeBrightness(false);
-        for (BiometricModeListener listener : mBiometricModeListeners) {
+        for (BiometricUnlockEventsListener listener : mBiometricUnlockEventsListeners) {
             listener.onResetMode();
         }
         mNumConsecutiveFpFailures = 0;
@@ -895,10 +907,17 @@
     }
 
     /** An interface to interact with the {@link BiometricUnlockController}. */
-    public interface BiometricModeListener {
+    public interface BiometricUnlockEventsListener {
         /** Called when {@code mMode} is reset to {@link #MODE_NONE}. */
         default void onResetMode() {}
         /** Called when {@code mMode} has changed in {@link #startWakeAndUnlock(int)}. */
         default void onModeChanged(@WakeAndUnlockMode int mode) {}
+
+        /**
+         * Called when the device is unlocked successfully using biometrics with the keyguard also
+         * being dismissed.
+         */
+        default void onBiometricUnlockedWithKeyguardDismissal(
+                BiometricSourceType biometricSourceType) { }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
index 7f8c135..0195d45 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
@@ -53,6 +53,7 @@
 import com.android.systemui.shade.NotificationShadeWindowViewController;
 import com.android.systemui.statusbar.LightRevealScrim;
 import com.android.systemui.statusbar.NotificationPresenter;
+import com.android.systemui.util.Compile;
 
 import java.io.PrintWriter;
 
@@ -71,6 +72,7 @@
     boolean DEBUG_MEDIA_FAKE_ARTWORK = false;
     boolean DEBUG_CAMERA_LIFT = false;
     boolean DEBUG_WINDOW_STATE = false;
+    boolean DEBUG_WAKEUP_DELAY = Compile.IS_DEBUG;
     // additional instrumentation for testing purposes; intended to be left on during development
     boolean CHATTY = DEBUG;
     boolean SHOW_LOCKSCREEN_MEDIA_ARTWORK = true;
@@ -155,7 +157,8 @@
         if (animationAdapter != null) {
             if (ENABLE_SHELL_TRANSITIONS) {
                 options = ActivityOptions.makeRemoteTransition(
-                        RemoteTransitionAdapter.adaptRemoteAnimation(animationAdapter));
+                        RemoteTransitionAdapter.adaptRemoteAnimation(animationAdapter,
+                                "SysUILaunch"));
             } else {
                 options = ActivityOptions.makeRemoteAnimation(animationAdapter);
             }
@@ -536,6 +539,8 @@
 
     void extendDozePulse();
 
+    boolean shouldDelayWakeUpAnimation();
+
     public static class KeyboardShortcutsMessage {
         final int mDeviceId;
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java
index b8c7a1d..8b6617b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java
@@ -67,12 +67,12 @@
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
 
+import dagger.Lazy;
+
 import java.util.Optional;
 
 import javax.inject.Inject;
 
-import dagger.Lazy;
-
 /** */
 @CentralSurfacesComponent.CentralSurfacesScope
 public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callbacks {
@@ -218,7 +218,7 @@
             return;
         }
 
-        mNotificationPanelViewController.expandShadeToNotifications();
+        mNotificationPanelViewController.expandToNotifications();
     }
 
     @Override
@@ -234,7 +234,7 @@
         // Settings are not available in setup
         if (!mDeviceProvisionedController.isCurrentUserSetup()) return;
 
-        mNotificationPanelViewController.expandWithQs();
+        mNotificationPanelViewController.expandToQs();
     }
 
     @Override
@@ -300,7 +300,7 @@
             }
         }
 
-        mNotificationPanelViewController.disable(state1, state2, animate);
+        mNotificationPanelViewController.disableHeader(state1, state2, animate);
     }
 
     /**
@@ -308,7 +308,7 @@
      * settings. Down action closes the entire panel.
      */
     @Override
-    public void handleSystemKey(int key) {
+    public void handleSystemKey(KeyEvent key) {
         if (CentralSurfaces.SPEW) {
             Log.d(CentralSurfaces.TAG, "handleNavigationKey: " + key);
         }
@@ -320,11 +320,11 @@
         // Panels are not available in setup
         if (!mDeviceProvisionedController.isCurrentUserSetup()) return;
 
-        if (KeyEvent.KEYCODE_SYSTEM_NAVIGATION_UP == key) {
+        if (KeyEvent.KEYCODE_SYSTEM_NAVIGATION_UP == key.getKeyCode()) {
             mMetricsLogger.action(MetricsEvent.ACTION_SYSTEM_NAVIGATION_KEY_UP);
             mNotificationPanelViewController.collapse(
                     false /* delayed */, 1.0f /* speedUpFactor */);
-        } else if (KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN == key) {
+        } else if (KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN == key.getKeyCode()) {
             mMetricsLogger.action(MetricsEvent.ACTION_SYSTEM_NAVIGATION_KEY_DOWN);
             if (mNotificationPanelViewController.isFullyCollapsed()) {
                 if (mVibrateOnOpening) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
index 2bc09a1..0c8e9e56 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -67,6 +67,7 @@
 import android.content.res.Configuration;
 import android.graphics.Point;
 import android.hardware.devicestate.DeviceStateManager;
+import android.hardware.fingerprint.FingerprintManager;
 import android.metrics.LogMaker;
 import android.net.Uri;
 import android.os.Binder;
@@ -262,6 +263,7 @@
 
 import javax.inject.Inject;
 import javax.inject.Named;
+import javax.inject.Provider;
 
 /**
  * A class handling initialization and coordination between some of the key central surfaces in
@@ -453,10 +455,20 @@
     private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     @VisibleForTesting
     DozeServiceHost mDozeServiceHost;
-    private boolean mWakeUpComingFromTouch;
     private LightRevealScrim mLightRevealScrim;
     private PowerButtonReveal mPowerButtonReveal;
 
+    private boolean mWakeUpComingFromTouch;
+
+    /**
+     * Whether we should delay the wakeup animation (which shows the notifications and moves the
+     * clock view). This is typically done when waking up from a 'press to unlock' gesture on a
+     * device with a side fingerprint sensor, so that if the fingerprint scan is successful, we
+     * can play the unlock animation directly rather than interrupting the wakeup animation part
+     * way through.
+     */
+    private boolean mShouldDelayWakeUpAnimation = false;
+
     private final Object mQueueLock = new Object();
 
     private final PulseExpansionHandler mPulseExpansionHandler;
@@ -518,6 +530,7 @@
     private final MessageRouter mMessageRouter;
     private final WallpaperManager mWallpaperManager;
     private final UserTracker mUserTracker;
+    private final Provider<FingerprintManager> mFingerprintManager;
 
     private CentralSurfacesComponent mCentralSurfacesComponent;
 
@@ -683,7 +696,7 @@
         @Override
         public void onBackProgressed(BackEvent event) {
             if (shouldBackBeHandled()) {
-                if (mNotificationPanelViewController.canPanelBeCollapsed()) {
+                if (mNotificationPanelViewController.canBeCollapsed()) {
                     float fraction = event.getProgress();
                     mNotificationPanelViewController.onBackProgressed(fraction);
                 }
@@ -790,7 +803,8 @@
             Lazy<CameraLauncher> cameraLauncherLazy,
             Lazy<LightRevealScrimViewModel> lightRevealScrimViewModelLazy,
             AlternateBouncerInteractor alternateBouncerInteractor,
-            UserTracker userTracker
+            UserTracker userTracker,
+            Provider<FingerprintManager> fingerprintManager
     ) {
         mContext = context;
         mNotificationsController = notificationsController;
@@ -873,6 +887,7 @@
         mCameraLauncherLazy = cameraLauncherLazy;
         mAlternateBouncerInteractor = alternateBouncerInteractor;
         mUserTracker = userTracker;
+        mFingerprintManager = fingerprintManager;
 
         mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
         mStartingSurfaceOptional = startingSurfaceOptional;
@@ -1255,14 +1270,13 @@
                     // re-display the notification panel if necessary (for example, if
                     // a heads-up notification was being displayed and should continue being
                     // displayed).
-                    mNotificationPanelViewController.updatePanelExpansionAndVisibility();
+                    mNotificationPanelViewController.updateExpansionAndVisibility();
                     setBouncerShowingForStatusBarComponents(mBouncerShowing);
                     checkBarModes();
                 });
         initializer.initializeStatusBar(mCentralSurfacesComponent);
 
         mStatusBarTouchableRegionManager.setup(this, mNotificationShadeWindowView);
-        mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager);
 
         createNavigationBar(result);
 
@@ -1335,7 +1349,8 @@
                 this,
                 mGestureRec,
                 mShadeController::makeExpandedInvisible,
-                mNotificationShelfController);
+                mNotificationShelfController,
+                mHeadsUpManager);
 
         BackDropView backdrop = mNotificationShadeWindowView.findViewById(R.id.backdrop);
         mMediaManager.setup(backdrop, backdrop.findViewById(R.id.backdrop_front),
@@ -1660,8 +1675,8 @@
         mStatusBarStateController.addCallback(mStateListener,
                 SysuiStatusBarStateController.RANK_STATUS_BAR);
         mBiometricUnlockController = mBiometricUnlockControllerLazy.get();
-        mBiometricUnlockController.addBiometricModeListener(
-                new BiometricUnlockController.BiometricModeListener() {
+        mBiometricUnlockController.addListener(
+                new BiometricUnlockController.BiometricUnlockEventsListener() {
                     @Override
                     public void onResetMode() {
                         setWakeAndUnlocking(false);
@@ -2073,16 +2088,16 @@
         }
 
         if (start) {
-            mNotificationPanelViewController.startWaitingForOpenPanelGesture();
+            mNotificationPanelViewController.startWaitingForExpandGesture();
         } else {
-            mNotificationPanelViewController.stopWaitingForOpenPanelGesture(cancel, velocity);
+            mNotificationPanelViewController.stopWaitingForExpandGesture(cancel, velocity);
         }
     }
 
     @Override
     public void animateCollapseQuickSettings() {
         if (mState == StatusBarState.SHADE) {
-            mNotificationPanelViewController.collapsePanel(
+            mNotificationPanelViewController.collapse(
                     true, false /* delayed */, 1.0f /* speedUpFactor */);
         }
     }
@@ -3181,6 +3196,10 @@
         }
     }
 
+    public boolean shouldDelayWakeUpAnimation() {
+        return mShouldDelayWakeUpAnimation;
+    }
+
     private void updateDozingState() {
         Trace.traceCounter(Trace.TRACE_TAG_APP, "dozing", mDozing ? 1 : 0);
         Trace.beginSection("CentralSurfaces#updateDozingState");
@@ -3191,11 +3210,8 @@
         boolean keyguardVisibleOrWillBe =
                 keyguardVisible || (mDozing && mDozeParameters.shouldDelayKeyguardShow());
 
-        boolean wakeAndUnlock = mBiometricUnlockController.getMode()
-                == BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
-        boolean animate = (!mDozing && mDozeServiceHost.shouldAnimateWakeup() && !wakeAndUnlock)
-                || (mDozing && mDozeParameters.shouldControlScreenOff()
-                && keyguardVisibleOrWillBe);
+        boolean animate = (!mDozing && shouldAnimateDozeWakeup())
+                || (mDozing && mDozeParameters.shouldControlScreenOff() && keyguardVisibleOrWillBe);
 
         mNotificationPanelViewController.setDozing(mDozing, animate);
         updateQsExpansionEnabled();
@@ -3277,14 +3293,14 @@
             return true;
         }
         if (mQsController.getExpanded()) {
-            mNotificationPanelViewController.animateCloseQs(false);
+            mNotificationPanelViewController.animateCollapseQs(false);
             return true;
         }
         if (mNotificationPanelViewController.closeUserSwitcherIfOpen()) {
             return true;
         }
         if (shouldBackBeHandled()) {
-            if (mNotificationPanelViewController.canPanelBeCollapsed()) {
+            if (mNotificationPanelViewController.canBeCollapsed()) {
                 // this is the Shade dismiss animation, so make sure QQS closes when it ends.
                 mNotificationPanelViewController.onBackPressed();
                 mShadeController.animateCollapseShade();
@@ -3550,7 +3566,44 @@
             DejankUtils.startDetectingBlockingIpcs(tag);
             mNotificationShadeWindowController.batchApplyWindowLayoutParams(()-> {
                 mDeviceInteractive = true;
-                mWakeUpCoordinator.setWakingUp(true);
+
+                if (shouldAnimateDozeWakeup()) {
+                    // If this is false, the power button must be physically pressed in order to
+                    // trigger fingerprint authentication.
+                    final boolean touchToUnlockAnytime = Settings.Secure.getIntForUser(
+                            mContext.getContentResolver(),
+                            Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
+                            -1,
+                            mUserTracker.getUserId()) > 0;
+
+                    // Delay if we're waking up, not mid-doze animation (which means we are
+                    // cancelling a sleep), from the power button, on a device with a power button
+                    // FPS, and 'press to unlock' is required.
+                    mShouldDelayWakeUpAnimation =
+                            !isPulsing()
+                                    && mStatusBarStateController.getDozeAmount() == 1f
+                                    && mWakefulnessLifecycle.getLastWakeReason()
+                                    == PowerManager.WAKE_REASON_POWER_BUTTON
+                                    && mFingerprintManager.get().isPowerbuttonFps()
+                                    && mFingerprintManager.get().hasEnrolledFingerprints()
+                                    && !touchToUnlockAnytime;
+                    if (DEBUG_WAKEUP_DELAY) {
+                        Log.d(TAG, "mShouldDelayWakeUpAnimation=" + mShouldDelayWakeUpAnimation);
+                    }
+                } else {
+                    // If we're not animating anyway, we do not need to delay it.
+                    mShouldDelayWakeUpAnimation = false;
+                    if (DEBUG_WAKEUP_DELAY) {
+                        Log.d(TAG, "mShouldDelayWakeUpAnimation CLEARED");
+                    }
+                }
+
+                mNotificationPanelViewController.setWillPlayDelayedDozeAmountAnimation(
+                        mShouldDelayWakeUpAnimation);
+                mWakeUpCoordinator.setWakingUp(
+                        /* wakingUp= */ true,
+                        mShouldDelayWakeUpAnimation);
+
                 if (!mKeyguardBypassController.getBypassEnabled()) {
                     mHeadsUpManager.releaseAllImmediately();
                 }
@@ -3577,7 +3630,7 @@
         @Override
         public void onFinishedWakingUp() {
             mWakeUpCoordinator.setFullyAwake(true);
-            mWakeUpCoordinator.setWakingUp(false);
+            mWakeUpCoordinator.setWakingUp(false, false);
             if (mKeyguardStateController.isOccluded()
                     && !mDozeParameters.canControlUnlockedScreenOff()) {
                 // When the keyguard is occluded we don't use the KEYGUARD state which would
@@ -4317,7 +4370,7 @@
                     mNavigationBarController.touchAutoDim(mDisplayId);
                     Trace.beginSection("CentralSurfaces#updateKeyguardState");
                     if (mState == StatusBarState.KEYGUARD) {
-                        mNotificationPanelViewController.cancelPendingPanelCollapse();
+                        mNotificationPanelViewController.cancelPendingCollapse();
                     }
                     updateDozingState();
                     checkBarModes();
@@ -4450,4 +4503,15 @@
         }
         return mUserTracker.getUserHandle();
     }
+
+    /**
+     * Whether we want to animate the wake animation AOD to lockscreen. This is done only if the
+     * doze service host says we can, and also we're not wake and unlocking (in which case the
+     * AOD instantly hides).
+     */
+    private boolean shouldAnimateDozeWakeup() {
+        return mDozeServiceHost.shouldAnimateWakeup()
+                && mBiometricUnlockController.getMode()
+                != BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
index 69f7c71..171e3d0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
@@ -32,6 +32,7 @@
 import com.android.systemui.plugins.DarkIconDispatcher;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.shade.NotificationPanelViewController;
+import com.android.systemui.shade.ShadeHeadsUpTracker;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.CrossFadeHelper;
 import com.android.systemui.statusbar.HeadsUpStatusBarView;
@@ -133,7 +134,8 @@
         // has started pulling down the notification shade from the HUN and then the font size
         // changes). We need to re-fetch these values since they're used to correctly display the
         // HUN during this shade expansion.
-        mTrackedChild = notificationPanelViewController.getTrackedHeadsUpNotification();
+        mTrackedChild = notificationPanelViewController.getShadeHeadsUpTracker()
+                .getTrackedHeadsUpNotification();
         mAppearFraction = stackScrollerController.getAppearFraction();
         mExpandedHeight = stackScrollerController.getExpandedHeight();
 
@@ -170,19 +172,23 @@
         mView.setOnDrawingRectChangedListener(
                 () -> updateIsolatedIconLocation(true /* requireUpdate */));
         mWakeUpCoordinator.addListener(this);
-        mNotificationPanelViewController.addTrackingHeadsUpListener(mSetTrackingHeadsUp);
-        mNotificationPanelViewController.setHeadsUpAppearanceController(this);
+        getShadeHeadsUpTracker().addTrackingHeadsUpListener(mSetTrackingHeadsUp);
+        getShadeHeadsUpTracker().setHeadsUpAppearanceController(this);
         mStackScrollerController.addOnExpandedHeightChangedListener(mSetExpandedHeight);
         mDarkIconDispatcher.addDarkReceiver(this);
     }
 
+    private ShadeHeadsUpTracker getShadeHeadsUpTracker() {
+        return mNotificationPanelViewController.getShadeHeadsUpTracker();
+    }
+
     @Override
     protected void onViewDetached() {
         mHeadsUpManager.removeListener(this);
         mView.setOnDrawingRectChangedListener(null);
         mWakeUpCoordinator.removeListener(this);
-        mNotificationPanelViewController.removeTrackingHeadsUpListener(mSetTrackingHeadsUp);
-        mNotificationPanelViewController.setHeadsUpAppearanceController(null);
+        getShadeHeadsUpTracker().removeTrackingHeadsUpListener(mSetTrackingHeadsUp);
+        getShadeHeadsUpTracker().setHeadsUpAppearanceController(null);
         mStackScrollerController.removeOnExpandedHeightChangedListener(mSetExpandedHeight);
         mDarkIconDispatcher.removeDarkReceiver(this);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
index 3743fff..1a84dde 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
@@ -271,13 +271,15 @@
     }
 
     /**
-     * Sets whether an entry's menu row is exposed and therefore it should stick in the heads up
+     * Sets whether an entry's guts are exposed and therefore it should stick in the heads up
      * area if it's pinned until it's hidden again.
      */
-    public void setMenuShown(@NonNull NotificationEntry entry, boolean menuShown) {
+    public void setGutsShown(@NonNull NotificationEntry entry, boolean gutsShown) {
         HeadsUpEntry headsUpEntry = getHeadsUpEntry(entry.getKey());
-        if (headsUpEntry instanceof HeadsUpEntryPhone && entry.isRowPinned()) {
-            ((HeadsUpEntryPhone) headsUpEntry).setMenuShownPinned(menuShown);
+        if (!(headsUpEntry instanceof HeadsUpEntryPhone)) return;
+        HeadsUpEntryPhone headsUpEntryPhone = (HeadsUpEntryPhone)headsUpEntry;
+        if (entry.isRowPinned() || !gutsShown) {
+            headsUpEntryPhone.setGutsShownPinned(gutsShown);
         }
     }
 
@@ -411,7 +413,7 @@
 
     protected class HeadsUpEntryPhone extends HeadsUpManager.HeadsUpEntry {
 
-        private boolean mMenuShownPinned;
+        private boolean mGutsShownPinned;
 
         /**
          * If the time this entry has been on was extended
@@ -421,7 +423,7 @@
 
         @Override
         public boolean isSticky() {
-            return super.isSticky() || mMenuShownPinned;
+            return super.isSticky() || mGutsShownPinned;
         }
 
         public void setEntry(@NonNull final NotificationEntry entry) {
@@ -469,13 +471,13 @@
             }
         }
 
-        public void setMenuShownPinned(boolean menuShownPinned) {
-            if (mMenuShownPinned == menuShownPinned) {
+        public void setGutsShownPinned(boolean gutsShownPinned) {
+            if (mGutsShownPinned == gutsShownPinned) {
                 return;
             }
 
-            mMenuShownPinned = menuShownPinned;
-            if (menuShownPinned) {
+            mGutsShownPinned = gutsShownPinned;
+            if (gutsShownPinned) {
                 removeAutoRemovalCallbacks();
             } else {
                 updateEntry(false /* updatePostTime */);
@@ -485,7 +487,7 @@
         @Override
         public void reset() {
             super.reset();
-            mMenuShownPinned = false;
+            mGutsShownPinned = false;
             extended = false;
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
index fe2a913..534edb9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
@@ -88,6 +88,8 @@
     private boolean mDirectReplying;
     private boolean mNavbarColorManagedByIme;
 
+    private boolean mIsCustomizingForBackNav;
+
     @Inject
     public LightBarController(
             Context ctx,
@@ -137,16 +139,17 @@
         for (int i = 0; i < numStacks && !stackAppearancesChanged; i++) {
             stackAppearancesChanged |= !appearanceRegions[i].equals(mAppearanceRegions[i]);
         }
-        if (stackAppearancesChanged || sbModeChanged) {
+        if (stackAppearancesChanged || sbModeChanged || mIsCustomizingForBackNav) {
             mAppearanceRegions = appearanceRegions;
             onStatusBarModeChanged(statusBarMode);
+            mIsCustomizingForBackNav = false;
         }
         mNavbarColorManagedByIme = navbarColorManagedByIme;
     }
 
     void onStatusBarModeChanged(int newBarMode) {
         mStatusBarMode = newBarMode;
-        updateStatus();
+        updateStatus(mAppearanceRegions);
     }
 
     public void onNavigationBarAppearanceChanged(@Appearance int appearance, boolean nbModeChanged,
@@ -186,6 +189,31 @@
     }
 
     /**
+     * Controls the light status bar temporarily for back navigation.
+     * @param appearance the custmoized appearance.
+     */
+    public void customizeStatusBarAppearance(AppearanceRegion appearance) {
+        if (appearance != null) {
+            final ArrayList<AppearanceRegion> appearancesList = new ArrayList<>();
+            appearancesList.add(appearance);
+            for (int i = 0; i < mAppearanceRegions.length; i++) {
+                final AppearanceRegion ar = mAppearanceRegions[i];
+                if (appearance.getBounds().contains(ar.getBounds())) {
+                    continue;
+                }
+                appearancesList.add(ar);
+            }
+
+            final AppearanceRegion[] newAppearances = new AppearanceRegion[appearancesList.size()];
+            updateStatus(appearancesList.toArray(newAppearances));
+            mIsCustomizingForBackNav = true;
+        } else {
+            mIsCustomizingForBackNav = false;
+            updateStatus(mAppearanceRegions);
+        }
+    }
+
+    /**
      * Sets whether the direct-reply is in use or not.
      * @param directReplying {@code true} when the direct-reply is in-use.
      */
@@ -226,12 +254,12 @@
                 && unlockMode != BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
     }
 
-    private void updateStatus() {
-        final int numStacks = mAppearanceRegions.length;
+    private void updateStatus(AppearanceRegion[] appearanceRegions) {
+        final int numStacks = appearanceRegions.length;
         final ArrayList<Rect> lightBarBounds = new ArrayList<>();
 
         for (int i = 0; i < numStacks; i++) {
-            final AppearanceRegion ar = mAppearanceRegions[i];
+            final AppearanceRegion ar = appearanceRegions[i];
             if (isLight(ar.getAppearance(), mStatusBarMode, APPEARANCE_LIGHT_STATUS_BARS)) {
                 lightBarBounds.add(ar.getBounds());
             }
@@ -247,7 +275,6 @@
         else if (lightBarBounds.size() == numStacks) {
             mStatusBarIconController.setIconsDarkArea(null);
             mStatusBarIconController.getTransitionsController().setIconsDark(true, animateChange());
-
         }
 
         // Not the same for every stack, magic!
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScreenOffAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScreenOffAnimationController.kt
index c817466..b303151 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScreenOffAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScreenOffAnimationController.kt
@@ -85,16 +85,17 @@
 
     /**
      * Called when keyguard is about to be displayed and allows to perform custom animation
+     *
+     * @return A handle that can be used for cancelling the animation, if necessary
      */
-    fun animateInKeyguard(keyguardView: View, after: Runnable) =
-        animations.firstOrNull {
+    fun animateInKeyguard(keyguardView: View, after: Runnable): AnimatorHandle? {
+        animations.forEach {
             if (it.shouldAnimateInKeyguard()) {
-                it.animateInKeyguard(keyguardView, after)
-                true
-            } else {
-                false
+                return@animateInKeyguard it.animateInKeyguard(keyguardView, after)
             }
         }
+        return null
+    }
 
     /**
      * If returns true it will disable propagating touches to apps and keyguard
@@ -211,7 +212,10 @@
     fun onAlwaysOnChanged(alwaysOn: Boolean) {}
 
     fun shouldAnimateInKeyguard(): Boolean = false
-    fun animateInKeyguard(keyguardView: View, after: Runnable) = after.run()
+    fun animateInKeyguard(keyguardView: View, after: Runnable): AnimatorHandle? {
+        after.run()
+        return null
+    }
 
     fun shouldDelayKeyguardShow(): Boolean = false
     fun isKeyguardShowDelayed(): Boolean = false
@@ -224,3 +228,7 @@
     fun shouldAnimateDozingChange(): Boolean = true
     fun shouldAnimateClockChange(): Boolean = true
 }
+
+interface AnimatorHandle {
+    fun cancel()
+}
\ No newline at end of file
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 46603df..d3aa4bf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -405,6 +405,7 @@
                         if (mKeyguardStateController.isKeyguardFadingAway()) {
                             mStatusBarKeyguardViewManager.onKeyguardFadedAway();
                         }
+                        dispatchScrimsVisible();
                     }
                 };
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeadsUpChangeListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeadsUpChangeListener.java
index 3d6bebb..a7413d5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeadsUpChangeListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeadsUpChangeListener.java
@@ -65,18 +65,7 @@
             mNotificationShadeWindowController.setHeadsUpShowing(true);
             mStatusBarWindowController.setForceStatusBarVisible(true);
             if (mNotificationPanelViewController.isFullyCollapsed()) {
-                // We need to ensure that the touchable region is updated before the
-                //window will be
-                // resized, in order to not catch any touches. A layout will ensure that
-                // onComputeInternalInsets will be called and after that we can
-                //resize the layout. Let's
-                // make sure that the window stays small for one frame until the
-                //touchableRegion is set.
-                mNotificationPanelViewController.requestLayoutOnView();
-                mNotificationShadeWindowController.setForceWindowCollapsed(true);
-                mNotificationPanelViewController.postToView(() -> {
-                    mNotificationShadeWindowController.setForceWindowCollapsed(false);
-                });
+                mNotificationPanelViewController.updateTouchableRegion();
             }
         } else {
             boolean bypassKeyguard = mKeyguardBypassController.getBypassEnabled()
@@ -96,7 +85,8 @@
                 //animation
                 // is finished.
                 mHeadsUpManager.setHeadsUpGoingAway(true);
-                mNotificationPanelViewController.runAfterAnimationFinished(() -> {
+                mNotificationPanelViewController.getNotificationStackScrollLayoutController()
+                        .runAfterAnimationFinished(() -> {
                     if (!mHeadsUpManager.hasPinnedHeadsUp()) {
                         mNotificationShadeWindowController.setHeadsUpShowing(false);
                         mHeadsUpManager.setHeadsUpGoingAway(false);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
index 30d2295..a8a834f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
@@ -558,8 +558,10 @@
             mGroup.addView(view, index, onCreateLayoutParams());
 
             if (mIsInDemoMode) {
+                Context mobileContext = mMobileContextProvider
+                        .getMobileContextForSub(subId, mContext);
                 mDemoStatusIcons.addModernMobileView(
-                        mContext,
+                        mobileContext,
                         mMobileIconsViewModel.getLogger(),
                         subId);
             }
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 f9493f4..49b58df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -973,7 +973,7 @@
     public void onKeyguardFadedAway() {
         mNotificationContainer.postDelayed(() -> mNotificationShadeWindowController
                         .setKeyguardFadingAway(false), 100);
-        mNotificationPanelViewController.resetViewAlphas();
+        mNotificationPanelViewController.resetViewGroupFade();
         mCentralSurfaces.finishKeyguardFadingAway();
         mBiometricUnlockController.finishKeyguardFadingAway();
         WindowManagerGlobal.getInstance().trimMemory(
@@ -1048,7 +1048,7 @@
             if (hideImmediately) {
                 mStatusBarStateController.setLeaveOpenOnKeyguardHide(false);
             } else {
-                mNotificationPanelViewController.expandShadeToNotifications();
+                mNotificationPanelViewController.expandToNotifications();
             }
         }
         return;
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 edfc95f..c623201 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
@@ -618,9 +618,6 @@
         if ((flags & Notification.FLAG_AUTO_CANCEL) != Notification.FLAG_AUTO_CANCEL) {
             return false;
         }
-        if ((flags & Notification.FLAG_FOREGROUND_SERVICE) != 0) {
-            return false;
-        }
         return true;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
index 4eed487..39362cf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
@@ -16,7 +16,6 @@
 
 import static com.android.systemui.statusbar.phone.CentralSurfaces.CLOSE_PANEL_WHEN_EMPTIED;
 import static com.android.systemui.statusbar.phone.CentralSurfaces.DEBUG;
-import static com.android.systemui.statusbar.phone.CentralSurfaces.MULTIUSER_DEBUG;
 
 import android.app.KeyguardManager;
 import android.content.Context;
@@ -176,7 +175,7 @@
         }
         remoteInputManager.setUpWithCallback(
                 remoteInputManagerCallback,
-                mNotificationPanel.createRemoteInputDelegate());
+                mNotificationPanel.getShadeNotificationPresenter().createRemoteInputDelegate());
 
         initController.addPostInitTask(() -> {
             mKeyguardIndicationController.init();
@@ -209,8 +208,8 @@
     }
 
     private void maybeEndAmbientPulse() {
-        if (mNotificationPanel.hasPulsingNotifications() &&
-                !mHeadsUpManager.hasNotifications()) {
+        if (mNotificationPanel.getShadeNotificationPresenter().hasPulsingNotifications()
+                && !mHeadsUpManager.hasNotifications()) {
             // We were showing a pulse for a notification, but no notifications are pulsing anymore.
             // Finish the pulse.
             mDozeScrimController.pulseOutNow();
@@ -222,7 +221,6 @@
         // Begin old BaseStatusBar.userSwitched
         mHeadsUpManager.setUser(newUserId);
         // End old BaseStatusBar.userSwitched
-        if (MULTIUSER_DEBUG) mNotificationPanel.setHeaderDebugInfo("USER " + newUserId);
         mCommandQueue.animateCollapsePanels();
         mMediaManager.clearCurrentMediaNotification();
         mCentralSurfaces.setLockscreenUser(newUserId);
@@ -243,7 +241,9 @@
     @Override
     public void onActivated(ActivatableNotificationView view) {
         onActivated();
-        if (view != null) mNotificationPanel.setActivatedChild(view);
+        if (view != null) {
+            mNotificationPanel.getShadeNotificationPresenter().setActivatedChild(view);
+        }
     }
 
     public void onActivated() {
@@ -251,7 +251,8 @@
                 MetricsEvent.ACTION_LS_NOTE,
                 0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */);
         mLockscreenGestureLogger.log(LockscreenUiEvent.LOCKSCREEN_NOTIFICATION_FALSE_TOUCH);
-        ActivatableNotificationView previousView = mNotificationPanel.getActivatedChild();
+        ActivatableNotificationView previousView =
+                mNotificationPanel.getShadeNotificationPresenter().getActivatedChild();
         if (previousView != null) {
             previousView.makeInactive(true /* animate */);
         }
@@ -259,8 +260,8 @@
 
     @Override
     public void onActivationReset(ActivatableNotificationView view) {
-        if (view == mNotificationPanel.getActivatedChild()) {
-            mNotificationPanel.setActivatedChild(null);
+        if (view == mNotificationPanel.getShadeNotificationPresenter().getActivatedChild()) {
+            mNotificationPanel.getShadeNotificationPresenter().setActivatedChild(null);
             mKeyguardIndicationController.hideTransientIndication();
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowCallback.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowCallback.java
index 50cce45..6dc8065 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowCallback.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowCallback.java
@@ -16,6 +16,12 @@
 package com.android.systemui.statusbar.phone;
 
 public interface StatusBarWindowCallback {
-    void onStateChanged(boolean keyguardShowing, boolean keyguardOccluded, boolean bouncerShowing,
-            boolean isDozing, boolean panelExpanded, boolean isDreaming);
+    /**
+     * Invoked when the internal state of NotificationShadeWindowControllerImpl changes.
+     * Some of the flags passed as argument to the callback might have changed, but this is not
+     * guaranteed.
+     */
+    void onStateChanged(boolean keyguardShowing, boolean keyguardOccluded,
+            boolean keyguardGoingAway, boolean bouncerShowing, boolean isDozing,
+            boolean panelExpanded, boolean isDreaming);
 }
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 118bfc5..deb0414 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
@@ -160,7 +160,7 @@
      * Animates in the provided keyguard view, ending in the same position that it will be in on
      * AOD.
      */
-    override fun animateInKeyguard(keyguardView: View, after: Runnable) {
+    override fun animateInKeyguard(keyguardView: View, after: Runnable): AnimatorHandle {
         shouldAnimateInKeyguard = false
         keyguardView.alpha = 0f
         keyguardView.visibility = View.VISIBLE
@@ -175,11 +175,36 @@
         // We animate the Y properly separately using the PropertyAnimator, as the panel
         // view also needs to update the end position.
         PropertyAnimator.cancelAnimation(keyguardView, AnimatableProperty.Y)
-        PropertyAnimator.setProperty<View>(keyguardView, AnimatableProperty.Y, currentY,
-                AnimationProperties().setDuration(duration.toLong()),
-                true /* animate */)
 
-        keyguardView.animate()
+        // Start the animation on the next frame using Choreographer APIs. animateInKeyguard() is
+        // called while the system is busy processing lots of requests, so delaying the animation a
+        // frame will mitigate jank. In the event the animation is cancelled before the next frame
+        // is called, this callback will be removed
+        val keyguardAnimator = keyguardView.animate()
+        val nextFrameCallback = TraceUtils.namedRunnable("startAnimateInKeyguard") {
+            PropertyAnimator.setProperty(keyguardView, AnimatableProperty.Y, currentY,
+                    AnimationProperties().setDuration(duration.toLong()),
+                    true /* animate */)
+            keyguardAnimator.start()
+        }
+        DejankUtils.postAfterTraversal(nextFrameCallback)
+        val animatorHandle = object : AnimatorHandle {
+            private var hasCancelled = false
+            override fun cancel() {
+                if (!hasCancelled) {
+                    DejankUtils.removeCallbacks(nextFrameCallback)
+                    // If we're cancelled, reset state flags/listeners. The end action above
+                    // will not be called, which is what we want since that will finish the
+                    // screen off animation and show the lockscreen, which we don't want if we
+                    // were cancelled.
+                    aodUiAnimationPlaying = false
+                    decidedToAnimateGoingToSleep = null
+                    keyguardView.animate().setListener(null)
+                    hasCancelled = true
+                }
+            }
+        }
+        keyguardAnimator
                 .setDuration(duration.toLong())
                 .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
                 .alpha(1f)
@@ -205,14 +230,7 @@
                 }
                 .setListener(object : AnimatorListenerAdapter() {
                     override fun onAnimationCancel(animation: Animator?) {
-                        // If we're cancelled, reset state flags/listeners. The end action above
-                        // will not be called, which is what we want since that will finish the
-                        // screen off animation and show the lockscreen, which we don't want if we
-                        // were cancelled.
-                        aodUiAnimationPlaying = false
-                        decidedToAnimateGoingToSleep = null
-                        keyguardView.animate().setListener(null)
-
+                        animatorHandle.cancel()
                         interactionJankMonitor.cancel(CUJ_SCREEN_OFF_SHOW_AOD)
                     }
 
@@ -222,7 +240,7 @@
                                 CUJ_SCREEN_OFF_SHOW_AOD)
                     }
                 })
-                .start()
+        return animatorHandle
     }
 
     override fun onStartedWakingUp() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
index 24ddded..fe63994 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
@@ -509,7 +509,7 @@
 
     private boolean shouldHideNotificationIcons() {
         if (!mShadeExpansionStateManager.isClosed()
-                && mNotificationPanelViewController.hideStatusBarIconsWhenExpanded()) {
+                && mNotificationPanelViewController.shouldHideStatusBarIconsWhenExpanded()) {
             return true;
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
index dfa6838..c73cc9e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
@@ -18,10 +18,10 @@
 
 import android.app.ActivityManager
 import android.app.IActivityManager
-import android.app.IUidObserver
 import android.app.Notification
 import android.app.Notification.CallStyle.CALL_TYPE_ONGOING
 import android.app.PendingIntent
+import android.app.UidObserver
 import android.content.Context
 import android.util.Log
 import android.view.View
@@ -319,7 +319,7 @@
     }
 
     /** Our implementation of a [IUidObserver]. */
-    inner class CallAppUidObserver : IUidObserver.Stub() {
+    inner class CallAppUidObserver : UidObserver() {
         /** True if the application managing the call is visible to the user. */
         var isCallAppVisible: Boolean = false
             private set
@@ -387,12 +387,6 @@
                 }
             }
         }
-
-        override fun onUidGone(uid: Int, disabled: Boolean) {}
-        override fun onUidActive(uid: Int) {}
-        override fun onUidIdle(uid: Int, disabled: Boolean) {}
-        override fun onUidCachedChanged(uid: Int, cached: Boolean) {}
-        override fun onUidProcAdjChanged(uid: Int) {}
     }
 }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
index adfea80..eaa1455 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
@@ -37,6 +37,8 @@
 import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter
 import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxy
 import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxyImpl
+import com.android.systemui.statusbar.pipeline.mobile.util.SubscriptionManagerProxy
+import com.android.systemui.statusbar.pipeline.mobile.util.SubscriptionManagerProxyImpl
 import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
 import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepositoryImpl
 import com.android.systemui.statusbar.pipeline.wifi.data.repository.RealWifiRepository
@@ -65,8 +67,7 @@
 
     @Binds abstract fun wifiRepository(impl: WifiRepositorySwitcher): WifiRepository
 
-    @Binds
-    abstract fun wifiInteractor(impl: WifiInteractorImpl): WifiInteractor
+    @Binds abstract fun wifiInteractor(impl: WifiInteractorImpl): WifiInteractor
 
     @Binds
     abstract fun mobileConnectionsRepository(
@@ -78,6 +79,11 @@
     @Binds abstract fun mobileMappingsProxy(impl: MobileMappingsProxyImpl): MobileMappingsProxy
 
     @Binds
+    abstract fun subscriptionManagerProxy(
+        impl: SubscriptionManagerProxyImpl
+    ): SubscriptionManagerProxy
+
+    @Binds
     abstract fun mobileIconsInteractor(impl: MobileIconsInteractorImpl): MobileIconsInteractor
 
     @Binds
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt
index 90c32dc..3a11635 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt
@@ -40,6 +40,9 @@
     /** The subscriptionId that this connection represents */
     val subId: Int
 
+    /** The carrierId for this connection. See [TelephonyManager.getSimCarrierId] */
+    val carrierId: StateFlow<Int>
+
     /**
      * The table log buffer created for this connection. Will have the name "MobileConnectionLog
      * [subId]"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt
index 809772e..6b86432 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.statusbar.pipeline.mobile.data.repository.demo
 
 import android.telephony.CellSignalStrength
+import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
 import android.telephony.TelephonyManager
 import com.android.systemui.log.table.TableLogBuffer
 import com.android.systemui.log.table.logDiffsForTable
@@ -25,6 +26,7 @@
 import com.android.systemui.statusbar.pipeline.mobile.data.model.ResolvedNetworkType
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.demo.model.FakeNetworkEventModel
+import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.FullMobileConnectionRepository.Companion.COL_CARRIER_ID
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.FullMobileConnectionRepository.Companion.COL_CARRIER_NETWORK_CHANGE
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.FullMobileConnectionRepository.Companion.COL_CDMA_LEVEL
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.FullMobileConnectionRepository.Companion.COL_EMERGENCY
@@ -52,6 +54,17 @@
     override val tableLogBuffer: TableLogBuffer,
     val scope: CoroutineScope,
 ) : MobileConnectionRepository {
+    private val _carrierId = MutableStateFlow(INVALID_SUBSCRIPTION_ID)
+    override val carrierId =
+        _carrierId
+            .logDiffsForTable(
+                tableLogBuffer,
+                columnPrefix = "",
+                columnName = COL_CARRIER_ID,
+                _carrierId.value,
+            )
+            .stateIn(scope, SharingStarted.WhileSubscribed(), _carrierId.value)
+
     private val _isEmergencyOnly = MutableStateFlow(false)
     override val isEmergencyOnly =
         _isEmergencyOnly
@@ -186,6 +199,8 @@
         dataEnabled.value = true
         networkName.value = NetworkNameModel.IntentDerived(event.name)
 
+        _carrierId.value = event.carrierId ?: INVALID_SUBSCRIPTION_ID
+
         cdmaRoaming.value = event.roaming
         _isRoaming.value = event.roaming
         // TODO(b/261029387): not yet supported
@@ -208,6 +223,8 @@
         // This is always true here, because we split out disabled states at the data-source level
         dataEnabled.value = true
         networkName.value = NetworkNameModel.IntentDerived(CARRIER_MERGED_NAME)
+        // TODO(b/276943904): is carrierId a thing with carrier merged networks?
+        _carrierId.value = INVALID_SUBSCRIPTION_ID
         numberOfLevels.value = event.numberOfLevels
         cdmaRoaming.value = false
         _primaryLevel.value = event.level
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt
index 94d6d0b..a609917 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.statusbar.pipeline.mobile.data.repository.prod
 
 import android.telephony.CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN
+import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
 import android.telephony.TelephonyManager
 import android.util.Log
 import com.android.systemui.dagger.SysUISingleton
@@ -157,6 +158,7 @@
             .stateIn(scope, SharingStarted.WhileSubscribed(), DataConnectionState.Disconnected)
 
     override val isRoaming = MutableStateFlow(false).asStateFlow()
+    override val carrierId = MutableStateFlow(INVALID_SUBSCRIPTION_ID).asStateFlow()
     override val isEmergencyOnly = MutableStateFlow(false).asStateFlow()
     override val operatorAlphaShort = MutableStateFlow(null).asStateFlow()
     override val isInService = MutableStateFlow(true).asStateFlow()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt
index b3737ec..8869dfe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt
@@ -109,6 +109,11 @@
             .stateIn(scope, SharingStarted.WhileSubscribed(), initial)
     }
 
+    override val carrierId =
+        activeRepo
+            .flatMapLatest { it.carrierId }
+            .stateIn(scope, SharingStarted.WhileSubscribed(), activeRepo.value.carrierId.value)
+
     override val cdmaRoaming =
         activeRepo
             .flatMapLatest { it.cdmaRoaming }
@@ -321,13 +326,14 @@
     }
 
     companion object {
-        const val COL_EMERGENCY = "emergencyOnly"
-        const val COL_ROAMING = "roaming"
-        const val COL_OPERATOR = "operatorName"
-        const val COL_IS_IN_SERVICE = "isInService"
-        const val COL_IS_GSM = "isGsm"
-        const val COL_CDMA_LEVEL = "cdmaLevel"
-        const val COL_PRIMARY_LEVEL = "primaryLevel"
+        const val COL_CARRIER_ID = "carrierId"
         const val COL_CARRIER_NETWORK_CHANGE = "carrierNetworkChangeActive"
+        const val COL_CDMA_LEVEL = "cdmaLevel"
+        const val COL_EMERGENCY = "emergencyOnly"
+        const val COL_IS_GSM = "isGsm"
+        const val COL_IS_IN_SERVICE = "isInService"
+        const val COL_OPERATOR = "operatorName"
+        const val COL_PRIMARY_LEVEL = "primaryLevel"
+        const val COL_ROAMING = "roaming"
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt
index d0c6215..b475183 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt
@@ -16,7 +16,7 @@
 
 package com.android.systemui.statusbar.pipeline.mobile.data.repository.prod
 
-import android.content.Context
+import android.content.Intent
 import android.content.IntentFilter
 import android.telephony.CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN
 import android.telephony.CellSignalStrengthCdma
@@ -31,6 +31,7 @@
 import android.telephony.TelephonyManager.ERI_ON
 import android.telephony.TelephonyManager.EXTRA_SUBSCRIPTION_ID
 import android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN
+import android.telephony.TelephonyManager.UNKNOWN_CARRIER_ID
 import com.android.settingslib.Utils
 import com.android.systemui.broadcast.BroadcastDispatcher
 import com.android.systemui.dagger.qualifiers.Application
@@ -65,6 +66,7 @@
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.mapLatest
 import kotlinx.coroutines.flow.mapNotNull
+import kotlinx.coroutines.flow.onStart
 import kotlinx.coroutines.flow.scan
 import kotlinx.coroutines.flow.stateIn
 
@@ -75,7 +77,6 @@
 @Suppress("EXPERIMENTAL_IS_NOT_ENABLED")
 @OptIn(ExperimentalCoroutinesApi::class)
 class MobileConnectionRepositoryImpl(
-    private val context: Context,
     override val subId: Int,
     defaultNetworkName: NetworkNameModel,
     networkNameSeparator: String,
@@ -293,6 +294,23 @@
             }
             .stateIn(scope, SharingStarted.WhileSubscribed(), false)
 
+    override val carrierId =
+        broadcastDispatcher
+            .broadcastFlow(
+                filter =
+                    IntentFilter(TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED),
+                map = { intent, _ -> intent },
+            )
+            .filter { intent ->
+                intent.getIntExtra(EXTRA_SUBSCRIPTION_ID, INVALID_SUBSCRIPTION_ID) == subId
+            }
+            .map { it.carrierId() }
+            .onStart {
+                // Make sure we get the initial carrierId
+                emit(telephonyManager.simCarrierId)
+            }
+            .stateIn(scope, SharingStarted.WhileSubscribed(), telephonyManager.simCarrierId)
+
     override val networkName: StateFlow<NetworkNameModel> =
         broadcastDispatcher
             .broadcastFlow(
@@ -317,7 +335,6 @@
     @Inject
     constructor(
         private val broadcastDispatcher: BroadcastDispatcher,
-        private val context: Context,
         private val telephonyManager: TelephonyManager,
         private val logger: MobileInputLogger,
         private val carrierConfigRepository: CarrierConfigRepository,
@@ -332,7 +349,6 @@
             networkNameSeparator: String,
         ): MobileConnectionRepository {
             return MobileConnectionRepositoryImpl(
-                context,
                 subId,
                 defaultNetworkName,
                 networkNameSeparator,
@@ -349,6 +365,9 @@
     }
 }
 
+private fun Intent.carrierId(): Int =
+    getIntExtra(TelephonyManager.EXTRA_CARRIER_ID, UNKNOWN_CARRIER_ID)
+
 /**
  * Wrap every [TelephonyCallback] we care about in a data class so we can accept them in a single
  * shared flow and then split them back out into other flows.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt
index 8c93bf7..45d50c1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt
@@ -44,6 +44,7 @@
 import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionsRepository
 import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxy
+import com.android.systemui.statusbar.pipeline.mobile.util.SubscriptionManagerProxy
 import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
 import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository
 import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
@@ -65,6 +66,7 @@
 import kotlinx.coroutines.flow.mapNotNull
 import kotlinx.coroutines.flow.merge
 import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.flow.onStart
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.withContext
 
@@ -76,6 +78,7 @@
 constructor(
     connectivityRepository: ConnectivityRepository,
     private val subscriptionManager: SubscriptionManager,
+    private val subscriptionManagerProxy: SubscriptionManagerProxy,
     private val telephonyManager: TelephonyManager,
     private val logger: MobileInputLogger,
     @MobileSummaryLog private val tableLogger: TableLogBuffer,
@@ -195,7 +198,7 @@
     override val defaultDataSubId: StateFlow<Int> =
         broadcastDispatcher
             .broadcastFlow(
-                IntentFilter(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED)
+                IntentFilter(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED),
             ) { intent, _ ->
                 intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, INVALID_SUBSCRIPTION_ID)
             }
@@ -204,14 +207,11 @@
                 tableLogger,
                 LOGGING_PREFIX,
                 columnName = "defaultSubId",
-                initialValue = SubscriptionManager.getDefaultDataSubscriptionId(),
+                initialValue = INVALID_SUBSCRIPTION_ID,
             )
+            .onStart { emit(subscriptionManagerProxy.getDefaultDataSubscriptionId()) }
             .onEach { defaultDataSubIdChangeEvent.tryEmit(Unit) }
-            .stateIn(
-                scope,
-                SharingStarted.WhileSubscribed(),
-                SubscriptionManager.getDefaultDataSubscriptionId()
-            )
+            .stateIn(scope, SharingStarted.WhileSubscribed(), INVALID_SUBSCRIPTION_ID)
 
     private val carrierConfigChangedEvent =
         broadcastDispatcher
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt
index 22351f8..b36ba384 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt
@@ -16,15 +16,21 @@
 
 package com.android.systemui.statusbar.pipeline.mobile.domain.interactor
 
+import android.content.Context
 import android.telephony.CarrierConfigManager
 import com.android.settingslib.SignalIcon.MobileIconGroup
-import com.android.settingslib.mobile.TelephonyIcons.NOT_DEFAULT_DATA
+import com.android.settingslib.mobile.MobileIconCarrierIdOverrides
+import com.android.settingslib.mobile.MobileIconCarrierIdOverridesImpl
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.log.table.TableLogBuffer
+import com.android.systemui.log.table.logDiffsForTable
 import com.android.systemui.statusbar.pipeline.mobile.data.model.DataConnectionState.Connected
 import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel
 import com.android.systemui.statusbar.pipeline.mobile.data.model.ResolvedNetworkType
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository
+import com.android.systemui.statusbar.pipeline.mobile.domain.model.NetworkTypeIconModel
+import com.android.systemui.statusbar.pipeline.mobile.domain.model.NetworkTypeIconModel.DefaultIcon
+import com.android.systemui.statusbar.pipeline.mobile.domain.model.NetworkTypeIconModel.OverriddenIcon
 import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -34,8 +40,6 @@
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.mapLatest
-import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.flow.stateIn
 
 interface MobileIconInteractor {
@@ -76,7 +80,7 @@
     val alwaysUseCdmaLevel: StateFlow<Boolean>
 
     /** Observable for RAT type (network type) indicator */
-    val networkTypeIconGroup: StateFlow<MobileIconGroup>
+    val networkTypeIconGroup: StateFlow<NetworkTypeIconModel>
 
     /**
      * Provider name for this network connection. The name can be one of 3 values:
@@ -119,10 +123,11 @@
     override val mobileIsDefault: StateFlow<Boolean>,
     defaultMobileIconMapping: StateFlow<Map<String, MobileIconGroup>>,
     defaultMobileIconGroup: StateFlow<MobileIconGroup>,
-    defaultDataSubId: StateFlow<Int>,
     override val isDefaultConnectionFailed: StateFlow<Boolean>,
     override val isForceHidden: Flow<Boolean>,
     connectionRepository: MobileConnectionRepository,
+    private val context: Context,
+    val carrierIdOverrides: MobileIconCarrierIdOverrides = MobileIconCarrierIdOverridesImpl()
 ) : MobileIconInteractor {
     override val tableLogBuffer: TableLogBuffer = connectionRepository.tableLogBuffer
 
@@ -130,14 +135,14 @@
 
     override val isDataEnabled: StateFlow<Boolean> = connectionRepository.dataEnabled
 
-    private val isDefault =
-        defaultDataSubId
-            .mapLatest { connectionRepository.subId == it }
-            .stateIn(
-                scope,
-                SharingStarted.WhileSubscribed(),
-                connectionRepository.subId == defaultDataSubId.value
-            )
+    // True if there exists _any_ icon override for this carrierId. Note that overrides can include
+    // any or none of the icon groups defined in MobileMappings, so we still need to check on a
+    // per-network-type basis whether or not the given icon group is overridden
+    private val carrierIdIconOverrideExists =
+        connectionRepository.carrierId
+            .map { carrierIdOverrides.carrierIdEntryExists(it) }
+            .distinctUntilChanged()
+            .stateIn(scope, SharingStarted.WhileSubscribed(), false)
 
     override val isDefaultDataEnabled = defaultSubscriptionHasDataEnabled
 
@@ -157,35 +162,56 @@
                 connectionRepository.networkName.value
             )
 
-    /** Observable for the current RAT indicator icon ([MobileIconGroup]) */
-    override val networkTypeIconGroup: StateFlow<MobileIconGroup> =
+    /** What the mobile icon would be before carrierId overrides */
+    private val defaultNetworkType: StateFlow<MobileIconGroup> =
         combine(
                 connectionRepository.resolvedNetworkType,
                 defaultMobileIconMapping,
                 defaultMobileIconGroup,
-                isDefault,
-            ) { resolvedNetworkType, mapping, defaultGroup, isDefault ->
-                if (!isDefault) {
-                    return@combine NOT_DEFAULT_DATA
-                }
-
+            ) { resolvedNetworkType, mapping, defaultGroup ->
                 when (resolvedNetworkType) {
                     is ResolvedNetworkType.CarrierMergedNetworkType ->
                         resolvedNetworkType.iconGroupOverride
-                    else -> mapping[resolvedNetworkType.lookupKey] ?: defaultGroup
+                    else -> {
+                        mapping[resolvedNetworkType.lookupKey] ?: defaultGroup
+                    }
+                }
+            }
+            .stateIn(scope, SharingStarted.WhileSubscribed(), defaultMobileIconGroup.value)
+
+    override val networkTypeIconGroup =
+        combine(
+                defaultNetworkType,
+                carrierIdIconOverrideExists,
+            ) { networkType, overrideExists ->
+                // DefaultIcon comes out of the icongroup lookup, we check for overrides here
+                if (overrideExists) {
+                    val iconOverride =
+                        carrierIdOverrides.getOverrideFor(
+                            connectionRepository.carrierId.value,
+                            networkType.name,
+                            context.resources,
+                        )
+                    if (iconOverride > 0) {
+                        OverriddenIcon(networkType, iconOverride)
+                    } else {
+                        DefaultIcon(networkType)
+                    }
+                } else {
+                    DefaultIcon(networkType)
                 }
             }
             .distinctUntilChanged()
-            .onEach {
-                // Doesn't use [logDiffsForTable] because [MobileIconGroup] can't implement the
-                // [Diffable] interface.
-                tableLogBuffer.logChange(
-                    prefix = "",
-                    columnName = "networkTypeIcon",
-                    value = it.name
-                )
-            }
-            .stateIn(scope, SharingStarted.WhileSubscribed(), defaultMobileIconGroup.value)
+            .logDiffsForTable(
+                tableLogBuffer = tableLogBuffer,
+                columnPrefix = "",
+                initialValue = DefaultIcon(defaultMobileIconGroup.value),
+            )
+            .stateIn(
+                scope,
+                SharingStarted.WhileSubscribed(),
+                DefaultIcon(defaultMobileIconGroup.value),
+            )
 
     override val isEmergencyOnly = connectionRepository.isEmergencyOnly
 
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 6c8310a..1e3122b 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
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar.pipeline.mobile.domain.interactor
 
+import android.content.Context
 import android.telephony.CarrierConfigManager
 import android.telephony.SubscriptionManager
 import com.android.settingslib.SignalIcon.MobileIconGroup
@@ -75,9 +76,6 @@
     /** True if the CDMA level should be preferred over the primary level. */
     val alwaysUseCdmaLevel: StateFlow<Boolean>
 
-    /** Tracks the subscriptionId set as the default for data connections */
-    val defaultDataSubId: StateFlow<Int>
-
     /** The icon mapping from network type to [MobileIconGroup] for the default subscription */
     val defaultMobileIconMapping: StateFlow<Map<String, MobileIconGroup>>
 
@@ -112,6 +110,7 @@
     connectivityRepository: ConnectivityRepository,
     userSetupRepo: UserSetupRepository,
     @Application private val scope: CoroutineScope,
+    private val context: Context,
 ) : MobileIconsInteractor {
 
     override val mobileIsDefault = mobileConnectionsRepo.mobileIsDefault
@@ -184,8 +183,6 @@
             )
             .stateIn(scope, SharingStarted.WhileSubscribed(), listOf())
 
-    override val defaultDataSubId = mobileConnectionsRepo.defaultDataSubId
-
     /**
      * 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).
@@ -282,10 +279,10 @@
             mobileIsDefault,
             defaultMobileIconMapping,
             defaultMobileIconGroup,
-            defaultDataSubId,
             isDefaultConnectionFailed,
             isForceHidden,
             mobileConnectionsRepo.getRepoForSubId(subId),
+            context,
         )
 
     companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/model/NetworkTypeIconModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/model/NetworkTypeIconModel.kt
new file mode 100644
index 0000000..6ea5f90
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/model/NetworkTypeIconModel.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.pipeline.mobile.domain.model
+
+import com.android.settingslib.SignalIcon.MobileIconGroup
+import com.android.systemui.log.table.Diffable
+import com.android.systemui.log.table.TableRowLogger
+
+/**
+ * A data wrapper class for [MobileIconGroup]. One lingering nuance of this pipeline is its
+ * dependency on MobileMappings for its lookup from NetworkType -> NetworkTypeIcon. And because
+ * MobileMappings is a static map of (netType, icon) that knows nothing of `carrierId`, we need the
+ * concept of a "default" or "overridden" icon type.
+ *
+ * Until we can remove that dependency on MobileMappings, we should just allow for the composition
+ * of overriding an icon id using the lookup defined in [MobileIconCarrierIdOverrides]. By using the
+ * [overrideIcon] method defined below, we can create any arbitrarily overridden network type icon.
+ */
+sealed interface NetworkTypeIconModel : Diffable<NetworkTypeIconModel> {
+    val contentDescription: Int
+    val iconId: Int
+    val name: String
+
+    data class DefaultIcon(
+        val iconGroup: MobileIconGroup,
+    ) : NetworkTypeIconModel {
+        override val contentDescription = iconGroup.dataContentDescription
+        override val iconId = iconGroup.dataType
+        override val name = iconGroup.name
+
+        override fun logDiffs(prevVal: NetworkTypeIconModel, row: TableRowLogger) {
+            if (prevVal !is DefaultIcon || prevVal.name != name) {
+                row.logChange(COL_NETWORK_ICON, name)
+            }
+        }
+    }
+
+    data class OverriddenIcon(
+        val iconGroup: MobileIconGroup,
+        override val iconId: Int,
+    ) : NetworkTypeIconModel {
+        override val contentDescription = iconGroup.dataContentDescription
+        override val name = iconGroup.name
+
+        override fun logDiffs(prevVal: NetworkTypeIconModel, row: TableRowLogger) {
+            if (prevVal !is OverriddenIcon || prevVal.name != name || prevVal.iconId != iconId) {
+                row.logChange(COL_NETWORK_ICON, "Ovrd($name)")
+            }
+        }
+    }
+
+    companion object {
+        const val COL_NETWORK_ICON = "networkTypeIcon"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt
index 0fd007c..dce7bf2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModel.kt
@@ -146,11 +146,10 @@
         combine(
                 iconInteractor.isDataConnected,
                 iconInteractor.isDataEnabled,
-                iconInteractor.isDefaultConnectionFailed,
                 iconInteractor.alwaysShowDataRatIcon,
                 iconInteractor.mobileIsDefault,
-            ) { dataConnected, dataEnabled, failedConnection, alwaysShow, mobileIsDefault ->
-                alwaysShow || (dataConnected && dataEnabled && !failedConnection && mobileIsDefault)
+            ) { dataConnected, dataEnabled, alwaysShow, mobileIsDefault ->
+                alwaysShow || (dataEnabled && dataConnected && mobileIsDefault)
             }
             .distinctUntilChanged()
             .logDiffsForTable(
@@ -167,10 +166,13 @@
                 showNetworkTypeIcon,
             ) { networkTypeIconGroup, shouldShow ->
                 val desc =
-                    if (networkTypeIconGroup.dataContentDescription != 0)
-                        ContentDescription.Resource(networkTypeIconGroup.dataContentDescription)
+                    if (networkTypeIconGroup.contentDescription != 0)
+                        ContentDescription.Resource(networkTypeIconGroup.contentDescription)
                     else null
-                val icon = Icon.Resource(networkTypeIconGroup.dataType, desc)
+                val icon =
+                    if (networkTypeIconGroup.iconId != 0)
+                        Icon.Resource(networkTypeIconGroup.iconId, desc)
+                    else null
                 return@combine when {
                     !shouldShow -> null
                     else -> icon
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/util/SubscriptionManagerProxy.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/util/SubscriptionManagerProxy.kt
new file mode 100644
index 0000000..22d0483
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/util/SubscriptionManagerProxy.kt
@@ -0,0 +1,30 @@
+/*
+ * 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.mobile.util
+
+import android.telephony.SubscriptionManager
+import javax.inject.Inject
+
+interface SubscriptionManagerProxy {
+    fun getDefaultDataSubscriptionId(): Int
+}
+
+/** Injectable proxy class for [SubscriptionManager]'s static methods */
+class SubscriptionManagerProxyImpl @Inject constructor() : SubscriptionManagerProxy {
+    /** The system default data subscription id, or INVALID_SUBSCRIPTION_ID on error */
+    override fun getDefaultDataSubscriptionId() = SubscriptionManager.getDefaultDataSubscriptionId()
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
index 86e7456..a4cb99b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
@@ -64,7 +64,7 @@
         mToggleSliderController = setMirrorLayout();
         mNotificationPanel = notificationPanelViewController;
         mDepthController = notificationShadeDepthController;
-        mNotificationPanel.setPanelAlphaEndAction(() -> {
+        mNotificationPanel.setAlphaChangeAnimationEndAction(() -> {
             mBrightnessMirror.setVisibility(View.INVISIBLE);
         });
         mVisibilityCallback = visibilityCallback;
@@ -74,13 +74,13 @@
     public void showMirror() {
         mBrightnessMirror.setVisibility(View.VISIBLE);
         mVisibilityCallback.accept(true);
-        mNotificationPanel.setPanelAlpha(0, true /* animate */);
+        mNotificationPanel.setAlpha(0, true /* animate */);
         mDepthController.setBrightnessMirrorVisible(true);
     }
 
     public void hideMirror() {
         mVisibilityCallback.accept(false);
-        mNotificationPanel.setPanelAlpha(255, true /* animate */);
+        mNotificationPanel.setAlpha(255, true /* animate */);
         mDepthController.setBrightnessMirrorVisible(false);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
index 1a4a311..9ede6ce 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
@@ -281,6 +281,10 @@
         mUser = user;
     }
 
+    public int getUser() {
+        return  mUser;
+    }
+
     public void dump(@NonNull PrintWriter pw, @NonNull String[] args) {
         pw.println("HeadsUpManager state:");
         dumpInternal(pw, args);
diff --git a/packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java b/packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java
index f09b2f7..757b4e5 100644
--- a/packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java
+++ b/packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java
@@ -108,13 +108,18 @@
         private void updateTouchRegions() {
             mExecutor.execute(() -> {
                 final HashMap<AttachedSurfaceControl, Region> affectedSurfaces = new HashMap<>();
+                if (mTrackedViews.isEmpty()) {
+                    return;
+                }
+
                 mTrackedViews.stream().forEach(view -> {
-                    if (!view.isAttachedToWindow()) {
+                    final AttachedSurfaceControl surface = view.getRootSurfaceControl();
+
+                    // Detached views will not have a surface control.
+                    if (surface == null) {
                         return;
                     }
 
-                    final AttachedSurfaceControl surface = view.getRootSurfaceControl();
-
                     if (!affectedSurfaces.containsKey(surface)) {
                         affectedSurfaces.put(surface, Region.obtain());
                     }
@@ -179,6 +184,7 @@
         mSessionRegions.values().stream().forEach(regionMapping -> {
             regionMapping.entrySet().stream().forEach(entry -> {
                 final AttachedSurfaceControl surface = entry.getKey();
+
                 if (!affectedSurfaces.containsKey(surface)) {
                     affectedSurfaces.put(surface, Region.obtain());
                 }
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt b/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
index 101bd44..d1bd73a 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
@@ -30,6 +30,7 @@
 import com.android.systemui.keyguard.WakefulnessLifecycle
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.shade.ShadeFoldAnimator
 import com.android.systemui.statusbar.LightRevealScrim
 import com.android.systemui.statusbar.phone.CentralSurfaces
 import com.android.systemui.statusbar.phone.ScreenOffAnimation
@@ -79,7 +80,7 @@
     private val foldToAodLatencyTracker = FoldToAodLatencyTracker()
 
     private val startAnimationRunnable = Runnable {
-        centralSurfaces.notificationPanelViewController.startFoldToAodAnimation(
+        getShadeFoldAnimator().startFoldToAodAnimation(
             /* startAction= */ { foldToAodLatencyTracker.onAnimationStarted() },
             /* endAction= */ { setAnimationState(playing = false) },
             /* cancelAction= */ { setAnimationState(playing = false) },
@@ -93,7 +94,7 @@
         wakefulnessLifecycle.addObserver(this)
 
         // TODO(b/254878364): remove this call to NPVC.getView()
-        centralSurfaces.notificationPanelViewController.view.repeatWhenAttached {
+        getShadeFoldAnimator().view.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.STARTED) { listenForDozing(this) }
         }
     }
@@ -109,7 +110,7 @@
     override fun startAnimation(): Boolean =
         if (shouldStartAnimation()) {
             setAnimationState(playing = true)
-            centralSurfaces.notificationPanelViewController.prepareFoldToAodAnimation()
+            getShadeFoldAnimator().prepareFoldToAodAnimation()
             true
         } else {
             setAnimationState(playing = false)
@@ -120,12 +121,15 @@
         if (isAnimationPlaying) {
             foldToAodLatencyTracker.cancel()
             cancelAnimation?.run()
-            centralSurfaces.notificationPanelViewController.cancelFoldToAodAnimation()
+            getShadeFoldAnimator().cancelFoldToAodAnimation()
         }
 
         setAnimationState(playing = false)
     }
 
+    private fun getShadeFoldAnimator(): ShadeFoldAnimator =
+        centralSurfaces.notificationPanelViewController.shadeFoldAnimator
+
     private fun setAnimationState(playing: Boolean) {
         shouldPlayAnimation = playing
         isAnimationPlaying = playing
@@ -152,16 +156,17 @@
         } else if (isFolded && !isFoldHandled && alwaysOnEnabled && isDozing) {
             // Screen turning on for the first time after folding and we are already dozing
             // We should play the folding to AOD animation
+            isFoldHandled = true
 
             setAnimationState(playing = true)
-            centralSurfaces.notificationPanelViewController.prepareFoldToAodAnimation()
+            getShadeFoldAnimator().prepareFoldToAodAnimation()
 
             // We don't need to wait for the scrim as it is already displayed
             // but we should wait for the initial animation preparations to be drawn
             // (setting initial alpha/translation)
             // TODO(b/254878364): remove this call to NPVC.getView()
             OneShotPreDrawListener.add(
-                centralSurfaces.notificationPanelViewController.view,
+                getShadeFoldAnimator().view,
                 onReady
             )
         } else {
@@ -186,7 +191,10 @@
             cancelAnimation?.run()
 
             // Post starting the animation to the next frame to avoid junk due to inset changes
-            cancelAnimation = mainExecutor.executeDelayed(startAnimationRunnable, /* delayMillis= */ 0)
+            cancelAnimation = mainExecutor.executeDelayed(
+                startAnimationRunnable,
+                /* delayMillis= */ 0
+            )
             shouldPlayAnimation = false
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/nullability.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/nullability.kt
index f3b7e0d..298dacd 100644
--- a/packages/SystemUI/src/com/android/systemui/util/kotlin/nullability.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/nullability.kt
@@ -26,4 +26,5 @@
 /**
  * Assists type-checking to unpack a Java Optional into T?
  */
+@Suppress("NOTHING_TO_INLINE")
 inline fun <T> Optional<T>.getOrNull(): T? = orElse(null)
diff --git a/packages/SystemUI/src/com/android/systemui/util/service/ObservableServiceConnection.java b/packages/SystemUI/src/com/android/systemui/util/service/ObservableServiceConnection.java
index c6da55c..968dcc9 100644
--- a/packages/SystemUI/src/com/android/systemui/util/service/ObservableServiceConnection.java
+++ b/packages/SystemUI/src/com/android/systemui/util/service/ObservableServiceConnection.java
@@ -25,6 +25,7 @@
 import android.util.Log;
 
 import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.settings.UserTracker;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -108,6 +109,7 @@
 
     private final Context mContext;
     private final Intent mServiceIntent;
+    private final UserTracker mUserTracker;
     private final int mFlags;
     private final Executor mExecutor;
     private final ServiceTransformer<T> mTransformer;
@@ -127,10 +129,12 @@
      */
     @Inject
     public ObservableServiceConnection(Context context, Intent serviceIntent,
+            UserTracker userTracker,
             @Main Executor executor,
             ServiceTransformer<T> transformer) {
         mContext = context;
         mServiceIntent = serviceIntent;
+        mUserTracker = userTracker;
         mFlags = Context.BIND_AUTO_CREATE;
         mExecutor = executor;
         mTransformer = transformer;
@@ -145,7 +149,8 @@
     public boolean bind() {
         boolean bindResult = false;
         try {
-            bindResult = mContext.bindService(mServiceIntent, mFlags, mExecutor, this);
+            bindResult = mContext.bindServiceAsUser(mServiceIntent, this, mFlags,
+                    mUserTracker.getUserHandle());
         } catch (SecurityException e) {
             Log.d(TAG, "Could not bind to service", e);
             mContext.unbindService(this);
@@ -228,11 +233,13 @@
 
     @Override
     public void onServiceConnected(ComponentName name, IBinder service) {
-        if (DEBUG) {
-            Log.d(TAG, "onServiceConnected");
-        }
-        mProxy = mTransformer.convert(service);
-        applyToCallbacksLocked(callback -> callback.onConnected(this, mProxy));
+        mExecutor.execute(() -> {
+            if (DEBUG) {
+                Log.d(TAG, "onServiceConnected");
+            }
+            mProxy = mTransformer.convert(service);
+            applyToCallbacksLocked(callback -> callback.onConnected(this, mProxy));
+        });
     }
 
     private void applyToCallbacksLocked(Consumer<Callback<T>> applicator) {
@@ -250,16 +257,16 @@
 
     @Override
     public void onServiceDisconnected(ComponentName name) {
-        onDisconnected(DISCONNECT_REASON_DISCONNECTED);
+        mExecutor.execute(() -> onDisconnected(DISCONNECT_REASON_DISCONNECTED));
     }
 
     @Override
     public void onBindingDied(ComponentName name) {
-        onDisconnected(DISCONNECT_REASON_DISCONNECTED);
+        mExecutor.execute(() -> onDisconnected(DISCONNECT_REASON_BINDING_DIED));
     }
 
     @Override
     public void onNullBinding(ComponentName name) {
-        onDisconnected(DISCONNECT_REASON_NULL_BINDING);
+        mExecutor.execute(() -> onDisconnected(DISCONNECT_REASON_NULL_BINDING));
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java
index 54b3030..cd1ad1b 100644
--- a/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java
@@ -125,6 +125,8 @@
         private int mBitmapUsages = 0;
         private final Object mLock = new Object();
 
+        private boolean mIsLockscreenLiveWallpaperEnabled;
+
         CanvasEngine() {
             super();
             setFixedSizeAllowed(true);
@@ -167,8 +169,10 @@
                 Log.d(TAG, "onCreate");
             }
             mWallpaperManager = getDisplayContext().getSystemService(WallpaperManager.class);
+            mIsLockscreenLiveWallpaperEnabled = mWallpaperManager
+                    .isLockscreenLiveWallpaperEnabled();
             mSurfaceHolder = surfaceHolder;
-            Rect dimensions = mWallpaperManager.isLockscreenLiveWallpaperEnabled()
+            Rect dimensions = mIsLockscreenLiveWallpaperEnabled
                     ? mWallpaperManager.peekBitmapDimensions(getSourceFlag())
                     : mWallpaperManager.peekBitmapDimensions();
             int width = Math.max(MIN_SURFACE_WIDTH, dimensions.width());
@@ -319,7 +323,7 @@
             boolean loadSuccess = false;
             Bitmap bitmap;
             try {
-                bitmap = mWallpaperManager.isLockscreenLiveWallpaperEnabled()
+                bitmap = mIsLockscreenLiveWallpaperEnabled
                         ? mWallpaperManager.getBitmapAsUser(
                                 mUserTracker.getUserId(), false, getSourceFlag())
                         : mWallpaperManager.getBitmapAsUser(mUserTracker.getUserId(), false);
@@ -333,7 +337,7 @@
                 // be loaded, we will go into a cycle. Don't do a build where the
                 // default wallpaper can't be loaded.
                 Log.w(TAG, "Unable to load wallpaper!", exception);
-                if (mWallpaperManager.isLockscreenLiveWallpaperEnabled()) {
+                if (mIsLockscreenLiveWallpaperEnabled) {
                     mWallpaperManager.clearWallpaper(getWallpaperFlags(), mUserTracker.getUserId());
                 } else {
                     mWallpaperManager.clearWallpaper(
@@ -341,7 +345,7 @@
                 }
 
                 try {
-                    bitmap = mWallpaperManager.isLockscreenLiveWallpaperEnabled()
+                    bitmap = mIsLockscreenLiveWallpaperEnabled
                             ? mWallpaperManager.getBitmapAsUser(
                                     mUserTracker.getUserId(), false, getSourceFlag())
                             : mWallpaperManager.getBitmapAsUser(mUserTracker.getUserId(), false);
@@ -365,7 +369,7 @@
                     mBitmap.recycle();
                 }
                 mBitmap = bitmap;
-                mWideColorGamut = mWallpaperManager.isLockscreenLiveWallpaperEnabled()
+                mWideColorGamut = mIsLockscreenLiveWallpaperEnabled
                         ? mWallpaperManager.wallpaperSupportsWcg(getSourceFlag())
                         : mWallpaperManager.wallpaperSupportsWcg(WallpaperManager.FLAG_SYSTEM);
 
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
index 08f7eae..a4b093d 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
@@ -241,8 +241,8 @@
 
         // Store callback in a field so it won't get GC'd
         mStatusBarWindowCallback =
-                (keyguardShowing, keyguardOccluded, bouncerShowing, isDozing, panelExpanded,
-                        isDreaming) ->
+                (keyguardShowing, keyguardOccluded, keyguardGoingAway, bouncerShowing, isDozing,
+                        panelExpanded, isDreaming) ->
                         mBubbles.onNotificationPanelExpandedChanged(panelExpanded);
         notificationShadeWindowController.registerCallback(mStatusBarWindowCallback);
 
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
index bd60401..e492534 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
@@ -295,8 +295,8 @@
             @Override
             public void notifyExpandNotification() {
                 mSysUiMainExecutor.execute(
-                        () -> mCommandQueue.handleSystemKey(
-                                KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN));
+                        () -> mCommandQueue.handleSystemKey(new KeyEvent(KeyEvent.ACTION_DOWN,
+                                KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN)));
             }
         });
 
diff --git a/packages/SystemUI/tests/res/drawable-nodpi/romainguy_rockaway.jpg b/packages/SystemUI/tests/res/drawable-nodpi/romainguy_rockaway.jpg
new file mode 100644
index 0000000..68473ba
--- /dev/null
+++ b/packages/SystemUI/tests/res/drawable-nodpi/romainguy_rockaway.jpg
Binary files differ
diff --git a/packages/SystemUI/tests/src/androidx/core/animation/AnimatorTestRule2.java b/packages/SystemUI/tests/src/androidx/core/animation/AnimatorTestRule2.java
new file mode 100644
index 0000000..e93e862
--- /dev/null
+++ b/packages/SystemUI/tests/src/androidx/core/animation/AnimatorTestRule2.java
@@ -0,0 +1,174 @@
+/*
+ * 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 androidx.core.animation;
+
+import android.os.Looper;
+import android.os.SystemClock;
+import android.util.AndroidRuntimeException;
+
+import androidx.annotation.NonNull;
+
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * NOTE: this is a copy of the {@link androidx.core.animation.AnimatorTestRule} which attempts to
+ * circumvent the problems with {@link androidx.core.animation.AnimationHandler} having a static
+ * list of callbacks.
+ *
+ * TODO(b/275602127): remove this and use the original rule once we have the updated androidx code.
+ */
+public final class AnimatorTestRule2 implements TestRule {
+
+    class TestAnimationHandler extends AnimationHandler {
+        TestAnimationHandler() {
+            super(new TestProvider());
+        }
+
+        List<AnimationFrameCallback> animationCallbacks = new ArrayList<>();
+
+        @Override
+        void addAnimationFrameCallback(AnimationFrameCallback callback) {
+            animationCallbacks.add(callback);
+            callback.doAnimationFrame(getCurrentTime());
+        }
+
+        @Override
+        public void removeCallback(AnimationFrameCallback callback) {
+            int id = animationCallbacks.indexOf(callback);
+            if (id >= 0) {
+                animationCallbacks.set(id, null);
+            }
+        }
+
+        void onAnimationFrame(long frameTime) {
+            for (int i = 0; i < animationCallbacks.size(); i++) {
+                final AnimationFrameCallback callback = animationCallbacks.get(i);
+                if (callback == null) {
+                    continue;
+                }
+                callback.doAnimationFrame(frameTime);
+            }
+        }
+
+        @Override
+        void autoCancelBasedOn(ObjectAnimator objectAnimator) {
+            for (int i = animationCallbacks.size() - 1; i >= 0; i--) {
+                AnimationFrameCallback cb = animationCallbacks.get(i);
+                if (cb == null) {
+                    continue;
+                }
+                if (objectAnimator.shouldAutoCancel(cb)) {
+                    ((Animator) animationCallbacks.get(i)).cancel();
+                }
+            }
+        }
+    }
+
+    final TestAnimationHandler mTestHandler;
+    final long mStartTime;
+    private long mTotalTimeDelta = 0;
+    private final Object mLock = new Object();
+
+    public AnimatorTestRule2() {
+        mStartTime = SystemClock.uptimeMillis();
+        mTestHandler = new TestAnimationHandler();
+    }
+
+    @NonNull
+    @Override
+    public Statement apply(@NonNull final Statement base, @NonNull Description description) {
+        return new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+                AnimationHandler.setTestHandler(mTestHandler);
+                try {
+                    base.evaluate();
+                } finally {
+                    AnimationHandler.setTestHandler(null);
+                }
+            }
+        };
+    }
+
+    /**
+     * Advances the animation clock by the given amount of delta in milliseconds. This call will
+     * produce an animation frame to all the ongoing animations. This method needs to be
+     * called on the same thread as {@link Animator#start()}.
+     *
+     * @param timeDelta the amount of milliseconds to advance
+     */
+    public void advanceTimeBy(long timeDelta) {
+        if (Looper.myLooper() == null) {
+            // Throw an exception
+            throw new AndroidRuntimeException("AnimationTestRule#advanceTimeBy(long) may only be"
+                    + "called on Looper threads");
+        }
+        synchronized (mLock) {
+            // Advance time & pulse a frame
+            mTotalTimeDelta += timeDelta < 0 ? 0 : timeDelta;
+        }
+        // produce a frame
+        mTestHandler.onAnimationFrame(getCurrentTime());
+    }
+
+
+    /**
+     * Returns the current time in milliseconds tracked by AnimationHandler. Note that this is a
+     * different time than the time tracked by {@link SystemClock} This method needs to be called on
+     * the same thread as {@link Animator#start()}.
+     */
+    public long getCurrentTime() {
+        if (Looper.myLooper() == null) {
+            // Throw an exception
+            throw new AndroidRuntimeException("AnimationTestRule#getCurrentTime() may only be"
+                    + "called on Looper threads");
+        }
+        synchronized (mLock) {
+            return mStartTime + mTotalTimeDelta;
+        }
+    }
+
+
+    private class TestProvider implements AnimationHandler.AnimationFrameCallbackProvider {
+        TestProvider() {
+        }
+
+        @Override
+        public void onNewCallbackAdded(AnimationHandler.AnimationFrameCallback callback) {
+            callback.doAnimationFrame(getCurrentTime());
+        }
+
+        @Override
+        public void postFrameCallback() {
+        }
+
+        @Override
+        public void setFrameDelay(long delay) {
+        }
+
+        @Override
+        public long getFrameDelay() {
+            return 0;
+        }
+    }
+}
+
diff --git a/packages/SystemUI/tests/src/androidx/core/animation/AnimatorTestRuleTest.kt b/packages/SystemUI/tests/src/androidx/core/animation/AnimatorTestRuleTest.kt
new file mode 100644
index 0000000..bddd60b
--- /dev/null
+++ b/packages/SystemUI/tests/src/androidx/core/animation/AnimatorTestRuleTest.kt
@@ -0,0 +1,77 @@
+/*
+ * 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 androidx.core.animation
+
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper.RunWithLooper
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.util.doOnEnd
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidTestingRunner::class)
+@SmallTest
+@RunWithLooper(setAsMainLooper = true)
+class AnimatorTestRuleTest : SysuiTestCase() {
+
+    @get:Rule val animatorTestRule = AnimatorTestRule2()
+
+    @Test
+    fun testA() {
+        didTouchA = false
+        didTouchB = false
+        ObjectAnimator.ofFloat(0f, 1f).apply {
+            duration = 100
+            doOnEnd { didTouchA = true }
+            start()
+        }
+        ObjectAnimator.ofFloat(0f, 1f).apply {
+            duration = 150
+            doOnEnd { didTouchA = true }
+            start()
+        }
+        animatorTestRule.advanceTimeBy(100)
+        assertThat(didTouchA).isTrue()
+        assertThat(didTouchB).isFalse()
+    }
+
+    @Test
+    fun testB() {
+        didTouchA = false
+        didTouchB = false
+        ObjectAnimator.ofFloat(0f, 1f).apply {
+            duration = 100
+            doOnEnd { didTouchB = true }
+            start()
+        }
+        ObjectAnimator.ofFloat(0f, 1f).apply {
+            duration = 150
+            doOnEnd { didTouchB = true }
+            start()
+        }
+        animatorTestRule.advanceTimeBy(100)
+        assertThat(didTouchA).isFalse()
+        assertThat(didTouchB).isTrue()
+    }
+
+    companion object {
+        var didTouchA = false
+        var didTouchB = false
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt
index 480b8f9..a9920ec7 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt
@@ -32,6 +32,7 @@
 import com.android.systemui.plugins.ClockController
 import com.android.systemui.plugins.ClockEvents
 import com.android.systemui.plugins.ClockFaceController
+import com.android.systemui.plugins.ClockFaceConfig
 import com.android.systemui.plugins.ClockFaceEvents
 import com.android.systemui.plugins.ClockTickRate
 import com.android.systemui.plugins.log.LogBuffer
@@ -101,8 +102,10 @@
         whenever(largeClockController.events).thenReturn(largeClockEvents)
         whenever(clock.events).thenReturn(events)
         whenever(clock.animations).thenReturn(animations)
-        whenever(smallClockEvents.tickRate).thenReturn(ClockTickRate.PER_MINUTE)
-        whenever(largeClockEvents.tickRate).thenReturn(ClockTickRate.PER_MINUTE)
+        whenever(smallClockController.config)
+            .thenReturn(ClockFaceConfig(tickRate = ClockTickRate.PER_MINUTE))
+        whenever(largeClockController.config)
+            .thenReturn(ClockFaceConfig(tickRate = ClockTickRate.PER_MINUTE))
 
         repository = FakeKeyguardRepository()
         bouncerRepository = FakeKeyguardBouncerRepository()
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java
index 7ce2b1c..1ba9931 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardAbsKeyInputViewControllerTest.java
@@ -152,19 +152,16 @@
                 false);
     }
 
+
     @Test
     public void testReset() {
         mKeyguardAbsKeyInputViewController.reset();
         verify(mKeyguardMessageAreaController).setMessage("", false);
-        verify(mAbsKeyInputView).resetPasswordText(false, false);
-        verify(mLockPatternUtils).getLockoutAttemptDeadline(anyInt());
     }
 
     @Test
-    public void onResume_Reset() {
+    public void testResume() {
         mKeyguardAbsKeyInputViewController.onResume(KeyguardSecurityView.VIEW_REVEALED);
-        verify(mKeyguardMessageAreaController).setMessage("", false);
-        verify(mAbsKeyInputView).resetPasswordText(false, false);
         verify(mLockPatternUtils).getLockoutAttemptDeadline(anyInt());
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
index b15ac39..2f627cb 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
@@ -315,8 +315,8 @@
     }
 
     @Test
-    public void testGetClockAnimationsForwardsToClock() {
-        assertEquals(mClockAnimations, mController.getClockAnimations());
+    public void testGetClock_ForwardsToClock() {
+        assertEquals(mClockController, mController.getClock());
     }
 
     @Test
@@ -367,9 +367,9 @@
     }
 
     @Test
-    public void testGetClockAnimations_nullClock_returnsNull() {
+    public void testGetClock_nullClock_returnsNull() {
         when(mClockEventController.getClock()).thenReturn(null);
-        assertNull(mController.getClockAnimations());
+        assertNull(mController.getClock());
     }
 
     private void verifyAttachment(VerificationMode times) {
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt
index 6ae28b7..a8d5569 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt
@@ -122,22 +122,8 @@
   }
 
   @Test
-  fun reset() {
-    mKeyguardPatternViewController.reset()
-    verify(mLockPatternView).setInStealthMode(anyBoolean())
-    verify(mLockPatternView).enableInput()
-    verify(mLockPatternView).setEnabled(true)
-    verify(mLockPatternView).clearPattern()
-    verify(mLockPatternUtils).getLockoutAttemptDeadline(anyInt())
-  }
-
-  @Test
   fun resume() {
     mKeyguardPatternViewController.onResume(KeyguardSecurityView.VIEW_REVEALED)
-    verify(mLockPatternView).setInStealthMode(anyBoolean())
-    verify(mLockPatternView).enableInput()
-    verify(mLockPatternView).setEnabled(true)
-    verify(mLockPatternView).clearPattern()
     verify(mLockPatternUtils).getLockoutAttemptDeadline(anyInt())
   }
 }
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java
index b73330f..d760189 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java
@@ -163,8 +163,6 @@
     @Captor
     private ArgumentCaptor<KeyguardSecurityContainer.SwipeListener> mSwipeListenerArgumentCaptor;
 
-    private Configuration mConfiguration;
-
     private KeyguardSecurityContainerController mKeyguardSecurityContainerController;
     private KeyguardPasswordViewController mKeyguardPasswordViewController;
     private KeyguardPasswordView mKeyguardPasswordView;
@@ -172,12 +170,12 @@
 
     @Before
     public void setup() {
-        mConfiguration = new Configuration();
-        mConfiguration.setToDefaults(); // Defaults to ORIENTATION_UNDEFINED.
         mTestableResources = mContext.getOrCreateTestableResources();
+        mTestableResources.getResources().getConfiguration().orientation =
+                Configuration.ORIENTATION_UNDEFINED;
 
         when(mView.getContext()).thenReturn(mContext);
-        when(mView.getResources()).thenReturn(mContext.getResources());
+        when(mView.getResources()).thenReturn(mTestableResources.getResources());
         FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(/* width=  */ 0, /* height= */
                 0);
         lp.gravity = 0;
@@ -254,6 +252,8 @@
 
     @Test
     public void onResourcesUpdate_callsThroughOnRotationChange() {
+        clearInvocations(mView);
+
         // Rotation is the same, shouldn't cause an update
         mKeyguardSecurityContainerController.updateResources();
         verify(mView, never()).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager),
@@ -393,6 +393,45 @@
     }
 
     @Test
+    public void showNextSecurityScreenOrFinish_DeviceNotSecure() {
+        // GIVEN the current security method is SimPin
+        when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false);
+        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(TARGET_USER_ID)).thenReturn(false);
+        mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.SimPin);
+
+        // WHEN a request is made from the SimPin screens to show the next security method
+        when(mKeyguardSecurityModel.getSecurityMode(TARGET_USER_ID)).thenReturn(SecurityMode.None);
+        mKeyguardSecurityContainerController.showNextSecurityScreenOrFinish(
+                /* authenticated= */true,
+                TARGET_USER_ID,
+                /* bypassSecondaryLockScreen= */true,
+                SecurityMode.SimPin);
+
+        // THEN the next security method of None will dismiss keyguard.
+        verify(mViewMediatorCallback).keyguardDone(anyBoolean(), anyInt());
+    }
+
+    @Test
+    public void showNextSecurityScreenOrFinish_DeviceNotSecure_prevent_bypass_on() {
+        when(mFeatureFlags.isEnabled(Flags.PREVENT_BYPASS_KEYGUARD)).thenReturn(true);
+        // GIVEN the current security method is SimPin
+        when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false);
+        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(TARGET_USER_ID)).thenReturn(false);
+        mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.SimPin);
+
+        // WHEN a request is made from the SimPin screens to show the next security method
+        when(mKeyguardSecurityModel.getSecurityMode(TARGET_USER_ID)).thenReturn(SecurityMode.None);
+        mKeyguardSecurityContainerController.showNextSecurityScreenOrFinish(
+                /* authenticated= */true,
+                TARGET_USER_ID,
+                /* bypassSecondaryLockScreen= */true,
+                SecurityMode.SimPin);
+
+        // THEN the next security method of None will dismiss keyguard.
+        verify(mViewMediatorCallback).keyguardDone(anyBoolean(), anyInt());
+    }
+
+    @Test
     public void showNextSecurityScreenOrFinish_ignoresCallWhenSecurityMethodHasChanged() {
         //GIVEN current security mode has been set to PIN
         mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.PIN);
@@ -581,12 +620,12 @@
         // Set initial gravity
         mTestableResources.addOverride(R.integer.keyguard_host_view_gravity,
                 Gravity.CENTER);
+        mTestableResources.addOverride(
+                R.bool.can_use_one_handed_bouncer, false);
 
         // Kick off the initial pass...
         mKeyguardSecurityContainerController.onInit();
-        verify(mView).setLayoutParams(argThat(
-                (ArgumentMatcher<FrameLayout.LayoutParams>) argument ->
-                        argument.gravity == Gravity.CENTER));
+        verify(mView).setLayoutParams(any());
         clearInvocations(mView);
 
         // Now simulate a config change
@@ -594,9 +633,7 @@
                 Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
 
         mKeyguardSecurityContainerController.updateResources();
-        verify(mView).setLayoutParams(argThat(
-                (ArgumentMatcher<FrameLayout.LayoutParams>) argument ->
-                        argument.gravity == (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM)));
+        verify(mView).setLayoutParams(any());
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java
index 7144914..48f7d92 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java
@@ -16,17 +16,17 @@
 
 package com.android.keyguard;
 
+import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.graphics.Rect;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
 
 import com.android.keyguard.logging.KeyguardLogger;
 import com.android.systemui.SysuiTestCase;
-import com.android.systemui.plugins.ClockAnimations;
+import com.android.systemui.plugins.ClockController;
 import com.android.systemui.statusbar.phone.DozeParameters;
 import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
 import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -118,14 +118,10 @@
     }
 
     @Test
-    public void getClockAnimations_forwardsToClockSwitch() {
-        ClockAnimations mockClockAnimations = mock(ClockAnimations.class);
-        when(mKeyguardClockSwitchController.getClockAnimations()).thenReturn(mockClockAnimations);
+    public void getClock_forwardsToClockSwitch() {
+        ClockController mockClock = mock(ClockController.class);
+        when(mKeyguardClockSwitchController.getClock()).thenReturn(mockClock);
 
-        Rect r1 = new Rect(1, 2, 3, 4);
-        Rect r2 = new Rect(5, 6, 7, 8);
-        mController.getClockAnimations().onPositionUpdated(r1, r2, 0.3f);
-
-        verify(mockClockAnimations).onPositionUpdated(r1, r2, 0.3f);
+        assertEquals(mockClock, mController.getClockController());
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerTest.java
index 33f0ae5..b6287598 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerTest.java
@@ -141,27 +141,6 @@
     }
 
     @Test
-    public void testUnlockIconShows_biometricUnlockedTrue() {
-        // GIVEN UDFPS sensor location is available
-        setupUdfps();
-
-        // GIVEN lock icon controller is initialized and view is attached
-        init(/* useMigrationFlag= */false);
-        captureKeyguardUpdateMonitorCallback();
-
-        // GIVEN user has unlocked with a biometric auth (ie: face auth)
-        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
-        reset(mLockIconView);
-
-        // WHEN face auth's biometric running state changes
-        mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
-                BiometricSourceType.FACE);
-
-        // THEN the unlock icon is shown
-        verify(mLockIconView).setContentDescription(UNLOCKED_LABEL);
-    }
-
-    @Test
     public void testLockIconStartState() {
         // GIVEN lock icon state
         setupShowLockIcon();
@@ -268,27 +247,6 @@
     }
 
     @Test
-    public void lockIconShows_afterBiometricsCleared() {
-        // GIVEN lock icon controller is initialized and view is attached
-        init(/* useMigrationFlag= */false);
-        captureKeyguardUpdateMonitorCallback();
-
-        // GIVEN user has unlocked with a biometric auth (ie: face auth)
-        // and biometric running state changes
-        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
-        mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
-                BiometricSourceType.FACE);
-        reset(mLockIconView);
-
-        // WHEN biometrics are cleared
-        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(false);
-        mKeyguardUpdateMonitorCallback.onBiometricsCleared();
-
-        // THEN the lock icon is shown
-        verify(mLockIconView).setContentDescription(LOCKED_LABEL);
-    }
-
-    @Test
     public void lockIconShows_afterUnlockStateChanges() {
         // GIVEN lock icon controller is initialized and view is attached
         init(/* useMigrationFlag= */false);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogTest.kt
index eb82956..353a7c3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogTest.kt
@@ -26,6 +26,8 @@
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.common.ui.view.SeekBarWithIconButtonsView
 import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.mockito.capture
+import com.android.systemui.util.mockito.whenever
 import com.android.systemui.util.settings.FakeSettings
 import com.android.systemui.util.settings.SecureSettings
 import com.android.systemui.util.settings.SystemSettings
@@ -34,6 +36,10 @@
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mockito.spy
+import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
 
 private const val ON: Int = 1
@@ -53,6 +59,9 @@
             .getResources()
             .getStringArray(com.android.settingslib.R.array.entryvalues_font_size)
 
+    @Captor
+    private lateinit var seekBarChangeCaptor: ArgumentCaptor<SeekBar.OnSeekBarChangeListener>
+
     @Before
     fun setUp() {
         MockitoAnnotations.initMocks(this)
@@ -61,7 +70,7 @@
         secureSettings = FakeSettings()
         backgroundExecutor = FakeExecutor(FakeSystemClock())
         fontScalingDialog =
-            FontScalingDialog(mContext, systemSettings, secureSettings, backgroundExecutor)
+            spy(FontScalingDialog(mContext, systemSettings, secureSettings, backgroundExecutor))
     }
 
     @Test
@@ -70,7 +79,7 @@
 
         val seekBar: SeekBar = fontScalingDialog.findViewById<SeekBar>(R.id.seekbar)!!
         val progress: Int = seekBar.getProgress()
-        val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def = */ 1.0f)
+        val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def= */ 1.0f)
 
         assertThat(currentScale).isEqualTo(fontSizeValueArray[progress].toFloat())
 
@@ -91,7 +100,7 @@
         iconEndFrame.performClick()
         backgroundExecutor.runAllReady()
 
-        val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def = */ 1.0f)
+        val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def= */ 1.0f)
         assertThat(seekBar.getProgress()).isEqualTo(1)
         assertThat(currentScale).isEqualTo(fontSizeValueArray[1].toFloat())
 
@@ -112,7 +121,7 @@
         iconStartFrame.performClick()
         backgroundExecutor.runAllReady()
 
-        val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def = */ 1.0f)
+        val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def= */ 1.0f)
         assertThat(seekBar.getProgress()).isEqualTo(fontSizeValueArray.size - 2)
         assertThat(currentScale)
             .isEqualTo(fontSizeValueArray[fontSizeValueArray.size - 2].toFloat())
@@ -141,4 +150,64 @@
 
         fontScalingDialog.dismiss()
     }
+
+    @Test
+    fun dragSeekbar_systemFontSizeSettingsDoesNotChange() {
+        val slider: SeekBarWithIconButtonsView = spy(SeekBarWithIconButtonsView(mContext))
+        whenever(
+                fontScalingDialog.findViewById<SeekBarWithIconButtonsView>(R.id.font_scaling_slider)
+            )
+            .thenReturn(slider)
+        fontScalingDialog.show()
+        verify(slider).setOnSeekBarChangeListener(capture(seekBarChangeCaptor))
+        val seekBar: SeekBar = slider.findViewById(R.id.seekbar)!!
+
+        // Default seekbar progress for font size is 1, simulate dragging to 0 without
+        // releasing the finger.
+        seekBarChangeCaptor.value.onStartTrackingTouch(seekBar)
+        // Update seekbar progress. This will trigger onProgressChanged in the
+        // OnSeekBarChangeListener and the seekbar could get updated progress value
+        // in onStopTrackingTouch.
+        seekBar.progress = 0
+        backgroundExecutor.runAllReady()
+
+        // Verify that the scale of font size remains the default value 1.0f.
+        var systemScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def= */ 1.0f)
+        assertThat(systemScale).isEqualTo(1.0f)
+
+        // Simulate releasing the finger from the seekbar.
+        seekBarChangeCaptor.value.onStopTrackingTouch(seekBar)
+        backgroundExecutor.runAllReady()
+
+        // Verify that the scale of font size has been updated.
+        systemScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def= */ 1.0f)
+        assertThat(systemScale).isEqualTo(fontSizeValueArray[0].toFloat())
+
+        fontScalingDialog.dismiss()
+    }
+
+    @Test
+    fun dragSeekBar_createTextPreview() {
+        val slider: SeekBarWithIconButtonsView = spy(SeekBarWithIconButtonsView(mContext))
+        whenever(
+                fontScalingDialog.findViewById<SeekBarWithIconButtonsView>(R.id.font_scaling_slider)
+            )
+            .thenReturn(slider)
+        fontScalingDialog.show()
+        verify(slider).setOnSeekBarChangeListener(capture(seekBarChangeCaptor))
+        val seekBar: SeekBar = slider.findViewById(R.id.seekbar)!!
+
+        // Default seekbar progress for font size is 1, simulate dragging to 0 without
+        // releasing the finger
+        seekBarChangeCaptor.value.onStartTrackingTouch(seekBar)
+        seekBarChangeCaptor.value.onProgressChanged(
+            seekBar,
+            /* progress= */ 0,
+            /* fromUser= */ false
+        )
+        backgroundExecutor.runAllReady()
+
+        verify(fontScalingDialog).createTextPreview(/* index= */ 0)
+        fontScalingDialog.dismiss()
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt
index 6ddba0b..b41053c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt
@@ -25,7 +25,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mock
-import org.mockito.Mockito.timeout
+import org.mockito.Mockito.times
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.verifyZeroInteractions
 import org.mockito.junit.MockitoJUnit
@@ -49,17 +49,31 @@
     }
 
     @Test
-    fun testEnableDetector_shouldPostRunnable() {
+    fun testEnableDetector_expandWithTrack_shouldPostRunnable() {
         detector.enable(action)
         // simulate notification expand
         shadeExpansionStateManager.onPanelExpansionChanged(5566f, true, true, 5566f)
-        verify(action, timeout(5000).times(1)).run()
+        verify(action).run()
+    }
+
+    @Test
+    fun testEnableDetector_trackOnly_shouldPostRunnable() {
+        detector.enable(action)
+        // simulate notification expand
+        shadeExpansionStateManager.onPanelExpansionChanged(5566f, false, true, 5566f)
+        verify(action).run()
+    }
+
+    @Test
+    fun testEnableDetector_expandOnly_shouldPostRunnable() {
+        detector.enable(action)
+        // simulate notification expand
+        shadeExpansionStateManager.onPanelExpansionChanged(5566f, true, false, 5566f)
+        verify(action).run()
     }
 
     @Test
     fun testEnableDetector_shouldNotPostRunnable() {
-        var detector =
-            AuthDialogPanelInteractionDetector(shadeExpansionStateManager, mContext.mainExecutor)
         detector.enable(action)
         detector.disable()
         shadeExpansionStateManager.onPanelExpansionChanged(5566f, true, true, 5566f)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt
index a245c01..7d9ccb642 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt
@@ -36,7 +36,6 @@
 import com.android.systemui.statusbar.commandline.CommandRegistry
 import com.android.systemui.statusbar.phone.BiometricUnlockController
 import com.android.systemui.statusbar.phone.CentralSurfaces
-import com.android.systemui.statusbar.phone.KeyguardBypassController
 import com.android.systemui.statusbar.policy.ConfigurationController
 import com.android.systemui.statusbar.policy.KeyguardStateController
 import com.android.systemui.util.leak.RotationUtils
@@ -50,6 +49,7 @@
 import org.mockito.ArgumentCaptor
 import org.mockito.ArgumentMatchers
 import org.mockito.ArgumentMatchers.eq
+import org.mockito.Captor
 import org.mockito.Mock
 import org.mockito.Mockito.`when`
 import org.mockito.Mockito.never
@@ -73,16 +73,28 @@
     @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
     @Mock private lateinit var authController: AuthController
     @Mock private lateinit var keyguardStateController: KeyguardStateController
-    @Mock private lateinit var wakefulnessLifecycle: WakefulnessLifecycle
-    @Mock private lateinit var notificationShadeWindowController: NotificationShadeWindowController
-    @Mock private lateinit var bypassController: KeyguardBypassController
-    @Mock private lateinit var biometricUnlockController: BiometricUnlockController
-    @Mock private lateinit var udfpsControllerProvider: Provider<UdfpsController>
-    @Mock private lateinit var udfpsController: UdfpsController
-    @Mock private lateinit var statusBarStateController: StatusBarStateController
-    @Mock private lateinit var featureFlags: FeatureFlags
-    @Mock private lateinit var lightRevealScrim: LightRevealScrim
-    @Mock private lateinit var fpSensorProp: FingerprintSensorPropertiesInternal
+    @Mock
+    private lateinit var wakefulnessLifecycle: WakefulnessLifecycle
+    @Mock
+    private lateinit var notificationShadeWindowController: NotificationShadeWindowController
+    @Mock
+    private lateinit var biometricUnlockController: BiometricUnlockController
+    @Mock
+    private lateinit var udfpsControllerProvider: Provider<UdfpsController>
+    @Mock
+    private lateinit var udfpsController: UdfpsController
+    @Mock
+    private lateinit var statusBarStateController: StatusBarStateController
+    @Mock
+    private lateinit var featureFlags: FeatureFlags
+    @Mock
+    private lateinit var lightRevealScrim: LightRevealScrim
+    @Mock
+    private lateinit var fpSensorProp: FingerprintSensorPropertiesInternal
+
+    @Captor
+    private lateinit var biometricUnlockListener:
+            ArgumentCaptor<BiometricUnlockController.BiometricUnlockEventsListener>
 
     @Before
     fun setUp() {
@@ -106,13 +118,12 @@
             wakefulnessLifecycle,
             commandRegistry,
             notificationShadeWindowController,
-            bypassController,
-            biometricUnlockController,
             udfpsControllerProvider,
             statusBarStateController,
             featureFlags,
             KeyguardLogger(logcatLogBuffer(AuthRippleController.TAG)),
-            rippleView
+            biometricUnlockController,
+            rippleView,
         )
         controller.init()
         `when`(mCentralSurfaces.lightRevealScrim).thenReturn(lightRevealScrim)
@@ -134,12 +145,9 @@
                 eq(BiometricSourceType.FINGERPRINT))).thenReturn(true)
 
         // WHEN fingerprint authenticated
-        val captor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java)
-        verify(keyguardUpdateMonitor).registerCallback(captor.capture())
-        captor.value.onBiometricAuthenticated(
-            0 /* userId */,
-            BiometricSourceType.FINGERPRINT /* type */,
-            false /* isStrongBiometric */)
+        verify(biometricUnlockController).addListener(biometricUnlockListener.capture())
+        biometricUnlockListener.value
+                .onBiometricUnlockedWithKeyguardDismissal(BiometricSourceType.FINGERPRINT)
 
         // THEN update sensor location and show ripple
         verify(rippleView).setFingerprintSensorLocation(fpsLocation, 0f)
@@ -191,51 +199,6 @@
     }
 
     @Test
-    fun testFaceTriggerBypassEnabled_Ripple() {
-        // GIVEN face auth sensor exists, keyguard is showing & unlocking with face is allowed
-        val faceLocation = Point(5, 5)
-        `when`(authController.faceSensorLocation).thenReturn(faceLocation)
-        controller.onViewAttached()
-
-        `when`(keyguardStateController.isShowing).thenReturn(true)
-        `when`(keyguardUpdateMonitor.isUnlockingWithBiometricAllowed(
-                BiometricSourceType.FACE)).thenReturn(true)
-
-        // WHEN bypass is enabled & face authenticated
-        `when`(bypassController.canBypass()).thenReturn(true)
-        val captor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java)
-        verify(keyguardUpdateMonitor).registerCallback(captor.capture())
-        captor.value.onBiometricAuthenticated(
-            0 /* userId */,
-            BiometricSourceType.FACE /* type */,
-            false /* isStrongBiometric */)
-
-        // THEN show ripple
-        verify(rippleView).setSensorLocation(faceLocation)
-        verify(rippleView).startUnlockedRipple(any())
-    }
-
-    @Test
-    fun testFaceTriggerNonBypass_NoRipple() {
-        // GIVEN face auth sensor exists
-        val faceLocation = Point(5, 5)
-        `when`(authController.faceSensorLocation).thenReturn(faceLocation)
-        controller.onViewAttached()
-
-        // WHEN bypass isn't enabled & face authenticated
-        `when`(bypassController.canBypass()).thenReturn(false)
-        val captor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java)
-        verify(keyguardUpdateMonitor).registerCallback(captor.capture())
-        captor.value.onBiometricAuthenticated(
-            0 /* userId */,
-            BiometricSourceType.FACE /* type */,
-            false /* isStrongBiometric */)
-
-        // THEN no ripple
-        verify(rippleView, never()).startUnlockedRipple(any())
-    }
-
-    @Test
     fun testNullFaceSensorLocationDoesNothing() {
         `when`(authController.faceSensorLocation).thenReturn(null)
         controller.onViewAttached()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
index bb037642..b2c2ae7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
@@ -21,6 +21,7 @@
 import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_KEYGUARD
 import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_OTHER
 import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_SETTINGS
+import android.hardware.biometrics.BiometricOverlayConstants.REASON_ENROLL_ENROLLING
 import android.hardware.biometrics.BiometricOverlayConstants.ShowReason
 import android.hardware.fingerprint.FingerprintManager
 import android.hardware.fingerprint.IUdfpsOverlayControllerCallback
@@ -29,6 +30,7 @@
 import android.view.LayoutInflater
 import android.view.MotionEvent
 import android.view.Surface
+import android.view.Surface.ROTATION_0
 import android.view.Surface.Rotation
 import android.view.View
 import android.view.WindowManager
@@ -42,6 +44,7 @@
 import com.android.systemui.animation.ActivityLaunchAnimator
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.flags.Flags
 import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor
 import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor
 import com.android.systemui.plugins.statusbar.StatusBarStateController
@@ -159,9 +162,10 @@
     private fun withRotation(@Rotation rotation: Int, block: () -> Unit) {
         // Sensor that's in the top left corner of the display in natural orientation.
         val sensorBounds = Rect(0, 0, SENSOR_WIDTH, SENSOR_HEIGHT)
+        val overlayBounds = Rect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT)
         overlayParams = UdfpsOverlayParams(
             sensorBounds,
-            sensorBounds,
+            overlayBounds,
             DISPLAY_WIDTH,
             DISPLAY_HEIGHT,
             scaleFactor = 1f,
@@ -314,4 +318,24 @@
         assertThat(controllerOverlay.matchesRequestId(REQUEST_ID)).isTrue()
         assertThat(controllerOverlay.matchesRequestId(REQUEST_ID + 1)).isFalse()
     }
+
+    @Test
+    fun smallOverlayOnEnrollmentWithA11y() = withRotation(ROTATION_0) {
+        withReason(REASON_ENROLL_ENROLLING) {
+            // When a11y enabled during enrollment
+            whenever(accessibilityManager.isTouchExplorationEnabled).thenReturn(true)
+            whenever(featureFlags.isEnabled(Flags.UDFPS_NEW_TOUCH_DETECTION)).thenReturn(true)
+
+            controllerOverlay.show(udfpsController, overlayParams)
+            verify(windowManager).addView(
+                eq(controllerOverlay.overlayView),
+                layoutParamsCaptor.capture()
+            )
+
+            // Layout params should use sensor bounds
+            val lp = layoutParamsCaptor.value
+            assertThat(lp.width).isEqualTo(overlayParams.sensorBounds.width())
+            assertThat(lp.height).isEqualTo(overlayParams.sensorBounds.height())
+        }
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index 445cc87..edee3f1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -1344,6 +1344,46 @@
     }
 
     @Test
+    public void onTouch_withNewTouchDetection_pilferPointerWhenAltBouncerShowing()
+            throws RemoteException {
+        final NormalizedTouchData touchData = new NormalizedTouchData(0, 0f, 0f, 0f, 0f, 0f, 0L,
+                0L);
+        final TouchProcessorResult processorResultUnchanged =
+                new TouchProcessorResult.ProcessedTouch(InteractionEvent.UNCHANGED,
+                        1 /* pointerId */, touchData);
+
+        // Enable new touch detection.
+        when(mFeatureFlags.isEnabled(Flags.UDFPS_NEW_TOUCH_DETECTION)).thenReturn(true);
+
+        // Configure UdfpsController to use FingerprintManager as opposed to AlternateTouchProvider.
+        initUdfpsController(mOpticalProps, false /* hasAlternateTouchProvider */);
+
+        // Configure UdfpsView to not accept the ACTION_DOWN event
+        when(mUdfpsView.isDisplayConfigured()).thenReturn(false);
+        when(mUdfpsView.isWithinSensorArea(anyFloat(), anyFloat())).thenReturn(false);
+
+        // GIVEN that the alternate bouncer is showing and a11y touch exploration NOT enabled
+        when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(false);
+        when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
+        mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
+                BiometricOverlayConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
+        mFgExecutor.runAllReady();
+
+        verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture());
+
+        // WHEN ACTION_DOWN is received and touch is not within sensor
+        when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
+                processorResultUnchanged);
+        MotionEvent downEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
+        mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
+        mBiometricExecutor.runAllReady();
+        downEvent.recycle();
+
+        // THEN the touch is pilfered
+        verify(mInputManager, times(1)).pilferPointers(any());
+    }
+
+    @Test
     public void onAodInterrupt_onAcquiredGood_fingerNoLongerDown() throws RemoteException {
         // GIVEN UDFPS overlay is showing
         mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
index f437a8f..6d9acb9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
@@ -19,6 +19,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.never;
@@ -157,6 +158,22 @@
     }
 
     @Test
+    public void onBiometricAuthenticated_pauseAuth() {
+        // GIVEN view is attached and we're on the keyguard (see testShouldNotPauseAuthOnKeyguard)
+        mController.onViewAttached();
+        captureStatusBarStateListeners();
+        sendStatusBarStateChanged(StatusBarState.KEYGUARD);
+
+        // WHEN biometric is authenticated
+        captureKeyguardStateControllerCallback();
+        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
+        mKeyguardStateControllerCallback.onUnlockedChanged();
+
+        // THEN pause auth
+        assertTrue(mController.shouldPauseAuth());
+    }
+
+    @Test
     public void testShouldPauseAuthIsLaunchTransitionFadingAway() {
         // GIVEN view is attached and we're on the keyguard (see testShouldNotPauseAuthOnKeyguard)
         mController.onViewAttached();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractorImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractorImplTest.kt
index 94489ad..1f2b64d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractorImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractorImplTest.kt
@@ -191,18 +191,11 @@
             foldListener.onFoldUpdate(FOLD_UPDATE_FINISH_CLOSED)
             keyguardTransitionRepository.startTransitionTo(KeyguardState.AOD)
 
-            var aod: Boolean? = null
-            var awake: Boolean? = null
             var folded: Int? = null
             var displayState: Int? = null
             val job =
                 interactor.addBiometricContextListener(
                     object : IBiometricContextListener.Stub() {
-                        override fun onDozeChanged(isAod: Boolean, isAwake: Boolean) {
-                            aod = isAod
-                            awake = isAwake
-                        }
-
                         override fun onFoldChanged(foldState: Int) {
                             folded = foldState
                         }
@@ -214,8 +207,6 @@
                 )
             runCurrent()
 
-            assertThat(aod).isTrue()
-            assertThat(awake).isFalse()
             assertThat(folded).isEqualTo(FoldState.FULLY_CLOSED)
             assertThat(displayState).isEqualTo(AuthenticateOptions.DISPLAY_STATE_AOD)
 
@@ -224,8 +215,6 @@
             keyguardTransitionRepository.startTransitionTo(KeyguardState.LOCKSCREEN)
             runCurrent()
 
-            assertThat(aod).isFalse()
-            assertThat(awake).isTrue()
             assertThat(folded).isEqualTo(FoldState.HALF_OPENED)
             assertThat(displayState).isEqualTo(AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN)
 
@@ -236,8 +225,6 @@
             keyguardTransitionRepository.startTransitionTo(KeyguardState.AOD)
             runCurrent()
 
-            assertThat(aod).isFalse()
-            assertThat(awake).isTrue()
             assertThat(folded).isEqualTo(FoldState.HALF_OPENED)
             assertThat(displayState).isEqualTo(AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN)
         }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java
index ffd75fb..299869c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java
@@ -20,7 +20,10 @@
 
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_ACTION_SHOWN;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_DISMISS_TAPPED;
+import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_EXPANDED_FROM_MINIMIZED;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_SHARE_TAPPED;
+import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_SHOWN_EXPANDED;
+import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_SHOWN_MINIMIZED;
 import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_SWIPE_DISMISSED;
 import static com.android.systemui.flags.Flags.CLIPBOARD_MINIMIZED_LAYOUT;
 import static com.android.systemui.flags.Flags.CLIPBOARD_REMOTE_BEHAVIOR;
@@ -340,9 +343,10 @@
 
     @Test
     public void test_setClipData_textData() {
-        mOverlayController.setClipData(mSampleClipData, "");
+        mOverlayController.setClipData(mSampleClipData, "abc");
 
         verify(mClipboardOverlayView, times(1)).showTextPreview("Test Item", false);
+        verify(mUiEventLogger, times(1)).log(CLIPBOARD_OVERLAY_SHOWN_EXPANDED, 0, "abc");
         verify(mClipboardOverlayView, times(1)).showShareChip();
         verify(mClipboardOverlayView, times(1)).getEnterAnimation();
     }
@@ -440,6 +444,8 @@
 
         verify(mUiEventLogger).log(CLIPBOARD_OVERLAY_DISMISS_TAPPED, 0, "first.package");
         verify(mUiEventLogger).log(CLIPBOARD_OVERLAY_DISMISS_TAPPED, 0, "second.package");
+        verify(mUiEventLogger).log(CLIPBOARD_OVERLAY_SHOWN_EXPANDED, 0, "first.package");
+        verify(mUiEventLogger).log(CLIPBOARD_OVERLAY_SHOWN_EXPANDED, 0, "second.package");
         verifyNoMoreInteractions(mUiEventLogger);
     }
 
@@ -465,6 +471,7 @@
         mExecutor.runAllReady();
 
         verify(mUiEventLogger).log(CLIPBOARD_OVERLAY_ACTION_SHOWN, 0, "actionShownSource");
+        verify(mUiEventLogger).log(CLIPBOARD_OVERLAY_SHOWN_EXPANDED, 0, "actionShownSource");
         verifyNoMoreInteractions(mUiEventLogger);
     }
 
@@ -481,11 +488,12 @@
     public void test_insets_showsMinimized() {
         when(mClipboardOverlayWindow.getWindowInsets()).thenReturn(
                 getImeInsets(new Rect(0, 0, 0, 1)));
-        mOverlayController.setClipData(mSampleClipData, "");
+        mOverlayController.setClipData(mSampleClipData, "abc");
         Animator mockFadeoutAnimator = Mockito.mock(Animator.class);
         when(mClipboardOverlayView.getMinimizedFadeoutAnimation()).thenReturn(mockFadeoutAnimator);
 
         verify(mClipboardOverlayView).setMinimized(true);
+        verify(mUiEventLogger, times(1)).log(CLIPBOARD_OVERLAY_SHOWN_MINIMIZED, 0, "abc");
         verify(mClipboardOverlayView, never()).setMinimized(false);
         verify(mClipboardOverlayView, never()).showTextPreview(any(), anyBoolean());
 
@@ -495,6 +503,8 @@
 
         verify(mClipboardOverlayView).setMinimized(false);
         verify(mClipboardOverlayView).showTextPreview("Test Item", false);
+        verify(mUiEventLogger, times(1)).log(CLIPBOARD_OVERLAY_EXPANDED_FROM_MINIMIZED, 0, "abc");
+        verify(mUiEventLogger, never()).log(CLIPBOARD_OVERLAY_SHOWN_EXPANDED, 0, "abc");
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogTest.kt
new file mode 100644
index 0000000..7753197
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogTest.kt
@@ -0,0 +1,84 @@
+/*
+ * 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.contrast
+
+import android.app.UiModeManager
+import android.app.UiModeManager.ContrastUtils.fromContrastLevel
+import android.os.Looper
+import android.provider.Settings
+import android.testing.AndroidTestingRunner
+import android.widget.FrameLayout
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.settings.SecureSettings
+import com.google.common.util.concurrent.MoreExecutors
+import java.util.concurrent.Executor
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.eq
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+/** Test the behaviour of buttons of the [ContrastDialog]. */
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class ContrastDialogTest : SysuiTestCase() {
+
+    private lateinit var mainExecutor: Executor
+    private lateinit var contrastDialog: ContrastDialog
+    @Mock private lateinit var mockUiModeManager: UiModeManager
+    @Mock private lateinit var mockUserTracker: UserTracker
+    @Mock private lateinit var mockSecureSettings: SecureSettings
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        mainExecutor = MoreExecutors.directExecutor()
+        whenever(mockUserTracker.userId).thenReturn(context.userId)
+    }
+
+    @Test
+    fun testClickButtons_putsContrastInSettings() {
+        if (Looper.myLooper() == null) Looper.prepare()
+        contrastDialog =
+            ContrastDialog(
+                context,
+                mainExecutor,
+                mockUiModeManager,
+                mockUserTracker,
+                mockSecureSettings
+            )
+        contrastDialog.show()
+        try {
+            contrastDialog.contrastButtons.forEach {
+                (contrastLevel: Int, clickedButton: FrameLayout) ->
+                clickedButton.performClick()
+                verify(mockSecureSettings)
+                    .putFloatForUser(
+                        eq(Settings.Secure.CONTRAST_LEVEL),
+                        eq(fromContrastLevel(contrastLevel)),
+                        eq(context.userId)
+                    )
+            }
+        } finally {
+            contrastDialog.dismiss()
+        }
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlActionCoordinatorImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlActionCoordinatorImplTest.kt
index 16fb50c..38372a3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlActionCoordinatorImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlActionCoordinatorImplTest.kt
@@ -29,7 +29,7 @@
 import com.android.systemui.statusbar.VibratorHelper
 import com.android.systemui.statusbar.policy.KeyguardStateController
 import com.android.systemui.util.concurrency.DelayableExecutor
-import com.android.wm.shell.TaskViewFactory
+import com.android.wm.shell.taskview.TaskViewFactory
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/AllModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/AllModelTest.kt
index 236384b..4ea9616 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/AllModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/AllModelTest.kt
@@ -32,6 +32,7 @@
 import org.junit.runner.RunWith
 import org.mockito.Mock
 import org.mockito.Mockito.never
+import org.mockito.Mockito.times
 import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
 
@@ -161,6 +162,7 @@
         }
 
         verify(controlsModelCallback).onFirstChange()
+        verify(controlsModelCallback).onChange()
     }
 
     @Test
@@ -176,6 +178,7 @@
         )
 
         verify(controlsModelCallback).onFirstChange()
+        verify(controlsModelCallback).onChange()
     }
 
     @Test
@@ -191,6 +194,7 @@
         }
 
         verify(controlsModelCallback, never()).onFirstChange()
+        verify(controlsModelCallback, never()).onChange()
     }
 
     @Test
@@ -207,6 +211,7 @@
         }
 
         verify(controlsModelCallback).onFirstChange()
+        verify(controlsModelCallback).onChange()
     }
 
     @Test
@@ -222,6 +227,7 @@
         )
 
         verify(controlsModelCallback).onFirstChange()
+        verify(controlsModelCallback).onChange()
     }
 
     @Test
@@ -236,5 +242,24 @@
         }
 
         verify(controlsModelCallback, never()).onFirstChange()
+        verify(controlsModelCallback, never()).onChange()
+    }
+
+    @Test
+    fun testAddSecondChange_callbacks() {
+        model.changeFavoriteStatus("${idPrefix}4", true)
+        model.changeFavoriteStatus("${idPrefix}5", true)
+
+        verify(controlsModelCallback).onFirstChange()
+        verify(controlsModelCallback, times(2)).onChange()
+    }
+
+    @Test
+    fun testRemoveSecondChange_callbacks() {
+        model.changeFavoriteStatus("${idPrefix}1", false)
+        model.changeFavoriteStatus("${idPrefix}3", false)
+
+        verify(controlsModelCallback).onFirstChange()
+        verify(controlsModelCallback, times(2)).onChange()
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsEditingActivityTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsEditingActivityTest.kt
index 3b6f7d1..4210675 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsEditingActivityTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsEditingActivityTest.kt
@@ -2,27 +2,33 @@
 
 import android.content.ComponentName
 import android.content.Intent
+import android.os.Bundle
 import android.testing.AndroidTestingRunner
 import android.testing.TestableLooper
+import android.view.View
+import android.widget.Button
 import android.window.OnBackInvokedCallback
 import android.window.OnBackInvokedDispatcher
 import androidx.test.filters.SmallTest
 import androidx.test.rule.ActivityTestRule
 import androidx.test.runner.intercepting.SingleActivityFactory
+import com.android.systemui.R
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.controls.CustomIconCache
 import com.android.systemui.controls.controller.ControlsControllerImpl
-import com.android.systemui.controls.ui.ControlsUiController
+import com.android.systemui.flags.FakeFeatureFlags
+import com.android.systemui.flags.Flags
 import com.android.systemui.settings.UserTracker
 import com.android.systemui.util.concurrency.FakeExecutor
 import com.android.systemui.util.time.FakeSystemClock
+import com.google.common.truth.Truth.assertThat
 import java.util.concurrent.CountDownLatch
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.ArgumentCaptor
-import org.mockito.ArgumentMatchers
+import org.mockito.ArgumentMatchers.eq
 import org.mockito.Captor
 import org.mockito.Mock
 import org.mockito.Mockito.verify
@@ -32,7 +38,15 @@
 @RunWith(AndroidTestingRunner::class)
 @TestableLooper.RunWithLooper
 class ControlsEditingActivityTest : SysuiTestCase() {
+
+    private companion object {
+        val TEST_COMPONENT = ComponentName("TestPackageName", "TestClassName")
+        val TEST_STRUCTURE: CharSequence = "TestStructure"
+        val TEST_APP: CharSequence = "TestApp"
+    }
+
     private val uiExecutor = FakeExecutor(FakeSystemClock())
+    private val featureFlags = FakeFeatureFlags()
 
     @Mock lateinit var controller: ControlsControllerImpl
 
@@ -40,9 +54,6 @@
 
     @Mock lateinit var customIconCache: CustomIconCache
 
-    @Mock lateinit var uiController: ControlsUiController
-
-    private lateinit var controlsEditingActivity: ControlsEditingActivity_Factory
     private var latch: CountDownLatch = CountDownLatch(1)
 
     @Mock private lateinit var mockDispatcher: OnBackInvokedDispatcher
@@ -58,11 +69,11 @@
                 ) {
                 override fun create(intent: Intent?): TestableControlsEditingActivity {
                     return TestableControlsEditingActivity(
+                        featureFlags,
                         uiExecutor,
                         controller,
                         userTracker,
                         customIconCache,
-                        uiController,
                         mockDispatcher,
                         latch
                     )
@@ -75,19 +86,17 @@
     @Before
     fun setUp() {
         MockitoAnnotations.initMocks(this)
-        val intent = Intent()
-        intent.putExtra(ControlsEditingActivity.EXTRA_STRUCTURE, "TestTitle")
-        val cname = ComponentName("TestPackageName", "TestClassName")
-        intent.putExtra(Intent.EXTRA_COMPONENT_NAME, cname)
-        activityRule.launchActivity(intent)
+
+        featureFlags.set(Flags.CONTROLS_MANAGEMENT_NEW_FLOWS, false)
     }
 
     @Test
     fun testBackCallbackRegistrationAndUnregistration() {
+        launchActivity()
         // 1. ensure that launching the activity results in it registering a callback
         verify(mockDispatcher)
             .registerOnBackInvokedCallback(
-                ArgumentMatchers.eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT),
+                eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT),
                 captureCallback.capture()
             )
         activityRule.finishActivity()
@@ -96,15 +105,102 @@
         verify(mockDispatcher).unregisterOnBackInvokedCallback(captureCallback.value)
     }
 
-    public class TestableControlsEditingActivity(
-        private val executor: FakeExecutor,
-        private val controller: ControlsControllerImpl,
-        private val userTracker: UserTracker,
-        private val customIconCache: CustomIconCache,
-        private val uiController: ControlsUiController,
+    @Test
+    fun testNewFlowDisabled_addControlsButton_gone() {
+        with(launchActivity()) {
+            val addControlsButton = requireViewById<Button>(R.id.addControls)
+            assertThat(addControlsButton.visibility).isEqualTo(View.GONE)
+        }
+    }
+
+    @Test
+    fun testNewFlowEnabled_addControlsButton_visible() {
+        featureFlags.set(Flags.CONTROLS_MANAGEMENT_NEW_FLOWS, true)
+        with(launchActivity()) {
+            val addControlsButton = requireViewById<Button>(R.id.addControls)
+            assertThat(addControlsButton.visibility).isEqualTo(View.VISIBLE)
+            assertThat(addControlsButton.isEnabled).isTrue()
+        }
+    }
+
+    @Test
+    fun testNotLaunchFromFavoriting_saveButton_disabled() {
+        featureFlags.set(Flags.CONTROLS_MANAGEMENT_NEW_FLOWS, true)
+        with(launchActivity(isFromFavoriting = false)) {
+            val saveButton = requireViewById<Button>(R.id.done)
+            assertThat(saveButton.isEnabled).isFalse()
+        }
+    }
+
+    @Test
+    fun testLaunchFromFavoriting_saveButton_enabled() {
+        featureFlags.set(Flags.CONTROLS_MANAGEMENT_NEW_FLOWS, true)
+        with(launchActivity(isFromFavoriting = true)) {
+            val saveButton = requireViewById<Button>(R.id.done)
+            assertThat(saveButton.isEnabled).isTrue()
+        }
+    }
+
+    @Test
+    fun testNotFromFavoriting_addControlsPressed_launchesFavouriting() {
+        featureFlags.set(Flags.CONTROLS_MANAGEMENT_NEW_FLOWS, true)
+        with(launchActivity(isFromFavoriting = false)) {
+            val addControls = requireViewById<Button>(R.id.addControls)
+
+            activityRule.runOnUiThread { addControls.performClick() }
+
+            with(startActivityData!!.intent) {
+                assertThat(component)
+                    .isEqualTo(ComponentName(context, ControlsFavoritingActivity::class.java))
+                assertThat(getCharSequenceExtra(ControlsFavoritingActivity.EXTRA_STRUCTURE))
+                    .isEqualTo(TEST_STRUCTURE)
+                assertThat(
+                        getParcelableExtra(Intent.EXTRA_COMPONENT_NAME, ComponentName::class.java)
+                    )
+                    .isEqualTo(TEST_COMPONENT)
+                assertThat(getCharSequenceExtra(ControlsFavoritingActivity.EXTRA_APP))
+                    .isEqualTo(TEST_APP)
+                assertThat(getByteExtra(ControlsFavoritingActivity.EXTRA_SOURCE, -1))
+                    .isEqualTo(ControlsFavoritingActivity.EXTRA_SOURCE_VALUE_FROM_EDITING)
+            }
+        }
+    }
+
+    private fun launchActivity(
+        componentName: ComponentName = TEST_COMPONENT,
+        structure: CharSequence = TEST_STRUCTURE,
+        isFromFavoriting: Boolean = false,
+        app: CharSequence = TEST_APP,
+    ): TestableControlsEditingActivity =
+        activityRule.launchActivity(
+            Intent().apply {
+                putExtra(ControlsEditingActivity.EXTRA_FROM_FAVORITING, isFromFavoriting)
+                putExtra(ControlsEditingActivity.EXTRA_STRUCTURE, structure)
+                putExtra(Intent.EXTRA_COMPONENT_NAME, componentName)
+                putExtra(ControlsEditingActivity.EXTRA_APP, app)
+            }
+        )
+
+    class TestableControlsEditingActivity(
+        featureFlags: FakeFeatureFlags,
+        executor: FakeExecutor,
+        controller: ControlsControllerImpl,
+        userTracker: UserTracker,
+        customIconCache: CustomIconCache,
         private val mockDispatcher: OnBackInvokedDispatcher,
         private val latch: CountDownLatch
-    ) : ControlsEditingActivity(executor, controller, userTracker, customIconCache, uiController) {
+    ) :
+        ControlsEditingActivity(
+            featureFlags,
+            executor,
+            controller,
+            userTracker,
+            customIconCache,
+        ) {
+
+        var startActivityData: StartActivityData? = null
+            private set
+
         override fun getOnBackInvokedDispatcher(): OnBackInvokedDispatcher {
             return mockDispatcher
         }
@@ -114,5 +210,13 @@
             // ensures that test runner thread does not proceed until ui thread is done
             latch.countDown()
         }
+
+        override fun startActivity(intent: Intent) {
+            startActivityData = StartActivityData(intent, null)
+        }
+
+        override fun startActivity(intent: Intent, options: Bundle?) {
+            startActivityData = StartActivityData(intent, options)
+        }
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsFavoritingActivityTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsFavoritingActivityTest.kt
index 3655232..f4cc8bc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsFavoritingActivityTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsFavoritingActivityTest.kt
@@ -1,30 +1,49 @@
 package com.android.systemui.controls.management
 
+import android.content.ComponentName
 import android.content.Intent
+import android.os.Bundle
+import android.service.controls.Control
 import android.testing.AndroidTestingRunner
 import android.testing.TestableLooper
+import android.view.View
+import android.widget.Button
 import android.window.OnBackInvokedCallback
 import android.window.OnBackInvokedDispatcher
 import androidx.test.filters.FlakyTest
 import androidx.test.filters.SmallTest
 import androidx.test.rule.ActivityTestRule
 import androidx.test.runner.intercepting.SingleActivityFactory
+import com.android.systemui.R
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.controls.ControlStatus
+import com.android.systemui.controls.ControlsServiceInfo
+import com.android.systemui.controls.controller.ControlsController
 import com.android.systemui.controls.controller.ControlsControllerImpl
-import com.android.systemui.controls.ui.ControlsUiController
+import com.android.systemui.controls.controller.createLoadDataObject
 import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.flags.FakeFeatureFlags
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.flags.Flags
 import com.android.systemui.settings.UserTracker
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.capture
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.MoreExecutors
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.Executor
+import java.util.function.Consumer
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.Answers
 import org.mockito.ArgumentCaptor
-import org.mockito.ArgumentMatchers
 import org.mockito.Captor
 import org.mockito.Mock
+import org.mockito.Mockito.eq
+import org.mockito.Mockito.mock
 import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
 
@@ -32,7 +51,25 @@
 @RunWith(AndroidTestingRunner::class)
 @TestableLooper.RunWithLooper
 class ControlsFavoritingActivityTest : SysuiTestCase() {
+
+    private companion object {
+        val TEST_COMPONENT = ComponentName("TestPackageName", "TestClassName")
+        val TEST_CONTROL =
+            mock(Control::class.java, Answers.RETURNS_MOCKS)!!.apply {
+                whenever(structure).thenReturn(TEST_STRUCTURE)
+            }
+        val TEST_STRUCTURE: CharSequence = "TestStructure"
+        val TEST_APP: CharSequence = "TestApp"
+
+        private fun View.waitForPost() {
+            val latch = CountDownLatch(1)
+            post(latch::countDown)
+            latch.await()
+        }
+    }
+
     @Main private val executor: Executor = MoreExecutors.directExecutor()
+    private val featureFlags = FakeFeatureFlags()
 
     @Mock lateinit var controller: ControlsControllerImpl
 
@@ -40,13 +77,15 @@
 
     @Mock lateinit var userTracker: UserTracker
 
-    @Mock lateinit var uiController: ControlsUiController
-
-    private lateinit var controlsFavoritingActivity: ControlsFavoritingActivity_Factory
     private var latch: CountDownLatch = CountDownLatch(1)
 
     @Mock private lateinit var mockDispatcher: OnBackInvokedDispatcher
     @Captor private lateinit var captureCallback: ArgumentCaptor<OnBackInvokedCallback>
+    @Captor
+    private lateinit var listingCallback:
+        ArgumentCaptor<ControlsListingController.ControlsListingCallback>
+    @Captor
+    private lateinit var controlsCallback: ArgumentCaptor<Consumer<ControlsController.LoadData>>
 
     @Rule
     @JvmField
@@ -58,11 +97,11 @@
                 ) {
                 override fun create(intent: Intent?): TestableControlsFavoritingActivity {
                     return TestableControlsFavoritingActivity(
+                        featureFlags,
                         executor,
                         controller,
                         listingController,
                         userTracker,
-                        uiController,
                         mockDispatcher,
                         latch
                     )
@@ -75,19 +114,18 @@
     @Before
     fun setUp() {
         MockitoAnnotations.initMocks(this)
-        val intent = Intent()
-        intent.putExtra(ControlsFavoritingActivity.EXTRA_FROM_PROVIDER_SELECTOR, true)
-        activityRule.launchActivity(intent)
+        featureFlags.set(Flags.CONTROLS_MANAGEMENT_NEW_FLOWS, false)
     }
 
     // b/259549854 to root-cause and fix
     @FlakyTest
     @Test
     fun testBackCallbackRegistrationAndUnregistration() {
+        launchActivity()
         // 1. ensure that launching the activity results in it registering a callback
         verify(mockDispatcher)
             .registerOnBackInvokedCallback(
-                ArgumentMatchers.eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT),
+                eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT),
                 captureCallback.capture()
             )
         activityRule.finishActivity()
@@ -96,22 +134,122 @@
         verify(mockDispatcher).unregisterOnBackInvokedCallback(captureCallback.value)
     }
 
-    public class TestableControlsFavoritingActivity(
+    @Test
+    fun testNewFlowEnabled_buttons() {
+        featureFlags.set(Flags.CONTROLS_MANAGEMENT_NEW_FLOWS, true)
+        with(launchActivity()) {
+            verify(listingController).addCallback(listingCallback.capture())
+            listingCallback.value.onServicesUpdated(
+                listOf(mock(ControlsServiceInfo::class.java), mock(ControlsServiceInfo::class.java))
+            )
+
+            val rearrangeButton = requireViewById<Button>(R.id.rearrange)
+            assertThat(rearrangeButton.visibility).isEqualTo(View.VISIBLE)
+            assertThat(rearrangeButton.isEnabled).isFalse()
+
+            val otherAppsButton = requireViewById<Button>(R.id.other_apps)
+            otherAppsButton.waitForPost()
+            assertThat(otherAppsButton.visibility).isEqualTo(View.GONE)
+        }
+    }
+
+    @Test
+    fun testNewFlowDisabled_buttons() {
+        with(launchActivity()) {
+            verify(listingController).addCallback(listingCallback.capture())
+            activityRule.runOnUiThread {
+                listingCallback.value.onServicesUpdated(
+                    listOf(
+                        mock(ControlsServiceInfo::class.java),
+                        mock(ControlsServiceInfo::class.java)
+                    )
+                )
+            }
+
+            val rearrangeButton = requireViewById<Button>(R.id.rearrange)
+            assertThat(rearrangeButton.visibility).isEqualTo(View.GONE)
+            assertThat(rearrangeButton.isEnabled).isFalse()
+
+            val otherAppsButton = requireViewById<Button>(R.id.other_apps)
+            otherAppsButton.waitForPost()
+            assertThat(otherAppsButton.visibility).isEqualTo(View.VISIBLE)
+        }
+    }
+
+    @Test
+    fun testNewFlowEnabled_rearrangePressed_savesAndlaunchesActivity() {
+        featureFlags.set(Flags.CONTROLS_MANAGEMENT_NEW_FLOWS, true)
+        with(launchActivity()) {
+            verify(listingController).addCallback(capture(listingCallback))
+            listingCallback.value.onServicesUpdated(
+                listOf(mock(ControlsServiceInfo::class.java), mock(ControlsServiceInfo::class.java))
+            )
+            verify(controller).loadForComponent(any(), capture(controlsCallback), any())
+            activityRule.runOnUiThread {
+                controlsCallback.value.accept(
+                    createLoadDataObject(
+                        listOf(ControlStatus(TEST_CONTROL, TEST_COMPONENT, true)),
+                        emptyList(),
+                    )
+                )
+                requireViewById<Button>(R.id.rearrange).performClick()
+            }
+
+            verify(controller).replaceFavoritesForStructure(any())
+            with(startActivityData!!.intent) {
+                assertThat(component)
+                    .isEqualTo(ComponentName(context, ControlsEditingActivity::class.java))
+                assertThat(
+                        getParcelableExtra(Intent.EXTRA_COMPONENT_NAME, ComponentName::class.java)
+                    )
+                    .isEqualTo(TEST_COMPONENT)
+                assertThat(getCharSequenceExtra(ControlsEditingActivity.EXTRA_APP))
+                    .isEqualTo(TEST_APP)
+                assertThat(getBooleanExtra(ControlsEditingActivity.EXTRA_FROM_FAVORITING, false))
+                    .isTrue()
+                assertThat(getCharSequenceExtra(ControlsEditingActivity.EXTRA_STRUCTURE))
+                    .isEqualTo("")
+            }
+        }
+    }
+
+    private fun launchActivity(
+        componentName: ComponentName = TEST_COMPONENT,
+        structure: CharSequence = TEST_STRUCTURE,
+        app: CharSequence = TEST_APP,
+        source: Byte = ControlsFavoritingActivity.EXTRA_SOURCE_VALUE_FROM_PROVIDER_SELECTOR,
+    ): TestableControlsFavoritingActivity =
+        activityRule.launchActivity(
+            Intent().apply {
+                putExtra(Intent.EXTRA_COMPONENT_NAME, componentName)
+                putExtra(ControlsFavoritingActivity.EXTRA_STRUCTURE, structure)
+                putExtra(ControlsFavoritingActivity.EXTRA_APP, app)
+                putExtra(ControlsFavoritingActivity.EXTRA_SOURCE, source)
+            }
+        )
+
+    class TestableControlsFavoritingActivity(
+        featureFlags: FeatureFlags,
         executor: Executor,
         controller: ControlsControllerImpl,
         listingController: ControlsListingController,
         userTracker: UserTracker,
-        uiController: ControlsUiController,
         private val mockDispatcher: OnBackInvokedDispatcher,
         private val latch: CountDownLatch
     ) :
         ControlsFavoritingActivity(
+            featureFlags,
             executor,
             controller,
             listingController,
             userTracker,
-            uiController
         ) {
+
+        var triedToFinish = false
+
+        var startActivityData: StartActivityData? = null
+            private set
+
         override fun getOnBackInvokedDispatcher(): OnBackInvokedDispatcher {
             return mockDispatcher
         }
@@ -121,5 +259,17 @@
             // ensures that test runner thread does not proceed until ui thread is done
             latch.countDown()
         }
+
+        override fun startActivity(intent: Intent) {
+            startActivityData = StartActivityData(intent, null)
+        }
+
+        override fun startActivity(intent: Intent, options: Bundle?) {
+            startActivityData = StartActivityData(intent, options)
+        }
+
+        override fun animateExitAndFinish() {
+            triedToFinish = true
+        }
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/StartActivityData.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/StartActivityData.kt
new file mode 100644
index 0000000..977e3ba
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/StartActivityData.kt
@@ -0,0 +1,6 @@
+package com.android.systemui.controls.management
+
+import android.content.Intent
+import android.os.Bundle
+
+data class StartActivityData(val intent: Intent, val options: Bundle?)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt
index 84584807..605dc3f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt
@@ -59,8 +59,8 @@
 import com.android.systemui.util.mockito.mock
 import com.android.systemui.util.mockito.whenever
 import com.android.systemui.util.time.FakeSystemClock
-import com.android.wm.shell.TaskView
-import com.android.wm.shell.TaskViewFactory
+import com.android.wm.shell.taskview.TaskView
+import com.android.wm.shell.taskview.TaskViewFactory
 import com.google.common.truth.Truth.assertThat
 import java.util.Optional
 import java.util.function.Consumer
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt
index 6a6a65a..c3506e8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt
@@ -24,7 +24,7 @@
 import com.android.systemui.broadcast.BroadcastSender
 import com.android.systemui.plugins.ActivityStarter
 import com.android.systemui.statusbar.policy.KeyguardStateController
-import com.android.wm.shell.TaskView
+import com.android.wm.shell.taskview.TaskView
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/PanelTaskViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/PanelTaskViewControllerTest.kt
index 9df7992..f7c8cca 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/PanelTaskViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/PanelTaskViewControllerTest.kt
@@ -36,7 +36,7 @@
 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.TaskView
+import com.android.wm.shell.taskview.TaskView
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
index 6b3ec68..a7d7b93 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
@@ -28,20 +28,29 @@
 
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.phone.DozeParameters;
+import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.time.FakeSystemClock;
 
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.concurrent.Executor;
+
 @SmallTest
 public class DozeScreenStatePreventingAdapterTest extends SysuiTestCase {
 
+    private Executor mExecutor;
     private DozeMachine.Service mInner;
     private DozeScreenStatePreventingAdapter mWrapper;
 
     @Before
     public void setup() throws Exception {
+        mExecutor = new FakeExecutor(new FakeSystemClock());
         mInner = mock(DozeMachine.Service.class);
-        mWrapper = new DozeScreenStatePreventingAdapter(mInner);
+        mWrapper = new DozeScreenStatePreventingAdapter(
+                mInner,
+                mExecutor
+        );
     }
 
     @Test
@@ -86,7 +95,8 @@
         when(params.getDisplayStateSupported()).thenReturn(false);
 
         assertEquals(DozeScreenStatePreventingAdapter.class,
-                DozeScreenStatePreventingAdapter.wrapIfNeeded(mInner, params).getClass());
+                DozeScreenStatePreventingAdapter.wrapIfNeeded(mInner, params, mExecutor)
+                        .getClass());
     }
 
     @Test
@@ -94,6 +104,7 @@
         DozeParameters params = mock(DozeParameters.class);
         when(params.getDisplayStateSupported()).thenReturn(true);
 
-        assertSame(mInner, DozeScreenStatePreventingAdapter.wrapIfNeeded(mInner, params));
+        assertSame(mInner, DozeScreenStatePreventingAdapter.wrapIfNeeded(mInner, params,
+                mExecutor));
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapterTest.java
index 9ae7217..240d2d7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapterTest.java
@@ -28,20 +28,26 @@
 
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.phone.DozeParameters;
+import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.time.FakeSystemClock;
 
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.concurrent.Executor;
+
 @SmallTest
 public class DozeSuspendScreenStatePreventingAdapterTest extends SysuiTestCase {
 
+    private Executor mExecutor;
     private DozeMachine.Service mInner;
     private DozeSuspendScreenStatePreventingAdapter mWrapper;
 
     @Before
     public void setup() throws Exception {
+        mExecutor = new FakeExecutor(new FakeSystemClock());
         mInner = mock(DozeMachine.Service.class);
-        mWrapper = new DozeSuspendScreenStatePreventingAdapter(mInner);
+        mWrapper = new DozeSuspendScreenStatePreventingAdapter(mInner, mExecutor);
     }
 
     @Test
@@ -92,7 +98,8 @@
         when(params.getDozeSuspendDisplayStateSupported()).thenReturn(false);
 
         assertEquals(DozeSuspendScreenStatePreventingAdapter.class,
-                DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded(mInner, params).getClass());
+                DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded(mInner, params, mExecutor)
+                        .getClass());
     }
 
     @Test
@@ -100,6 +107,7 @@
         DozeParameters params = mock(DozeParameters.class);
         when(params.getDozeSuspendDisplayStateSupported()).thenReturn(true);
 
-        assertSame(mInner, DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded(mInner, params));
+        assertSame(mInner, DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded(mInner, params,
+                mExecutor));
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
index 2a72e7d..18abfa5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
@@ -26,8 +26,10 @@
 import static org.mockito.Mockito.when;
 
 import android.content.res.Resources;
+import android.graphics.Region;
 import android.os.Handler;
 import android.testing.AndroidTestingRunner;
+import android.view.AttachedSurfaceControl;
 import android.view.ViewGroup;
 import android.view.ViewRootImpl;
 import android.view.ViewTreeObserver;
@@ -76,6 +78,9 @@
     ComplicationHostViewController mComplicationHostViewController;
 
     @Mock
+    AttachedSurfaceControl mAttachedSurfaceControl;
+
+    @Mock
     ViewGroup mDreamOverlayContentView;
 
     @Mock
@@ -108,6 +113,8 @@
         when(mDreamOverlayContainerView.getResources()).thenReturn(mResources);
         when(mDreamOverlayContainerView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
         when(mDreamOverlayContainerView.getViewRootImpl()).thenReturn(mViewRoot);
+        when(mDreamOverlayContainerView.getRootSurfaceControl())
+                .thenReturn(mAttachedSurfaceControl);
 
         mController = new DreamOverlayContainerViewController(
                 mDreamOverlayContainerView,
@@ -128,6 +135,12 @@
     }
 
     @Test
+    public void testRootSurfaceControlInsetSetOnAttach() {
+        mController.onViewAttached();
+        verify(mAttachedSurfaceControl).setTouchableRegion(eq(Region.obtain()));
+    }
+
+    @Test
     public void testDreamOverlayStatusBarViewControllerInitialized() {
         mController.init();
         verify(mDreamOverlayStatusBarViewController).init();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java
index 7f6e2ba..08427da 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java
@@ -399,7 +399,21 @@
     }
 
     @Test
-    public void testPause() {
+    public void testPauseWithNoActiveSessions() {
+        final DreamTouchHandler touchHandler = Mockito.mock(DreamTouchHandler.class);
+
+        final Environment environment = new Environment(Stream.of(touchHandler)
+                .collect(Collectors.toCollection(HashSet::new)));
+
+        environment.updateLifecycle(observerOwnerPair -> {
+            observerOwnerPair.first.onPause(observerOwnerPair.second);
+        });
+
+        environment.verifyInputSessionDispose();
+    }
+
+    @Test
+    public void testDeferredPauseWithActiveSessions() {
         final DreamTouchHandler touchHandler = Mockito.mock(DreamTouchHandler.class);
 
         final Environment environment = new Environment(Stream.of(touchHandler)
@@ -417,14 +431,59 @@
         environment.publishInputEvent(event);
         verify(eventListener).onInputEvent(eq(event));
 
+        final ArgumentCaptor<DreamTouchHandler.TouchSession> touchSessionArgumentCaptor =
+                ArgumentCaptor.forClass(DreamTouchHandler.TouchSession.class);
+
+        verify(touchHandler).onSessionStart(touchSessionArgumentCaptor.capture());
+
         environment.updateLifecycle(observerOwnerPair -> {
             observerOwnerPair.first.onPause(observerOwnerPair.second);
         });
 
+        verify(environment.mInputSession, never()).dispose();
+
+        // End session
+        touchSessionArgumentCaptor.getValue().pop();
+        environment.executeAll();
+
+        // Check to make sure the input session is now disposed.
         environment.verifyInputSessionDispose();
     }
 
     @Test
+    public void testDestroyWithActiveSessions() {
+        final DreamTouchHandler touchHandler = Mockito.mock(DreamTouchHandler.class);
+
+        final Environment environment = new Environment(Stream.of(touchHandler)
+                .collect(Collectors.toCollection(HashSet::new)));
+
+        final InputEvent initialEvent = Mockito.mock(InputEvent.class);
+        environment.publishInputEvent(initialEvent);
+
+        // Ensure session started
+        final InputChannelCompat.InputEventListener eventListener =
+                registerInputEventListener(touchHandler);
+
+        // First event will be missed since we register after the execution loop,
+        final InputEvent event = Mockito.mock(InputEvent.class);
+        environment.publishInputEvent(event);
+        verify(eventListener).onInputEvent(eq(event));
+
+        final ArgumentCaptor<DreamTouchHandler.TouchSession> touchSessionArgumentCaptor =
+                ArgumentCaptor.forClass(DreamTouchHandler.TouchSession.class);
+
+        verify(touchHandler).onSessionStart(touchSessionArgumentCaptor.capture());
+
+        environment.updateLifecycle(observerOwnerPair -> {
+            observerOwnerPair.first.onDestroy(observerOwnerPair.second);
+        });
+
+        // Check to make sure the input session is now disposed.
+        environment.verifyInputSessionDispose();
+    }
+
+
+    @Test
     public void testPilfering() {
         final DreamTouchHandler touchHandler1 = Mockito.mock(DreamTouchHandler.class);
         final DreamTouchHandler touchHandler2 = Mockito.mock(DreamTouchHandler.class);
@@ -476,7 +535,7 @@
         environment.executeAll();
 
         environment.updateLifecycle(observerOwnerPair -> {
-            observerOwnerPair.first.onPause(observerOwnerPair.second);
+            observerOwnerPair.first.onDestroy(observerOwnerPair.second);
         });
 
         environment.executeAll();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/ShadeTouchHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/ShadeTouchHandlerTest.java
new file mode 100644
index 0000000..5704ef3
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/ShadeTouchHandlerTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.dreams.touch;
+
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.testing.AndroidTestingRunner;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.shade.NotificationPanelViewController;
+import com.android.systemui.shared.system.InputChannelCompat;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Optional;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+public class ShadeTouchHandlerTest extends SysuiTestCase {
+    @Mock
+    CentralSurfaces mCentralSurfaces;
+
+    @Mock
+    NotificationPanelViewController mNotificationPanelViewController;
+
+    @Mock
+    DreamTouchHandler.TouchSession mTouchSession;
+
+    ShadeTouchHandler mTouchHandler;
+
+    private static final int TOUCH_HEIGHT = 20;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        mTouchHandler = new ShadeTouchHandler(Optional.of(mCentralSurfaces),
+                TOUCH_HEIGHT);
+        when(mCentralSurfaces.getNotificationPanelViewController())
+                .thenReturn(mNotificationPanelViewController);
+    }
+
+    /**
+     * Verify that touches aren't handled when the bouncer is showing.
+     */
+    @Test
+    public void testInactiveOnBouncer() {
+        when(mCentralSurfaces.isBouncerShowing()).thenReturn(true);
+        mTouchHandler.onSessionStart(mTouchSession);
+        verify(mTouchSession).pop();
+    }
+
+    /**
+     * Make sure {@link ShadeTouchHandler}
+     */
+    @Test
+    public void testTouchPilferingOnScroll() {
+        final MotionEvent motionEvent1 = Mockito.mock(MotionEvent.class);
+        final MotionEvent motionEvent2 = Mockito.mock(MotionEvent.class);
+
+        final ArgumentCaptor<GestureDetector.OnGestureListener> gestureListenerArgumentCaptor =
+                ArgumentCaptor.forClass(GestureDetector.OnGestureListener.class);
+
+        mTouchHandler.onSessionStart(mTouchSession);
+        verify(mTouchSession).registerGestureListener(gestureListenerArgumentCaptor.capture());
+
+        assertThat(gestureListenerArgumentCaptor.getValue()
+                .onScroll(motionEvent1, motionEvent2, 1, 1))
+                .isTrue();
+    }
+
+    /**
+     * Ensure touches are propagated to the {@link NotificationPanelViewController}.
+     */
+    @Test
+    public void testEventPropagation() {
+        final MotionEvent motionEvent = Mockito.mock(MotionEvent.class);
+
+        final ArgumentCaptor<InputChannelCompat.InputEventListener>
+                inputEventListenerArgumentCaptor =
+                    ArgumentCaptor.forClass(InputChannelCompat.InputEventListener.class);
+
+        mTouchHandler.onSessionStart(mTouchSession);
+        verify(mTouchSession).registerInputListener(inputEventListenerArgumentCaptor.capture());
+        inputEventListenerArgumentCaptor.getValue().onInputEvent(motionEvent);
+        verify(mNotificationPanelViewController).handleExternalTouch(motionEvent);
+    }
+
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/graphics/ImageLoaderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/graphics/ImageLoaderTest.kt
new file mode 100644
index 0000000..ccd631e
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/graphics/ImageLoaderTest.kt
@@ -0,0 +1,346 @@
+package com.android.systemui.graphics
+
+import android.content.res.Resources
+import android.graphics.Bitmap
+import android.graphics.BitmapFactory
+import android.graphics.ImageDecoder
+import android.graphics.drawable.BitmapDrawable
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.Icon
+import android.graphics.drawable.VectorDrawable
+import android.net.Uri
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.R
+import com.android.systemui.SysuiTestCase
+import com.google.common.truth.Truth.assertThat
+import java.io.ByteArrayInputStream
+import java.io.ByteArrayOutputStream
+import java.io.File
+import java.io.FileInputStream
+import java.io.FileOutputStream
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.UnconfinedTestDispatcher
+import kotlinx.coroutines.test.runTest
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
[email protected]
+@RunWith(AndroidJUnit4::class)
+class ImageLoaderTest : SysuiTestCase() {
+
+    private val testDispatcher = UnconfinedTestDispatcher()
+    private val testScope = TestScope(testDispatcher)
+    private val imageLoader = ImageLoader(context, testDispatcher)
+
+    private lateinit var imgFile: File
+
+    @Before
+    fun setUp() {
+        val context = context.createPackageContext("com.android.systemui.tests", 0)
+        val bitmap =
+            BitmapFactory.decodeResource(
+                context.resources,
+                com.android.systemui.tests.R.drawable.romainguy_rockaway
+            )
+
+        imgFile = File.createTempFile("image", ".png", context.cacheDir)
+        imgFile.deleteOnExit()
+        bitmap.compress(Bitmap.CompressFormat.PNG, 100, FileOutputStream(imgFile))
+    }
+
+    @After
+    fun tearDown() {
+        imgFile.delete()
+    }
+
+    @Test
+    fun invalidResource_drawable_returnsNull() =
+        testScope.runTest { assertThat(imageLoader.loadDrawable(ImageLoader.Res(-1))).isNull() }
+
+    @Test
+    fun invalidResource_bitmap_returnsNull() =
+        testScope.runTest { assertThat(imageLoader.loadBitmap(ImageLoader.Res(-1))).isNull() }
+
+    @Test
+    fun invalidUri_returnsNull() =
+        testScope.runTest {
+            assertThat(imageLoader.loadBitmap(ImageLoader.Uri("this.is/bogus"))).isNull()
+        }
+
+    @Test
+    fun invalidFile_returnsNull() =
+        testScope.runTest {
+            assertThat(imageLoader.loadBitmap(ImageLoader.File("this is broken!"))).isNull()
+        }
+
+    @Test
+    fun invalidIcon_returnsNull() =
+        testScope.runTest {
+            assertThat(imageLoader.loadDrawable(Icon.createWithFilePath("this is broken"))).isNull()
+        }
+
+    @Test
+    fun invalidIS_returnsNull() =
+        testScope.runTest {
+            assertThat(
+                    imageLoader.loadDrawable(
+                        ImageLoader.InputStream(ByteArrayInputStream(ByteArray(0)))
+                    )
+                )
+                .isNull()
+        }
+
+    @Test
+    fun validBitmapResource_loadDrawable_returnsBitmapDrawable() =
+        testScope.runTest {
+            val context = context.createPackageContext("com.android.systemui.tests", 0)
+            val bitmap =
+                BitmapFactory.decodeResource(
+                    context.resources,
+                    com.android.systemui.tests.R.drawable.romainguy_rockaway
+                )
+            assertThat(bitmap).isNotNull()
+            val loadedDrawable =
+                imageLoader.loadDrawable(
+                    ImageLoader.Res(
+                        com.android.systemui.tests.R.drawable.romainguy_rockaway,
+                        context
+                    )
+                )
+            assertBitmapEqualToDrawable(loadedDrawable, bitmap)
+        }
+
+    @Test
+    fun validBitmapResource_loadBitmap_returnsBitmapDrawable() =
+        testScope.runTest {
+            val bitmap =
+                BitmapFactory.decodeResource(
+                    context.resources,
+                    R.drawable.dessert_zombiegingerbread
+                )
+            val loadedBitmap =
+                imageLoader.loadBitmap(ImageLoader.Res(R.drawable.dessert_zombiegingerbread))
+            assertBitmapEqualToBitmap(loadedBitmap, bitmap)
+        }
+
+    @Test
+    fun validBitmapUri_returnsBitmapDrawable() =
+        testScope.runTest {
+            val bitmap =
+                BitmapFactory.decodeResource(
+                    context.resources,
+                    R.drawable.dessert_zombiegingerbread
+                )
+
+            val uri =
+                "android.resource://${context.packageName}/${R.drawable.dessert_zombiegingerbread}"
+            val loadedBitmap = imageLoader.loadBitmap(ImageLoader.Uri(uri))
+            assertBitmapEqualToBitmap(loadedBitmap, bitmap)
+        }
+
+    @Test
+    fun validBitmapFile_returnsBitmapDrawable() =
+        testScope.runTest {
+            val bitmap = BitmapFactory.decodeFile(imgFile.absolutePath)
+            val loadedBitmap = imageLoader.loadBitmap(ImageLoader.File(imgFile))
+            assertBitmapEqualToBitmap(loadedBitmap, bitmap)
+        }
+
+    @Test
+    fun validInputStream_returnsBitmapDrawable() =
+        testScope.runTest {
+            val bitmap = BitmapFactory.decodeFile(imgFile.absolutePath)
+            val loadedBitmap =
+                imageLoader.loadBitmap(ImageLoader.InputStream(FileInputStream(imgFile)))
+            assertBitmapEqualToBitmap(loadedBitmap, bitmap)
+        }
+
+    @Test
+    fun validBitmapIcon_returnsBitmapDrawable() =
+        testScope.runTest {
+            val bitmap =
+                BitmapFactory.decodeResource(
+                    context.resources,
+                    R.drawable.dessert_zombiegingerbread
+                )
+            val loadedDrawable = imageLoader.loadDrawable(Icon.createWithBitmap(bitmap))
+            assertBitmapEqualToDrawable(loadedDrawable, bitmap)
+        }
+
+    @Test
+    fun validUriIcon_returnsBitmapDrawable() =
+        testScope.runTest {
+            val bitmap =
+                BitmapFactory.decodeResource(
+                    context.resources,
+                    R.drawable.dessert_zombiegingerbread
+                )
+            val uri =
+                "android.resource://${context.packageName}/${R.drawable.dessert_zombiegingerbread}"
+            val loadedDrawable = imageLoader.loadDrawable(Icon.createWithContentUri(Uri.parse(uri)))
+            assertBitmapEqualToDrawable(loadedDrawable, bitmap)
+        }
+
+    @Test
+    fun validDataIcon_returnsBitmapDrawable() =
+        testScope.runTest {
+            val bitmap =
+                BitmapFactory.decodeResource(
+                    context.resources,
+                    R.drawable.dessert_zombiegingerbread
+                )
+            val bos =
+                ByteArrayOutputStream(
+                    bitmap.byteCount * 2
+                ) // Compressed bitmap should be smaller than its source.
+            bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos)
+
+            val array = bos.toByteArray()
+            val loadedDrawable = imageLoader.loadDrawable(Icon.createWithData(array, 0, array.size))
+            assertBitmapEqualToDrawable(loadedDrawable, bitmap)
+        }
+
+    @Test
+    fun validSystemResourceIcon_returnsBitmapDrawable() =
+        testScope.runTest {
+            val bitmap =
+                Resources.getSystem().getDrawable(android.R.drawable.ic_dialog_alert, context.theme)
+            val loadedDrawable =
+                imageLoader.loadDrawable(
+                    Icon.createWithResource("android", android.R.drawable.ic_dialog_alert)
+                )
+            assertBitmapEqualToDrawable(loadedDrawable, (bitmap as BitmapDrawable).bitmap)
+        }
+
+    @Test
+    fun invalidDifferentPackageResourceIcon_returnsNull() =
+        testScope.runTest {
+            val loadedDrawable =
+                imageLoader.loadDrawable(
+                    Icon.createWithResource(
+                        "noooope.wrong.package",
+                        R.drawable.dessert_zombiegingerbread
+                    )
+                )
+            assertThat(loadedDrawable).isNull()
+        }
+
+    @Test
+    fun validBitmapResource_widthMoreRestricted_downsizesKeepingAspectRatio() =
+        testScope.runTest {
+            val loadedDrawable =
+                imageLoader.loadDrawable(ImageLoader.File(imgFile), maxWidth = 160, maxHeight = 160)
+            val loadedBitmap = assertBitmapInDrawable(loadedDrawable)
+            assertThat(loadedBitmap.width).isEqualTo(160)
+            assertThat(loadedBitmap.height).isEqualTo(106)
+        }
+
+    @Test
+    fun validBitmapResource_heightMoreRestricted_downsizesKeepingAspectRatio() =
+        testScope.runTest {
+            val loadedDrawable =
+                imageLoader.loadDrawable(ImageLoader.File(imgFile), maxWidth = 160, maxHeight = 50)
+            val loadedBitmap = assertBitmapInDrawable(loadedDrawable)
+            assertThat(loadedBitmap.width).isEqualTo(74)
+            assertThat(loadedBitmap.height).isEqualTo(50)
+        }
+
+    @Test
+    fun validBitmapResource_onlyWidthRestricted_downsizesKeepingAspectRatio() =
+        testScope.runTest {
+            val loadedDrawable =
+                imageLoader.loadDrawable(
+                    ImageLoader.File(imgFile),
+                    maxWidth = 160,
+                    maxHeight = ImageLoader.DO_NOT_RESIZE
+                )
+            val loadedBitmap = assertBitmapInDrawable(loadedDrawable)
+            assertThat(loadedBitmap.width).isEqualTo(160)
+            assertThat(loadedBitmap.height).isEqualTo(106)
+        }
+
+    @Test
+    fun validBitmapResource_onlyHeightRestricted_downsizesKeepingAspectRatio() =
+        testScope.runTest {
+            val loadedDrawable =
+                imageLoader.loadDrawable(
+                    ImageLoader.Res(R.drawable.bubble_thumbnail),
+                    maxWidth = ImageLoader.DO_NOT_RESIZE,
+                    maxHeight = 120
+                )
+            val loadedBitmap = assertBitmapInDrawable(loadedDrawable)
+            assertThat(loadedBitmap.width).isEqualTo(123)
+            assertThat(loadedBitmap.height).isEqualTo(120)
+        }
+
+    @Test
+    fun validVectorDrawable_loadDrawable_successfullyLoaded() =
+        testScope.runTest {
+            val loadedDrawable = imageLoader.loadDrawable(ImageLoader.Res(R.drawable.ic_settings))
+            assertThat(loadedDrawable).isNotNull()
+            assertThat(loadedDrawable).isInstanceOf(VectorDrawable::class.java)
+        }
+
+    @Test
+    fun validVectorDrawable_loadBitmap_returnsNull() =
+        testScope.runTest {
+            val loadedBitmap = imageLoader.loadBitmap(ImageLoader.Res(R.drawable.ic_settings))
+            assertThat(loadedBitmap).isNull()
+        }
+
+    @Test
+    fun validVectorDrawableIcon_loadDrawable_successfullyLoaded() =
+        testScope.runTest {
+            val loadedDrawable =
+                imageLoader.loadDrawable(Icon.createWithResource(context, R.drawable.ic_settings))
+            assertThat(loadedDrawable).isNotNull()
+            assertThat(loadedDrawable).isInstanceOf(VectorDrawable::class.java)
+        }
+
+    @Test
+    fun hardwareAllocator_returnsHardwareBitmap() =
+        testScope.runTest {
+            val loadedDrawable =
+                imageLoader.loadDrawable(
+                    ImageLoader.File(imgFile),
+                    allocator = ImageDecoder.ALLOCATOR_HARDWARE
+                )
+            assertThat(loadedDrawable).isNotNull()
+            assertThat((loadedDrawable as BitmapDrawable).bitmap.config)
+                .isEqualTo(Bitmap.Config.HARDWARE)
+        }
+
+    @Test
+    fun softwareAllocator_returnsSoftwareBitmap() =
+        testScope.runTest {
+            val loadedDrawable =
+                imageLoader.loadDrawable(
+                    ImageLoader.File(imgFile),
+                    allocator = ImageDecoder.ALLOCATOR_SOFTWARE
+                )
+            assertThat(loadedDrawable).isNotNull()
+            assertThat((loadedDrawable as BitmapDrawable).bitmap.config)
+                .isNotEqualTo(Bitmap.Config.HARDWARE)
+        }
+
+    private fun assertBitmapInDrawable(drawable: Drawable?): Bitmap {
+        assertThat(drawable).isNotNull()
+        assertThat(drawable).isInstanceOf(BitmapDrawable::class.java)
+        return (drawable as BitmapDrawable).bitmap
+    }
+
+    private fun assertBitmapEqualToDrawable(actual: Drawable?, expected: Bitmap) {
+        val actualBitmap = assertBitmapInDrawable(actual)
+        assertBitmapEqualToBitmap(actualBitmap, expected)
+    }
+
+    private fun assertBitmapEqualToBitmap(actual: Bitmap?, expected: Bitmap) {
+        assertThat(actual).isNotNull()
+        assertThat(actual?.width).isEqualTo(expected.width)
+        assertThat(actual?.height).isEqualTo(expected.height)
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt
index fb7d379..5d83f56 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt
@@ -157,11 +157,34 @@
             assertThat(strongBiometricAllowed()).isFalse()
         }
 
+    @Test
+    fun convenienceBiometricAllowedChange() =
+        testScope.runTest {
+            createBiometricSettingsRepository()
+            val convenienceBiometricAllowed =
+                collectLastValue(underTest.isNonStrongBiometricAllowed)
+            runCurrent()
+
+            onNonStrongAuthChanged(true, PRIMARY_USER_ID)
+            assertThat(convenienceBiometricAllowed()).isTrue()
+
+            onNonStrongAuthChanged(false, ANOTHER_USER_ID)
+            assertThat(convenienceBiometricAllowed()).isTrue()
+
+            onNonStrongAuthChanged(false, PRIMARY_USER_ID)
+            assertThat(convenienceBiometricAllowed()).isFalse()
+        }
+
     private fun onStrongAuthChanged(flags: Int, userId: Int) {
         strongAuthTracker.value.stub.onStrongAuthRequiredChanged(flags, userId)
         testableLooper?.processAllMessages() // StrongAuthTracker uses the TestableLooper
     }
 
+    private fun onNonStrongAuthChanged(allowed: Boolean, userId: Int) {
+        strongAuthTracker.value.stub.onIsNonStrongBiometricAllowedChanged(allowed, userId)
+        testableLooper?.processAllMessages() // StrongAuthTracker uses the TestableLooper
+    }
+
     @Test
     fun fingerprintDisabledByDpmChange() =
         testScope.runTest {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt
new file mode 100644
index 0000000..6e002f5
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt
@@ -0,0 +1,920 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.keyguard.data.repository
+
+import android.app.StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP
+import android.app.StatusBarManager.SESSION_KEYGUARD
+import android.content.pm.UserInfo
+import android.content.pm.UserInfo.FLAG_PRIMARY
+import android.hardware.biometrics.BiometricFaceConstants.FACE_ERROR_CANCELED
+import android.hardware.biometrics.BiometricFaceConstants.FACE_ERROR_LOCKOUT_PERMANENT
+import android.hardware.biometrics.ComponentInfoInternal
+import android.hardware.face.FaceAuthenticateOptions
+import android.hardware.face.FaceManager
+import android.hardware.face.FaceSensorProperties
+import android.hardware.face.FaceSensorPropertiesInternal
+import android.os.CancellationSignal
+import androidx.test.filters.SmallTest
+import com.android.internal.logging.InstanceId.fakeInstanceId
+import com.android.internal.logging.UiEventLogger
+import com.android.keyguard.FaceAuthUiEvent
+import com.android.keyguard.FaceAuthUiEvent.FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN
+import com.android.keyguard.FaceAuthUiEvent.FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER
+import com.android.systemui.R
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.FlowValue
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.dump.DumpManager
+import com.android.systemui.dump.logcatLogBuffer
+import com.android.systemui.flags.FakeFeatureFlags
+import com.android.systemui.flags.Flags.FACE_AUTH_REFACTOR
+import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.shared.model.AuthenticationStatus
+import com.android.systemui.keyguard.shared.model.DetectionStatus
+import com.android.systemui.keyguard.shared.model.ErrorAuthenticationStatus
+import com.android.systemui.keyguard.shared.model.HelpAuthenticationStatus
+import com.android.systemui.keyguard.shared.model.SuccessAuthenticationStatus
+import com.android.systemui.keyguard.shared.model.WakeSleepReason
+import com.android.systemui.keyguard.shared.model.WakefulnessModel
+import com.android.systemui.keyguard.shared.model.WakefulnessState
+import com.android.systemui.log.FaceAuthenticationLogger
+import com.android.systemui.log.SessionTracker
+import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.statusbar.phone.FakeKeyguardStateController
+import com.android.systemui.statusbar.phone.KeyguardBypassController
+import com.android.systemui.user.data.repository.FakeUserRepository
+import com.android.systemui.util.mockito.KotlinArgumentCaptor
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.time.SystemClock
+import com.google.common.truth.Truth.assertThat
+import java.io.PrintWriter
+import java.io.StringWriter
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.advanceTimeBy
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.ArgumentCaptor
+import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.Captor
+import org.mockito.Mock
+import org.mockito.Mockito.clearInvocations
+import org.mockito.Mockito.isNull
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.MockitoAnnotations
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(JUnit4::class)
+class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
+    private lateinit var underTest: DeviceEntryFaceAuthRepositoryImpl
+
+    @Mock private lateinit var faceManager: FaceManager
+    @Mock private lateinit var bypassController: KeyguardBypassController
+    @Mock private lateinit var sessionTracker: SessionTracker
+    @Mock private lateinit var uiEventLogger: UiEventLogger
+    @Mock private lateinit var dumpManager: DumpManager
+
+    @Captor
+    private lateinit var authenticationCallback: ArgumentCaptor<FaceManager.AuthenticationCallback>
+
+    @Captor
+    private lateinit var detectionCallback: ArgumentCaptor<FaceManager.FaceDetectionCallback>
+    @Captor private lateinit var cancellationSignal: ArgumentCaptor<CancellationSignal>
+
+    private lateinit var bypassStateChangedListener:
+        KotlinArgumentCaptor<KeyguardBypassController.OnBypassStateChangedListener>
+
+    @Captor
+    private lateinit var faceLockoutResetCallback: ArgumentCaptor<FaceManager.LockoutResetCallback>
+    private lateinit var testDispatcher: TestDispatcher
+
+    private lateinit var testScope: TestScope
+    private lateinit var fakeUserRepository: FakeUserRepository
+    private lateinit var authStatus: FlowValue<AuthenticationStatus?>
+    private lateinit var detectStatus: FlowValue<DetectionStatus?>
+    private lateinit var authRunning: FlowValue<Boolean?>
+    private lateinit var lockedOut: FlowValue<Boolean?>
+    private lateinit var canFaceAuthRun: FlowValue<Boolean?>
+    private lateinit var authenticated: FlowValue<Boolean?>
+    private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
+    private lateinit var deviceEntryFingerprintAuthRepository:
+        FakeDeviceEntryFingerprintAuthRepository
+    private lateinit var trustRepository: FakeTrustRepository
+    private lateinit var keyguardRepository: FakeKeyguardRepository
+    private lateinit var keyguardInteractor: KeyguardInteractor
+    private lateinit var alternateBouncerInteractor: AlternateBouncerInteractor
+    private lateinit var bouncerRepository: FakeKeyguardBouncerRepository
+    private lateinit var fakeCommandQueue: FakeCommandQueue
+    private lateinit var featureFlags: FakeFeatureFlags
+
+    private var wasAuthCancelled = false
+    private var wasDetectCancelled = false
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+        fakeUserRepository = FakeUserRepository()
+        fakeUserRepository.setUserInfos(listOf(primaryUser, secondaryUser))
+        testDispatcher = StandardTestDispatcher()
+        biometricSettingsRepository = FakeBiometricSettingsRepository()
+        deviceEntryFingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository()
+        trustRepository = FakeTrustRepository()
+        keyguardRepository = FakeKeyguardRepository()
+        bouncerRepository = FakeKeyguardBouncerRepository()
+        featureFlags = FakeFeatureFlags().apply { set(FACE_AUTH_REFACTOR, true) }
+        fakeCommandQueue = FakeCommandQueue()
+        keyguardInteractor =
+            KeyguardInteractor(
+                keyguardRepository,
+                fakeCommandQueue,
+                featureFlags,
+                bouncerRepository
+            )
+        alternateBouncerInteractor =
+            AlternateBouncerInteractor(
+                bouncerRepository = bouncerRepository,
+                biometricSettingsRepository = biometricSettingsRepository,
+                deviceEntryFingerprintAuthRepository = deviceEntryFingerprintAuthRepository,
+                systemClock = mock(SystemClock::class.java),
+                keyguardStateController = FakeKeyguardStateController(),
+                statusBarStateController = mock(StatusBarStateController::class.java),
+            )
+
+        bypassStateChangedListener =
+            KotlinArgumentCaptor(KeyguardBypassController.OnBypassStateChangedListener::class.java)
+        testScope = TestScope(testDispatcher)
+        whenever(sessionTracker.getSessionId(SESSION_KEYGUARD)).thenReturn(keyguardSessionId)
+        whenever(faceManager.sensorPropertiesInternal)
+            .thenReturn(listOf(createFaceSensorProperties(supportsFaceDetection = true)))
+        whenever(bypassController.bypassEnabled).thenReturn(true)
+        underTest = createDeviceEntryFaceAuthRepositoryImpl(faceManager, bypassController)
+    }
+
+    private fun createDeviceEntryFaceAuthRepositoryImpl(
+        fmOverride: FaceManager? = faceManager,
+        bypassControllerOverride: KeyguardBypassController? = bypassController
+    ) =
+        DeviceEntryFaceAuthRepositoryImpl(
+            mContext,
+            fmOverride,
+            fakeUserRepository,
+            bypassControllerOverride,
+            testScope.backgroundScope,
+            testDispatcher,
+            sessionTracker,
+            uiEventLogger,
+            FaceAuthenticationLogger(logcatLogBuffer("DeviceEntryFaceAuthRepositoryLog")),
+            biometricSettingsRepository,
+            deviceEntryFingerprintAuthRepository,
+            trustRepository,
+            keyguardRepository,
+            keyguardInteractor,
+            alternateBouncerInteractor,
+            dumpManager,
+        )
+
+    @Test
+    fun faceAuthRunsAndProvidesAuthStatusUpdates() =
+        testScope.runTest {
+            initCollectors()
+            allPreconditionsToRunFaceAuthAreTrue()
+
+            FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER.extraInfo = 10
+            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
+            faceAuthenticateIsCalled()
+            uiEventIsLogged(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
+
+            assertThat(authRunning()).isTrue()
+
+            val successResult = successResult()
+            authenticationCallback.value.onAuthenticationSucceeded(successResult)
+
+            assertThat(authStatus()).isEqualTo(SuccessAuthenticationStatus(successResult))
+            assertThat(authenticated()).isTrue()
+            assertThat(authRunning()).isFalse()
+        }
+
+    private fun uiEventIsLogged(faceAuthUiEvent: FaceAuthUiEvent) {
+        verify(uiEventLogger)
+            .logWithInstanceIdAndPosition(
+                faceAuthUiEvent,
+                0,
+                null,
+                keyguardSessionId,
+                faceAuthUiEvent.extraInfo
+            )
+    }
+
+    @Test
+    fun faceAuthDoesNotRunWhileItIsAlreadyRunning() =
+        testScope.runTest {
+            initCollectors()
+
+            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
+            faceAuthenticateIsCalled()
+            clearInvocations(faceManager)
+            clearInvocations(uiEventLogger)
+
+            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
+            verifyNoMoreInteractions(faceManager)
+            verifyNoMoreInteractions(uiEventLogger)
+        }
+
+    @Test
+    fun faceLockoutStatusIsPropagated() =
+        testScope.runTest {
+            initCollectors()
+            verify(faceManager).addLockoutResetCallback(faceLockoutResetCallback.capture())
+
+            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
+            faceAuthenticateIsCalled()
+
+            authenticationCallback.value.onAuthenticationError(
+                FACE_ERROR_LOCKOUT_PERMANENT,
+                "face locked out"
+            )
+
+            assertThat(lockedOut()).isTrue()
+
+            faceLockoutResetCallback.value.onLockoutReset(0)
+            assertThat(lockedOut()).isFalse()
+        }
+
+    @Test
+    fun faceDetectionSupportIsTheCorrectValue() =
+        testScope.runTest {
+            assertThat(
+                    createDeviceEntryFaceAuthRepositoryImpl(fmOverride = null).isDetectionSupported
+                )
+                .isFalse()
+
+            whenever(faceManager.sensorPropertiesInternal).thenReturn(null)
+            assertThat(createDeviceEntryFaceAuthRepositoryImpl().isDetectionSupported).isFalse()
+
+            whenever(faceManager.sensorPropertiesInternal).thenReturn(listOf())
+            assertThat(createDeviceEntryFaceAuthRepositoryImpl().isDetectionSupported).isFalse()
+
+            whenever(faceManager.sensorPropertiesInternal)
+                .thenReturn(listOf(createFaceSensorProperties(supportsFaceDetection = false)))
+            assertThat(createDeviceEntryFaceAuthRepositoryImpl().isDetectionSupported).isFalse()
+
+            whenever(faceManager.sensorPropertiesInternal)
+                .thenReturn(
+                    listOf(
+                        createFaceSensorProperties(supportsFaceDetection = false),
+                        createFaceSensorProperties(supportsFaceDetection = true)
+                    )
+                )
+            assertThat(createDeviceEntryFaceAuthRepositoryImpl().isDetectionSupported).isFalse()
+
+            whenever(faceManager.sensorPropertiesInternal)
+                .thenReturn(
+                    listOf(
+                        createFaceSensorProperties(supportsFaceDetection = true),
+                        createFaceSensorProperties(supportsFaceDetection = false)
+                    )
+                )
+            assertThat(createDeviceEntryFaceAuthRepositoryImpl().isDetectionSupported).isTrue()
+        }
+
+    @Test
+    fun cancelStopsFaceAuthentication() =
+        testScope.runTest {
+            initCollectors()
+
+            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
+            faceAuthenticateIsCalled()
+
+            var wasAuthCancelled = false
+            cancellationSignal.value.setOnCancelListener { wasAuthCancelled = true }
+
+            underTest.cancel()
+            assertThat(wasAuthCancelled).isTrue()
+            assertThat(authRunning()).isFalse()
+        }
+
+    @Test
+    fun cancelInvokedWithoutFaceAuthRunningIsANoop() = testScope.runTest { underTest.cancel() }
+
+    @Test
+    fun faceDetectionRunsAndPropagatesDetectionStatus() =
+        testScope.runTest {
+            whenever(faceManager.sensorPropertiesInternal)
+                .thenReturn(listOf(createFaceSensorProperties(supportsFaceDetection = true)))
+            underTest = createDeviceEntryFaceAuthRepositoryImpl()
+            initCollectors()
+
+            underTest.detect()
+            faceDetectIsCalled()
+
+            detectionCallback.value.onFaceDetected(1, 1, true)
+
+            assertThat(detectStatus()).isEqualTo(DetectionStatus(1, 1, true))
+        }
+
+    @Test
+    fun faceDetectDoesNotRunIfDetectionIsNotSupported() =
+        testScope.runTest {
+            whenever(faceManager.sensorPropertiesInternal)
+                .thenReturn(listOf(createFaceSensorProperties(supportsFaceDetection = false)))
+            underTest = createDeviceEntryFaceAuthRepositoryImpl()
+            initCollectors()
+            clearInvocations(faceManager)
+
+            underTest.detect()
+
+            verify(faceManager, never())
+                .detectFace(any(), any(), any(FaceAuthenticateOptions::class.java))
+        }
+
+    @Test
+    fun faceAuthShouldWaitAndRunIfTriggeredWhileCancelling() =
+        testScope.runTest {
+            initCollectors()
+
+            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
+            faceAuthenticateIsCalled()
+
+            // Enter cancelling state
+            underTest.cancel()
+            clearInvocations(faceManager)
+
+            // Auth is while cancelling.
+            underTest.authenticate(FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN)
+            // Auth is not started
+            verifyNoMoreInteractions(faceManager)
+
+            // Auth is done cancelling.
+            authenticationCallback.value.onAuthenticationError(
+                FACE_ERROR_CANCELED,
+                "First auth attempt cancellation completed"
+            )
+            assertThat(authStatus())
+                .isEqualTo(
+                    ErrorAuthenticationStatus(
+                        FACE_ERROR_CANCELED,
+                        "First auth attempt cancellation completed"
+                    )
+                )
+
+            faceAuthenticateIsCalled()
+            uiEventIsLogged(FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN)
+        }
+
+    @Test
+    fun faceAuthAutoCancelsAfterDefaultCancellationTimeout() =
+        testScope.runTest {
+            initCollectors()
+            allPreconditionsToRunFaceAuthAreTrue()
+
+            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
+            faceAuthenticateIsCalled()
+
+            clearInvocations(faceManager)
+            underTest.cancel()
+            advanceTimeBy(DeviceEntryFaceAuthRepositoryImpl.DEFAULT_CANCEL_SIGNAL_TIMEOUT + 1)
+
+            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
+            faceAuthenticateIsCalled()
+        }
+
+    @Test
+    fun faceHelpMessagesAreIgnoredBasedOnConfig() =
+        testScope.runTest {
+            overrideResource(
+                R.array.config_face_acquire_device_entry_ignorelist,
+                intArrayOf(10, 11)
+            )
+            underTest = createDeviceEntryFaceAuthRepositoryImpl()
+            initCollectors()
+
+            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
+            faceAuthenticateIsCalled()
+
+            authenticationCallback.value.onAuthenticationHelp(9, "help msg")
+            authenticationCallback.value.onAuthenticationHelp(10, "Ignored help msg")
+            authenticationCallback.value.onAuthenticationHelp(11, "Ignored help msg")
+
+            assertThat(authStatus()).isEqualTo(HelpAuthenticationStatus(9, "help msg"))
+        }
+
+    @Test
+    fun dumpDoesNotErrorOutWhenFaceManagerOrBypassControllerIsNull() =
+        testScope.runTest {
+            fakeUserRepository.setSelectedUserInfo(primaryUser)
+            underTest.dump(PrintWriter(StringWriter()), emptyArray())
+
+            underTest =
+                createDeviceEntryFaceAuthRepositoryImpl(
+                    fmOverride = null,
+                    bypassControllerOverride = null
+                )
+            fakeUserRepository.setSelectedUserInfo(primaryUser)
+
+            underTest.dump(PrintWriter(StringWriter()), emptyArray())
+        }
+
+    @Test
+    fun authenticateDoesNotRunIfFaceIsNotEnrolled() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth { biometricSettingsRepository.setFaceEnrolled(false) }
+        }
+
+    @Test
+    fun authenticateDoesNotRunIfFaceIsNotEnabled() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth { biometricSettingsRepository.setIsFaceAuthEnabled(false) }
+        }
+
+    @Test
+    fun authenticateDoesNotRunIfUserIsInLockdown() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth { biometricSettingsRepository.setIsUserInLockdown(true) }
+        }
+
+    @Test
+    fun authenticateDoesNotRunIfUserIsCurrentlySwitching() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth { fakeUserRepository.setUserSwitching(true) }
+        }
+
+    @Test
+    fun authenticateDoesNotRunWhenFpIsLockedOut() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth { deviceEntryFingerprintAuthRepository.setLockedOut(true) }
+        }
+
+    @Test
+    fun authenticateDoesNotRunWhenUserIsCurrentlyTrusted() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth { trustRepository.setCurrentUserTrusted(true) }
+        }
+
+    @Test
+    fun authenticateDoesNotRunWhenKeyguardIsGoingAway() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth { keyguardRepository.setKeyguardGoingAway(true) }
+        }
+
+    @Test
+    fun authenticateDoesNotRunWhenDeviceIsGoingToSleep() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth {
+                keyguardRepository.setWakefulnessModel(
+                    WakefulnessModel(
+                        state = WakefulnessState.STARTING_TO_SLEEP,
+                        isWakingUpOrAwake = false,
+                        lastWakeReason = WakeSleepReason.OTHER,
+                        lastSleepReason = WakeSleepReason.OTHER,
+                    )
+                )
+            }
+        }
+
+    @Test
+    fun authenticateDoesNotRunWhenDeviceIsSleeping() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth {
+                keyguardRepository.setWakefulnessModel(
+                    WakefulnessModel(
+                        state = WakefulnessState.ASLEEP,
+                        isWakingUpOrAwake = false,
+                        lastWakeReason = WakeSleepReason.OTHER,
+                        lastSleepReason = WakeSleepReason.OTHER,
+                    )
+                )
+            }
+        }
+
+    @Test
+    fun authenticateDoesNotRunWhenNonStrongBiometricIsNotAllowed() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth {
+                biometricSettingsRepository.setIsNonStrongBiometricAllowed(false)
+            }
+        }
+
+    @Test
+    fun authenticateDoesNotRunWhenCurrentUserIsNotPrimary() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth {
+                launch { fakeUserRepository.setSelectedUserInfo(secondaryUser) }
+            }
+        }
+
+    @Test
+    fun authenticateDoesNotRunWhenSecureCameraIsActive() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth {
+                bouncerRepository.setAlternateVisible(false)
+                fakeCommandQueue.doForEachCallback {
+                    it.onCameraLaunchGestureDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
+                }
+            }
+        }
+
+    @Test
+    fun authenticateDoesNotRunOnUnsupportedPosture() =
+        testScope.runTest {
+            testGatingCheckForFaceAuth {
+                biometricSettingsRepository.setIsFaceAuthSupportedInCurrentPosture(false)
+            }
+        }
+
+    @Test
+    fun authenticateFallbacksToDetectionWhenItCannotRun() =
+        testScope.runTest {
+            whenever(faceManager.sensorPropertiesInternal)
+                .thenReturn(listOf(createFaceSensorProperties(supportsFaceDetection = true)))
+            whenever(bypassController.bypassEnabled).thenReturn(true)
+            underTest = createDeviceEntryFaceAuthRepositoryImpl()
+            initCollectors()
+            allPreconditionsToRunFaceAuthAreTrue()
+
+            // Flip one precondition to false.
+            biometricSettingsRepository.setIsNonStrongBiometricAllowed(false)
+            assertThat(canFaceAuthRun()).isFalse()
+            underTest.authenticate(
+                FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER,
+                fallbackToDetection = true
+            )
+            faceAuthenticateIsNotCalled()
+
+            faceDetectIsCalled()
+        }
+
+    @Test
+    fun everythingWorksWithFaceAuthRefactorFlagDisabled() =
+        testScope.runTest {
+            featureFlags.set(FACE_AUTH_REFACTOR, false)
+
+            underTest = createDeviceEntryFaceAuthRepositoryImpl()
+            initCollectors()
+
+            // Collecting any flows exposed in the public API doesn't throw any error
+            authStatus()
+            detectStatus()
+            authRunning()
+            lockedOut()
+            canFaceAuthRun()
+            authenticated()
+        }
+
+    @Test
+    fun isAuthenticatedIsFalseWhenFaceAuthFails() =
+        testScope.runTest {
+            initCollectors()
+            allPreconditionsToRunFaceAuthAreTrue()
+
+            triggerFaceAuth(false)
+
+            authenticationCallback.value.onAuthenticationFailed()
+
+            assertThat(authenticated()).isFalse()
+        }
+
+    @Test
+    fun isAuthenticatedIsFalseWhenFaceAuthErrorsOut() =
+        testScope.runTest {
+            initCollectors()
+            allPreconditionsToRunFaceAuthAreTrue()
+
+            triggerFaceAuth(false)
+
+            authenticationCallback.value.onAuthenticationError(-1, "some error")
+
+            assertThat(authenticated()).isFalse()
+        }
+
+    @Test
+    fun isAuthenticatedIsResetToFalseWhenKeyguardIsGoingAway() =
+        testScope.runTest {
+            initCollectors()
+            allPreconditionsToRunFaceAuthAreTrue()
+
+            triggerFaceAuth(false)
+
+            authenticationCallback.value.onAuthenticationSucceeded(
+                mock(FaceManager.AuthenticationResult::class.java)
+            )
+
+            assertThat(authenticated()).isTrue()
+
+            keyguardRepository.setKeyguardGoingAway(true)
+
+            assertThat(authenticated()).isFalse()
+        }
+
+    @Test
+    fun isAuthenticatedIsResetToFalseWhenUserIsSwitching() =
+        testScope.runTest {
+            initCollectors()
+            allPreconditionsToRunFaceAuthAreTrue()
+
+            triggerFaceAuth(false)
+
+            authenticationCallback.value.onAuthenticationSucceeded(
+                mock(FaceManager.AuthenticationResult::class.java)
+            )
+
+            assertThat(authenticated()).isTrue()
+
+            fakeUserRepository.setUserSwitching(true)
+
+            assertThat(authenticated()).isFalse()
+        }
+
+    @Test
+    fun detectDoesNotRunWhenFaceIsNotEnrolled() =
+        testScope.runTest {
+            testGatingCheckForDetect { biometricSettingsRepository.setFaceEnrolled(false) }
+        }
+
+    @Test
+    fun detectDoesNotRunWhenFaceIsNotEnabled() =
+        testScope.runTest {
+            testGatingCheckForDetect { biometricSettingsRepository.setIsFaceAuthEnabled(false) }
+        }
+
+    @Test
+    fun detectDoesNotRunWhenUserSwitchingInProgress() =
+        testScope.runTest { testGatingCheckForDetect { fakeUserRepository.setUserSwitching(true) } }
+
+    @Test
+    fun detectDoesNotRunWhenKeyguardGoingAway() =
+        testScope.runTest {
+            testGatingCheckForDetect { keyguardRepository.setKeyguardGoingAway(true) }
+        }
+
+    @Test
+    fun detectDoesNotRunWhenDeviceSleepingStartingToSleep() =
+        testScope.runTest {
+            testGatingCheckForDetect {
+                keyguardRepository.setWakefulnessModel(
+                    WakefulnessModel(
+                        state = WakefulnessState.STARTING_TO_SLEEP,
+                        isWakingUpOrAwake = false,
+                        lastWakeReason = WakeSleepReason.OTHER,
+                        lastSleepReason = WakeSleepReason.OTHER,
+                    )
+                )
+            }
+        }
+
+    @Test
+    fun detectDoesNotRunWhenSecureCameraIsActive() =
+        testScope.runTest {
+            testGatingCheckForDetect {
+                bouncerRepository.setAlternateVisible(false)
+                fakeCommandQueue.doForEachCallback {
+                    it.onCameraLaunchGestureDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
+                }
+            }
+        }
+
+    @Test
+    fun detectDoesNotRunWhenFaceAuthNotSupportedInCurrentPosture() =
+        testScope.runTest {
+            testGatingCheckForDetect {
+                biometricSettingsRepository.setIsFaceAuthSupportedInCurrentPosture(false)
+            }
+        }
+
+    @Test
+    fun detectDoesNotRunWhenCurrentUserInLockdown() =
+        testScope.runTest {
+            testGatingCheckForDetect { biometricSettingsRepository.setIsUserInLockdown(true) }
+        }
+
+    @Test
+    fun detectDoesNotRunWhenBypassIsNotEnabled() =
+        testScope.runTest {
+            runCurrent()
+            verify(bypassController)
+                .registerOnBypassStateChangedListener(bypassStateChangedListener.capture())
+
+            testGatingCheckForDetect {
+                bypassStateChangedListener.value.onBypassStateChanged(false)
+            }
+        }
+
+    @Test
+    fun detectDoesNotRunWhenNonStrongBiometricIsAllowed() =
+        testScope.runTest {
+            testGatingCheckForDetect {
+                biometricSettingsRepository.setIsNonStrongBiometricAllowed(true)
+            }
+        }
+
+    @Test
+    fun detectDoesNotRunIfUdfpsIsRunning() =
+        testScope.runTest {
+            testGatingCheckForDetect {
+                deviceEntryFingerprintAuthRepository.setAvailableFpSensorType(
+                    BiometricType.UNDER_DISPLAY_FINGERPRINT
+                )
+                deviceEntryFingerprintAuthRepository.setIsRunning(true)
+            }
+        }
+
+    private suspend fun TestScope.testGatingCheckForFaceAuth(gatingCheckModifier: () -> Unit) {
+        initCollectors()
+        allPreconditionsToRunFaceAuthAreTrue()
+
+        gatingCheckModifier()
+        runCurrent()
+
+        // gating check doesn't allow face auth to run.
+        assertThat(underTest.canRunFaceAuth.value).isFalse()
+
+        // flip the gating check back on.
+        allPreconditionsToRunFaceAuthAreTrue()
+
+        triggerFaceAuth(false)
+
+        // Flip gating check off
+        gatingCheckModifier()
+        runCurrent()
+
+        // Stops currently running auth
+        assertThat(wasAuthCancelled).isTrue()
+        clearInvocations(faceManager)
+
+        // Try auth again
+        underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
+
+        // Auth can't run again
+        faceAuthenticateIsNotCalled()
+    }
+
+    private suspend fun TestScope.testGatingCheckForDetect(gatingCheckModifier: () -> Unit) {
+        initCollectors()
+        allPreconditionsToRunFaceAuthAreTrue()
+
+        // This will stop face auth from running but is required to be false for detect.
+        biometricSettingsRepository.setIsNonStrongBiometricAllowed(false)
+        runCurrent()
+
+        assertThat(canFaceAuthRun()).isFalse()
+
+        // Trigger authenticate with detection fallback
+        underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER, fallbackToDetection = true)
+
+        faceAuthenticateIsNotCalled()
+        faceDetectIsCalled()
+        cancellationSignal.value.setOnCancelListener { wasDetectCancelled = true }
+
+        // Flip gating check
+        gatingCheckModifier()
+        runCurrent()
+
+        // Stops currently running detect
+        assertThat(wasDetectCancelled).isTrue()
+        clearInvocations(faceManager)
+
+        // Try to run detect again
+        underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER, fallbackToDetection = true)
+
+        // Detect won't run because preconditions are not true anymore.
+        faceDetectIsNotCalled()
+    }
+
+    private suspend fun triggerFaceAuth(fallbackToDetect: Boolean) {
+        assertThat(canFaceAuthRun()).isTrue()
+        underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER, fallbackToDetect)
+        faceAuthenticateIsCalled()
+        assertThat(authRunning()).isTrue()
+        cancellationSignal.value.setOnCancelListener { wasAuthCancelled = true }
+    }
+
+    private suspend fun TestScope.allPreconditionsToRunFaceAuthAreTrue() {
+        biometricSettingsRepository.setFaceEnrolled(true)
+        biometricSettingsRepository.setIsFaceAuthEnabled(true)
+        fakeUserRepository.setUserSwitching(false)
+        deviceEntryFingerprintAuthRepository.setLockedOut(false)
+        trustRepository.setCurrentUserTrusted(false)
+        keyguardRepository.setKeyguardGoingAway(false)
+        keyguardRepository.setWakefulnessModel(
+            WakefulnessModel(
+                WakefulnessState.STARTING_TO_WAKE,
+                true,
+                WakeSleepReason.OTHER,
+                WakeSleepReason.OTHER
+            )
+        )
+        biometricSettingsRepository.setIsNonStrongBiometricAllowed(true)
+        biometricSettingsRepository.setIsUserInLockdown(false)
+        fakeUserRepository.setSelectedUserInfo(primaryUser)
+        biometricSettingsRepository.setIsFaceAuthSupportedInCurrentPosture(true)
+        bouncerRepository.setAlternateVisible(true)
+        runCurrent()
+    }
+
+    private suspend fun TestScope.initCollectors() {
+        authStatus = collectLastValue(underTest.authenticationStatus)
+        detectStatus = collectLastValue(underTest.detectionStatus)
+        authRunning = collectLastValue(underTest.isAuthRunning)
+        lockedOut = collectLastValue(underTest.isLockedOut)
+        canFaceAuthRun = collectLastValue(underTest.canRunFaceAuth)
+        authenticated = collectLastValue(underTest.isAuthenticated)
+        fakeUserRepository.setSelectedUserInfo(primaryUser)
+    }
+
+    private fun successResult() = FaceManager.AuthenticationResult(null, null, primaryUserId, false)
+
+    private fun faceDetectIsCalled() {
+        verify(faceManager)
+            .detectFace(
+                cancellationSignal.capture(),
+                detectionCallback.capture(),
+                eq(FaceAuthenticateOptions.Builder().setUserId(primaryUserId).build())
+            )
+    }
+
+    private fun faceAuthenticateIsCalled() {
+        verify(faceManager)
+            .authenticate(
+                isNull(),
+                cancellationSignal.capture(),
+                authenticationCallback.capture(),
+                isNull(),
+                eq(FaceAuthenticateOptions.Builder().setUserId(primaryUserId).build())
+            )
+    }
+
+    private fun faceAuthenticateIsNotCalled() {
+        verify(faceManager, never())
+            .authenticate(
+                isNull(),
+                any(),
+                any(),
+                isNull(),
+                any(FaceAuthenticateOptions::class.java)
+            )
+    }
+
+    private fun faceDetectIsNotCalled() {
+        verify(faceManager, never())
+            .detectFace(any(), any(), any(FaceAuthenticateOptions::class.java))
+    }
+
+    private fun createFaceSensorProperties(
+        supportsFaceDetection: Boolean
+    ): FaceSensorPropertiesInternal {
+        val componentInfo =
+            listOf(
+                ComponentInfoInternal(
+                    "faceSensor" /* componentId */,
+                    "vendor/model/revision" /* hardwareVersion */,
+                    "1.01" /* firmwareVersion */,
+                    "00000001" /* serialNumber */,
+                    "" /* softwareVersion */
+                )
+            )
+        return FaceSensorPropertiesInternal(
+            0 /* id */,
+            FaceSensorProperties.STRENGTH_STRONG,
+            1 /* maxTemplatesAllowed */,
+            componentInfo,
+            FaceSensorProperties.TYPE_UNKNOWN,
+            supportsFaceDetection /* supportsFaceDetection */,
+            true /* supportsSelfIllumination */,
+            false /* resetLockoutRequiresChallenge */
+        )
+    }
+
+    companion object {
+        const val primaryUserId = 1
+        val keyguardSessionId = fakeInstanceId(10)!!
+        val primaryUser = UserInfo(primaryUserId, "test user", FLAG_PRIMARY)
+
+        val secondaryUser = UserInfo(2, "secondary user", 0)
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt
index 70f766f..e57b044 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.keyguard.data.repository
 
+import android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT
 import android.hardware.biometrics.BiometricSourceType
 import androidx.test.filters.SmallTest
 import com.android.keyguard.KeyguardUpdateMonitor
@@ -30,7 +31,6 @@
 import kotlinx.coroutines.test.TestScope
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
-import org.junit.After
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -70,11 +70,6 @@
             )
     }
 
-    @After
-    fun tearDown() {
-        //        verify(keyguardUpdateMonitor).removeCallback(updateMonitorCallback.value)
-    }
-
     @Test
     fun isLockedOut_whenFingerprintLockoutStateChanges_emitsNewValue() =
         testScope.runTest {
@@ -129,29 +124,55 @@
     }
 
     @Test
-    fun enabledFingerprintTypeProvidesTheCorrectOutput() =
+    fun enabledFingerprintTypeProvidesTheCorrectOutputForSpfs() =
         testScope.runTest {
             whenever(authController.isSfpsSupported).thenReturn(true)
             whenever(authController.isUdfpsSupported).thenReturn(false)
             whenever(authController.isRearFpsSupported).thenReturn(false)
 
-            assertThat(underTest.availableFpSensorType).isEqualTo(BiometricType.SIDE_FINGERPRINT)
+            val availableFpSensorType = collectLastValue(underTest.availableFpSensorType)
+            assertThat(availableFpSensorType()).isEqualTo(BiometricType.SIDE_FINGERPRINT)
+        }
 
+    @Test
+    fun enabledFingerprintTypeProvidesTheCorrectOutputForUdfps() =
+        testScope.runTest {
             whenever(authController.isSfpsSupported).thenReturn(false)
             whenever(authController.isUdfpsSupported).thenReturn(true)
             whenever(authController.isRearFpsSupported).thenReturn(false)
+            val availableFpSensorType = collectLastValue(underTest.availableFpSensorType)
+            assertThat(availableFpSensorType()).isEqualTo(BiometricType.UNDER_DISPLAY_FINGERPRINT)
+        }
 
-            assertThat(underTest.availableFpSensorType)
-                .isEqualTo(BiometricType.UNDER_DISPLAY_FINGERPRINT)
-
+    @Test
+    fun enabledFingerprintTypeProvidesTheCorrectOutputForRearFps() =
+        testScope.runTest {
             whenever(authController.isSfpsSupported).thenReturn(false)
             whenever(authController.isUdfpsSupported).thenReturn(false)
             whenever(authController.isRearFpsSupported).thenReturn(true)
 
-            assertThat(underTest.availableFpSensorType).isEqualTo(BiometricType.REAR_FINGERPRINT)
+            val availableFpSensorType = collectLastValue(underTest.availableFpSensorType)
 
+            assertThat(availableFpSensorType()).isEqualTo(BiometricType.REAR_FINGERPRINT)
+        }
+
+    @Test
+    fun enabledFingerprintTypeProvidesTheCorrectOutputAfterAllAuthenticatorsAreRegistered() =
+        testScope.runTest {
+            whenever(authController.isSfpsSupported).thenReturn(false)
+            whenever(authController.isUdfpsSupported).thenReturn(false)
             whenever(authController.isRearFpsSupported).thenReturn(false)
+            whenever(authController.areAllFingerprintAuthenticatorsRegistered()).thenReturn(false)
 
-            assertThat(underTest.availableFpSensorType).isNull()
+            val availableFpSensorType = collectLastValue(underTest.availableFpSensorType)
+            runCurrent()
+
+            val callback = ArgumentCaptor.forClass(AuthController.Callback::class.java)
+            verify(authController).addCallback(callback.capture())
+            assertThat(availableFpSensorType()).isNull()
+
+            whenever(authController.isUdfpsSupported).thenReturn(true)
+            callback.value.onAllAuthenticatorsRegistered(TYPE_FINGERPRINT)
+            assertThat(availableFpSensorType()).isEqualTo(BiometricType.UNDER_DISPLAY_FINGERPRINT)
         }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardFaceAuthManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardFaceAuthManagerTest.kt
deleted file mode 100644
index d55370b..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardFaceAuthManagerTest.kt
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.keyguard.data.repository
-
-import android.app.StatusBarManager.SESSION_KEYGUARD
-import android.content.pm.UserInfo
-import android.hardware.biometrics.BiometricFaceConstants.FACE_ERROR_CANCELED
-import android.hardware.biometrics.BiometricFaceConstants.FACE_ERROR_LOCKOUT_PERMANENT
-import android.hardware.biometrics.ComponentInfoInternal
-import android.hardware.face.FaceAuthenticateOptions
-import android.hardware.face.FaceManager
-import android.hardware.face.FaceSensorProperties
-import android.hardware.face.FaceSensorPropertiesInternal
-import android.os.CancellationSignal
-import androidx.test.filters.SmallTest
-import com.android.internal.logging.InstanceId.fakeInstanceId
-import com.android.internal.logging.UiEventLogger
-import com.android.keyguard.FaceAuthUiEvent
-import com.android.keyguard.FaceAuthUiEvent.FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN
-import com.android.keyguard.FaceAuthUiEvent.FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER
-import com.android.systemui.R
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.FlowValue
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.dump.logcatLogBuffer
-import com.android.systemui.keyguard.shared.model.AuthenticationStatus
-import com.android.systemui.keyguard.shared.model.DetectionStatus
-import com.android.systemui.keyguard.shared.model.ErrorAuthenticationStatus
-import com.android.systemui.keyguard.shared.model.HelpAuthenticationStatus
-import com.android.systemui.keyguard.shared.model.SuccessAuthenticationStatus
-import com.android.systemui.log.FaceAuthenticationLogger
-import com.android.systemui.log.SessionTracker
-import com.android.systemui.statusbar.phone.KeyguardBypassController
-import com.android.systemui.user.data.repository.FakeUserRepository
-import com.android.systemui.util.mockito.whenever
-import com.google.common.truth.Truth.assertThat
-import java.io.PrintWriter
-import java.io.StringWriter
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestDispatcher
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.advanceTimeBy
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import org.mockito.ArgumentCaptor
-import org.mockito.ArgumentMatchers.any
-import org.mockito.ArgumentMatchers.eq
-import org.mockito.Captor
-import org.mockito.Mock
-import org.mockito.Mockito.clearInvocations
-import org.mockito.Mockito.isNull
-import org.mockito.Mockito.never
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyNoMoreInteractions
-import org.mockito.MockitoAnnotations
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@SmallTest
-@RunWith(JUnit4::class)
-class KeyguardFaceAuthManagerTest : SysuiTestCase() {
-    private lateinit var underTest: KeyguardFaceAuthManagerImpl
-
-    @Mock private lateinit var faceManager: FaceManager
-    @Mock private lateinit var bypassController: KeyguardBypassController
-    @Mock private lateinit var sessionTracker: SessionTracker
-    @Mock private lateinit var uiEventLogger: UiEventLogger
-    @Mock private lateinit var dumpManager: DumpManager
-
-    @Captor
-    private lateinit var authenticationCallback: ArgumentCaptor<FaceManager.AuthenticationCallback>
-    @Captor
-    private lateinit var detectionCallback: ArgumentCaptor<FaceManager.FaceDetectionCallback>
-    @Captor private lateinit var cancellationSignal: ArgumentCaptor<CancellationSignal>
-    @Captor
-    private lateinit var faceLockoutResetCallback: ArgumentCaptor<FaceManager.LockoutResetCallback>
-    private lateinit var testDispatcher: TestDispatcher
-
-    private lateinit var testScope: TestScope
-    private lateinit var fakeUserRepository: FakeUserRepository
-    private lateinit var authStatus: FlowValue<AuthenticationStatus?>
-    private lateinit var detectStatus: FlowValue<DetectionStatus?>
-    private lateinit var authRunning: FlowValue<Boolean?>
-    private lateinit var lockedOut: FlowValue<Boolean?>
-
-    @Before
-    fun setup() {
-        MockitoAnnotations.initMocks(this)
-        fakeUserRepository = FakeUserRepository()
-        fakeUserRepository.setUserInfos(listOf(currentUser))
-        testDispatcher = StandardTestDispatcher()
-        testScope = TestScope(testDispatcher)
-        whenever(sessionTracker.getSessionId(SESSION_KEYGUARD)).thenReturn(keyguardSessionId)
-        whenever(bypassController.bypassEnabled).thenReturn(true)
-        underTest = createFaceAuthManagerImpl(faceManager)
-    }
-
-    private fun createFaceAuthManagerImpl(
-        fmOverride: FaceManager? = faceManager,
-        bypassControllerOverride: KeyguardBypassController? = bypassController
-    ) =
-        KeyguardFaceAuthManagerImpl(
-            mContext,
-            fmOverride,
-            fakeUserRepository,
-            bypassControllerOverride,
-            testScope.backgroundScope,
-            testDispatcher,
-            sessionTracker,
-            uiEventLogger,
-            FaceAuthenticationLogger(logcatLogBuffer("KeyguardFaceAuthManagerLog")),
-            dumpManager,
-        )
-
-    @Test
-    fun faceAuthRunsAndProvidesAuthStatusUpdates() =
-        testScope.runTest {
-            testSetup(this)
-
-            FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER.extraInfo = 10
-            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
-            faceAuthenticateIsCalled()
-            uiEventIsLogged(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
-
-            assertThat(authRunning()).isTrue()
-
-            val successResult = successResult()
-            authenticationCallback.value.onAuthenticationSucceeded(successResult)
-
-            assertThat(authStatus()).isEqualTo(SuccessAuthenticationStatus(successResult))
-
-            assertThat(authRunning()).isFalse()
-        }
-
-    private fun uiEventIsLogged(faceAuthUiEvent: FaceAuthUiEvent) {
-        verify(uiEventLogger)
-            .logWithInstanceIdAndPosition(
-                faceAuthUiEvent,
-                0,
-                null,
-                keyguardSessionId,
-                faceAuthUiEvent.extraInfo
-            )
-    }
-
-    @Test
-    fun faceAuthDoesNotRunWhileItIsAlreadyRunning() =
-        testScope.runTest {
-            testSetup(this)
-
-            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
-            faceAuthenticateIsCalled()
-            clearInvocations(faceManager)
-            clearInvocations(uiEventLogger)
-
-            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
-            verifyNoMoreInteractions(faceManager)
-            verifyNoMoreInteractions(uiEventLogger)
-        }
-
-    @Test
-    fun faceLockoutStatusIsPropagated() =
-        testScope.runTest {
-            testSetup(this)
-            verify(faceManager).addLockoutResetCallback(faceLockoutResetCallback.capture())
-
-            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
-            faceAuthenticateIsCalled()
-
-            authenticationCallback.value.onAuthenticationError(
-                FACE_ERROR_LOCKOUT_PERMANENT,
-                "face locked out"
-            )
-
-            assertThat(lockedOut()).isTrue()
-
-            faceLockoutResetCallback.value.onLockoutReset(0)
-            assertThat(lockedOut()).isFalse()
-        }
-
-    @Test
-    fun faceDetectionSupportIsTheCorrectValue() =
-        testScope.runTest {
-            assertThat(createFaceAuthManagerImpl(fmOverride = null).isDetectionSupported).isFalse()
-
-            whenever(faceManager.sensorPropertiesInternal).thenReturn(null)
-            assertThat(createFaceAuthManagerImpl().isDetectionSupported).isFalse()
-
-            whenever(faceManager.sensorPropertiesInternal).thenReturn(listOf())
-            assertThat(createFaceAuthManagerImpl().isDetectionSupported).isFalse()
-
-            whenever(faceManager.sensorPropertiesInternal)
-                .thenReturn(listOf(createFaceSensorProperties(supportsFaceDetection = false)))
-            assertThat(createFaceAuthManagerImpl().isDetectionSupported).isFalse()
-
-            whenever(faceManager.sensorPropertiesInternal)
-                .thenReturn(
-                    listOf(
-                        createFaceSensorProperties(supportsFaceDetection = false),
-                        createFaceSensorProperties(supportsFaceDetection = true)
-                    )
-                )
-            assertThat(createFaceAuthManagerImpl().isDetectionSupported).isFalse()
-
-            whenever(faceManager.sensorPropertiesInternal)
-                .thenReturn(
-                    listOf(
-                        createFaceSensorProperties(supportsFaceDetection = true),
-                        createFaceSensorProperties(supportsFaceDetection = false)
-                    )
-                )
-            assertThat(createFaceAuthManagerImpl().isDetectionSupported).isTrue()
-        }
-
-    @Test
-    fun cancelStopsFaceAuthentication() =
-        testScope.runTest {
-            testSetup(this)
-
-            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
-            faceAuthenticateIsCalled()
-
-            var wasAuthCancelled = false
-            cancellationSignal.value.setOnCancelListener { wasAuthCancelled = true }
-
-            underTest.cancel()
-            assertThat(wasAuthCancelled).isTrue()
-            assertThat(authRunning()).isFalse()
-        }
-
-    @Test
-    fun cancelInvokedWithoutFaceAuthRunningIsANoop() = testScope.runTest { underTest.cancel() }
-
-    @Test
-    fun faceDetectionRunsAndPropagatesDetectionStatus() =
-        testScope.runTest {
-            whenever(faceManager.sensorPropertiesInternal)
-                .thenReturn(listOf(createFaceSensorProperties(supportsFaceDetection = true)))
-            underTest = createFaceAuthManagerImpl()
-            testSetup(this)
-
-            underTest.detect()
-            faceDetectIsCalled()
-
-            detectionCallback.value.onFaceDetected(1, 1, true)
-
-            assertThat(detectStatus()).isEqualTo(DetectionStatus(1, 1, true))
-        }
-
-    @Test
-    fun faceDetectDoesNotRunIfDetectionIsNotSupported() =
-        testScope.runTest {
-            whenever(faceManager.sensorPropertiesInternal)
-                .thenReturn(listOf(createFaceSensorProperties(supportsFaceDetection = false)))
-            underTest = createFaceAuthManagerImpl()
-            testSetup(this)
-            clearInvocations(faceManager)
-
-            underTest.detect()
-
-            verify(faceManager, never()).detectFace(any(), any(), any())
-        }
-
-    @Test
-    fun faceAuthShouldWaitAndRunIfTriggeredWhileCancelling() =
-        testScope.runTest {
-            testSetup(this)
-
-            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
-            faceAuthenticateIsCalled()
-
-            // Enter cancelling state
-            underTest.cancel()
-            clearInvocations(faceManager)
-
-            // Auth is while cancelling.
-            underTest.authenticate(FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN)
-            // Auth is not started
-            verifyNoMoreInteractions(faceManager)
-
-            // Auth is done cancelling.
-            authenticationCallback.value.onAuthenticationError(
-                FACE_ERROR_CANCELED,
-                "First auth attempt cancellation completed"
-            )
-            assertThat(authStatus())
-                .isEqualTo(
-                    ErrorAuthenticationStatus(
-                        FACE_ERROR_CANCELED,
-                        "First auth attempt cancellation completed"
-                    )
-                )
-
-            faceAuthenticateIsCalled()
-            uiEventIsLogged(FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN)
-        }
-
-    @Test
-    fun faceAuthAutoCancelsAfterDefaultCancellationTimeout() =
-        testScope.runTest {
-            testSetup(this)
-
-            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
-            faceAuthenticateIsCalled()
-
-            clearInvocations(faceManager)
-            underTest.cancel()
-            advanceTimeBy(KeyguardFaceAuthManagerImpl.DEFAULT_CANCEL_SIGNAL_TIMEOUT + 1)
-
-            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
-            faceAuthenticateIsCalled()
-        }
-
-    @Test
-    fun faceHelpMessagesAreIgnoredBasedOnConfig() =
-        testScope.runTest {
-            overrideResource(
-                R.array.config_face_acquire_device_entry_ignorelist,
-                intArrayOf(10, 11)
-            )
-            underTest = createFaceAuthManagerImpl()
-            testSetup(this)
-
-            underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
-            faceAuthenticateIsCalled()
-
-            authenticationCallback.value.onAuthenticationHelp(9, "help msg")
-            authenticationCallback.value.onAuthenticationHelp(10, "Ignored help msg")
-            authenticationCallback.value.onAuthenticationHelp(11, "Ignored help msg")
-
-            assertThat(authStatus()).isEqualTo(HelpAuthenticationStatus(9, "help msg"))
-        }
-
-    @Test
-    fun dumpDoesNotErrorOutWhenFaceManagerOrBypassControllerIsNull() =
-        testScope.runTest {
-            fakeUserRepository.setSelectedUserInfo(currentUser)
-            underTest.dump(PrintWriter(StringWriter()), emptyArray())
-
-            underTest =
-                createFaceAuthManagerImpl(fmOverride = null, bypassControllerOverride = null)
-            fakeUserRepository.setSelectedUserInfo(currentUser)
-
-            underTest.dump(PrintWriter(StringWriter()), emptyArray())
-        }
-
-    private suspend fun testSetup(testScope: TestScope) {
-        with(testScope) {
-            authStatus = collectLastValue(underTest.authenticationStatus)
-            detectStatus = collectLastValue(underTest.detectionStatus)
-            authRunning = collectLastValue(underTest.isAuthRunning)
-            lockedOut = collectLastValue(underTest.isLockedOut)
-            fakeUserRepository.setSelectedUserInfo(currentUser)
-        }
-    }
-
-    private fun successResult() = FaceManager.AuthenticationResult(null, null, currentUserId, false)
-
-    private fun faceDetectIsCalled() {
-        verify(faceManager)
-            .detectFace(
-                cancellationSignal.capture(),
-                detectionCallback.capture(),
-                eq(FaceAuthenticateOptions.Builder().setUserId(currentUserId).build())
-            )
-    }
-
-    private fun faceAuthenticateIsCalled() {
-        verify(faceManager)
-            .authenticate(
-                isNull(),
-                cancellationSignal.capture(),
-                authenticationCallback.capture(),
-                isNull(),
-                eq(FaceAuthenticateOptions.Builder().setUserId(currentUserId).build())
-            )
-    }
-
-    private fun createFaceSensorProperties(
-        supportsFaceDetection: Boolean
-    ): FaceSensorPropertiesInternal {
-        val componentInfo =
-            listOf(
-                ComponentInfoInternal(
-                    "faceSensor" /* componentId */,
-                    "vendor/model/revision" /* hardwareVersion */,
-                    "1.01" /* firmwareVersion */,
-                    "00000001" /* serialNumber */,
-                    "" /* softwareVersion */
-                )
-            )
-        return FaceSensorPropertiesInternal(
-            0 /* id */,
-            FaceSensorProperties.STRENGTH_STRONG,
-            1 /* maxTemplatesAllowed */,
-            componentInfo,
-            FaceSensorProperties.TYPE_UNKNOWN,
-            supportsFaceDetection /* supportsFaceDetection */,
-            true /* supportsSelfIllumination */,
-            false /* resetLockoutRequiresChallenge */
-        )
-    }
-
-    companion object {
-        const val currentUserId = 1
-        val keyguardSessionId = fakeInstanceId(10)!!
-        val currentUser = UserInfo(currentUserId, "test user", 0)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt
index 0e6f8d4..3fd97da 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt
@@ -46,10 +46,12 @@
 import com.android.systemui.util.mockito.whenever
 import com.android.systemui.util.mockito.withArgCaptor
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.launchIn
 import kotlinx.coroutines.flow.onCompletion
 import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
 import org.junit.Before
@@ -59,6 +61,7 @@
 import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class KeyguardRepositoryImplTest : SysuiTestCase() {
@@ -73,6 +76,9 @@
     @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
     @Mock private lateinit var dreamOverlayCallbackController: DreamOverlayCallbackController
     @Mock private lateinit var dozeParameters: DozeParameters
+    private val mainDispatcher = StandardTestDispatcher()
+    private val testDispatcher = StandardTestDispatcher()
+    private val testScope = TestScope(testDispatcher)
 
     private lateinit var underTest: KeyguardRepositoryImpl
 
@@ -92,12 +98,13 @@
                 dozeParameters,
                 authController,
                 dreamOverlayCallbackController,
+                mainDispatcher
             )
     }
 
     @Test
     fun animateBottomAreaDozingTransitions() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             assertThat(underTest.animateBottomAreaDozingTransitions.value).isEqualTo(false)
 
             underTest.setAnimateDozingTransitions(true)
@@ -112,7 +119,7 @@
 
     @Test
     fun bottomAreaAlpha() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             assertThat(underTest.bottomAreaAlpha.value).isEqualTo(1f)
 
             underTest.setBottomAreaAlpha(0.1f)
@@ -133,7 +140,7 @@
 
     @Test
     fun clockPosition() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             assertThat(underTest.clockPosition.value).isEqualTo(Position(0, 0))
 
             underTest.setClockPosition(0, 1)
@@ -151,11 +158,12 @@
 
     @Test
     fun isKeyguardShowing() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             whenever(keyguardStateController.isShowing).thenReturn(false)
             var latest: Boolean? = null
             val job = underTest.isKeyguardShowing.onEach { latest = it }.launchIn(this)
 
+            runCurrent()
             assertThat(latest).isFalse()
             assertThat(underTest.isKeyguardShowing()).isFalse()
 
@@ -164,11 +172,13 @@
 
             whenever(keyguardStateController.isShowing).thenReturn(true)
             captor.value.onKeyguardShowingChanged()
+            runCurrent()
             assertThat(latest).isTrue()
             assertThat(underTest.isKeyguardShowing()).isTrue()
 
             whenever(keyguardStateController.isShowing).thenReturn(false)
             captor.value.onKeyguardShowingChanged()
+            runCurrent()
             assertThat(latest).isFalse()
             assertThat(underTest.isKeyguardShowing()).isFalse()
 
@@ -197,11 +207,12 @@
 
     @Test
     fun isKeyguardOccluded() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             whenever(keyguardStateController.isOccluded).thenReturn(false)
             var latest: Boolean? = null
             val job = underTest.isKeyguardOccluded.onEach { latest = it }.launchIn(this)
 
+            runCurrent()
             assertThat(latest).isFalse()
 
             val captor = argumentCaptor<KeyguardStateController.Callback>()
@@ -209,10 +220,12 @@
 
             whenever(keyguardStateController.isOccluded).thenReturn(true)
             captor.value.onKeyguardShowingChanged()
+            runCurrent()
             assertThat(latest).isTrue()
 
             whenever(keyguardStateController.isOccluded).thenReturn(false)
             captor.value.onKeyguardShowingChanged()
+            runCurrent()
             assertThat(latest).isFalse()
 
             job.cancel()
@@ -220,11 +233,12 @@
 
     @Test
     fun isKeyguardUnlocked() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             whenever(keyguardStateController.isUnlocked).thenReturn(false)
             var latest: Boolean? = null
             val job = underTest.isKeyguardUnlocked.onEach { latest = it }.launchIn(this)
 
+            runCurrent()
             assertThat(latest).isFalse()
 
             val captor = argumentCaptor<KeyguardStateController.Callback>()
@@ -232,10 +246,12 @@
 
             whenever(keyguardStateController.isUnlocked).thenReturn(true)
             captor.value.onUnlockedChanged()
+            runCurrent()
             assertThat(latest).isTrue()
 
             whenever(keyguardStateController.isUnlocked).thenReturn(false)
             captor.value.onUnlockedChanged()
+            runCurrent()
             assertThat(latest).isFalse()
 
             job.cancel()
@@ -243,82 +259,98 @@
 
     @Test
     fun isDozing() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             var latest: Boolean? = null
             val job = underTest.isDozing.onEach { latest = it }.launchIn(this)
 
+            runCurrent()
             val captor = argumentCaptor<DozeHost.Callback>()
             verify(dozeHost).addCallback(captor.capture())
 
             captor.value.onDozingChanged(true)
+            runCurrent()
             assertThat(latest).isTrue()
 
             captor.value.onDozingChanged(false)
+            runCurrent()
             assertThat(latest).isFalse()
 
             job.cancel()
+            runCurrent()
             verify(dozeHost).removeCallback(captor.value)
         }
 
     @Test
     fun `isDozing - starts with correct initial value for isDozing`() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             var latest: Boolean? = null
 
             whenever(statusBarStateController.isDozing).thenReturn(true)
             var job = underTest.isDozing.onEach { latest = it }.launchIn(this)
+            runCurrent()
             assertThat(latest).isTrue()
             job.cancel()
 
             whenever(statusBarStateController.isDozing).thenReturn(false)
             job = underTest.isDozing.onEach { latest = it }.launchIn(this)
+            runCurrent()
             assertThat(latest).isFalse()
             job.cancel()
         }
 
     @Test
     fun dozeAmount() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             val values = mutableListOf<Float>()
             val job = underTest.linearDozeAmount.onEach(values::add).launchIn(this)
 
             val captor = argumentCaptor<StatusBarStateController.StateListener>()
+            runCurrent()
             verify(statusBarStateController).addCallback(captor.capture())
 
             captor.value.onDozeAmountChanged(0.433f, 0.4f)
+            runCurrent()
             captor.value.onDozeAmountChanged(0.498f, 0.5f)
+            runCurrent()
             captor.value.onDozeAmountChanged(0.661f, 0.65f)
+            runCurrent()
 
             assertThat(values).isEqualTo(listOf(0f, 0.433f, 0.498f, 0.661f))
 
             job.cancel()
+            runCurrent()
             verify(statusBarStateController).removeCallback(captor.value)
         }
 
     @Test
     fun wakefulness() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             val values = mutableListOf<WakefulnessModel>()
             val job = underTest.wakefulness.onEach(values::add).launchIn(this)
 
+            runCurrent()
             val captor = argumentCaptor<WakefulnessLifecycle.Observer>()
             verify(wakefulnessLifecycle).addObserver(captor.capture())
 
             whenever(wakefulnessLifecycle.wakefulness)
                 .thenReturn(WakefulnessLifecycle.WAKEFULNESS_WAKING)
             captor.value.onStartedWakingUp()
+            runCurrent()
 
             whenever(wakefulnessLifecycle.wakefulness)
                 .thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE)
             captor.value.onFinishedWakingUp()
+            runCurrent()
 
             whenever(wakefulnessLifecycle.wakefulness)
                 .thenReturn(WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP)
             captor.value.onStartedGoingToSleep()
+            runCurrent()
 
             whenever(wakefulnessLifecycle.wakefulness)
                 .thenReturn(WakefulnessLifecycle.WAKEFULNESS_ASLEEP)
             captor.value.onFinishedGoingToSleep()
+            runCurrent()
 
             assertThat(values.map { it.state })
                 .isEqualTo(
@@ -333,12 +365,13 @@
                 )
 
             job.cancel()
+            runCurrent()
             verify(wakefulnessLifecycle).removeObserver(captor.value)
         }
 
     @Test
     fun isUdfpsSupported() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             whenever(keyguardUpdateMonitor.isUdfpsSupported).thenReturn(true)
             assertThat(underTest.isUdfpsSupported()).isTrue()
 
@@ -348,11 +381,11 @@
 
     @Test
     fun isKeyguardGoingAway() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             whenever(keyguardStateController.isKeyguardGoingAway).thenReturn(false)
             var latest: Boolean? = null
             val job = underTest.isKeyguardGoingAway.onEach { latest = it }.launchIn(this)
-
+            runCurrent()
             assertThat(latest).isFalse()
 
             val captor = argumentCaptor<KeyguardStateController.Callback>()
@@ -360,10 +393,12 @@
 
             whenever(keyguardStateController.isKeyguardGoingAway).thenReturn(true)
             captor.value.onKeyguardGoingAwayChanged()
+            runCurrent()
             assertThat(latest).isTrue()
 
             whenever(keyguardStateController.isKeyguardGoingAway).thenReturn(false)
             captor.value.onKeyguardGoingAwayChanged()
+            runCurrent()
             assertThat(latest).isFalse()
 
             job.cancel()
@@ -371,20 +406,23 @@
 
     @Test
     fun isDreamingFromKeyguardUpdateMonitor() =
-        runTest(UnconfinedTestDispatcher()) {
+        TestScope(mainDispatcher).runTest {
             whenever(keyguardUpdateMonitor.isDreaming()).thenReturn(false)
             var latest: Boolean? = null
             val job = underTest.isDreaming.onEach { latest = it }.launchIn(this)
 
+            runCurrent()
             assertThat(latest).isFalse()
 
             val captor = argumentCaptor<KeyguardUpdateMonitorCallback>()
             verify(keyguardUpdateMonitor).registerCallback(captor.capture())
 
             captor.value.onDreamingStateChanged(true)
+            runCurrent()
             assertThat(latest).isTrue()
 
             captor.value.onDreamingStateChanged(false)
+            runCurrent()
             assertThat(latest).isFalse()
 
             job.cancel()
@@ -392,11 +430,12 @@
 
     @Test
     fun isDreamingFromDreamOverlayCallbackController() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             whenever(dreamOverlayCallbackController.isDreaming).thenReturn(false)
             var latest: Boolean? = null
             val job = underTest.isDreamingWithOverlay.onEach { latest = it }.launchIn(this)
 
+            runCurrent()
             assertThat(latest).isFalse()
 
             val listener =
@@ -405,9 +444,11 @@
                 }
 
             listener.onStartDream()
+            runCurrent()
             assertThat(latest).isTrue()
 
             listener.onWakeUp()
+            runCurrent()
             assertThat(latest).isFalse()
 
             job.cancel()
@@ -415,12 +456,13 @@
 
     @Test
     fun biometricUnlockState() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             val values = mutableListOf<BiometricUnlockModel>()
             val job = underTest.biometricUnlockState.onEach(values::add).launchIn(this)
 
-            val captor = argumentCaptor<BiometricUnlockController.BiometricModeListener>()
-            verify(biometricUnlockController).addBiometricModeListener(captor.capture())
+            runCurrent()
+            val captor = argumentCaptor<BiometricUnlockController.BiometricUnlockEventsListener>()
+            verify(biometricUnlockController).addListener(captor.capture())
 
             listOf(
                     BiometricUnlockController.MODE_NONE,
@@ -435,6 +477,7 @@
                 .forEach {
                     whenever(biometricUnlockController.mode).thenReturn(it)
                     captor.value.onModeChanged(it)
+                    runCurrent()
                 }
 
             assertThat(values)
@@ -454,12 +497,13 @@
                 )
 
             job.cancel()
-            verify(biometricUnlockController).removeBiometricModeListener(captor.value)
+            runCurrent()
+            verify(biometricUnlockController).removeListener(captor.value)
         }
 
     @Test
     fun dozeTransitionModel() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             // For the initial state
             whenever(dozeTransitionListener.oldState).thenReturn(DozeMachine.State.UNINITIALIZED)
             whenever(dozeTransitionListener.newState).thenReturn(DozeMachine.State.UNINITIALIZED)
@@ -467,6 +511,7 @@
             val values = mutableListOf<DozeTransitionModel>()
             val job = underTest.dozeTransitionModel.onEach(values::add).launchIn(this)
 
+            runCurrent()
             val listener =
                 withArgCaptor<DozeTransitionCallback> {
                     verify(dozeTransitionListener).addCallback(capture())
@@ -475,20 +520,26 @@
             // These don't have to reflect real transitions from the DozeMachine. Only that the
             // transitions are properly emitted
             listener.onDozeTransition(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE)
+            runCurrent()
             listener.onDozeTransition(DozeMachine.State.DOZE, DozeMachine.State.DOZE_AOD)
+            runCurrent()
             listener.onDozeTransition(DozeMachine.State.DOZE_AOD_DOCKED, DozeMachine.State.FINISH)
+            runCurrent()
             listener.onDozeTransition(
                 DozeMachine.State.DOZE_REQUEST_PULSE,
                 DozeMachine.State.DOZE_PULSING
             )
+            runCurrent()
             listener.onDozeTransition(
                 DozeMachine.State.DOZE_SUSPEND_TRIGGERS,
                 DozeMachine.State.DOZE_PULSE_DONE
             )
+            runCurrent()
             listener.onDozeTransition(
                 DozeMachine.State.DOZE_AOD_PAUSING,
                 DozeMachine.State.DOZE_AOD_PAUSED
             )
+            runCurrent()
 
             assertThat(values)
                 .isEqualTo(
@@ -517,15 +568,17 @@
                 )
 
             job.cancel()
+            runCurrent()
             verify(dozeTransitionListener).removeCallback(listener)
         }
 
     @Test
     fun fingerprintSensorLocation() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             val values = mutableListOf<Point?>()
             val job = underTest.fingerprintSensorLocation.onEach(values::add).launchIn(this)
 
+            runCurrent()
             val captor = argumentCaptor<AuthController.Callback>()
             verify(authController).addCallback(captor.capture())
 
@@ -539,6 +592,7 @@
                 .onEach {
                     whenever(authController.fingerprintSensorLocation).thenReturn(it)
                     captor.value.onFingerprintLocationChanged()
+                    runCurrent()
                 }
                 .also { dispatchedSensorLocations ->
                     assertThat(values).isEqualTo(listOf(null) + dispatchedSensorLocations)
@@ -549,11 +603,12 @@
 
     @Test
     fun faceSensorLocation() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             val values = mutableListOf<Point?>()
             val job = underTest.faceSensorLocation.onEach(values::add).launchIn(this)
 
             val captor = argumentCaptor<AuthController.Callback>()
+            runCurrent()
             verify(authController).addCallback(captor.capture())
 
             // An initial, null value should be initially emitted so that flows combined with this
@@ -571,6 +626,7 @@
                 .onEach {
                     whenever(authController.faceSensorLocation).thenReturn(it)
                     captor.value.onFaceSensorLocationChanged()
+                    runCurrent()
                 }
                 .also { dispatchedSensorLocations ->
                     assertThat(values).isEqualTo(listOf(null) + dispatchedSensorLocations)
@@ -581,10 +637,11 @@
 
     @Test
     fun biometricUnlockSource() =
-        runTest(UnconfinedTestDispatcher()) {
+        testScope.runTest {
             val values = mutableListOf<BiometricUnlockSource?>()
             val job = underTest.biometricUnlockSource.onEach(values::add).launchIn(this)
 
+            runCurrent()
             val captor = argumentCaptor<KeyguardUpdateMonitorCallback>()
             verify(keyguardUpdateMonitor).registerCallback(captor.capture())
 
@@ -603,6 +660,7 @@
                 )
                 .onEach { biometricSourceType ->
                     captor.value.onBiometricAuthenticated(0, biometricSourceType, false)
+                    runCurrent()
                 }
 
             assertThat(values)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt
index 7f30162..68d694a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt
@@ -18,18 +18,16 @@
 package com.android.systemui.keyguard.domain.interactor
 
 import android.app.StatusBarManager
-import android.content.Context
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.flags.FakeFeatureFlags
 import com.android.systemui.flags.Flags.FACE_AUTH_REFACTOR
+import com.android.systemui.keyguard.data.repository.FakeCommandQueue
 import com.android.systemui.keyguard.data.repository.FakeKeyguardBouncerRepository
 import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
 import com.android.systemui.keyguard.shared.model.CameraLaunchSourceModel
-import com.android.systemui.settings.DisplayTracker
-import com.android.systemui.statusbar.CommandQueue
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.flow.onCompletion
 import kotlinx.coroutines.test.TestScope
@@ -38,7 +36,6 @@
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.Mockito.mock
 import org.mockito.MockitoAnnotations
 
 @SmallTest
@@ -56,7 +53,7 @@
     fun setUp() {
         MockitoAnnotations.initMocks(this)
         featureFlags = FakeFeatureFlags().apply { set(FACE_AUTH_REFACTOR, true) }
-        commandQueue = FakeCommandQueue(mock(Context::class.java), mock(DisplayTracker::class.java))
+        commandQueue = FakeCommandQueue()
         testScope = TestScope()
         repository = FakeKeyguardRepository()
         bouncerRepository = FakeKeyguardBouncerRepository()
@@ -174,22 +171,3 @@
             assertThat(secureCameraActive()).isFalse()
         }
 }
-
-class FakeCommandQueue(val context: Context, val displayTracker: DisplayTracker) :
-    CommandQueue(context, displayTracker) {
-    private val callbacks = mutableListOf<Callbacks>()
-
-    override fun addCallback(callback: Callbacks) {
-        callbacks.add(callback)
-    }
-
-    override fun removeCallback(callback: Callbacks) {
-        callbacks.remove(callback)
-    }
-
-    fun doForEachCallback(func: (callback: Callbacks) -> Unit) {
-        callbacks.forEach { func(it) }
-    }
-
-    fun callbackCount(): Int = callbacks.size
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractorTest.kt
index bdc33f4..24a47b0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractorTest.kt
@@ -48,6 +48,7 @@
 import org.mockito.Answers
 import org.mockito.ArgumentCaptor
 import org.mockito.Mock
+import org.mockito.Mockito.anyInt
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.never
 import org.mockito.Mockito.verify
@@ -124,6 +125,17 @@
     }
 
     @Test
+    fun testShow_isResumed() {
+        whenever(repository.primaryBouncerShow.value).thenReturn(true)
+        whenever(keyguardSecurityModel.getSecurityMode(anyInt()))
+            .thenReturn(KeyguardSecurityModel.SecurityMode.SimPuk)
+
+        underTest.show(true)
+        verify(repository).setPrimaryShow(false)
+        verify(repository).setPrimaryShow(true)
+    }
+
+    @Test
     fun testHide() {
         underTest.hide()
         verify(falsingCollector).onBouncerHidden()
@@ -131,6 +143,7 @@
         verify(repository).setPrimaryShowingSoon(false)
         verify(repository).setPrimaryShow(false)
         verify(mPrimaryBouncerCallbackInteractor).dispatchVisibilityChanged(View.INVISIBLE)
+        verify(repository).setPrimaryStartDisappearAnimation(null)
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/lifecycle/RepeatWhenAttachedTest.kt b/packages/SystemUI/tests/src/com/android/systemui/lifecycle/RepeatWhenAttachedTest.kt
index 91a6de6a..ea11f01 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/lifecycle/RepeatWhenAttachedTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/lifecycle/RepeatWhenAttachedTest.kt
@@ -17,7 +17,6 @@
 
 package com.android.systemui.lifecycle
 
-import android.testing.TestableLooper.RunWithLooper
 import android.view.View
 import android.view.ViewTreeObserver
 import androidx.lifecycle.Lifecycle
@@ -28,8 +27,16 @@
 import com.android.systemui.util.mockito.argumentCaptor
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.DisposableHandle
-import kotlinx.coroutines.test.runBlockingTest
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.resetMain
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import kotlinx.coroutines.test.setMain
+import org.junit.After
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -41,9 +48,9 @@
 import org.mockito.Mockito.`when` as whenever
 import org.mockito.junit.MockitoJUnit
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(JUnit4::class)
-@RunWithLooper
 class RepeatWhenAttachedTest : SysuiTestCase() {
 
     @JvmField @Rule val mockito = MockitoJUnit.rule()
@@ -54,9 +61,13 @@
 
     private lateinit var block: Block
     private lateinit var attachListeners: MutableList<View.OnAttachStateChangeListener>
+    private lateinit var testScope: TestScope
 
     @Before
     fun setUp() {
+        val testDispatcher = StandardTestDispatcher()
+        testScope = TestScope(testDispatcher)
+        Dispatchers.setMain(testDispatcher)
         Assert.setTestThread(Thread.currentThread())
         whenever(view.viewTreeObserver).thenReturn(viewTreeObserver)
         whenever(view.windowVisibility).thenReturn(View.GONE)
@@ -71,186 +82,218 @@
         block = Block()
     }
 
-    @Test(expected = IllegalStateException::class)
-    fun `repeatWhenAttached - enforces main thread`() = runBlockingTest {
-        Assert.setTestThread(null)
-
-        repeatWhenAttached()
+    @After
+    fun tearDown() {
+        Dispatchers.resetMain()
     }
 
     @Test(expected = IllegalStateException::class)
-    fun `repeatWhenAttached - dispose enforces main thread`() = runBlockingTest {
-        val disposableHandle = repeatWhenAttached()
-        Assert.setTestThread(null)
+    fun `repeatWhenAttached - enforces main thread`() =
+        testScope.runTest {
+            Assert.setTestThread(null)
 
-        disposableHandle.dispose()
-    }
+            repeatWhenAttached()
+        }
+
+    @Test(expected = IllegalStateException::class)
+    fun `repeatWhenAttached - dispose enforces main thread`() =
+        testScope.runTest {
+            val disposableHandle = repeatWhenAttached()
+            Assert.setTestThread(null)
+
+            disposableHandle.dispose()
+        }
 
     @Test
-    fun `repeatWhenAttached - view starts detached - runs block when attached`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(false)
-        repeatWhenAttached()
-        assertThat(block.invocationCount).isEqualTo(0)
+    fun `repeatWhenAttached - view starts detached - runs block when attached`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(false)
+            repeatWhenAttached()
+            assertThat(block.invocationCount).isEqualTo(0)
 
-        whenever(view.isAttachedToWindow).thenReturn(true)
-        attachListeners.last().onViewAttachedToWindow(view)
+            whenever(view.isAttachedToWindow).thenReturn(true)
+            attachListeners.last().onViewAttachedToWindow(view)
 
-        assertThat(block.invocationCount).isEqualTo(1)
-        assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.CREATED)
-    }
+            runCurrent()
+            assertThat(block.invocationCount).isEqualTo(1)
+            assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.CREATED)
+        }
 
     @Test
-    fun `repeatWhenAttached - view already attached - immediately runs block`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(true)
+    fun `repeatWhenAttached - view already attached - immediately runs block`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(true)
 
-        repeatWhenAttached()
+            repeatWhenAttached()
 
-        assertThat(block.invocationCount).isEqualTo(1)
-        assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.CREATED)
-    }
+            runCurrent()
+            assertThat(block.invocationCount).isEqualTo(1)
+            assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.CREATED)
+        }
 
     @Test
-    fun `repeatWhenAttached - starts visible without focus - STARTED`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(true)
-        whenever(view.windowVisibility).thenReturn(View.VISIBLE)
+    fun `repeatWhenAttached - starts visible without focus - STARTED`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(true)
+            whenever(view.windowVisibility).thenReturn(View.VISIBLE)
 
-        repeatWhenAttached()
+            repeatWhenAttached()
 
-        assertThat(block.invocationCount).isEqualTo(1)
-        assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.STARTED)
-    }
+            runCurrent()
+            assertThat(block.invocationCount).isEqualTo(1)
+            assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.STARTED)
+        }
 
     @Test
-    fun `repeatWhenAttached - starts with focus but invisible - CREATED`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(true)
-        whenever(view.hasWindowFocus()).thenReturn(true)
+    fun `repeatWhenAttached - starts with focus but invisible - CREATED`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(true)
+            whenever(view.hasWindowFocus()).thenReturn(true)
 
-        repeatWhenAttached()
+            repeatWhenAttached()
 
-        assertThat(block.invocationCount).isEqualTo(1)
-        assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.CREATED)
-    }
+            runCurrent()
+            assertThat(block.invocationCount).isEqualTo(1)
+            assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.CREATED)
+        }
 
     @Test
-    fun `repeatWhenAttached - starts visible and with focus - RESUMED`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(true)
-        whenever(view.windowVisibility).thenReturn(View.VISIBLE)
-        whenever(view.hasWindowFocus()).thenReturn(true)
+    fun `repeatWhenAttached - starts visible and with focus - RESUMED`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(true)
+            whenever(view.windowVisibility).thenReturn(View.VISIBLE)
+            whenever(view.hasWindowFocus()).thenReturn(true)
 
-        repeatWhenAttached()
+            repeatWhenAttached()
 
-        assertThat(block.invocationCount).isEqualTo(1)
-        assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.RESUMED)
-    }
+            runCurrent()
+            assertThat(block.invocationCount).isEqualTo(1)
+            assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.RESUMED)
+        }
 
     @Test
-    fun `repeatWhenAttached - becomes visible without focus - STARTED`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(true)
-        repeatWhenAttached()
-        val listenerCaptor = argumentCaptor<ViewTreeObserver.OnWindowVisibilityChangeListener>()
-        verify(viewTreeObserver).addOnWindowVisibilityChangeListener(listenerCaptor.capture())
+    fun `repeatWhenAttached - becomes visible without focus - STARTED`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(true)
+            repeatWhenAttached()
+            val listenerCaptor = argumentCaptor<ViewTreeObserver.OnWindowVisibilityChangeListener>()
+            verify(viewTreeObserver).addOnWindowVisibilityChangeListener(listenerCaptor.capture())
 
-        whenever(view.windowVisibility).thenReturn(View.VISIBLE)
-        listenerCaptor.value.onWindowVisibilityChanged(View.VISIBLE)
+            whenever(view.windowVisibility).thenReturn(View.VISIBLE)
+            listenerCaptor.value.onWindowVisibilityChanged(View.VISIBLE)
 
-        assertThat(block.invocationCount).isEqualTo(1)
-        assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.STARTED)
-    }
+            runCurrent()
+            assertThat(block.invocationCount).isEqualTo(1)
+            assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.STARTED)
+        }
 
     @Test
-    fun `repeatWhenAttached - gains focus but invisible - CREATED`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(true)
-        repeatWhenAttached()
-        val listenerCaptor = argumentCaptor<ViewTreeObserver.OnWindowFocusChangeListener>()
-        verify(viewTreeObserver).addOnWindowFocusChangeListener(listenerCaptor.capture())
+    fun `repeatWhenAttached - gains focus but invisible - CREATED`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(true)
+            repeatWhenAttached()
+            val listenerCaptor = argumentCaptor<ViewTreeObserver.OnWindowFocusChangeListener>()
+            verify(viewTreeObserver).addOnWindowFocusChangeListener(listenerCaptor.capture())
 
-        whenever(view.hasWindowFocus()).thenReturn(true)
-        listenerCaptor.value.onWindowFocusChanged(true)
+            whenever(view.hasWindowFocus()).thenReturn(true)
+            listenerCaptor.value.onWindowFocusChanged(true)
 
-        assertThat(block.invocationCount).isEqualTo(1)
-        assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.CREATED)
-    }
+            runCurrent()
+            assertThat(block.invocationCount).isEqualTo(1)
+            assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.CREATED)
+        }
 
     @Test
-    fun `repeatWhenAttached - becomes visible and gains focus - RESUMED`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(true)
-        repeatWhenAttached()
-        val visibleCaptor = argumentCaptor<ViewTreeObserver.OnWindowVisibilityChangeListener>()
-        verify(viewTreeObserver).addOnWindowVisibilityChangeListener(visibleCaptor.capture())
-        val focusCaptor = argumentCaptor<ViewTreeObserver.OnWindowFocusChangeListener>()
-        verify(viewTreeObserver).addOnWindowFocusChangeListener(focusCaptor.capture())
+    fun `repeatWhenAttached - becomes visible and gains focus - RESUMED`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(true)
+            repeatWhenAttached()
+            val visibleCaptor = argumentCaptor<ViewTreeObserver.OnWindowVisibilityChangeListener>()
+            verify(viewTreeObserver).addOnWindowVisibilityChangeListener(visibleCaptor.capture())
+            val focusCaptor = argumentCaptor<ViewTreeObserver.OnWindowFocusChangeListener>()
+            verify(viewTreeObserver).addOnWindowFocusChangeListener(focusCaptor.capture())
 
-        whenever(view.windowVisibility).thenReturn(View.VISIBLE)
-        visibleCaptor.value.onWindowVisibilityChanged(View.VISIBLE)
-        whenever(view.hasWindowFocus()).thenReturn(true)
-        focusCaptor.value.onWindowFocusChanged(true)
+            whenever(view.windowVisibility).thenReturn(View.VISIBLE)
+            visibleCaptor.value.onWindowVisibilityChanged(View.VISIBLE)
+            whenever(view.hasWindowFocus()).thenReturn(true)
+            focusCaptor.value.onWindowFocusChanged(true)
 
-        assertThat(block.invocationCount).isEqualTo(1)
-        assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.RESUMED)
-    }
+            runCurrent()
+            assertThat(block.invocationCount).isEqualTo(1)
+            assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.RESUMED)
+        }
 
     @Test
-    fun `repeatWhenAttached - view gets detached - destroys the lifecycle`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(true)
-        repeatWhenAttached()
+    fun `repeatWhenAttached - view gets detached - destroys the lifecycle`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(true)
+            repeatWhenAttached()
 
-        whenever(view.isAttachedToWindow).thenReturn(false)
-        attachListeners.last().onViewDetachedFromWindow(view)
+            whenever(view.isAttachedToWindow).thenReturn(false)
+            attachListeners.last().onViewDetachedFromWindow(view)
 
-        assertThat(block.invocationCount).isEqualTo(1)
-        assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.DESTROYED)
-    }
+            runCurrent()
+            assertThat(block.invocationCount).isEqualTo(1)
+            assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.DESTROYED)
+        }
 
     @Test
-    fun `repeatWhenAttached - view gets reattached - recreates a lifecycle`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(true)
-        repeatWhenAttached()
-        whenever(view.isAttachedToWindow).thenReturn(false)
-        attachListeners.last().onViewDetachedFromWindow(view)
+    fun `repeatWhenAttached - view gets reattached - recreates a lifecycle`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(true)
+            repeatWhenAttached()
+            whenever(view.isAttachedToWindow).thenReturn(false)
+            attachListeners.last().onViewDetachedFromWindow(view)
 
-        whenever(view.isAttachedToWindow).thenReturn(true)
-        attachListeners.last().onViewAttachedToWindow(view)
+            whenever(view.isAttachedToWindow).thenReturn(true)
+            attachListeners.last().onViewAttachedToWindow(view)
 
-        assertThat(block.invocationCount).isEqualTo(2)
-        assertThat(block.invocations[0].lifecycleState).isEqualTo(Lifecycle.State.DESTROYED)
-        assertThat(block.invocations[1].lifecycleState).isEqualTo(Lifecycle.State.CREATED)
-    }
+            runCurrent()
+            assertThat(block.invocationCount).isEqualTo(2)
+            assertThat(block.invocations[0].lifecycleState).isEqualTo(Lifecycle.State.DESTROYED)
+            assertThat(block.invocations[1].lifecycleState).isEqualTo(Lifecycle.State.CREATED)
+        }
 
     @Test
-    fun `repeatWhenAttached - dispose attached`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(true)
-        val handle = repeatWhenAttached()
+    fun `repeatWhenAttached - dispose attached`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(true)
+            val handle = repeatWhenAttached()
 
-        handle.dispose()
+            handle.dispose()
 
-        assertThat(attachListeners).isEmpty()
-        assertThat(block.invocationCount).isEqualTo(1)
-        assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.DESTROYED)
-    }
+            runCurrent()
+            assertThat(attachListeners).isEmpty()
+            assertThat(block.invocationCount).isEqualTo(1)
+            assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.DESTROYED)
+        }
 
     @Test
-    fun `repeatWhenAttached - dispose never attached`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(false)
-        val handle = repeatWhenAttached()
+    fun `repeatWhenAttached - dispose never attached`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(false)
+            val handle = repeatWhenAttached()
 
-        handle.dispose()
+            handle.dispose()
 
-        assertThat(attachListeners).isEmpty()
-        assertThat(block.invocationCount).isEqualTo(0)
-    }
+            assertThat(attachListeners).isEmpty()
+            assertThat(block.invocationCount).isEqualTo(0)
+        }
 
     @Test
-    fun `repeatWhenAttached - dispose previously attached now detached`() = runBlockingTest {
-        whenever(view.isAttachedToWindow).thenReturn(true)
-        val handle = repeatWhenAttached()
-        attachListeners.last().onViewDetachedFromWindow(view)
+    fun `repeatWhenAttached - dispose previously attached now detached`() =
+        testScope.runTest {
+            whenever(view.isAttachedToWindow).thenReturn(true)
+            val handle = repeatWhenAttached()
+            attachListeners.last().onViewDetachedFromWindow(view)
 
-        handle.dispose()
+            handle.dispose()
 
-        assertThat(attachListeners).isEmpty()
-        assertThat(block.invocationCount).isEqualTo(1)
-        assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.DESTROYED)
-    }
+            runCurrent()
+            assertThat(attachListeners).isEmpty()
+            assertThat(block.invocationCount).isEqualTo(1)
+            assertThat(block.latestLifecycleState).isEqualTo(Lifecycle.State.DESTROYED)
+        }
 
     private fun CoroutineScope.repeatWhenAttached(): DisposableHandle {
         return view.repeatWhenAttached(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/log/SessionTrackerTest.java b/packages/SystemUI/tests/src/com/android/systemui/log/SessionTrackerTest.java
index aa54a1c..447b333 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/log/SessionTrackerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/log/SessionTrackerTest.java
@@ -26,6 +26,7 @@
 import static org.junit.Assert.assertNotEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -37,6 +38,7 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.internal.logging.InstanceId;
+import com.android.internal.logging.UiEventLogger;
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.keyguard.KeyguardUpdateMonitorCallback;
@@ -64,6 +66,8 @@
     private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     @Mock
     private KeyguardStateController mKeyguardStateController;
+    @Mock
+    private UiEventLogger mUiEventLogger;
 
     @Captor
     ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallbackCaptor;
@@ -87,7 +91,8 @@
                 mStatusBarService,
                 mAuthController,
                 mKeyguardUpdateMonitor,
-                mKeyguardStateController
+                mKeyguardStateController,
+                mUiEventLogger
         );
     }
 
@@ -238,6 +243,62 @@
                 eq(SESSION_KEYGUARD), any(InstanceId.class));
     }
 
+    @Test
+    public void uiEventLoggedOnEndSessionWhenDeviceStartsSleeping() throws RemoteException {
+        // GIVEN session tracker start
+        mSessionTracker.start();
+        captureKeyguardUpdateMonitorCallback();
+        captureKeyguardStateControllerCallback();
+
+        // GIVEN keyguard becomes visible (ie: from lockdown), so there's a valid keyguard
+        // session running
+        when(mKeyguardStateController.isShowing()).thenReturn(true);
+        mKeyguardStateCallback.onKeyguardShowingChanged();
+
+        // WHEN device starts going to sleep
+        mKeyguardUpdateMonitorCallback.onStartedGoingToSleep(0);
+
+        // THEN UI event is logged
+        verify(mUiEventLogger).log(
+                eq(SessionTracker.SessionUiEvent.KEYGUARD_SESSION_END_GOING_TO_SLEEP),
+                any(InstanceId.class));
+    }
+
+    @Test
+    public void noUiEventLoggedOnEndSessionWhenDeviceStartsSleepingWithoutStartSession()
+            throws RemoteException {
+        // GIVEN session tracker start without any valid sessions
+        mSessionTracker.start();
+        captureKeyguardUpdateMonitorCallback();
+
+        // WHEN device starts going to sleep when there was no started sessions
+        mKeyguardUpdateMonitorCallback.onStartedGoingToSleep(0);
+
+        // THEN UI event is never logged
+        verify(mUiEventLogger, never()).log(
+                eq(SessionTracker.SessionUiEvent.KEYGUARD_SESSION_END_GOING_TO_SLEEP),
+                any(InstanceId.class));
+    }
+
+    @Test
+    public void uiEventLoggedOnEndSessionWhenKeyguardGoingAway() throws RemoteException {
+        // GIVEN session tracker started w/o any sessions
+        mSessionTracker.start();
+        captureKeyguardUpdateMonitorCallback();
+        captureKeyguardStateControllerCallback();
+
+        // WHEN keyguard was showing and now it's not
+        when(mKeyguardStateController.isShowing()).thenReturn(true);
+        mKeyguardStateCallback.onKeyguardShowingChanged();
+        when(mKeyguardStateController.isShowing()).thenReturn(false);
+        mKeyguardStateCallback.onKeyguardShowingChanged();
+
+        // THEN UI event is logged
+        verify(mUiEventLogger).log(
+                eq(SessionTracker.SessionUiEvent.KEYGUARD_SESSION_END_KEYGUARD_GOING_AWAY),
+                any(InstanceId.class));
+    }
+
     void captureKeyguardUpdateMonitorCallback() {
         verify(mKeyguardUpdateMonitor).registerCallback(
                 mKeyguardUpdateMonitorCallbackCaptor.capture());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/KeyguardMediaControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/KeyguardMediaControllerTest.kt
index 2026006..b40ebc9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/KeyguardMediaControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/KeyguardMediaControllerTest.kt
@@ -24,12 +24,14 @@
 import android.view.View.VISIBLE
 import android.widget.FrameLayout
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.statusbar.StatusBarState
 import com.android.systemui.statusbar.SysuiStatusBarStateController
 import com.android.systemui.statusbar.notification.stack.MediaContainerView
 import com.android.systemui.statusbar.phone.KeyguardBypassController
 import com.android.systemui.statusbar.policy.ConfigurationController
 import com.android.systemui.util.animation.UniqueObjectHostView
+import com.android.systemui.util.mockito.whenever
 import com.android.systemui.util.settings.FakeSettings
 import com.android.systemui.utils.os.FakeHandler
 import com.google.common.truth.Truth.assertThat
@@ -39,8 +41,9 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mock
+import org.mockito.Mockito.any
+import org.mockito.Mockito.doAnswer
 import org.mockito.Mockito.verify
-import org.mockito.Mockito.`when` as whenever
 import org.mockito.junit.MockitoJUnit
 
 @SmallTest
@@ -61,9 +64,16 @@
     private lateinit var keyguardMediaController: KeyguardMediaController
     private lateinit var testableLooper: TestableLooper
     private lateinit var fakeHandler: FakeHandler
+    private lateinit var statusBarStateListener: StatusBarStateController.StateListener
 
     @Before
     fun setup() {
+        doAnswer {
+                statusBarStateListener = it.arguments[0] as StatusBarStateController.StateListener
+                return@doAnswer Unit
+            }
+            .whenever(statusBarStateController)
+            .addCallback(any(StatusBarStateController.StateListener::class.java))
         // default state is positive, media should show up
         whenever(mediaHost.visible).thenReturn(true)
         whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
@@ -170,4 +180,31 @@
     fun testMediaHost_expandedPlayer() {
         verify(mediaHost).expansion = MediaHostState.EXPANDED
     }
+
+    @Test
+    fun dozing_inSplitShade_mediaIsHidden() {
+        val splitShadeContainer = FrameLayout(context)
+        keyguardMediaController.attachSplitShadeContainer(splitShadeContainer)
+        keyguardMediaController.useSplitShade = true
+
+        setDozing()
+
+        assertThat(splitShadeContainer.visibility).isEqualTo(GONE)
+    }
+
+    @Test
+    fun dozing_inSingleShade_mediaIsVisible() {
+        val splitShadeContainer = FrameLayout(context)
+        keyguardMediaController.attachSplitShadeContainer(splitShadeContainer)
+        keyguardMediaController.useSplitShade = false
+
+        setDozing()
+
+        assertThat(mediaContainerView.visibility).isEqualTo(VISIBLE)
+    }
+
+    private fun setDozing() {
+        whenever(statusBarStateController.isDozing).thenReturn(true)
+        statusBarStateListener.onDozingChanged(true)
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
index 17d8799..7f7952f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
@@ -532,7 +532,7 @@
         mMediaOutputAdapter.onBindViewHolder(mViewHolder, 0);
 
         assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.GONE);
-        assertThat(mViewHolder.mSeekBar.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(mViewHolder.mSeekBar.getVisibility()).isEqualTo(View.GONE);
         assertThat(mViewHolder.mProgressBar.getVisibility()).isEqualTo(View.GONE);
         assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.GONE);
         assertThat(mViewHolder.mStatusIcon.getVisibility()).isEqualTo(View.VISIBLE);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt
index acde887..19f9960 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt
@@ -22,6 +22,8 @@
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.classifier.FalsingManagerFake
 import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.flags.FakeFeatureFlags
+import com.android.systemui.flags.Flags
 import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.keyguard.shared.model.KeyguardState
@@ -31,6 +33,8 @@
 import com.android.systemui.multishade.data.repository.MultiShadeRepository
 import com.android.systemui.multishade.shared.model.ProxiedInputModel
 import com.android.systemui.multishade.shared.model.ShadeId
+import com.android.systemui.shade.ShadeController
+import com.android.systemui.util.mockito.whenever
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.TestScope
@@ -42,6 +46,10 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
+import org.mockito.Mock
+import org.mockito.Mockito.anyBoolean
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
@@ -57,9 +65,11 @@
     private val touchSlop: Int = ViewConfiguration.get(context).scaledTouchSlop
     private lateinit var keyguardTransitionRepository: FakeKeyguardTransitionRepository
     private lateinit var falsingManager: FalsingManagerFake
+    @Mock private lateinit var shadeController: ShadeController
 
     @Before
     fun setUp() {
+        MockitoAnnotations.initMocks(this)
         testScope = TestScope()
         motionEvents = mutableSetOf()
 
@@ -75,18 +85,23 @@
                 repository = repository,
                 inputProxy = inputProxy,
             )
+        val featureFlags = FakeFeatureFlags()
+        featureFlags.set(Flags.DUAL_SHADE, true)
         keyguardTransitionRepository = FakeKeyguardTransitionRepository()
         falsingManager = FalsingManagerFake()
+
         underTest =
             MultiShadeMotionEventInteractor(
                 applicationContext = context,
                 applicationScope = testScope.backgroundScope,
                 multiShadeInteractor = interactor,
+                featureFlags = featureFlags,
                 keyguardTransitionInteractor =
                     KeyguardTransitionInteractor(
                         repository = keyguardTransitionRepository,
                     ),
                 falsingManager = falsingManager,
+                shadeController = shadeController,
             )
     }
 
@@ -96,6 +111,39 @@
     }
 
     @Test
+    fun listenForIsAnyShadeExpanded_expanded_makesWindowViewVisible() =
+        testScope.runTest {
+            whenever(shadeController.isKeyguard).thenReturn(false)
+            repository.setExpansion(ShadeId.LEFT, 0.1f)
+            val expanded by collectLastValue(interactor.isAnyShadeExpanded)
+            assertThat(expanded).isTrue()
+
+            verify(shadeController).makeExpandedVisible(anyBoolean())
+        }
+
+    @Test
+    fun listenForIsAnyShadeExpanded_collapsed_makesWindowViewInvisible() =
+        testScope.runTest {
+            whenever(shadeController.isKeyguard).thenReturn(false)
+            repository.setForceCollapseAll(true)
+            val expanded by collectLastValue(interactor.isAnyShadeExpanded)
+            assertThat(expanded).isFalse()
+
+            verify(shadeController).makeExpandedInvisible()
+        }
+
+    @Test
+    fun listenForIsAnyShadeExpanded_collapsedOnKeyguard_makesWindowViewVisible() =
+        testScope.runTest {
+            whenever(shadeController.isKeyguard).thenReturn(true)
+            repository.setForceCollapseAll(true)
+            val expanded by collectLastValue(interactor.isAnyShadeExpanded)
+            assertThat(expanded).isFalse()
+
+            verify(shadeController).makeExpandedVisible(anyBoolean())
+        }
+
+    @Test
     fun shouldIntercept_initialDown_returnsFalse() =
         testScope.runTest {
             assertThat(underTest.shouldIntercept(motionEvent(MotionEvent.ACTION_DOWN))).isFalse()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt
index fbe089a..ba29ca5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt
@@ -369,6 +369,39 @@
 
         verifyZeroInteractions(context, bubbles, eventLogger)
     }
+
+    @Test
+    fun showNoteTask_keyboardShortcut_shouldStartActivity() {
+        val expectedInfo =
+                NOTE_TASK_INFO.copy(
+                        entryPoint = NoteTaskEntryPoint.KEYBOARD_SHORTCUT,
+                        isKeyguardLocked = true,
+                )
+        whenever(keyguardManager.isKeyguardLocked).thenReturn(expectedInfo.isKeyguardLocked)
+        whenever(resolver.resolveInfo(any(), any())).thenReturn(expectedInfo)
+
+        createNoteTaskController()
+                .showNoteTask(
+                        entryPoint = expectedInfo.entryPoint!!,
+                )
+
+        val intentCaptor = argumentCaptor<Intent>()
+        val userCaptor = argumentCaptor<UserHandle>()
+        verify(context).startActivityAsUser(capture(intentCaptor), capture(userCaptor))
+        intentCaptor.value.let { intent ->
+            assertThat(intent.action).isEqualTo(Intent.ACTION_CREATE_NOTE)
+            assertThat(intent.`package`).isEqualTo(NOTE_TASK_PACKAGE_NAME)
+            assertThat(intent.flags and FLAG_ACTIVITY_NEW_TASK).isEqualTo(FLAG_ACTIVITY_NEW_TASK)
+            assertThat(intent.flags and FLAG_ACTIVITY_MULTIPLE_TASK)
+                    .isEqualTo(FLAG_ACTIVITY_MULTIPLE_TASK)
+            assertThat(intent.flags and FLAG_ACTIVITY_NEW_DOCUMENT)
+                    .isEqualTo(FLAG_ACTIVITY_NEW_DOCUMENT)
+            assertThat(intent.getBooleanExtra(Intent.EXTRA_USE_STYLUS_MODE, true)).isFalse()
+        }
+        assertThat(userCaptor.value).isEqualTo(userTracker.userHandle)
+        verify(eventLogger).logNoteTaskOpened(expectedInfo)
+        verifyZeroInteractions(bubbles)
+    }
     // endregion
 
     // region setNoteTaskShortcutEnabled
diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt
index cd67e8d..ec4daee 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt
@@ -98,14 +98,24 @@
     // region handleSystemKey
     @Test
     fun handleSystemKey_receiveValidSystemKey_shouldShowNoteTask() {
-        createNoteTaskInitializer().callbacks.handleSystemKey(KeyEvent.KEYCODE_STYLUS_BUTTON_TAIL)
+        createNoteTaskInitializer().callbacks.handleSystemKey(KeyEvent(KeyEvent.ACTION_DOWN,
+                KeyEvent.KEYCODE_STYLUS_BUTTON_TAIL))
 
         verify(controller).showNoteTask(entryPoint = NoteTaskEntryPoint.TAIL_BUTTON)
     }
 
     @Test
+    fun handleSystemKey_receiveKeyboardShortcut_shouldShowNoteTask() {
+        createNoteTaskInitializer().callbacks.handleSystemKey(KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
+                KeyEvent.KEYCODE_N, 0, KeyEvent.META_META_ON or KeyEvent.META_CTRL_ON))
+
+        verify(controller).showNoteTask(entryPoint = NoteTaskEntryPoint.KEYBOARD_SHORTCUT)
+    }
+    
+    @Test
     fun handleSystemKey_receiveInvalidSystemKey_shouldDoNothing() {
-        createNoteTaskInitializer().callbacks.handleSystemKey(KeyEvent.KEYCODE_UNKNOWN)
+        createNoteTaskInitializer().callbacks.handleSystemKey(KeyEvent(KeyEvent.ACTION_DOWN,
+                KeyEvent.KEYCODE_UNKNOWN))
 
         verifyZeroInteractions(controller)
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/shortcut/LaunchNoteTaskActivityTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/shortcut/LaunchNoteTaskActivityTest.kt
index c96853d..a0c376f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/notetask/shortcut/LaunchNoteTaskActivityTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/shortcut/LaunchNoteTaskActivityTest.kt
@@ -30,6 +30,7 @@
 import com.android.systemui.notetask.NoteTaskController
 import com.android.systemui.notetask.NoteTaskEntryPoint
 import com.android.systemui.settings.FakeUserTracker
+import com.android.systemui.util.mockito.any
 import com.android.systemui.util.mockito.eq
 import com.android.systemui.util.mockito.whenever
 import org.junit.After
@@ -38,6 +39,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mock
+import org.mockito.Mockito.never
 import org.mockito.MockitoAnnotations
 
 @RunWith(AndroidTestingRunner::class)
@@ -86,15 +88,28 @@
 
     @Test
     fun startActivityOnWorkProfileUser_shouldLaunchProxyActivity() {
+        val mainUserHandle: UserHandle = mainUser.userHandle
         userTracker.set(listOf(mainUser, workProfileUser), selectedUserIndex = 1)
         whenever(userManager.isManagedProfile).thenReturn(true)
+        whenever(userManager.mainUser).thenReturn(mainUserHandle)
 
         activityRule.launchActivity(/* startIntent= */ null)
 
-        val mainUserHandle: UserHandle = mainUser.userHandle
         verify(noteTaskController).startNoteTaskProxyActivityForUser(eq(mainUserHandle))
     }
 
+    @Test
+    fun startActivityOnWorkProfileUser_noMainUser_shouldNotLaunch() {
+        userTracker.set(listOf(mainUser, workProfileUser), selectedUserIndex = 1)
+        whenever(userManager.isManagedProfile).thenReturn(true)
+        whenever(userManager.mainUser).thenReturn(null)
+
+        activityRule.launchActivity(/* startIntent= */ null)
+
+        verify(noteTaskController, never()).showNoteTask(any())
+        verify(noteTaskController, never()).startNoteTaskProxyActivityForUser(any())
+    }
+
     private companion object {
         val mainUser = UserInfo(/* id= */ 0, /* name= */ "primary", /* flags= */ UserInfo.FLAG_MAIN)
         val workProfileUser =
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/FgsManagerControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/FgsManagerControllerTest.java
index 6f54f62..f5a3bec 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/FgsManagerControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/FgsManagerControllerTest.java
@@ -111,8 +111,6 @@
         MockitoAnnotations.initMocks(this);
 
         mDeviceConfigProxyFake = new DeviceConfigProxyFake();
-        mDeviceConfigProxyFake.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
-                SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED, "true", false);
         mSystemClock = new FakeSystemClock();
         mMainExecutor = new FakeExecutor(mSystemClock);
         mBackgroundExecutor = new FakeExecutor(mSystemClock);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java
index 46af89e..9ca7a85 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java
@@ -40,6 +40,7 @@
 
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.qs.QSHost;
+import com.android.systemui.qs.pipeline.data.repository.CustomTileAddedRepository;
 import com.android.systemui.settings.UserTracker;
 
 import org.junit.After;
@@ -64,6 +65,8 @@
     private QSHost mQSHost;
     @Mock
     private Context mMockContext;
+    @Mock
+    private CustomTileAddedRepository mCustomTileAddedRepository;
 
     private HandlerThread mThread;
     private Handler mHandler;
@@ -86,8 +89,9 @@
 
         mComponentName = new ComponentName(mContext, TileServiceManagerTest.class);
         when(mTileLifecycle.getComponent()).thenReturn(mComponentName);
+
         mTileServiceManager = new TileServiceManager(mTileServices, mHandler, mUserTracker,
-                mTileLifecycle);
+                mCustomTileAddedRepository, mTileLifecycle);
     }
 
     @After
@@ -98,28 +102,34 @@
 
     @Test
     public void testSetTileAddedIfNotAdded() {
-        when(mQSHost.isTileAdded(eq(mComponentName), anyInt())).thenReturn(false);
+        when(mCustomTileAddedRepository.isTileAdded(eq(mComponentName), anyInt()))
+                .thenReturn(false);
         mTileServiceManager.startLifecycleManagerAndAddTile();
 
-        verify(mQSHost).setTileAdded(mComponentName, mUserTracker.getUserId(), true);
+        verify(mCustomTileAddedRepository)
+                .setTileAdded(mComponentName, mUserTracker.getUserId(), true);
     }
 
     @Test
     public void testNotSetTileAddedIfAdded() {
-        when(mQSHost.isTileAdded(eq(mComponentName), anyInt())).thenReturn(true);
+        when(mCustomTileAddedRepository.isTileAdded(eq(mComponentName), anyInt()))
+                .thenReturn(true);
         mTileServiceManager.startLifecycleManagerAndAddTile();
 
-        verify(mQSHost, never()).setTileAdded(eq(mComponentName), anyInt(), eq(true));
+        verify(mCustomTileAddedRepository, never())
+                .setTileAdded(eq(mComponentName), anyInt(), eq(true));
     }
 
     @Test
     public void testSetTileAddedCorrectUser() {
         int user = 10;
         when(mUserTracker.getUserId()).thenReturn(user);
-        when(mQSHost.isTileAdded(eq(mComponentName), anyInt())).thenReturn(false);
+        when(mCustomTileAddedRepository.isTileAdded(eq(mComponentName), anyInt()))
+                .thenReturn(false);
         mTileServiceManager.startLifecycleManagerAndAddTile();
 
-        verify(mQSHost).setTileAdded(mComponentName, user, true);
+        verify(mCustomTileAddedRepository)
+                .setTileAdded(mComponentName, user, true);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
index 7e052bf..12b5656 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
@@ -42,6 +42,7 @@
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.qs.QSHost;
+import com.android.systemui.qs.pipeline.data.repository.CustomTileAddedRepository;
 import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor;
 import com.android.systemui.settings.UserTracker;
 import com.android.systemui.statusbar.CommandQueue;
@@ -54,6 +55,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
@@ -95,6 +97,10 @@
     private QSHost mQSHost;
     @Mock
     private PanelInteractor mPanelInteractor;
+    @Captor
+    private ArgumentCaptor<CommandQueue.Callbacks> mCallbacksArgumentCaptor;
+    @Mock
+    private CustomTileAddedRepository mCustomTileAddedRepository;
 
     @Before
     public void setUp() throws Exception {
@@ -112,7 +118,7 @@
 
         mTileService = new TestTileServices(mQSHost, provider, mBroadcastDispatcher,
                 mUserTracker, mKeyguardStateController, mCommandQueue, mStatusBarIconController,
-                mPanelInteractor);
+                mPanelInteractor, mCustomTileAddedRepository);
     }
 
     @After
@@ -251,13 +257,50 @@
         verify(mPanelInteractor).forceCollapsePanels();
     }
 
+    @Test
+    public void tileFreedForCorrectUser() throws RemoteException {
+        verify(mCommandQueue).addCallback(mCallbacksArgumentCaptor.capture());
+
+        ComponentName componentName = new ComponentName("pkg", "cls");
+        CustomTile tileUser0 = mock(CustomTile.class);
+        CustomTile tileUser1 = mock(CustomTile.class);
+
+        when(tileUser0.getComponent()).thenReturn(componentName);
+        when(tileUser1.getComponent()).thenReturn(componentName);
+        when(tileUser0.getUser()).thenReturn(0);
+        when(tileUser1.getUser()).thenReturn(1);
+
+        // Create a tile for user 0
+        TileServiceManager manager0 = mTileService.getTileWrapper(tileUser0);
+        when(manager0.isActiveTile()).thenReturn(true);
+        // Then create a tile for user 1
+        TileServiceManager manager1 = mTileService.getTileWrapper(tileUser1);
+        when(manager1.isActiveTile()).thenReturn(true);
+
+        // When the tile for user 0 gets freed
+        mTileService.freeService(tileUser0, manager0);
+        // and the user is 1
+        when(mUserTracker.getUserId()).thenReturn(1);
+
+        // a call to requestListeningState
+        mCallbacksArgumentCaptor.getValue().requestTileServiceListeningState(componentName);
+        mTestableLooper.processAllMessages();
+
+        // will call in the correct tile
+        verify(manager1).setBindRequested(true);
+        // and set it to listening
+        verify(manager1.getTileService()).onStartListening();
+    }
+
     private class TestTileServices extends TileServices {
         TestTileServices(QSHost host, Provider<Handler> handlerProvider,
                 BroadcastDispatcher broadcastDispatcher, UserTracker userTracker,
                 KeyguardStateController keyguardStateController, CommandQueue commandQueue,
-                StatusBarIconController statusBarIconController, PanelInteractor panelInteractor) {
+                StatusBarIconController statusBarIconController, PanelInteractor panelInteractor,
+                CustomTileAddedRepository customTileAddedRepository) {
             super(host, handlerProvider, broadcastDispatcher, userTracker, keyguardStateController,
-                    commandQueue, statusBarIconController, panelInteractor);
+                    commandQueue, statusBarIconController, panelInteractor,
+                    customTileAddedRepository);
         }
 
         @Override
@@ -268,6 +311,8 @@
             when(manager.isLifecycleStarted()).thenReturn(true);
             Binder b = new Binder();
             when(manager.getToken()).thenReturn(b);
+            IQSTileService service = mock(IQSTileService.class);
+            when(manager.getTileService()).thenReturn(service);
             return manager;
         }
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModelTest.kt
index 0b9fbd9..59f0d96 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModelTest.kt
@@ -259,7 +259,6 @@
         val securityController = FakeSecurityController()
         val fgsManagerController =
             FakeFgsManagerController(
-                isAvailable = true,
                 showFooterDot = false,
                 numRunningPackages = 0,
             )
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/CustomTileAddedSharedPreferencesRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/CustomTileAddedSharedPreferencesRepositoryTest.kt
new file mode 100644
index 0000000..d7ab903
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/CustomTileAddedSharedPreferencesRepositoryTest.kt
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.pipeline.data.repository
+
+import android.content.ComponentName
+import android.content.SharedPreferences
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.settings.UserFileManager
+import com.android.systemui.util.FakeSharedPreferences
+import com.google.common.truth.Truth.assertThat
+import java.io.File
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class CustomTileAddedSharedPreferencesRepositoryTest : SysuiTestCase() {
+
+    private lateinit var underTest: CustomTileAddedSharedPrefsRepository
+
+    @Test
+    fun setTileAdded_inSharedPreferences() {
+        val userId = 0
+        val sharedPrefs = FakeSharedPreferences()
+        val userFileManager = FakeUserFileManager(mapOf(userId to sharedPrefs))
+
+        underTest = CustomTileAddedSharedPrefsRepository(userFileManager)
+
+        underTest.setTileAdded(TEST_COMPONENT, userId, added = true)
+        assertThat(sharedPrefs.getForComponentName(TEST_COMPONENT)).isTrue()
+
+        underTest.setTileAdded(TEST_COMPONENT, userId, added = false)
+        assertThat(sharedPrefs.getForComponentName(TEST_COMPONENT)).isFalse()
+    }
+
+    @Test
+    fun setTileAdded_differentComponents() {
+        val userId = 0
+        val sharedPrefs = FakeSharedPreferences()
+        val userFileManager = FakeUserFileManager(mapOf(userId to sharedPrefs))
+
+        underTest = CustomTileAddedSharedPrefsRepository(userFileManager)
+
+        underTest.setTileAdded(TEST_COMPONENT, userId, added = true)
+
+        assertThat(sharedPrefs.getForComponentName(TEST_COMPONENT)).isTrue()
+        assertThat(sharedPrefs.getForComponentName(OTHER_TEST_COMPONENT)).isFalse()
+    }
+
+    @Test
+    fun setTileAdded_differentUsers() {
+        val sharedPrefs0 = FakeSharedPreferences()
+        val sharedPrefs1 = FakeSharedPreferences()
+        val userFileManager = FakeUserFileManager(mapOf(0 to sharedPrefs0, 1 to sharedPrefs1))
+
+        underTest = CustomTileAddedSharedPrefsRepository(userFileManager)
+
+        underTest.setTileAdded(TEST_COMPONENT, userId = 1, added = true)
+
+        assertThat(sharedPrefs0.getForComponentName(TEST_COMPONENT)).isFalse()
+        assertThat(sharedPrefs1.getForComponentName(TEST_COMPONENT)).isTrue()
+    }
+
+    @Test
+    fun isTileAdded_fromSharedPreferences() {
+        val userId = 0
+        val sharedPrefs = FakeSharedPreferences()
+        val userFileManager = FakeUserFileManager(mapOf(userId to sharedPrefs))
+
+        underTest = CustomTileAddedSharedPrefsRepository(userFileManager)
+
+        assertThat(underTest.isTileAdded(TEST_COMPONENT, userId)).isFalse()
+
+        sharedPrefs.setForComponentName(TEST_COMPONENT, true)
+        assertThat(underTest.isTileAdded(TEST_COMPONENT, userId)).isTrue()
+
+        sharedPrefs.setForComponentName(TEST_COMPONENT, false)
+        assertThat(underTest.isTileAdded(TEST_COMPONENT, userId)).isFalse()
+    }
+
+    @Test
+    fun isTileAdded_differentComponents() {
+        val userId = 0
+        val sharedPrefs = FakeSharedPreferences()
+        val userFileManager = FakeUserFileManager(mapOf(userId to sharedPrefs))
+
+        underTest = CustomTileAddedSharedPrefsRepository(userFileManager)
+
+        sharedPrefs.setForComponentName(OTHER_TEST_COMPONENT, true)
+
+        assertThat(underTest.isTileAdded(TEST_COMPONENT, userId)).isFalse()
+        assertThat(underTest.isTileAdded(OTHER_TEST_COMPONENT, userId)).isTrue()
+    }
+
+    @Test
+    fun isTileAdded_differentUsers() {
+        val sharedPrefs0 = FakeSharedPreferences()
+        val sharedPrefs1 = FakeSharedPreferences()
+        val userFileManager = FakeUserFileManager(mapOf(0 to sharedPrefs0, 1 to sharedPrefs1))
+
+        underTest = CustomTileAddedSharedPrefsRepository(userFileManager)
+
+        sharedPrefs1.setForComponentName(TEST_COMPONENT, true)
+
+        assertThat(underTest.isTileAdded(TEST_COMPONENT, userId = 0)).isFalse()
+        assertThat(underTest.isTileAdded(TEST_COMPONENT, userId = 1)).isTrue()
+    }
+
+    private fun SharedPreferences.getForComponentName(componentName: ComponentName): Boolean {
+        return getBoolean(componentName.flattenToString(), false)
+    }
+
+    private fun SharedPreferences.setForComponentName(
+        componentName: ComponentName,
+        value: Boolean
+    ) {
+        edit().putBoolean(componentName.flattenToString(), value).commit()
+    }
+
+    companion object {
+        private val TEST_COMPONENT = ComponentName("pkg", "cls")
+        private val OTHER_TEST_COMPONENT = ComponentName("pkg", "other")
+    }
+}
+
+private const val FILE_NAME = "tiles_prefs"
+
+private class FakeUserFileManager(private val sharedPrefs: Map<Int, SharedPreferences>) :
+    UserFileManager {
+    override fun getFile(fileName: String, userId: Int): File {
+        throw UnsupportedOperationException()
+    }
+
+    override fun getSharedPreferences(fileName: String, mode: Int, userId: Int): SharedPreferences {
+        if (fileName != FILE_NAME) {
+            throw IllegalArgumentException("Preference files must be $FILE_NAME")
+        }
+        return sharedPrefs.getValue(userId)
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt
new file mode 100644
index 0000000..c03849b3
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt
@@ -0,0 +1,341 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.pipeline.data.repository
+
+import android.provider.Settings
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.systemui.R
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.qs.QSHost
+import com.android.systemui.qs.pipeline.shared.TileSpec
+import com.android.systemui.qs.pipeline.shared.logging.QSPipelineLogger
+import com.android.systemui.util.settings.FakeSettings
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+@OptIn(ExperimentalCoroutinesApi::class)
+class TileSpecSettingsRepositoryTest : SysuiTestCase() {
+
+    private lateinit var secureSettings: FakeSettings
+
+    @Mock private lateinit var logger: QSPipelineLogger
+
+    private val testDispatcher = StandardTestDispatcher()
+    private val testScope = TestScope(testDispatcher)
+
+    private lateinit var underTest: TileSpecSettingsRepository
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+
+        secureSettings = FakeSettings()
+
+        with(context.orCreateTestableResources) {
+            addOverride(R.string.quick_settings_tiles_default, DEFAULT_TILES)
+        }
+
+        underTest =
+            TileSpecSettingsRepository(
+                secureSettings,
+                context.resources,
+                logger,
+                testDispatcher,
+            )
+    }
+
+    @Test
+    fun emptySetting_usesDefaultValue() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+            assertThat(tiles).isEqualTo(getDefaultTileSpecs())
+        }
+
+    @Test
+    fun changeInSettings_changesValue() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            storeTilesForUser("a", 0)
+            assertThat(tiles).isEqualTo(listOf(TileSpec.create("a")))
+
+            storeTilesForUser("a,custom(b/c)", 0)
+            assertThat(tiles)
+                .isEqualTo(listOf(TileSpec.create("a"), TileSpec.create("custom(b/c)")))
+        }
+
+    @Test
+    fun tilesForCorrectUsers() =
+        testScope.runTest {
+            val tilesFromUser0 by collectLastValue(underTest.tilesSpecs(0))
+            val tilesFromUser1 by collectLastValue(underTest.tilesSpecs(1))
+
+            val user0Tiles = "a"
+            val user1Tiles = "custom(b/c)"
+            storeTilesForUser(user0Tiles, 0)
+            storeTilesForUser(user1Tiles, 1)
+
+            assertThat(tilesFromUser0).isEqualTo(user0Tiles.toTileSpecs())
+            assertThat(tilesFromUser1).isEqualTo(user1Tiles.toTileSpecs())
+        }
+
+    @Test
+    fun invalidTilesAreNotPresent() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            val specs = "d,custom(bad)"
+            storeTilesForUser(specs, 0)
+
+            assertThat(tiles).isEqualTo(specs.toTileSpecs().filter { it != TileSpec.Invalid })
+        }
+
+    @Test
+    fun noValidTiles_defaultSet() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            storeTilesForUser("custom(bad),custom()", 0)
+
+            assertThat(tiles).isEqualTo(getDefaultTileSpecs())
+        }
+
+    @Test
+    fun addTileAtEnd() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            storeTilesForUser("a", 0)
+
+            underTest.addTile(userId = 0, TileSpec.create("b"))
+
+            val expected = "a,b"
+            assertThat(loadTilesForUser(0)).isEqualTo(expected)
+            assertThat(tiles).isEqualTo(expected.toTileSpecs())
+        }
+
+    @Test
+    fun addTileAtPosition() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            storeTilesForUser("a,custom(b/c)", 0)
+
+            underTest.addTile(userId = 0, TileSpec.create("d"), position = 1)
+
+            val expected = "a,d,custom(b/c)"
+            assertThat(loadTilesForUser(0)).isEqualTo(expected)
+            assertThat(tiles).isEqualTo(expected.toTileSpecs())
+        }
+
+    @Test
+    fun addInvalidTile_noop() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            val specs = "a,custom(b/c)"
+            storeTilesForUser(specs, 0)
+
+            underTest.addTile(userId = 0, TileSpec.Invalid)
+
+            assertThat(loadTilesForUser(0)).isEqualTo(specs)
+            assertThat(tiles).isEqualTo(specs.toTileSpecs())
+        }
+
+    @Test
+    fun addTileForOtherUser_addedInThatUser() =
+        testScope.runTest {
+            val tilesUser0 by collectLastValue(underTest.tilesSpecs(0))
+            val tilesUser1 by collectLastValue(underTest.tilesSpecs(1))
+
+            storeTilesForUser("a", 0)
+            storeTilesForUser("b", 1)
+
+            underTest.addTile(userId = 1, TileSpec.create("c"))
+
+            assertThat(loadTilesForUser(0)).isEqualTo("a")
+            assertThat(tilesUser0).isEqualTo("a".toTileSpecs())
+            assertThat(loadTilesForUser(1)).isEqualTo("b,c")
+            assertThat(tilesUser1).isEqualTo("b,c".toTileSpecs())
+        }
+
+    @Test
+    fun removeTile() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            storeTilesForUser("a,b", 0)
+
+            underTest.removeTile(userId = 0, TileSpec.create("a"))
+
+            assertThat(loadTilesForUser(0)).isEqualTo("b")
+            assertThat(tiles).isEqualTo("b".toTileSpecs())
+        }
+
+    @Test
+    fun removeTileNotThere_noop() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            val specs = "a,b"
+            storeTilesForUser(specs, 0)
+
+            underTest.removeTile(userId = 0, TileSpec.create("c"))
+
+            assertThat(loadTilesForUser(0)).isEqualTo(specs)
+            assertThat(tiles).isEqualTo(specs.toTileSpecs())
+        }
+
+    @Test
+    fun removeInvalidTile_noop() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            val specs = "a,b"
+            storeTilesForUser(specs, 0)
+
+            underTest.removeTile(userId = 0, TileSpec.Invalid)
+
+            assertThat(loadTilesForUser(0)).isEqualTo(specs)
+            assertThat(tiles).isEqualTo(specs.toTileSpecs())
+        }
+
+    @Test
+    fun removeTileFromSecondaryUser_removedOnlyInCorrectUser() =
+        testScope.runTest {
+            val user0Tiles by collectLastValue(underTest.tilesSpecs(0))
+            val user1Tiles by collectLastValue(underTest.tilesSpecs(1))
+
+            val specs = "a,b"
+            storeTilesForUser(specs, 0)
+            storeTilesForUser(specs, 1)
+
+            underTest.removeTile(userId = 1, TileSpec.create("a"))
+
+            assertThat(loadTilesForUser(0)).isEqualTo(specs)
+            assertThat(user0Tiles).isEqualTo(specs.toTileSpecs())
+            assertThat(loadTilesForUser(1)).isEqualTo("b")
+            assertThat(user1Tiles).isEqualTo("b".toTileSpecs())
+        }
+
+    @Test
+    fun changeTiles() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            val specs = "a,custom(b/c)"
+
+            underTest.setTiles(userId = 0, specs.toTileSpecs())
+
+            assertThat(loadTilesForUser(0)).isEqualTo(specs)
+            assertThat(tiles).isEqualTo(specs.toTileSpecs())
+        }
+
+    @Test
+    fun changeTiles_ignoresInvalid() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            val specs = "a,custom(b/c)"
+
+            underTest.setTiles(userId = 0, listOf(TileSpec.Invalid) + specs.toTileSpecs())
+
+            assertThat(loadTilesForUser(0)).isEqualTo(specs)
+            assertThat(tiles).isEqualTo(specs.toTileSpecs())
+        }
+
+    @Test
+    fun changeTiles_empty_noChanges() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            underTest.setTiles(userId = 0, emptyList())
+
+            assertThat(loadTilesForUser(0)).isNull()
+            assertThat(tiles).isEqualTo(getDefaultTileSpecs())
+        }
+
+    @Test
+    fun changeTiles_forCorrectUser() =
+        testScope.runTest {
+            val user0Tiles by collectLastValue(underTest.tilesSpecs(0))
+            val user1Tiles by collectLastValue(underTest.tilesSpecs(1))
+
+            val specs = "a"
+            storeTilesForUser(specs, 0)
+            storeTilesForUser(specs, 1)
+
+            underTest.setTiles(userId = 1, "b".toTileSpecs())
+
+            assertThat(loadTilesForUser(0)).isEqualTo("a")
+            assertThat(user0Tiles).isEqualTo(specs.toTileSpecs())
+
+            assertThat(loadTilesForUser(1)).isEqualTo("b")
+            assertThat(user1Tiles).isEqualTo("b".toTileSpecs())
+        }
+
+    @Test
+    fun multipleConcurrentRemovals_bothRemoved() =
+        testScope.runTest {
+            val tiles by collectLastValue(underTest.tilesSpecs(0))
+
+            val specs = "a,b,c"
+            storeTilesForUser(specs, 0)
+
+            coroutineScope {
+                underTest.removeTile(userId = 0, TileSpec.create("c"))
+                underTest.removeTile(userId = 0, TileSpec.create("a"))
+            }
+
+            assertThat(loadTilesForUser(0)).isEqualTo("b")
+            assertThat(tiles).isEqualTo("b".toTileSpecs())
+        }
+
+    private fun getDefaultTileSpecs(): List<TileSpec> {
+        return QSHost.getDefaultSpecs(context.resources).map(TileSpec::create)
+    }
+
+    private fun storeTilesForUser(specs: String, forUser: Int) {
+        secureSettings.putStringForUser(SETTING, specs, forUser)
+    }
+
+    private fun loadTilesForUser(forUser: Int): String? {
+        return secureSettings.getStringForUser(SETTING, forUser)
+    }
+
+    companion object {
+        private const val DEFAULT_TILES = "a,b,c"
+        private const val SETTING = Settings.Secure.QS_TILES
+
+        private fun String.toTileSpecs(): List<TileSpec> {
+            return split(",").map(TileSpec::create)
+        }
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt
new file mode 100644
index 0000000..d880172
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.pipeline.shared
+
+import android.content.ComponentName
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class TileSpecTest : SysuiTestCase() {
+
+    @Test
+    fun platformTile() {
+        val spec = "spec"
+
+        val tileSpec = TileSpec.create(spec)
+
+        assertThat(tileSpec is TileSpec.PlatformTileSpec).isTrue()
+        assertThat(tileSpec.spec).isEqualTo(spec)
+    }
+
+    @Test
+    fun customTile() {
+        val componentName = ComponentName("test_pkg", "test_cls")
+        val spec = CUSTOM_TILE_PREFIX + componentName.flattenToString() + ")"
+
+        val tileSpec = TileSpec.create(spec)
+
+        assertThat(tileSpec is TileSpec.CustomTileSpec).isTrue()
+        assertThat(tileSpec.spec).isEqualTo(spec)
+        assertThat((tileSpec as TileSpec.CustomTileSpec).componentName).isEqualTo(componentName)
+    }
+
+    @Test
+    fun emptyCustomTile_invalid() {
+        val spec = CUSTOM_TILE_PREFIX + ")"
+
+        val tileSpec = TileSpec.create(spec)
+
+        assertThat(tileSpec).isEqualTo(TileSpec.Invalid)
+    }
+
+    @Test
+    fun invalidCustomTileSpec_invalid() {
+        val spec = CUSTOM_TILE_PREFIX + "invalid)"
+
+        val tileSpec = TileSpec.create(spec)
+
+        assertThat(tileSpec).isEqualTo(TileSpec.Invalid)
+    }
+
+    @Test
+    fun customTileNotEndsWithParenthesis_invalid() {
+        val componentName = ComponentName("test_pkg", "test_cls")
+        val spec = CUSTOM_TILE_PREFIX + componentName.flattenToString()
+
+        val tileSpec = TileSpec.create(spec)
+
+        assertThat(tileSpec).isEqualTo(TileSpec.Invalid)
+    }
+
+    @Test
+    fun emptySpec_invalid() {
+        assertThat(TileSpec.create("")).isEqualTo(TileSpec.Invalid)
+    }
+
+    companion object {
+        private const val CUSTOM_TILE_PREFIX = "custom("
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt
index d3ec1dd..28aeba4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt
@@ -317,6 +317,26 @@
     }
 
     @Test
+    fun testDisableByPolicyThenRemoved_changesColor() {
+        val stateActive = QSTile.State()
+        stateActive.state = Tile.STATE_ACTIVE
+
+        val stateDisabledByPolicy = stateActive.copy()
+        stateDisabledByPolicy.disabledByPolicy = true
+
+        tileView.changeState(stateActive)
+        val activeColors = tileView.getCurrentColors()
+
+        tileView.changeState(stateDisabledByPolicy)
+        // It has unavailable colors
+        assertThat(tileView.getCurrentColors()).isNotEqualTo(activeColors)
+
+        // When we get back to not disabled by policy tile, it should go back to active colors
+        tileView.changeState(stateActive)
+        assertThat(tileView.getCurrentColors()).containsExactlyElementsIn(activeColors)
+    }
+
+    @Test
     fun testDisabledByPolicy_secondaryLabelText() {
         val testA11yLabel = "TEST_LABEL"
         context.orCreateTestableResources
diff --git a/packages/SystemUI/tests/src/com/android/systemui/recents/OverviewProxyServiceTest.kt b/packages/SystemUI/tests/src/com/android/systemui/recents/OverviewProxyServiceTest.kt
index eb7b481..8cb5d31 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/recents/OverviewProxyServiceTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/recents/OverviewProxyServiceTest.kt
@@ -19,6 +19,7 @@
 import android.content.ComponentName
 import android.content.pm.PackageManager
 import android.content.pm.ResolveInfo
+import android.os.PowerManager
 import android.testing.AndroidTestingRunner
 import android.testing.TestableContext
 import android.testing.TestableLooper
@@ -30,6 +31,7 @@
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.keyguard.KeyguardUnlockAnimationController
 import com.android.systemui.keyguard.ScreenLifecycle
+import com.android.systemui.keyguard.WakefulnessLifecycle
 import com.android.systemui.model.SysUiState
 import com.android.systemui.navigationbar.NavigationBarController
 import com.android.systemui.navigationbar.NavigationModeController
@@ -37,16 +39,17 @@
 import com.android.systemui.settings.FakeDisplayTracker
 import com.android.systemui.settings.UserTracker
 import com.android.systemui.shared.recents.IOverviewProxy
-import com.android.systemui.shared.system.QuickStepContract.SCREEN_STATE_OFF
-import com.android.systemui.shared.system.QuickStepContract.SCREEN_STATE_ON
-import com.android.systemui.shared.system.QuickStepContract.SCREEN_STATE_TURNING_OFF
-import com.android.systemui.shared.system.QuickStepContract.SCREEN_STATE_TURNING_ON
-import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_STATE_MASK
+import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_WAKEFULNESS_MASK
+import com.android.systemui.shared.system.QuickStepContract.WAKEFULNESS_ASLEEP
+import com.android.systemui.shared.system.QuickStepContract.WAKEFULNESS_AWAKE
+import com.android.systemui.shared.system.QuickStepContract.WAKEFULNESS_GOING_TO_SLEEP
+import com.android.systemui.shared.system.QuickStepContract.WAKEFULNESS_WAKING
 import com.android.systemui.statusbar.CommandQueue
 import com.android.systemui.statusbar.NotificationShadeWindowController
 import com.android.systemui.statusbar.phone.CentralSurfaces
 import com.android.systemui.unfold.progress.UnfoldTransitionProgressForwarder
 import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.time.FakeSystemClock
 import com.android.wm.shell.sysui.ShellInterface
 import com.google.common.util.concurrent.MoreExecutors
 import dagger.Lazy
@@ -60,6 +63,7 @@
 import org.mockito.Mock
 import org.mockito.Mockito.any
 import org.mockito.Mockito.anyInt
+import org.mockito.Mockito.clearInvocations
 import org.mockito.Mockito.intThat
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.verify
@@ -75,8 +79,11 @@
     private lateinit var subject: OverviewProxyService
     private val dumpManager = DumpManager()
     private val displayTracker = FakeDisplayTracker(mContext)
+    private val fakeSystemClock = FakeSystemClock()
     private val sysUiState = SysUiState(displayTracker)
     private val screenLifecycle = ScreenLifecycle(dumpManager)
+    private val wakefulnessLifecycle =
+        WakefulnessLifecycle(mContext, null, fakeSystemClock, dumpManager)
 
     @Mock private lateinit var overviewProxy: IOverviewProxy.Stub
     @Mock private lateinit var packageManager: PackageManager
@@ -130,6 +137,7 @@
                 sysUiState,
                 userTracker,
                 screenLifecycle,
+                wakefulnessLifecycle,
                 uiEventLogger,
                 displayTracker,
                 sysuiUnlockAnimationController,
@@ -145,42 +153,48 @@
     }
 
     @Test
-    fun `ScreenLifecycle - screenTurnedOn triggers SysUI state flag changes `() {
-        screenLifecycle.dispatchScreenTurnedOn()
+    fun `WakefulnessLifecycle - dispatchFinishedWakingUp sets SysUI flag to AWAKE`() {
+        // WakefulnessLifecycle is initialized to AWAKE initially, and won't emit a noop.
+        wakefulnessLifecycle.dispatchFinishedGoingToSleep()
+        clearInvocations(overviewProxy)
+
+        wakefulnessLifecycle.dispatchFinishedWakingUp()
 
         verify(overviewProxy)
             .onSystemUiStateChanged(
-                intThat { it and SYSUI_STATE_SCREEN_STATE_MASK == SCREEN_STATE_ON }
+                intThat { it and SYSUI_STATE_WAKEFULNESS_MASK == WAKEFULNESS_AWAKE }
             )
     }
 
     @Test
-    fun `ScreenLifecycle - screenTurningOn triggers SysUI state flag changes `() {
-        screenLifecycle.dispatchScreenTurningOn()
+    fun `WakefulnessLifecycle - dispatchStartedWakingUp sets SysUI flag to WAKING`() {
+        wakefulnessLifecycle.dispatchStartedWakingUp(PowerManager.WAKE_REASON_UNKNOWN)
 
         verify(overviewProxy)
             .onSystemUiStateChanged(
-                intThat { it and SYSUI_STATE_SCREEN_STATE_MASK == SCREEN_STATE_TURNING_ON }
+                intThat { it and SYSUI_STATE_WAKEFULNESS_MASK == WAKEFULNESS_WAKING }
             )
     }
 
     @Test
-    fun `ScreenLifecycle - screenTurnedOff triggers SysUI state flag changes `() {
-        screenLifecycle.dispatchScreenTurnedOff()
+    fun `WakefulnessLifecycle - dispatchFinishedGoingToSleep sets SysUI flag to ASLEEP`() {
+        wakefulnessLifecycle.dispatchFinishedGoingToSleep()
 
         verify(overviewProxy)
             .onSystemUiStateChanged(
-                intThat { it and SYSUI_STATE_SCREEN_STATE_MASK == SCREEN_STATE_OFF }
+                intThat { it and SYSUI_STATE_WAKEFULNESS_MASK == WAKEFULNESS_ASLEEP }
             )
     }
 
     @Test
-    fun `ScreenLifecycle - screenTurningOff triggers SysUI state flag changes `() {
-        screenLifecycle.dispatchScreenTurningOff()
+    fun `WakefulnessLifecycle - dispatchStartedGoingToSleep sets SysUI flag to GOING_TO_SLEEP`() {
+        wakefulnessLifecycle.dispatchStartedGoingToSleep(
+            PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON
+        )
 
         verify(overviewProxy)
             .onSystemUiStateChanged(
-                intThat { it and SYSUI_STATE_SCREEN_STATE_MASK == SCREEN_STATE_TURNING_OFF }
+                intThat { it and SYSUI_STATE_WAKEFULNESS_MASK == WAKEFULNESS_GOING_TO_SLEEP }
             )
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotServiceTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotServiceTest.kt
index 47d88a5..77f7426 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotServiceTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotServiceTest.kt
@@ -23,28 +23,21 @@
 import android.graphics.Bitmap
 import android.graphics.Bitmap.Config.HARDWARE
 import android.graphics.ColorSpace
-import android.graphics.Insets
-import android.graphics.Rect
 import android.hardware.HardwareBuffer
 import android.os.UserHandle
 import android.os.UserManager
 import android.testing.AndroidTestingRunner
 import android.view.WindowManager.ScreenshotSource.SCREENSHOT_KEY_OTHER
-import android.view.WindowManager.ScreenshotSource.SCREENSHOT_OVERVIEW
 import android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN
-import android.view.WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE
 import androidx.test.filters.SmallTest
 import com.android.internal.logging.testing.UiEventLoggerFake
 import com.android.internal.util.ScreenshotRequest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.flags.FakeFeatureFlags
-import com.android.systemui.flags.Flags.SCREENSHOT_METADATA_REFACTOR
 import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_CAPTURE_FAILED
 import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_REQUESTED_KEY_OTHER
-import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_REQUESTED_OVERVIEW
 import com.android.systemui.screenshot.TakeScreenshotService.RequestCallback
 import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.argThat
 import com.android.systemui.util.mockito.eq
 import com.android.systemui.util.mockito.mock
 import com.android.systemui.util.mockito.whenever
@@ -61,9 +54,6 @@
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.verifyZeroInteractions
 
-private const val USER_ID = 1
-private const val TASK_ID = 11
-
 @RunWith(AndroidTestingRunner::class)
 @SmallTest
 class TakeScreenshotServiceTest : SysuiTestCase() {
@@ -123,9 +113,6 @@
             .whenever(requestProcessor)
             .processAsync(/* screenshot= */ any(ScreenshotData::class.java), /* callback= */ any())
 
-        // Flipped in selected test cases
-        flags.set(SCREENSHOT_METADATA_REFACTOR, false)
-
         service.attach(
             mContext,
             /* thread = */ null,
@@ -158,39 +145,6 @@
         service.handleRequest(request, { /* onSaved */}, callback)
 
         verify(controller, times(1))
-            .takeScreenshotFullscreen(
-                eq(topComponent),
-                /* onSavedListener = */ any(),
-                /* requestCallback = */ any()
-            )
-
-        assertEquals("Expected one UiEvent", 1, eventLogger.numLogs())
-        val logEvent = eventLogger.get(0)
-
-        assertEquals(
-            "Expected SCREENSHOT_REQUESTED UiEvent",
-            logEvent.eventId,
-            SCREENSHOT_REQUESTED_KEY_OTHER.id
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            eventLogger.get(0).packageName
-        )
-    }
-
-    @Test
-    fun takeScreenshotFullscreen_screenshotDataEnabled() {
-        flags.set(SCREENSHOT_METADATA_REFACTOR, true)
-
-        val request =
-            ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER)
-                .setTopComponent(topComponent)
-                .build()
-
-        service.handleRequest(request, { /* onSaved */}, callback)
-
-        verify(controller, times(1))
             .handleScreenshot(
                 eq(ScreenshotData.fromRequest(request)),
                 /* onSavedListener = */ any(),
@@ -213,53 +167,7 @@
     }
 
     @Test
-    fun takeScreenshotProvidedImage() {
-        val bounds = Rect(50, 50, 150, 150)
-        val bitmap = makeHardwareBitmap(100, 100)
-
-        val request =
-            ScreenshotRequest.Builder(TAKE_SCREENSHOT_PROVIDED_IMAGE, SCREENSHOT_OVERVIEW)
-                .setTopComponent(topComponent)
-                .setTaskId(TASK_ID)
-                .setUserId(USER_ID)
-                .setBitmap(bitmap)
-                .setBoundsOnScreen(bounds)
-                .setInsets(Insets.NONE)
-                .build()
-
-        service.handleRequest(request, { /* onSaved */}, callback)
-
-        verify(controller, times(1))
-            .handleImageAsScreenshot(
-                argThat { b -> b.equalsHardwareBitmap(bitmap) },
-                eq(bounds),
-                eq(Insets.NONE),
-                eq(TASK_ID),
-                eq(USER_ID),
-                eq(topComponent),
-                /* onSavedListener = */ any(),
-                /* requestCallback = */ any()
-            )
-
-        assertEquals("Expected one UiEvent", 1, eventLogger.numLogs())
-        val logEvent = eventLogger.get(0)
-
-        assertEquals(
-            "Expected SCREENSHOT_REQUESTED_* UiEvent",
-            logEvent.eventId,
-            SCREENSHOT_REQUESTED_OVERVIEW.id
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            eventLogger.get(0).packageName
-        )
-    }
-
-    @Test
     fun takeScreenshotFullscreen_userLocked() {
-        flags.set(SCREENSHOT_METADATA_REFACTOR, true)
-
         whenever(userManager.isUserUnlocked).thenReturn(false)
 
         val request =
@@ -300,8 +208,6 @@
 
     @Test
     fun takeScreenshotFullscreen_screenCaptureDisabled_allUsers() {
-        flags.set(SCREENSHOT_METADATA_REFACTOR, true)
-
         whenever(devicePolicyManager.getScreenCaptureDisabled(isNull(), eq(UserHandle.USER_ALL)))
             .thenReturn(true)
 
@@ -350,143 +256,7 @@
     }
 
     @Test
-    fun takeScreenshotFullscreen_userLocked_metadataDisabled() {
-        flags.set(SCREENSHOT_METADATA_REFACTOR, false)
-        whenever(userManager.isUserUnlocked).thenReturn(false)
-
-        val request =
-            ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER)
-                .setTopComponent(topComponent)
-                .build()
-
-        service.handleRequest(request, { /* onSaved */}, callback)
-
-        verify(notificationsController, times(1)).notifyScreenshotError(anyInt())
-        verify(callback, times(1)).reportError()
-        verifyZeroInteractions(controller)
-
-        assertEquals("Expected two UiEvents", 2, eventLogger.numLogs())
-        val requestEvent = eventLogger.get(0)
-        assertEquals(
-            "Expected SCREENSHOT_REQUESTED_* UiEvent",
-            SCREENSHOT_REQUESTED_KEY_OTHER.id,
-            requestEvent.eventId
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            requestEvent.packageName
-        )
-        val failureEvent = eventLogger.get(1)
-        assertEquals(
-            "Expected SCREENSHOT_CAPTURE_FAILED UiEvent",
-            SCREENSHOT_CAPTURE_FAILED.id,
-            failureEvent.eventId
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            failureEvent.packageName
-        )
-    }
-
-    @Test
-    fun takeScreenshotFullscreen_screenCaptureDisabled_allUsers_metadataDisabled() {
-        flags.set(SCREENSHOT_METADATA_REFACTOR, false)
-
-        whenever(devicePolicyManager.getScreenCaptureDisabled(isNull(), eq(UserHandle.USER_ALL)))
-            .thenReturn(true)
-
-        whenever(
-                devicePolicyResourcesManager.getString(
-                    eq(SCREENSHOT_BLOCKED_BY_ADMIN),
-                    /* Supplier<String> */
-                    any(),
-                )
-            )
-            .thenReturn("SCREENSHOT_BLOCKED_BY_ADMIN")
-
-        val request =
-            ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER)
-                .setTopComponent(topComponent)
-                .build()
-
-        service.handleRequest(request, { /* onSaved */}, callback)
-
-        // error shown: Toast.makeText(...).show(), untestable
-        verify(callback, times(1)).reportError()
-        verifyZeroInteractions(controller)
-        assertEquals("Expected two UiEvents", 2, eventLogger.numLogs())
-        val requestEvent = eventLogger.get(0)
-        assertEquals(
-            "Expected SCREENSHOT_REQUESTED_* UiEvent",
-            SCREENSHOT_REQUESTED_KEY_OTHER.id,
-            requestEvent.eventId
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            requestEvent.packageName
-        )
-        val failureEvent = eventLogger.get(1)
-        assertEquals(
-            "Expected SCREENSHOT_CAPTURE_FAILED UiEvent",
-            SCREENSHOT_CAPTURE_FAILED.id,
-            failureEvent.eventId
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            failureEvent.packageName
-        )
-    }
-
-    @Test
-    fun takeScreenshot_workProfile_nullBitmap_metadataDisabled() {
-        flags.set(SCREENSHOT_METADATA_REFACTOR, false)
-
-        val request =
-            ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER)
-                .setTopComponent(topComponent)
-                .build()
-
-        doThrow(IllegalStateException::class.java)
-            .whenever(requestProcessor)
-            .processAsync(any(ScreenshotRequest::class.java), any())
-
-        service.handleRequest(request, { /* onSaved */}, callback)
-
-        verify(callback, times(1)).reportError()
-        verify(notificationsController, times(1)).notifyScreenshotError(anyInt())
-        verifyZeroInteractions(controller)
-        assertEquals("Expected two UiEvents", 2, eventLogger.numLogs())
-        val requestEvent = eventLogger.get(0)
-        assertEquals(
-            "Expected SCREENSHOT_REQUESTED_* UiEvent",
-            SCREENSHOT_REQUESTED_KEY_OTHER.id,
-            requestEvent.eventId
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            requestEvent.packageName
-        )
-        val failureEvent = eventLogger.get(1)
-        assertEquals(
-            "Expected SCREENSHOT_CAPTURE_FAILED UiEvent",
-            SCREENSHOT_CAPTURE_FAILED.id,
-            failureEvent.eventId
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            failureEvent.packageName
-        )
-    }
-    @Test
     fun takeScreenshot_workProfile_nullBitmap() {
-        flags.set(SCREENSHOT_METADATA_REFACTOR, true)
-
         val request =
             ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER)
                 .setTopComponent(topComponent)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/appclips/AppClipsServiceTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/appclips/AppClipsServiceTest.java
index b55fe36..67b1099 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/appclips/AppClipsServiceTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/appclips/AppClipsServiceTest.java
@@ -20,8 +20,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.app.admin.DevicePolicyManager;
@@ -29,6 +31,8 @@
 import android.content.Intent;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
 
 import androidx.test.runner.AndroidJUnit4;
 
@@ -42,6 +46,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 
 import java.util.Optional;
@@ -58,6 +63,9 @@
     @Mock private Optional<Bubbles> mOptionalBubbles;
     @Mock private Bubbles mBubbles;
     @Mock private DevicePolicyManager mDevicePolicyManager;
+    @Mock private UserManager mUserManager;
+
+    private AppClipsService mAppClipsService;
 
     @Before
     public void setUp() {
@@ -119,26 +127,53 @@
 
     @Test
     public void allPrerequisitesSatisfy_shouldReturnTrue() throws RemoteException {
-        when(mFeatureFlags.isEnabled(SCREENSHOT_APP_CLIPS)).thenReturn(true);
-        when(mOptionalBubbles.isEmpty()).thenReturn(false);
-        when(mOptionalBubbles.get()).thenReturn(mBubbles);
-        when(mBubbles.isAppBubbleTaskId(eq((FAKE_TASK_ID)))).thenReturn(true);
-        when(mDevicePolicyManager.getScreenCaptureDisabled(eq(null))).thenReturn(false);
+        mockToSatisfyAllPrerequisites();
 
         assertThat(getInterfaceWithRealContext()
                 .canLaunchCaptureContentActivityForNote(FAKE_TASK_ID)).isTrue();
     }
 
+    @Test
+    public void isManagedProfile_shouldUseProxyConnection() throws RemoteException {
+        when(mUserManager.isManagedProfile()).thenReturn(true);
+        when(mUserManager.getMainUser()).thenReturn(UserHandle.SYSTEM);
+        IAppClipsService service = getInterfaceWithRealContext();
+        mAppClipsService.mProxyConnectorToMainProfile =
+                Mockito.spy(mAppClipsService.mProxyConnectorToMainProfile);
+
+        service.canLaunchCaptureContentActivityForNote(FAKE_TASK_ID);
+
+        verify(mAppClipsService.mProxyConnectorToMainProfile).postForResult(any());
+    }
+
+    @Test
+    public void isManagedProfile_noMainUser_shouldReturnFalse() {
+        when(mUserManager.isManagedProfile()).thenReturn(true);
+        when(mUserManager.getMainUser()).thenReturn(null);
+
+        getInterfaceWithRealContext();
+
+        assertThat(mAppClipsService.mProxyConnectorToMainProfile).isNull();
+    }
+
+    private void mockToSatisfyAllPrerequisites() {
+        when(mFeatureFlags.isEnabled(SCREENSHOT_APP_CLIPS)).thenReturn(true);
+        when(mOptionalBubbles.isEmpty()).thenReturn(false);
+        when(mOptionalBubbles.get()).thenReturn(mBubbles);
+        when(mBubbles.isAppBubbleTaskId(eq((FAKE_TASK_ID)))).thenReturn(true);
+        when(mDevicePolicyManager.getScreenCaptureDisabled(eq(null))).thenReturn(false);
+    }
+
     private IAppClipsService getInterfaceWithRealContext() {
-        AppClipsService appClipsService = new AppClipsService(getContext(), mFeatureFlags,
-                mOptionalBubbles, mDevicePolicyManager);
-        return getInterfaceFromService(appClipsService);
+        mAppClipsService = new AppClipsService(getContext(), mFeatureFlags,
+                mOptionalBubbles, mDevicePolicyManager, mUserManager);
+        return getInterfaceFromService(mAppClipsService);
     }
 
     private IAppClipsService getInterfaceWithMockContext() {
-        AppClipsService appClipsService = new AppClipsService(mMockContext, mFeatureFlags,
-                mOptionalBubbles, mDevicePolicyManager);
-        return getInterfaceFromService(appClipsService);
+        mAppClipsService = new AppClipsService(mMockContext, mFeatureFlags,
+                mOptionalBubbles, mDevicePolicyManager, mUserManager);
+        return getInterfaceFromService(mAppClipsService);
     }
 
     private static IAppClipsService getInterfaceFromService(AppClipsService appClipsService) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/appclips/AppClipsTrampolineActivityTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/appclips/AppClipsTrampolineActivityTest.java
index ad06dcc..31a33d4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/appclips/AppClipsTrampolineActivityTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/appclips/AppClipsTrampolineActivityTest.java
@@ -49,6 +49,8 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.testing.AndroidTestingRunner;
 
 import androidx.test.rule.ActivityTestRule;
@@ -98,6 +100,9 @@
     private UserTracker mUserTracker;
     @Mock
     private UiEventLogger mUiEventLogger;
+    @Mock
+    private UserManager mUserManager;
+
     @Main
     private Handler mMainHandler;
 
@@ -109,7 +114,7 @@
                 protected AppClipsTrampolineActivityTestable create(Intent unUsed) {
                     return new AppClipsTrampolineActivityTestable(mDevicePolicyManager,
                             mFeatureFlags, mOptionalBubbles, mNoteTaskController, mPackageManager,
-                            mUserTracker, mUiEventLogger, mMainHandler);
+                            mUserTracker, mUiEventLogger, mUserManager, mMainHandler);
                 }
             };
 
@@ -264,6 +269,40 @@
         verify(mUiEventLogger).log(SCREENSHOT_FOR_NOTE_TRIGGERED, TEST_UID, TEST_CALLING_PACKAGE);
     }
 
+    @Test
+    public void startAppClipsActivity_throughWPUser_shouldStartMainUserActivity()
+            throws NameNotFoundException {
+        when(mUserManager.isManagedProfile()).thenReturn(true);
+        when(mUserManager.getMainUser()).thenReturn(UserHandle.SYSTEM);
+        mockToSatisfyAllPrerequisites();
+
+        AppClipsTrampolineActivityTestable activity = mActivityRule.launchActivity(mActivityIntent);
+        waitForIdleSync();
+
+        Intent actualIntent = activity.mStartedIntent;
+        assertThat(actualIntent.getComponent()).isEqualTo(
+                new ComponentName(mContext, AppClipsTrampolineActivity.class));
+        assertThat(actualIntent.getFlags()).isEqualTo(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+        assertThat(activity.mStartingUser).isEqualTo(UserHandle.SYSTEM);
+    }
+
+    @Test
+    public void startAppClipsActivity_throughWPUser_noMainUser_shouldFinishWithFailed()
+            throws NameNotFoundException {
+        when(mUserManager.isManagedProfile()).thenReturn(true);
+        when(mUserManager.getMainUser()).thenReturn(null);
+
+        mockToSatisfyAllPrerequisites();
+
+        mActivityRule.launchActivity(mActivityIntent);
+        waitForIdleSync();
+
+        ActivityResult actualResult = mActivityRule.getActivityResult();
+        assertThat(actualResult.getResultCode()).isEqualTo(Activity.RESULT_OK);
+        assertThat(getStatusCodeExtra(actualResult.getResultData()))
+                .isEqualTo(CAPTURE_CONTENT_FOR_NOTE_FAILED);
+    }
+
     private void mockToSatisfyAllPrerequisites() throws NameNotFoundException {
         when(mFeatureFlags.isEnabled(SCREENSHOT_APP_CLIPS)).thenReturn(true);
         when(mOptionalBubbles.isEmpty()).thenReturn(false);
@@ -282,6 +321,9 @@
     public static final class AppClipsTrampolineActivityTestable extends
             AppClipsTrampolineActivity {
 
+        Intent mStartedIntent;
+        UserHandle mStartingUser;
+
         public AppClipsTrampolineActivityTestable(DevicePolicyManager devicePolicyManager,
                 FeatureFlags flags,
                 Optional<Bubbles> optionalBubbles,
@@ -289,9 +331,10 @@
                 PackageManager packageManager,
                 UserTracker userTracker,
                 UiEventLogger uiEventLogger,
+                UserManager userManager,
                 @Main Handler mainHandler) {
             super(devicePolicyManager, flags, optionalBubbles, noteTaskController, packageManager,
-                    userTracker, uiEventLogger, mainHandler);
+                    userTracker, uiEventLogger, userManager, mainHandler);
         }
 
         @Override
@@ -303,6 +346,12 @@
         public void startActivity(Intent unUsed) {
             // Ignore this intent to avoid App Clips screenshot editing activity from starting.
         }
+
+        @Override
+        public void startActivityAsUser(Intent startedIntent, UserHandle startingUser) {
+            mStartedIntent = startedIntent;
+            mStartingUser = startingUser;
+        }
     }
 
     private static int getStatusCodeExtra(Intent intent) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
index 7087c01..7b37ea0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
@@ -103,6 +103,7 @@
 import com.android.systemui.media.controls.ui.KeyguardMediaController;
 import com.android.systemui.media.controls.ui.MediaHierarchyManager;
 import com.android.systemui.model.SysUiState;
+import com.android.systemui.multishade.domain.interactor.MultiShadeInteractor;
 import com.android.systemui.navigationbar.NavigationBarController;
 import com.android.systemui.navigationbar.NavigationModeController;
 import com.android.systemui.plugins.FalsingManager;
@@ -162,6 +163,8 @@
 import com.android.systemui.util.time.SystemClock;
 import com.android.wm.shell.animation.FlingAnimationUtils;
 
+import dagger.Lazy;
+
 import org.junit.After;
 import org.junit.Before;
 import org.mockito.ArgumentCaptor;
@@ -173,7 +176,6 @@
 import java.util.List;
 import java.util.Optional;
 
-import dagger.Lazy;
 import kotlinx.coroutines.CoroutineDispatcher;
 
 public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
@@ -207,7 +209,6 @@
     @Mock protected KeyguardStateController mKeyguardStateController;
     @Mock protected DozeLog mDozeLog;
     @Mock protected ShadeLogger mShadeLog;
-    @Mock protected ShadeHeightLogger mShadeHeightLogger;
     @Mock protected CommandQueue mCommandQueue;
     @Mock protected VibratorHelper mVibratorHelper;
     @Mock protected LatencyTracker mLatencyTracker;
@@ -286,6 +287,7 @@
     @Mock protected GoneToDreamingTransitionViewModel mGoneToDreamingTransitionViewModel;
 
     @Mock protected KeyguardTransitionInteractor mKeyguardTransitionInteractor;
+    @Mock protected MultiShadeInteractor mMultiShadeInteractor;
     @Mock protected KeyguardLongPressViewModel mKeyuardLongPressViewModel;
     @Mock protected AlternateBouncerInteractor mAlternateBouncerInteractor;
     @Mock protected MotionEvent mDownMotionEvent;
@@ -519,7 +521,6 @@
                 mLatencyTracker, mPowerManager, mAccessibilityManager, 0, mUpdateMonitor,
                 mMetricsLogger,
                 mShadeLog,
-                mShadeHeightLogger,
                 mConfigurationController,
                 () -> flingAnimationUtilsBuilder, mStatusBarTouchableRegionManager,
                 mConversationNotificationManager, mMediaHierarchyManager,
@@ -571,6 +572,7 @@
                 mLockscreenToOccludedTransitionViewModel,
                 mMainDispatcher,
                 mKeyguardTransitionInteractor,
+                () -> mMultiShadeInteractor,
                 mDumpManager,
                 mKeyuardLongPressViewModel,
                 mKeyguardInteractor);
@@ -578,7 +580,8 @@
                 mCentralSurfaces,
                 null,
                 () -> {},
-                mNotificationShelfController);
+                mNotificationShelfController,
+                mHeadsUpManager);
         mNotificationPanelViewController.setTrackingStartedListener(() -> {});
         mNotificationPanelViewController.setOpenCloseListener(
                 new NotificationPanelViewController.OpenCloseListener() {
@@ -588,7 +591,6 @@
                     @Override
                     public void onOpenStarted() {}
                 });
-        mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager);
         ArgumentCaptor<View.OnAttachStateChangeListener> onAttachStateChangeListenerArgumentCaptor =
                 ArgumentCaptor.forClass(View.OnAttachStateChangeListener.class);
         verify(mView, atLeast(1)).addOnAttachStateChangeListener(
@@ -601,7 +603,7 @@
         mAccessibilityDelegate = accessibilityDelegateArgumentCaptor.getValue();
         mNotificationPanelViewController.getStatusBarStateController()
                 .addCallback(mNotificationPanelViewController.getStatusBarStateListener());
-        mNotificationPanelViewController
+        mNotificationPanelViewController.getShadeHeadsUpTracker()
                 .setHeadsUpAppearanceController(mock(HeadsUpAppearanceController.class));
         verify(mNotificationStackScrollLayoutController)
                 .setOnEmptySpaceClickListener(mEmptySpaceClickListenerCaptor.capture());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
index d36cc7e..2db9c97 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
@@ -456,6 +456,34 @@
     }
 
     @Test
+    public void keyguardStatusView_willPlayDelayedDoze_isCentered_thenNot() {
+        when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(2);
+        mStatusBarStateController.setState(KEYGUARD);
+        enableSplitShade(/* enabled= */ true);
+
+        mNotificationPanelViewController.setWillPlayDelayedDozeAmountAnimation(true);
+        setDozing(/* dozing= */ false, /* dozingAlwaysOn= */ false);
+        assertKeyguardStatusViewCentered();
+
+        mNotificationPanelViewController.setWillPlayDelayedDozeAmountAnimation(false);
+        assertKeyguardStatusViewNotCentered();
+    }
+
+    @Test
+    public void keyguardStatusView_willPlayDelayedDoze_isCentered_thenStillCenteredIfNoNotifs() {
+        when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(0);
+        mStatusBarStateController.setState(KEYGUARD);
+        enableSplitShade(/* enabled= */ true);
+
+        mNotificationPanelViewController.setWillPlayDelayedDozeAmountAnimation(true);
+        setDozing(/* dozing= */ false, /* dozingAlwaysOn= */ false);
+        assertKeyguardStatusViewCentered();
+
+        mNotificationPanelViewController.setWillPlayDelayedDozeAmountAnimation(false);
+        assertKeyguardStatusViewCentered();
+    }
+
+    @Test
     public void testCanCollapsePanelOnTouch_trueForKeyGuard() {
         mStatusBarStateController.setState(KEYGUARD);
 
@@ -702,7 +730,8 @@
                 ArgumentCaptor.forClass(ValueAnimator.AnimatorUpdateListener.class);
 
         // Start fold animation & Capture Listeners
-        mNotificationPanelViewController.startFoldToAodAnimation(() -> {}, () -> {}, () -> {});
+        mNotificationPanelViewController.getShadeFoldAnimator()
+                .startFoldToAodAnimation(() -> {}, () -> {}, () -> {});
         verify(mViewPropertyAnimator).setListener(animCaptor.capture());
         verify(mViewPropertyAnimator).setUpdateListener(updateCaptor.capture());
 
@@ -717,7 +746,7 @@
         enableSplitShade(/* enabled= */ true);
         mStatusBarStateController.setState(KEYGUARD);
 
-        mNotificationPanelViewController.expandWithQs();
+        mNotificationPanelViewController.expandToQs();
 
         verify(mLockscreenShadeTransitionController).goToLockedShade(
                 /* expandedView= */null, /* needsQSAnimation= */true);
@@ -798,7 +827,7 @@
     @Test
     public void testQsExpansionChangedToDefaultWhenRotatingFromOrToSplitShade() {
         // to make sure shade is in expanded state
-        mNotificationPanelViewController.startWaitingForOpenPanelGesture();
+        mNotificationPanelViewController.startWaitingForExpandGesture();
 
         // switch to split shade from portrait (default state)
         enableSplitShade(/* enabled= */ true);
@@ -817,7 +846,7 @@
         mNotificationPanelViewController.setExpandedFraction(1f);
 
         assertThat(mNotificationPanelViewController.isClosing()).isFalse();
-        mNotificationPanelViewController.animateCloseQs(false);
+        mNotificationPanelViewController.animateCollapseQs(false);
 
         assertThat(mNotificationPanelViewController.isClosing()).isTrue();
     }
@@ -825,7 +854,7 @@
     @Test
     public void getMaxPanelTransitionDistance_expanding_inSplitShade_returnsSplitShadeFullTransitionDistance() {
         enableSplitShade(true);
-        mNotificationPanelViewController.expandWithQs();
+        mNotificationPanelViewController.expandToQs();
 
         int maxDistance = mNotificationPanelViewController.getMaxPanelTransitionDistance();
 
@@ -835,7 +864,7 @@
     @Test
     public void getMaxPanelTransitionDistance_inSplitShade_withHeadsUp_returnsBiggerValue() {
         enableSplitShade(true);
-        mNotificationPanelViewController.expandWithQs();
+        mNotificationPanelViewController.expandToQs();
         when(mHeadsUpManager.isTrackingHeadsUp()).thenReturn(true);
         when(mQsController.calculatePanelHeightExpanded(anyInt())).thenReturn(10000);
         mNotificationPanelViewController.setHeadsUpDraggingStartingHeight(
@@ -852,7 +881,7 @@
     public void getMaxPanelTransitionDistance_expandingSplitShade_keyguard_returnsNonSplitShadeValue() {
         mStatusBarStateController.setState(KEYGUARD);
         enableSplitShade(true);
-        mNotificationPanelViewController.expandWithQs();
+        mNotificationPanelViewController.expandToQs();
 
         int maxDistance = mNotificationPanelViewController.getMaxPanelTransitionDistance();
 
@@ -862,7 +891,7 @@
     @Test
     public void getMaxPanelTransitionDistance_expanding_notSplitShade_returnsNonSplitShadeValue() {
         enableSplitShade(false);
-        mNotificationPanelViewController.expandWithQs();
+        mNotificationPanelViewController.expandToQs();
 
         int maxDistance = mNotificationPanelViewController.getMaxPanelTransitionDistance();
 
@@ -1033,11 +1062,11 @@
         mStatusBarStateController.setState(SHADE);
 
         mNotificationPanelViewController.setExpandedHeight(0);
-        assertThat(mNotificationPanelViewController.isShadeFullyOpen()).isFalse();
+        assertThat(mNotificationPanelViewController.isShadeFullyExpanded()).isFalse();
 
         int transitionDistance = mNotificationPanelViewController.getMaxPanelTransitionDistance();
         mNotificationPanelViewController.setExpandedHeight(transitionDistance);
-        assertThat(mNotificationPanelViewController.isShadeFullyOpen()).isTrue();
+        assertThat(mNotificationPanelViewController.isShadeFullyExpanded()).isTrue();
     }
 
     @Test
@@ -1046,12 +1075,12 @@
 
         int transitionDistance = mNotificationPanelViewController.getMaxPanelTransitionDistance();
         mNotificationPanelViewController.setExpandedHeight(transitionDistance);
-        assertThat(mNotificationPanelViewController.isShadeFullyOpen()).isFalse();
+        assertThat(mNotificationPanelViewController.isShadeFullyExpanded()).isFalse();
     }
 
     @Test
     public void shadeExpanded_onShadeLocked() {
         mStatusBarStateController.setState(SHADE_LOCKED);
-        assertThat(mNotificationPanelViewController.isShadeFullyOpen()).isTrue();
+        assertThat(mNotificationPanelViewController.isShadeFullyExpanded()).isTrue();
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
index 2a10823..bc8ab1f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
@@ -86,6 +86,7 @@
     @Mock private lateinit var notificationShadeDepthController: NotificationShadeDepthController
     @Mock private lateinit var notificationShadeWindowController: NotificationShadeWindowController
     @Mock private lateinit var keyguardUnlockAnimationController: KeyguardUnlockAnimationController
+    @Mock private lateinit var shadeController: ShadeController
     @Mock private lateinit var ambientState: AmbientState
     @Mock private lateinit var keyguardBouncerViewModel: KeyguardBouncerViewModel
     @Mock private lateinit var stackScrollLayoutController: NotificationStackScrollLayoutController
@@ -173,11 +174,13 @@
                         applicationContext = context,
                         applicationScope = testScope.backgroundScope,
                         multiShadeInteractor = multiShadeInteractor,
+                        featureFlags = featureFlags,
                         keyguardTransitionInteractor =
                             KeyguardTransitionInteractor(
                                 repository = FakeKeyguardTransitionRepository(),
                             ),
                         falsingManager = FalsingManagerFake(),
+                        shadeController = shadeController,
                     )
                 },
             )
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt
index 86660a4..56385b2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt
@@ -185,11 +185,13 @@
                         applicationContext = context,
                         applicationScope = testScope.backgroundScope,
                         multiShadeInteractor = multiShadeInteractor,
+                        featureFlags = featureFlags,
                         keyguardTransitionInteractor =
                             KeyguardTransitionInteractor(
                                 repository = FakeKeyguardTransitionRepository(),
                             ),
                         falsingManager = FalsingManagerFake(),
+                        shadeController = shadeController,
                     )
                 },
             )
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/ClockRegistryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/ClockRegistryTest.kt
index 374aae1..78f5bf2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/ClockRegistryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/ClockRegistryTest.kt
@@ -122,7 +122,7 @@
             isEnabled = true,
             handleAllUsers = true,
             defaultClockProvider = fakeDefaultProvider,
-            keepAllLoaded = true,
+            keepAllLoaded = false,
             subTag = "Test",
         ) {
             override fun querySettings() { }
@@ -154,8 +154,8 @@
         pluginListener.onPluginLoaded(plugin2, mockContext, mockPluginLifecycle)
         val list = registry.getClocks()
         assertEquals(
-            list,
-            listOf(
+            list.toSet(),
+            setOf(
                 ClockMetadata(DEFAULT_CLOCK_ID, DEFAULT_CLOCK_NAME),
                 ClockMetadata("clock_1", "clock 1"),
                 ClockMetadata("clock_2", "clock 2"),
@@ -187,8 +187,8 @@
         pluginListener.onPluginLoaded(plugin2, mockContext, mockPluginLifecycle2)
         val list = registry.getClocks()
         assertEquals(
-            list,
-            listOf(
+            list.toSet(),
+            setOf(
                 ClockMetadata(DEFAULT_CLOCK_ID, DEFAULT_CLOCK_NAME),
                 ClockMetadata("clock_1", "clock 1"),
                 ClockMetadata("clock_2", "clock 2")
@@ -293,6 +293,53 @@
         assertEquals(4, listChangeCallCount)
     }
 
+    @Test
+    fun pluginAddRemove_concurrentModification() {
+        val mockPluginLifecycle1 = mock<PluginLifecycleManager<ClockProviderPlugin>>()
+        val mockPluginLifecycle2 = mock<PluginLifecycleManager<ClockProviderPlugin>>()
+        val mockPluginLifecycle3 = mock<PluginLifecycleManager<ClockProviderPlugin>>()
+        val mockPluginLifecycle4 = mock<PluginLifecycleManager<ClockProviderPlugin>>()
+        val plugin1 = FakeClockPlugin().addClock("clock_1", "clock 1")
+        val plugin2 = FakeClockPlugin().addClock("clock_2", "clock 2")
+        val plugin3 = FakeClockPlugin().addClock("clock_3", "clock 3")
+        val plugin4 = FakeClockPlugin().addClock("clock_4", "clock 4")
+        whenever(mockPluginLifecycle1.isLoaded).thenReturn(true)
+        whenever(mockPluginLifecycle2.isLoaded).thenReturn(true)
+        whenever(mockPluginLifecycle3.isLoaded).thenReturn(true)
+        whenever(mockPluginLifecycle4.isLoaded).thenReturn(true)
+
+        // Set the current clock to the final clock to load
+        registry.applySettings(ClockSettings("clock_4", null))
+        scheduler.runCurrent()
+
+        // When ClockRegistry attempts to unload a plugin, we at that point decide to load and
+        // unload other plugins. This causes ClockRegistry to modify the list of available clock
+        // plugins while it is being iterated over. In production this happens as a result of a
+        // thread race, instead of synchronously like it does here.
+        whenever(mockPluginLifecycle2.unloadPlugin()).then {
+            pluginListener.onPluginDetached(mockPluginLifecycle1)
+            pluginListener.onPluginLoaded(plugin4, mockContext, mockPluginLifecycle4)
+        }
+
+        // Load initial plugins
+        pluginListener.onPluginLoaded(plugin1, mockContext, mockPluginLifecycle1)
+        pluginListener.onPluginLoaded(plugin2, mockContext, mockPluginLifecycle2)
+        pluginListener.onPluginLoaded(plugin3, mockContext, mockPluginLifecycle3)
+
+        // Repeatedly verify the loaded providers to get final state
+        registry.verifyLoadedProviders()
+        scheduler.runCurrent()
+        registry.verifyLoadedProviders()
+        scheduler.runCurrent()
+
+        // Verify all plugins were correctly loaded into the registry
+        assertEquals(registry.getClocks().toSet(), setOf(
+            ClockMetadata("DEFAULT", "Default Clock"),
+            ClockMetadata("clock_2", "clock 2"),
+            ClockMetadata("clock_3", "clock 3"),
+            ClockMetadata("clock_4", "clock 4")
+        ))
+    }
 
     @Test
     fun jsonDeserialization_gotExpectedObject() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
index f581154..f4cd383 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
@@ -33,6 +33,7 @@
 import android.hardware.biometrics.PromptInfo;
 import android.hardware.fingerprint.IUdfpsRefreshRateRequestCallback;
 import android.os.Bundle;
+import android.view.KeyEvent;
 import android.view.WindowInsets;
 import android.view.WindowInsets.Type.InsetsType;
 import android.view.WindowInsetsController.Appearance;
@@ -397,9 +398,10 @@
 
     @Test
     public void testHandleSysKey() {
-        mCommandQueue.handleSystemKey(1);
+        KeyEvent testEvent = new KeyEvent(1, 1);
+        mCommandQueue.handleSystemKey(testEvent);
         waitForIdleSync();
-        verify(mCallbacks).handleSystemKey(eq(1));
+        verify(mCallbacks).handleSystemKey(eq(testEvent));
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
index ab615f9..932a1f9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
@@ -223,7 +223,7 @@
     fun testGoToLockedShadeCreatesQSAnimation() {
         transitionController.goToLockedShade(null)
         verify(statusbarStateController).setState(StatusBarState.SHADE_LOCKED)
-        verify(notificationPanelController).animateToFullShade(anyLong())
+        verify(notificationPanelController).transitionToExpandedShade(anyLong())
         assertNotNull(transitionController.dragDownAnimator)
     }
 
@@ -231,7 +231,7 @@
     fun testGoToLockedShadeDoesntCreateQSAnimation() {
         transitionController.goToLockedShade(null, needsQSAnimation = false)
         verify(statusbarStateController).setState(StatusBarState.SHADE_LOCKED)
-        verify(notificationPanelController).animateToFullShade(anyLong())
+        verify(notificationPanelController).transitionToExpandedShade(anyLong())
         assertNull(transitionController.dragDownAnimator)
     }
 
@@ -239,7 +239,7 @@
     fun testGoToLockedShadeAlwaysCreatesQSAnimationInSplitShade() {
         enableSplitShade()
         transitionController.goToLockedShade(null, needsQSAnimation = true)
-        verify(notificationPanelController).animateToFullShade(anyLong())
+        verify(notificationPanelController).transitionToExpandedShade(anyLong())
         assertNotNull(transitionController.dragDownAnimator)
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt
index 08a9f31..7b59cc2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt
@@ -22,7 +22,7 @@
 import android.testing.TestableLooper.RunWithLooper
 import android.view.View
 import android.widget.FrameLayout
-import androidx.core.animation.AnimatorTestRule
+import androidx.core.animation.AnimatorTestRule2
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.dump.DumpManager
@@ -70,7 +70,7 @@
     private lateinit var systemStatusAnimationScheduler: SystemStatusAnimationScheduler
     private val fakeFeatureFlags = FakeFeatureFlags()
 
-    @get:Rule val animatorTestRule = AnimatorTestRule()
+    @get:Rule val animatorTestRule = AnimatorTestRule2()
 
     @Before
     fun setup() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt
index 7a67796..bef9fcb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt
@@ -18,7 +18,7 @@
 
 import android.testing.AndroidTestingRunner
 import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase;
+import com.android.systemui.SysuiTestCase
 import com.android.systemui.plugins.log.LogBuffer
 import com.android.systemui.plugins.log.LogLevel
 import com.android.systemui.plugins.log.LogcatEchoTracker
@@ -45,47 +45,130 @@
     }
 
     @Test
-    fun setDozeAmountWillThrottleFractionalUpdates() {
-        logger.logSetDozeAmount(0f, 0f, "source1", StatusBarState.SHADE, changed = false)
+    fun updateVisibilityThrottleFractionalUpdates() {
+        logger.logSetVisibilityAmount(0f)
         verifyDidLog(1)
-        logger.logSetDozeAmount(0.1f, 0.1f, "source1", StatusBarState.SHADE, changed = true)
+        logger.logSetVisibilityAmount(0.1f)
         verifyDidLog(1)
-        logger.logSetDozeAmount(0.2f, 0.2f, "source1", StatusBarState.SHADE, changed = true)
-        logger.logSetDozeAmount(0.3f, 0.3f, "source1", StatusBarState.SHADE, changed = true)
-        logger.logSetDozeAmount(0.4f, 0.4f, "source1", StatusBarState.SHADE, changed = true)
-        logger.logSetDozeAmount(0.5f, 0.5f, "source1", StatusBarState.SHADE, changed = true)
+        logger.logSetVisibilityAmount(0.2f)
+        logger.logSetVisibilityAmount(0.3f)
+        logger.logSetVisibilityAmount(0.4f)
+        logger.logSetVisibilityAmount(0.5f)
         verifyDidLog(0)
-        logger.logSetDozeAmount(1f, 1f, "source1", StatusBarState.SHADE, changed = true)
+        logger.logSetVisibilityAmount(1f)
         verifyDidLog(1)
     }
 
     @Test
-    fun setDozeAmountWillIncludeFractionalUpdatesWhenStateChanges() {
-        logger.logSetDozeAmount(0f, 0f, "source1", StatusBarState.SHADE, changed = false)
+    fun updateHideAmountThrottleFractionalOrRepeatedUpdates() {
+        logger.logSetHideAmount(0f)
         verifyDidLog(1)
-        logger.logSetDozeAmount(0.1f, 0.1f, "source1", StatusBarState.SHADE, changed = true)
-        verifyDidLog(1)
-        logger.logSetDozeAmount(0.2f, 0.2f, "source1", StatusBarState.SHADE, changed = true)
-        logger.logSetDozeAmount(0.3f, 0.3f, "source1", StatusBarState.SHADE, changed = true)
-        logger.logSetDozeAmount(0.4f, 0.4f, "source1", StatusBarState.SHADE, changed = true)
-        logger.logSetDozeAmount(0.5f, 0.5f, "source1", StatusBarState.SHADE, changed = true)
+        logger.logSetHideAmount(0f)
+        logger.logSetHideAmount(0f)
         verifyDidLog(0)
-        logger.logSetDozeAmount(0.5f, 0.5f, "source1", StatusBarState.KEYGUARD, changed = false)
+        logger.logSetHideAmount(0.1f)
+        verifyDidLog(1)
+        logger.logSetHideAmount(0.2f)
+        logger.logSetHideAmount(0.3f)
+        logger.logSetHideAmount(0.4f)
+        logger.logSetHideAmount(0.5f)
+        logger.logSetHideAmount(0.5f)
+        logger.logSetHideAmount(0.5f)
+        verifyDidLog(0)
+        logger.logSetHideAmount(1f)
+        verifyDidLog(1)
+        logger.logSetHideAmount(1f)
+        logger.logSetHideAmount(1f)
+        verifyDidLog(0)
+    }
+
+    @Test
+    fun updateDozeAmountWillThrottleFractionalInputUpdates() {
+        logger.logUpdateDozeAmount(0f, 0f, null, 0f, StatusBarState.SHADE, changed = false)
+        verifyDidLog(1)
+        logger.logUpdateDozeAmount(0.1f, 0f, null, 0.1f, StatusBarState.SHADE, changed = true)
+        verifyDidLog(1)
+        logger.logUpdateDozeAmount(0.2f, 0f, null, 0.2f, StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0.3f, 0f, null, 0.3f, StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0.4f, 0f, null, 0.4f, StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0.5f, 0f, null, 0.5f, StatusBarState.SHADE, changed = true)
+        verifyDidLog(0)
+        logger.logUpdateDozeAmount(1f, 0f, null, 1f, StatusBarState.SHADE, changed = true)
         verifyDidLog(1)
     }
 
     @Test
-    fun setDozeAmountWillIncludeFractionalUpdatesWhenSourceChanges() {
-        logger.logSetDozeAmount(0f, 0f, "source1", StatusBarState.SHADE, changed = false)
+    fun updateDozeAmountWillThrottleFractionalDelayUpdates() {
+        logger.logUpdateDozeAmount(0f, 0f, null, 0f, StatusBarState.SHADE, changed = false)
         verifyDidLog(1)
-        logger.logSetDozeAmount(0.1f, 0.1f, "source1", StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0f, 0.1f, null, 0.1f, StatusBarState.SHADE, changed = true)
         verifyDidLog(1)
-        logger.logSetDozeAmount(0.2f, 0.2f, "source1", StatusBarState.SHADE, changed = true)
-        logger.logSetDozeAmount(0.3f, 0.3f, "source1", StatusBarState.SHADE, changed = true)
-        logger.logSetDozeAmount(0.4f, 0.4f, "source1", StatusBarState.SHADE, changed = true)
-        logger.logSetDozeAmount(0.5f, 0.5f, "source1", StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0f, 0.2f, null, 0.2f, StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0f, 0.3f, null, 0.3f, StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0f, 0.4f, null, 0.4f, StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0f, 0.5f, null, 0.5f, StatusBarState.SHADE, changed = true)
         verifyDidLog(0)
-        logger.logSetDozeAmount(0.5f, 0.5f, "source2", StatusBarState.SHADE, changed = false)
+        logger.logUpdateDozeAmount(0f, 1f, null, 1f, StatusBarState.SHADE, changed = true)
+        verifyDidLog(1)
+    }
+
+    @Test
+    fun updateDozeAmountWillIncludeFractionalUpdatesWhenOtherInputChangesFractionality() {
+        logger.logUpdateDozeAmount(0.0f, 1.0f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        verifyDidLog(1)
+        logger.logUpdateDozeAmount(0.1f, 1.0f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        verifyDidLog(1)
+        logger.logUpdateDozeAmount(0.2f, 1.0f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        logger.logUpdateDozeAmount(0.3f, 1.0f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        logger.logUpdateDozeAmount(0.4f, 1.0f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        verifyDidLog(0)
+        logger.logUpdateDozeAmount(0.5f, 0.9f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        verifyDidLog(1)
+        logger.logUpdateDozeAmount(0.6f, 0.8f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        logger.logUpdateDozeAmount(0.8f, 0.6f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        logger.logUpdateDozeAmount(0.9f, 0.5f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        verifyDidLog(0)
+        logger.logUpdateDozeAmount(1.0f, 0.4f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        verifyDidLog(1)
+        logger.logUpdateDozeAmount(1.0f, 0.3f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        logger.logUpdateDozeAmount(1.0f, 0.2f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        logger.logUpdateDozeAmount(1.0f, 0.1f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        verifyDidLog(0)
+        logger.logUpdateDozeAmount(1.0f, 0.0f, 1f, 1f, StatusBarState.SHADE, changed = false)
+        verifyDidLog(1)
+    }
+
+    @Test
+    fun updateDozeAmountWillIncludeFractionalUpdatesWhenStateChanges() {
+        logger.logUpdateDozeAmount(0f, 0f, null, 0f, StatusBarState.SHADE, changed = false)
+        verifyDidLog(1)
+        logger.logUpdateDozeAmount(0.1f, 0f, null, 0.1f, StatusBarState.SHADE, changed = true)
+        verifyDidLog(1)
+        logger.logUpdateDozeAmount(0.2f, 0f, null, 0.2f, StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0.3f, 0f, null, 0.3f, StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0.4f, 0f, null, 0.4f, StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0.5f, 0f, null, 0.5f, StatusBarState.SHADE, changed = true)
+        verifyDidLog(0)
+        logger.logUpdateDozeAmount(0.5f, 0f, null, 0.5f, StatusBarState.KEYGUARD, changed = false)
+        verifyDidLog(1)
+    }
+
+    @Test
+    fun updateDozeAmountWillIncludeFractionalUpdatesWhenHardOverrideChanges() {
+        logger.logUpdateDozeAmount(0f, 0f, null, 0f, StatusBarState.SHADE, changed = false)
+        verifyDidLog(1)
+        logger.logUpdateDozeAmount(0.1f, 0f, null, 0.1f, StatusBarState.SHADE, changed = true)
+        verifyDidLog(1)
+        logger.logUpdateDozeAmount(0.2f, 0f, null, 0.2f, StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0.3f, 0f, null, 0.3f, StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0.4f, 0f, null, 0.4f, StatusBarState.SHADE, changed = true)
+        logger.logUpdateDozeAmount(0.5f, 0f, null, 0.5f, StatusBarState.SHADE, changed = true)
+        verifyDidLog(0)
+        logger.logUpdateDozeAmount(0.5f, 0f, 1f, 1f, StatusBarState.SHADE, changed = true)
+        verifyDidLog(1)
+        logger.logUpdateDozeAmount(0.5f, 0f, 0f, 0f, StatusBarState.SHADE, changed = true)
+        verifyDidLog(1)
+        logger.logUpdateDozeAmount(0.5f, 0f, null, 0.5f, StatusBarState.SHADE, changed = true)
         verifyDidLog(1)
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorTest.kt
index 95591a4..be3b723 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorTest.kt
@@ -17,31 +17,42 @@
 package com.android.systemui.statusbar.notification
 
 import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import androidx.core.animation.AnimatorTestRule2
 import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase;
+import com.android.systemui.SysuiTestCase
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.shade.NotificationPanelViewController.WAKEUP_ANIMATION_DELAY_MS
 import com.android.systemui.statusbar.StatusBarState
 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
+import com.android.systemui.statusbar.notification.stack.StackStateAnimator.ANIMATION_DURATION_WAKEUP
 import com.android.systemui.statusbar.phone.DozeParameters
 import com.android.systemui.statusbar.phone.KeyguardBypassController
 import com.android.systemui.statusbar.phone.ScreenOffAnimationController
 import com.android.systemui.statusbar.policy.HeadsUpManager
+import com.android.systemui.util.mockito.eq
 import com.android.systemui.util.mockito.mock
 import com.android.systemui.util.mockito.whenever
 import com.android.systemui.util.mockito.withArgCaptor
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
+import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito.anyFloat
 import org.mockito.Mockito.clearInvocations
+import org.mockito.Mockito.never
 import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
 
 @RunWith(AndroidTestingRunner::class)
 @SmallTest
[email protected](setAsMainLooper = true)
 class NotificationWakeUpCoordinatorTest : SysuiTestCase() {
 
+    @get:Rule val animatorTestRule = AnimatorTestRule2()
+
     private val dumpManager: DumpManager = mock()
     private val headsUpManager: HeadsUpManager = mock()
     private val statusBarStateController: StatusBarStateController = mock()
@@ -50,6 +61,7 @@
     private val screenOffAnimationController: ScreenOffAnimationController = mock()
     private val logger: NotificationWakeUpCoordinatorLogger = mock()
     private val stackScrollerController: NotificationStackScrollLayoutController = mock()
+    private val wakeUpListener: NotificationWakeUpCoordinator.WakeUpListener = mock()
 
     private lateinit var notificationWakeUpCoordinator: NotificationWakeUpCoordinator
     private lateinit var statusBarStateCallback: StatusBarStateController.StateListener
@@ -57,7 +69,8 @@
 
     private var bypassEnabled: Boolean = false
     private var statusBarState: Int = StatusBarState.KEYGUARD
-    private var dozeAmount: Float = 0f
+    private fun eased(dozeAmount: Float) =
+        notificationWakeUpCoordinator.dozeAmountInterpolator.getInterpolation(dozeAmount)
 
     private fun setBypassEnabled(enabled: Boolean) {
         bypassEnabled = enabled
@@ -70,7 +83,6 @@
     }
 
     private fun setDozeAmount(dozeAmount: Float) {
-        this.dozeAmount = dozeAmount
         statusBarStateCallback.onDozeAmountChanged(dozeAmount, dozeAmount)
     }
 
@@ -129,7 +141,7 @@
     fun setDozeToZeroWithBypassWillFullyHideNotifications() {
         bypassEnabled = true
         setDozeAmount(0f)
-        verifyStackScrollerDozeAndHideAmount(dozeAmount = 01f, hideAmount = 1f)
+        verifyStackScrollerDozeAndHideAmount(dozeAmount = 1f, hideAmount = 1f)
         assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isTrue()
     }
 
@@ -152,12 +164,161 @@
         assertThat(notificationWakeUpCoordinator.statusBarState).isEqualTo(StatusBarState.SHADE)
     }
 
+    private val delayedDozeDelay = WAKEUP_ANIMATION_DELAY_MS.toLong()
+    private val delayedDozeDuration = ANIMATION_DURATION_WAKEUP.toLong()
+
+    @Test
+    fun dozeAmountOutputClampsTo1WhenDelayStarts() {
+        notificationWakeUpCoordinator.setWakingUp(true, requestDelayedAnimation = true)
+        verifyStackScrollerDozeAndHideAmount(dozeAmount = 1f, hideAmount = 1f)
+        assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isTrue()
+
+        // verify further doze amount changes have no effect on output
+        setDozeAmount(0.5f)
+        verifyStackScrollerDozeAndHideAmount(dozeAmount = 1f, hideAmount = 1f)
+        assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isTrue()
+    }
+
+    @Test
+    fun verifyDozeAmountOutputTracksDelay() {
+        dozeAmountOutputClampsTo1WhenDelayStarts()
+
+        // Animator waiting the delay amount should not yet affect the output
+        animatorTestRule.advanceTimeBy(delayedDozeDelay)
+        verifyStackScrollerDozeAndHideAmount(dozeAmount = 1f, hideAmount = 1f)
+        assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isTrue()
+
+        // input doze amount change to 0 has no effect
+        setDozeAmount(0.0f)
+        verifyStackScrollerDozeAndHideAmount(dozeAmount = 1f, hideAmount = 1f)
+        assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isTrue()
+
+        // Advancing the delay to 50% will cause the 50% output
+        animatorTestRule.advanceTimeBy(delayedDozeDuration / 2)
+        verifyStackScrollerDozeAndHideAmount(dozeAmount = 0.5f, hideAmount = 0.5f)
+        assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isFalse()
+
+        // Now advance delay to 100% completion; notifications become fully visible
+        animatorTestRule.advanceTimeBy(delayedDozeDuration / 2)
+        verifyStackScrollerDozeAndHideAmount(dozeAmount = 0f, hideAmount = 0f)
+        assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isFalse()
+
+        // Now advance delay to 200% completion -- should not invoke anything else
+        animatorTestRule.advanceTimeBy(delayedDozeDuration)
+        verify(stackScrollerController, never()).setDozeAmount(anyFloat())
+        verify(stackScrollerController, never()).setHideAmount(anyFloat(), anyFloat())
+        assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isFalse()
+    }
+
+    @Test
+    fun verifyWakeUpListenerCallbacksWhenDozing() {
+        // prime internal state as dozing, then add the listener
+        setDozeAmount(1f)
+        notificationWakeUpCoordinator.addListener(wakeUpListener)
+
+        setDozeAmount(0.5f)
+        verify(wakeUpListener).onFullyHiddenChanged(eq(false))
+        verifyNoMoreInteractions(wakeUpListener)
+        clearInvocations(wakeUpListener)
+
+        setDozeAmount(0f)
+        verifyNoMoreInteractions(wakeUpListener)
+
+        setDozeAmount(0.5f)
+        verifyNoMoreInteractions(wakeUpListener)
+
+        setDozeAmount(1f)
+        verify(wakeUpListener).onFullyHiddenChanged(eq(true))
+        verifyNoMoreInteractions(wakeUpListener)
+    }
+
+    @Test
+    fun verifyWakeUpListenerCallbacksWhenDelayingAnimation() {
+        // prime internal state as dozing, then add the listener
+        setDozeAmount(1f)
+        notificationWakeUpCoordinator.addListener(wakeUpListener)
+
+        // setWakingUp() doesn't do anything yet
+        notificationWakeUpCoordinator.setWakingUp(true, requestDelayedAnimation = true)
+        verifyNoMoreInteractions(wakeUpListener)
+
+        // verify further doze amount changes have no effect
+        setDozeAmount(0.5f)
+        verifyNoMoreInteractions(wakeUpListener)
+
+        // advancing to just before the start time should not invoke the listener
+        animatorTestRule.advanceTimeBy(delayedDozeDelay - 1)
+        verifyNoMoreInteractions(wakeUpListener)
+
+        animatorTestRule.advanceTimeBy(1)
+        verify(wakeUpListener).onDelayedDozeAmountAnimationRunning(eq(true))
+        verifyNoMoreInteractions(wakeUpListener)
+        clearInvocations(wakeUpListener)
+
+        // input doze amount change to 0 has no effect
+        setDozeAmount(0.0f)
+        verifyNoMoreInteractions(wakeUpListener)
+
+        // Advancing the delay to 50% will cause notifications to no longer be fully hidden
+        animatorTestRule.advanceTimeBy(delayedDozeDuration / 2)
+        verify(wakeUpListener).onFullyHiddenChanged(eq(false))
+        verifyNoMoreInteractions(wakeUpListener)
+        clearInvocations(wakeUpListener)
+
+        // Now advance delay to 99.x% completion; notifications become fully visible
+        animatorTestRule.advanceTimeBy(delayedDozeDuration / 2 - 1)
+        verifyNoMoreInteractions(wakeUpListener)
+
+        // advance to 100%; animation no longer running
+        animatorTestRule.advanceTimeBy(1)
+        verify(wakeUpListener).onDelayedDozeAmountAnimationRunning(eq(false))
+        verifyNoMoreInteractions(wakeUpListener)
+        clearInvocations(wakeUpListener)
+
+        // Now advance delay to 200% completion -- should not invoke anything else
+        animatorTestRule.advanceTimeBy(delayedDozeDuration)
+        verifyNoMoreInteractions(wakeUpListener)
+    }
+
+    @Test
+    fun verifyDelayedDozeAmountCanBeOverridden() {
+        dozeAmountOutputClampsTo1WhenDelayStarts()
+
+        // input doze amount change to 0 has no effect
+        setDozeAmount(0.0f)
+        verifyStackScrollerDozeAndHideAmount(dozeAmount = 1f, hideAmount = 1f)
+        assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isTrue()
+
+        // Advancing the delay to 50% will cause the 50% output
+        animatorTestRule.advanceTimeBy(delayedDozeDelay + delayedDozeDuration / 2)
+        verifyStackScrollerDozeAndHideAmount(dozeAmount = 0.5f, hideAmount = 0.5f)
+        assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isFalse()
+
+        // Enabling bypass and showing keyguard will override back to fully dozing/hidden
+        setBypassEnabled(true)
+        setStatusBarState(StatusBarState.KEYGUARD)
+        verifyStackScrollerDozeAndHideAmount(dozeAmount = 1f, hideAmount = 1f)
+        assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isTrue()
+    }
+
+    @Test
+    fun verifyRemovingOverrideRestoresOtherwiseCalculatedDozeAmount() {
+        verifyDelayedDozeAmountCanBeOverridden()
+
+        // Disabling bypass will return back to the 50% value
+        setBypassEnabled(false)
+        verifyStackScrollerDozeAndHideAmount(dozeAmount = 0.5f, hideAmount = 0.5f)
+        assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isFalse()
+    }
+
     private fun verifyStackScrollerDozeAndHideAmount(dozeAmount: Float, hideAmount: Float) {
         // First verify that we did in-fact receive the correct values
-        verify(stackScrollerController).setDozeAmount(dozeAmount)
-        verify(stackScrollerController).setHideAmount(hideAmount, hideAmount)
+        verify(stackScrollerController).setDozeAmount(eased(dozeAmount))
+        verify(stackScrollerController).setHideAmount(hideAmount, eased(hideAmount))
         // Now verify that there was just this ONE call to each of these methods
         verify(stackScrollerController).setDozeAmount(anyFloat())
         verify(stackScrollerController).setHideAmount(anyFloat(), anyFloat())
+        // clear for next check
+        clearInvocations(stackScrollerController)
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt
index 4bb14a1..ba91d87 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt
@@ -71,241 +71,241 @@
 @RunWith(AndroidTestingRunner::class)
 @RunWithLooper
 class HeadsUpCoordinatorTest : SysuiTestCase() {
-    private lateinit var mCoordinator: HeadsUpCoordinator
+    private lateinit var coordinator: HeadsUpCoordinator
 
     // captured listeners and pluggables:
-    private lateinit var mCollectionListener: NotifCollectionListener
-    private lateinit var mNotifPromoter: NotifPromoter
-    private lateinit var mNotifLifetimeExtender: NotifLifetimeExtender
-    private lateinit var mBeforeTransformGroupsListener: OnBeforeTransformGroupsListener
-    private lateinit var mBeforeFinalizeFilterListener: OnBeforeFinalizeFilterListener
-    private lateinit var mOnHeadsUpChangedListener: OnHeadsUpChangedListener
-    private lateinit var mNotifSectioner: NotifSectioner
-    private lateinit var mActionPressListener: Consumer<NotificationEntry>
+    private lateinit var collectionListener: NotifCollectionListener
+    private lateinit var notifPromoter: NotifPromoter
+    private lateinit var notifLifetimeExtender: NotifLifetimeExtender
+    private lateinit var beforeTransformGroupsListener: OnBeforeTransformGroupsListener
+    private lateinit var beforeFinalizeFilterListener: OnBeforeFinalizeFilterListener
+    private lateinit var onHeadsUpChangedListener: OnHeadsUpChangedListener
+    private lateinit var notifSectioner: NotifSectioner
+    private lateinit var actionPressListener: Consumer<NotificationEntry>
 
-    private val mNotifPipeline: NotifPipeline = mock()
-    private val mLogger = HeadsUpCoordinatorLogger(logcatLogBuffer(), verbose = true)
-    private val mHeadsUpManager: HeadsUpManager = mock()
-    private val mHeadsUpViewBinder: HeadsUpViewBinder = mock()
-    private val mNotificationInterruptStateProvider: NotificationInterruptStateProvider = mock()
-    private val mRemoteInputManager: NotificationRemoteInputManager = mock()
-    private val mEndLifetimeExtension: OnEndLifetimeExtensionCallback = mock()
-    private val mHeaderController: NodeController = mock()
-    private val mLaunchFullScreenIntentProvider: LaunchFullScreenIntentProvider = mock()
-    private val mFlags: NotifPipelineFlags = mock()
+    private val notifPipeline: NotifPipeline = mock()
+    private val logger = HeadsUpCoordinatorLogger(logcatLogBuffer(), verbose = true)
+    private val headsUpManager: HeadsUpManager = mock()
+    private val headsUpViewBinder: HeadsUpViewBinder = mock()
+    private val notificationInterruptStateProvider: NotificationInterruptStateProvider = mock()
+    private val remoteInputManager: NotificationRemoteInputManager = mock()
+    private val endLifetimeExtension: OnEndLifetimeExtensionCallback = mock()
+    private val headerController: NodeController = mock()
+    private val launchFullScreenIntentProvider: LaunchFullScreenIntentProvider = mock()
+    private val flags: NotifPipelineFlags = mock()
 
-    private lateinit var mEntry: NotificationEntry
-    private lateinit var mGroupSummary: NotificationEntry
-    private lateinit var mGroupPriority: NotificationEntry
-    private lateinit var mGroupSibling1: NotificationEntry
-    private lateinit var mGroupSibling2: NotificationEntry
-    private lateinit var mGroupChild1: NotificationEntry
-    private lateinit var mGroupChild2: NotificationEntry
-    private lateinit var mGroupChild3: NotificationEntry
-    private val mSystemClock = FakeSystemClock()
-    private val mExecutor = FakeExecutor(mSystemClock)
-    private val mHuns: ArrayList<NotificationEntry> = ArrayList()
-    private lateinit var mHelper: NotificationGroupTestHelper
+    private lateinit var entry: NotificationEntry
+    private lateinit var groupSummary: NotificationEntry
+    private lateinit var groupPriority: NotificationEntry
+    private lateinit var groupSibling1: NotificationEntry
+    private lateinit var groupSibling2: NotificationEntry
+    private lateinit var groupChild1: NotificationEntry
+    private lateinit var groupChild2: NotificationEntry
+    private lateinit var groupChild3: NotificationEntry
+    private val systemClock = FakeSystemClock()
+    private val executor = FakeExecutor(systemClock)
+    private val huns: ArrayList<NotificationEntry> = ArrayList()
+    private lateinit var helper: NotificationGroupTestHelper
     @Before
     fun setUp() {
         MockitoAnnotations.initMocks(this)
-        mHelper = NotificationGroupTestHelper(mContext)
-        mCoordinator = HeadsUpCoordinator(
-            mLogger,
-            mSystemClock,
-            mHeadsUpManager,
-            mHeadsUpViewBinder,
-            mNotificationInterruptStateProvider,
-            mRemoteInputManager,
-            mLaunchFullScreenIntentProvider,
-            mFlags,
-            mHeaderController,
-            mExecutor)
-        mCoordinator.attach(mNotifPipeline)
+        helper = NotificationGroupTestHelper(mContext)
+        coordinator = HeadsUpCoordinator(
+            logger,
+            systemClock,
+            headsUpManager,
+            headsUpViewBinder,
+            notificationInterruptStateProvider,
+            remoteInputManager,
+            launchFullScreenIntentProvider,
+            flags,
+            headerController,
+            executor)
+        coordinator.attach(notifPipeline)
 
         // capture arguments:
-        mCollectionListener = withArgCaptor {
-            verify(mNotifPipeline).addCollectionListener(capture())
+        collectionListener = withArgCaptor {
+            verify(notifPipeline).addCollectionListener(capture())
         }
-        mNotifPromoter = withArgCaptor {
-            verify(mNotifPipeline).addPromoter(capture())
+        notifPromoter = withArgCaptor {
+            verify(notifPipeline).addPromoter(capture())
         }
-        mNotifLifetimeExtender = withArgCaptor {
-            verify(mNotifPipeline).addNotificationLifetimeExtender(capture())
+        notifLifetimeExtender = withArgCaptor {
+            verify(notifPipeline).addNotificationLifetimeExtender(capture())
         }
-        mBeforeTransformGroupsListener = withArgCaptor {
-            verify(mNotifPipeline).addOnBeforeTransformGroupsListener(capture())
+        beforeTransformGroupsListener = withArgCaptor {
+            verify(notifPipeline).addOnBeforeTransformGroupsListener(capture())
         }
-        mBeforeFinalizeFilterListener = withArgCaptor {
-            verify(mNotifPipeline).addOnBeforeFinalizeFilterListener(capture())
+        beforeFinalizeFilterListener = withArgCaptor {
+            verify(notifPipeline).addOnBeforeFinalizeFilterListener(capture())
         }
-        mOnHeadsUpChangedListener = withArgCaptor {
-            verify(mHeadsUpManager).addListener(capture())
+        onHeadsUpChangedListener = withArgCaptor {
+            verify(headsUpManager).addListener(capture())
         }
-        mActionPressListener = withArgCaptor {
-            verify(mRemoteInputManager).addActionPressListener(capture())
+        actionPressListener = withArgCaptor {
+            verify(remoteInputManager).addActionPressListener(capture())
         }
-        given(mHeadsUpManager.allEntries).willAnswer { mHuns.stream() }
-        given(mHeadsUpManager.isAlerting(anyString())).willAnswer { invocation ->
+        given(headsUpManager.allEntries).willAnswer { huns.stream() }
+        given(headsUpManager.isAlerting(anyString())).willAnswer { invocation ->
             val key = invocation.getArgument<String>(0)
-            mHuns.any { entry -> entry.key == key }
+            huns.any { entry -> entry.key == key }
         }
-        given(mHeadsUpManager.canRemoveImmediately(anyString())).willAnswer { invocation ->
+        given(headsUpManager.canRemoveImmediately(anyString())).willAnswer { invocation ->
             val key = invocation.getArgument<String>(0)
-            !mHuns.any { entry -> entry.key == key }
+            !huns.any { entry -> entry.key == key }
         }
-        whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L)
-        mNotifSectioner = mCoordinator.sectioner
-        mNotifLifetimeExtender.setCallback(mEndLifetimeExtension)
-        mEntry = NotificationEntryBuilder().build()
+        whenever(headsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L)
+        notifSectioner = coordinator.sectioner
+        notifLifetimeExtender.setCallback(endLifetimeExtension)
+        entry = NotificationEntryBuilder().build()
         // Same summary we can use for either set of children
-        mGroupSummary = mHelper.createSummaryNotification(GROUP_ALERT_ALL, 0, "summary", 500)
+        groupSummary = helper.createSummaryNotification(GROUP_ALERT_ALL, 0, "summary", 500)
         // One set of children with GROUP_ALERT_SUMMARY
-        mGroupPriority = mHelper.createChildNotification(GROUP_ALERT_SUMMARY, 0, "priority", 400)
-        mGroupSibling1 = mHelper.createChildNotification(GROUP_ALERT_SUMMARY, 1, "sibling", 300)
-        mGroupSibling2 = mHelper.createChildNotification(GROUP_ALERT_SUMMARY, 2, "sibling", 200)
+        groupPriority = helper.createChildNotification(GROUP_ALERT_SUMMARY, 0, "priority", 400)
+        groupSibling1 = helper.createChildNotification(GROUP_ALERT_SUMMARY, 1, "sibling", 300)
+        groupSibling2 = helper.createChildNotification(GROUP_ALERT_SUMMARY, 2, "sibling", 200)
         // Another set of children with GROUP_ALERT_ALL
-        mGroupChild1 = mHelper.createChildNotification(GROUP_ALERT_ALL, 1, "child", 350)
-        mGroupChild2 = mHelper.createChildNotification(GROUP_ALERT_ALL, 2, "child", 250)
-        mGroupChild3 = mHelper.createChildNotification(GROUP_ALERT_ALL, 3, "child", 150)
+        groupChild1 = helper.createChildNotification(GROUP_ALERT_ALL, 1, "child", 350)
+        groupChild2 = helper.createChildNotification(GROUP_ALERT_ALL, 2, "child", 250)
+        groupChild3 = helper.createChildNotification(GROUP_ALERT_ALL, 3, "child", 150)
 
         // Set the default FSI decision
         setShouldFullScreen(any(), FullScreenIntentDecision.NO_FULL_SCREEN_INTENT)
 
         // Run tests with default feature flag state
-        whenever(mFlags.fsiOnDNDUpdate()).thenReturn(Flags.FSI_ON_DND_UPDATE.default)
+        whenever(flags.fsiOnDNDUpdate()).thenReturn(Flags.FSI_ON_DND_UPDATE.default)
     }
 
     @Test
     fun testCancelStickyNotification() {
-        whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true)
-        addHUN(mEntry)
-        whenever(mHeadsUpManager.canRemoveImmediately(anyString())).thenReturn(false, true)
-        whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L, 0L)
-        assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
-        mExecutor.advanceClockToLast()
-        mExecutor.runAllReady()
-        verify(mHeadsUpManager, times(0)).removeNotification(anyString(), eq(false))
-        verify(mHeadsUpManager, times(1)).removeNotification(anyString(), eq(true))
+        whenever(headsUpManager.isSticky(anyString())).thenReturn(true)
+        addHUN(entry)
+        whenever(headsUpManager.canRemoveImmediately(anyString())).thenReturn(false, true)
+        whenever(headsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L, 0L)
+        assertTrue(notifLifetimeExtender.maybeExtendLifetime(entry, 0))
+        executor.advanceClockToLast()
+        executor.runAllReady()
+        verify(headsUpManager, times(0)).removeNotification(anyString(), eq(false))
+        verify(headsUpManager, times(1)).removeNotification(anyString(), eq(true))
     }
 
     @Test
     fun testCancelAndReAddStickyNotification() {
-        whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true)
-        addHUN(mEntry)
-        whenever(mHeadsUpManager.canRemoveImmediately(anyString())).thenReturn(false, true, false)
-        whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L)
-        assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
-        addHUN(mEntry)
-        assertFalse(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
-        mExecutor.advanceClockToLast()
-        mExecutor.runAllReady()
-        assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
-        verify(mHeadsUpManager, times(0)).removeNotification(anyString(), eq(false))
-        verify(mHeadsUpManager, times(0)).removeNotification(anyString(), eq(true))
+        whenever(headsUpManager.isSticky(anyString())).thenReturn(true)
+        addHUN(entry)
+        whenever(headsUpManager.canRemoveImmediately(anyString())).thenReturn(false, true, false)
+        whenever(headsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L)
+        assertTrue(notifLifetimeExtender.maybeExtendLifetime(entry, 0))
+        addHUN(entry)
+        assertFalse(notifLifetimeExtender.maybeExtendLifetime(entry, 0))
+        executor.advanceClockToLast()
+        executor.runAllReady()
+        assertTrue(notifLifetimeExtender.maybeExtendLifetime(entry, 0))
+        verify(headsUpManager, times(0)).removeNotification(anyString(), eq(false))
+        verify(headsUpManager, times(0)).removeNotification(anyString(), eq(true))
     }
 
     @Test
     fun hunNotRemovedWhenExtensionCancelled() {
-        whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true)
-        addHUN(mEntry)
-        whenever(mHeadsUpManager.canRemoveImmediately(anyString())).thenReturn(false)
-        whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L)
-        assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
-        mNotifLifetimeExtender.cancelLifetimeExtension(mEntry)
-        mExecutor.advanceClockToLast()
-        mExecutor.runAllReady()
-        verify(mHeadsUpManager, times(0)).removeNotification(anyString(), any())
+        whenever(headsUpManager.isSticky(anyString())).thenReturn(true)
+        addHUN(entry)
+        whenever(headsUpManager.canRemoveImmediately(anyString())).thenReturn(false)
+        whenever(headsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L)
+        assertTrue(notifLifetimeExtender.maybeExtendLifetime(entry, 0))
+        notifLifetimeExtender.cancelLifetimeExtension(entry)
+        executor.advanceClockToLast()
+        executor.runAllReady()
+        verify(headsUpManager, times(0)).removeNotification(anyString(), any())
     }
 
     @Test
     fun hunExtensionCancelledWhenHunActionPressed() {
-        whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true)
-        addHUN(mEntry)
-        whenever(mHeadsUpManager.canRemoveImmediately(anyString())).thenReturn(false)
-        whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L)
-        assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
-        mActionPressListener.accept(mEntry)
-        mExecutor.advanceClockToLast()
-        mExecutor.runAllReady()
-        verify(mHeadsUpManager, times(1)).removeNotification(eq(mEntry.key), eq(true))
+        whenever(headsUpManager.isSticky(anyString())).thenReturn(true)
+        addHUN(entry)
+        whenever(headsUpManager.canRemoveImmediately(anyString())).thenReturn(false)
+        whenever(headsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L)
+        assertTrue(notifLifetimeExtender.maybeExtendLifetime(entry, 0))
+        actionPressListener.accept(entry)
+        executor.advanceClockToLast()
+        executor.runAllReady()
+        verify(headsUpManager, times(1)).removeNotification(eq(entry.key), eq(true))
     }
 
     @Test
     fun testCancelUpdatedStickyNotification() {
-        whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true)
-        addHUN(mEntry)
-        whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L, 500L)
-        assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
-        addHUN(mEntry)
-        mExecutor.advanceClockToLast()
-        mExecutor.runAllReady()
-        verify(mHeadsUpManager, times(0)).removeNotification(anyString(), eq(false))
-        verify(mHeadsUpManager, times(0)).removeNotification(anyString(), eq(true))
+        whenever(headsUpManager.isSticky(anyString())).thenReturn(true)
+        addHUN(entry)
+        whenever(headsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L, 500L)
+        assertTrue(notifLifetimeExtender.maybeExtendLifetime(entry, 0))
+        addHUN(entry)
+        executor.advanceClockToLast()
+        executor.runAllReady()
+        verify(headsUpManager, times(0)).removeNotification(anyString(), eq(false))
+        verify(headsUpManager, times(0)).removeNotification(anyString(), eq(true))
     }
 
     @Test
     fun testCancelNotification() {
-        whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(false)
-        addHUN(mEntry)
-        whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L, 500L)
-        assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0))
-        mExecutor.advanceClockToLast()
-        mExecutor.runAllReady()
-        verify(mHeadsUpManager, times(1)).removeNotification(anyString(), eq(false))
-        verify(mHeadsUpManager, times(0)).removeNotification(anyString(), eq(true))
+        whenever(headsUpManager.isSticky(anyString())).thenReturn(false)
+        addHUN(entry)
+        whenever(headsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L, 500L)
+        assertTrue(notifLifetimeExtender.maybeExtendLifetime(entry, 0))
+        executor.advanceClockToLast()
+        executor.runAllReady()
+        verify(headsUpManager, times(1)).removeNotification(anyString(), eq(false))
+        verify(headsUpManager, times(0)).removeNotification(anyString(), eq(true))
     }
 
     @Test
     fun testOnEntryAdded_shouldFullScreen() {
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_EXPECTED_NOT_TO_HUN)
-        mCollectionListener.onEntryAdded(mEntry)
-        verify(mLaunchFullScreenIntentProvider).launchFullScreenIntent(mEntry)
+        setShouldFullScreen(entry, FullScreenIntentDecision.FSI_EXPECTED_NOT_TO_HUN)
+        collectionListener.onEntryAdded(entry)
+        verify(launchFullScreenIntentProvider).launchFullScreenIntent(entry)
     }
 
     @Test
     fun testOnEntryAdded_shouldNotFullScreen() {
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FULL_SCREEN_INTENT)
-        mCollectionListener.onEntryAdded(mEntry)
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
+        setShouldFullScreen(entry, FullScreenIntentDecision.NO_FULL_SCREEN_INTENT)
+        collectionListener.onEntryAdded(entry)
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
     }
 
     @Test
     fun testPromotesAddedHUN() {
         // GIVEN the current entry should heads up
-        whenever(mNotificationInterruptStateProvider.shouldHeadsUp(mEntry)).thenReturn(true)
+        setShouldHeadsUp(entry, true)
 
         // WHEN the notification is added but not yet binding
-        mCollectionListener.onEntryAdded(mEntry)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mEntry), any())
+        collectionListener.onEntryAdded(entry)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(entry), any())
 
         // THEN only promote mEntry
-        assertTrue(mNotifPromoter.shouldPromoteToTopLevel(mEntry))
+        assertTrue(notifPromoter.shouldPromoteToTopLevel(entry))
     }
 
     @Test
     fun testPromotesBindingHUN() {
         // GIVEN the current entry should heads up
-        whenever(mNotificationInterruptStateProvider.shouldHeadsUp(mEntry)).thenReturn(true)
+        setShouldHeadsUp(entry, true)
 
         // WHEN the notification started binding on the previous run
-        mCollectionListener.onEntryAdded(mEntry)
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
-        verify(mHeadsUpViewBinder).bindHeadsUpView(eq(mEntry), any())
+        collectionListener.onEntryAdded(entry)
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
+        verify(headsUpViewBinder).bindHeadsUpView(eq(entry), any())
 
         // THEN only promote mEntry
-        assertTrue(mNotifPromoter.shouldPromoteToTopLevel(mEntry))
+        assertTrue(notifPromoter.shouldPromoteToTopLevel(entry))
     }
 
     @Test
     fun testPromotesCurrentHUN() {
         // GIVEN the current HUN is set to mEntry
-        addHUN(mEntry)
+        addHUN(entry)
 
         // THEN only promote the current HUN, mEntry
-        assertTrue(mNotifPromoter.shouldPromoteToTopLevel(mEntry))
-        assertFalse(mNotifPromoter.shouldPromoteToTopLevel(NotificationEntryBuilder()
+        assertTrue(notifPromoter.shouldPromoteToTopLevel(entry))
+        assertFalse(notifPromoter.shouldPromoteToTopLevel(NotificationEntryBuilder()
             .setPkg("test-package2")
             .build()))
     }
@@ -313,11 +313,11 @@
     @Test
     fun testIncludeInSectionCurrentHUN() {
         // GIVEN the current HUN is set to mEntry
-        addHUN(mEntry)
+        addHUN(entry)
 
         // THEN only section the current HUN, mEntry
-        assertTrue(mNotifSectioner.isInSection(mEntry))
-        assertFalse(mNotifSectioner.isInSection(NotificationEntryBuilder()
+        assertTrue(notifSectioner.isInSection(entry))
+        assertFalse(notifSectioner.isInSection(NotificationEntryBuilder()
             .setPkg("test-package")
             .build()))
     }
@@ -325,11 +325,11 @@
     @Test
     fun testLifetimeExtendsCurrentHUN() {
         // GIVEN there is a HUN, mEntry
-        addHUN(mEntry)
+        addHUN(entry)
 
         // THEN only the current HUN, mEntry, should be lifetimeExtended
-        assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, /* cancellationReason */ 0))
-        assertFalse(mNotifLifetimeExtender.maybeExtendLifetime(
+        assertTrue(notifLifetimeExtender.maybeExtendLifetime(entry, /* cancellationReason */ 0))
+        assertFalse(notifLifetimeExtender.maybeExtendLifetime(
             NotificationEntryBuilder()
                 .setPkg("test-package")
                 .build(), /* cancellationReason */ 0))
@@ -338,726 +338,752 @@
     @Test
     fun testShowHUNOnInflationFinished() {
         // WHEN a notification should HUN and its inflation is finished
-        whenever(mNotificationInterruptStateProvider.shouldHeadsUp(mEntry)).thenReturn(true)
+        setShouldHeadsUp(entry, true)
 
-        mCollectionListener.onEntryAdded(mEntry)
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
-        verify(mHeadsUpManager, never()).showNotification(mEntry)
+        collectionListener.onEntryAdded(entry)
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
+        verify(headsUpManager, never()).showNotification(entry)
         withArgCaptor<BindCallback> {
-            verify(mHeadsUpViewBinder).bindHeadsUpView(eq(mEntry), capture())
-        }.onBindFinished(mEntry)
+            verify(headsUpViewBinder).bindHeadsUpView(eq(entry), capture())
+        }.onBindFinished(entry)
 
         // THEN we tell the HeadsUpManager to show the notification
-        verify(mHeadsUpManager).showNotification(mEntry)
+        verify(headsUpManager).showNotification(entry)
     }
 
     @Test
     fun testNoHUNOnInflationFinished() {
         // WHEN a notification shouldn't HUN and its inflation is finished
-        whenever(mNotificationInterruptStateProvider.shouldHeadsUp(mEntry)).thenReturn(false)
-        mCollectionListener.onEntryAdded(mEntry)
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        setShouldHeadsUp(entry, false)
+        collectionListener.onEntryAdded(entry)
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // THEN we never bind the heads up view or tell HeadsUpManager to show the notification
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mEntry), any())
-        verify(mHeadsUpManager, never()).showNotification(mEntry)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(entry), any())
+        verify(headsUpManager, never()).showNotification(entry)
     }
 
     @Test
     fun testOnEntryUpdated_toAlert() {
         // GIVEN that an entry is posted that should not heads up
-        setShouldHeadsUp(mEntry, false)
-        mCollectionListener.onEntryAdded(mEntry)
+        setShouldHeadsUp(entry, false)
+        collectionListener.onEntryAdded(entry)
 
         // WHEN it's updated to heads up
-        setShouldHeadsUp(mEntry)
-        mCollectionListener.onEntryUpdated(mEntry)
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        setShouldHeadsUp(entry)
+        collectionListener.onEntryUpdated(entry)
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // THEN the notification alerts
-        finishBind(mEntry)
-        verify(mHeadsUpManager).showNotification(mEntry)
+        finishBind(entry)
+        verify(headsUpManager).showNotification(entry)
     }
 
     @Test
     fun testOnEntryUpdated_toNotAlert() {
         // GIVEN that an entry is posted that should heads up
-        setShouldHeadsUp(mEntry)
-        mCollectionListener.onEntryAdded(mEntry)
+        setShouldHeadsUp(entry)
+        collectionListener.onEntryAdded(entry)
 
         // WHEN it's updated to not heads up
-        setShouldHeadsUp(mEntry, false)
-        mCollectionListener.onEntryUpdated(mEntry)
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        setShouldHeadsUp(entry, false)
+        collectionListener.onEntryUpdated(entry)
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // THEN the notification is never bound or shown
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        verify(mHeadsUpManager, never()).showNotification(any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        verify(headsUpManager, never()).showNotification(any())
     }
 
     @Test
     fun testOnEntryRemovedRemovesHeadsUpNotification() {
         // GIVEN the current HUN is mEntry
-        addHUN(mEntry)
+        addHUN(entry)
 
         // WHEN mEntry is removed from the notification collection
-        mCollectionListener.onEntryRemoved(mEntry, /* cancellation reason */ 0)
-        whenever(mRemoteInputManager.isSpinning(any())).thenReturn(false)
+        collectionListener.onEntryRemoved(entry, /* cancellation reason */ 0)
+        whenever(remoteInputManager.isSpinning(any())).thenReturn(false)
 
         // THEN heads up manager should remove the entry
-        verify(mHeadsUpManager).removeNotification(mEntry.key, false)
+        verify(headsUpManager).removeNotification(entry.key, false)
     }
 
     private fun addHUN(entry: NotificationEntry) {
-        mHuns.add(entry)
-        whenever(mHeadsUpManager.topEntry).thenReturn(entry)
-        mOnHeadsUpChangedListener.onHeadsUpStateChanged(entry, true)
-        mNotifLifetimeExtender.cancelLifetimeExtension(entry)
+        huns.add(entry)
+        whenever(headsUpManager.topEntry).thenReturn(entry)
+        onHeadsUpChangedListener.onHeadsUpStateChanged(entry, true)
+        notifLifetimeExtender.cancelLifetimeExtension(entry)
     }
 
     @Test
     fun testTransferIsolatedChildAlert_withGroupAlertSummary() {
-        setShouldHeadsUp(mGroupSummary)
-        whenever(mNotifPipeline.allNotifs).thenReturn(listOf(mGroupSummary, mGroupSibling1))
+        setShouldHeadsUp(groupSummary)
+        whenever(notifPipeline.allNotifs).thenReturn(listOf(groupSummary, groupSibling1))
 
-        mCollectionListener.onEntryAdded(mGroupSummary)
-        mCollectionListener.onEntryAdded(mGroupSibling1)
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mGroupSibling1))
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mGroupSibling1))
+        collectionListener.onEntryAdded(groupSummary)
+        collectionListener.onEntryAdded(groupSibling1)
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupSibling1))
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupSibling1))
 
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSummary), any())
-        finishBind(mGroupSibling1)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any())
+        finishBind(groupSibling1)
 
-        verify(mHeadsUpManager, never()).showNotification(mGroupSummary)
-        verify(mHeadsUpManager).showNotification(mGroupSibling1)
+        verify(headsUpManager, never()).showNotification(groupSummary)
+        verify(headsUpManager).showNotification(groupSibling1)
 
         // In addition make sure we have explicitly marked the summary as having interrupted due
         // to the alert being transferred
-        assertTrue(mGroupSummary.hasInterrupted())
+        assertTrue(groupSummary.hasInterrupted())
     }
 
     @Test
     fun testTransferIsolatedChildAlert_withGroupAlertAll() {
-        setShouldHeadsUp(mGroupSummary)
-        whenever(mNotifPipeline.allNotifs).thenReturn(listOf(mGroupSummary, mGroupChild1))
+        setShouldHeadsUp(groupSummary)
+        whenever(notifPipeline.allNotifs).thenReturn(listOf(groupSummary, groupChild1))
 
-        mCollectionListener.onEntryAdded(mGroupSummary)
-        mCollectionListener.onEntryAdded(mGroupChild1)
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mGroupChild1))
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mGroupChild1))
+        collectionListener.onEntryAdded(groupSummary)
+        collectionListener.onEntryAdded(groupChild1)
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupChild1))
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupChild1))
 
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSummary), any())
-        finishBind(mGroupChild1)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any())
+        finishBind(groupChild1)
 
-        verify(mHeadsUpManager, never()).showNotification(mGroupSummary)
-        verify(mHeadsUpManager).showNotification(mGroupChild1)
-        assertTrue(mGroupSummary.hasInterrupted())
+        verify(headsUpManager, never()).showNotification(groupSummary)
+        verify(headsUpManager).showNotification(groupChild1)
+        assertTrue(groupSummary.hasInterrupted())
     }
 
     @Test
     fun testTransferTwoIsolatedChildAlert_withGroupAlertSummary() {
         // WHEN a notification should HUN and its inflation is finished
-        setShouldHeadsUp(mGroupSummary)
-        whenever(mNotifPipeline.allNotifs)
-            .thenReturn(listOf(mGroupSummary, mGroupSibling1, mGroupSibling2, mGroupPriority))
+        setShouldHeadsUp(groupSummary)
+        whenever(notifPipeline.allNotifs)
+            .thenReturn(listOf(groupSummary, groupSibling1, groupSibling2, groupPriority))
 
-        mCollectionListener.onEntryAdded(mGroupSummary)
-        mCollectionListener.onEntryAdded(mGroupSibling1)
-        mCollectionListener.onEntryAdded(mGroupSibling2)
-        val entryList = listOf(mGroupSibling1, mGroupSibling2)
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(entryList)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(entryList)
+        collectionListener.onEntryAdded(groupSummary)
+        collectionListener.onEntryAdded(groupSibling1)
+        collectionListener.onEntryAdded(groupSibling2)
+        val entryList = listOf(groupSibling1, groupSibling2)
+        beforeTransformGroupsListener.onBeforeTransformGroups(entryList)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(entryList)
 
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSummary), any())
-        finishBind(mGroupSibling1)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSibling2), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any())
+        finishBind(groupSibling1)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any())
 
         // THEN we tell the HeadsUpManager to show the notification
-        verify(mHeadsUpManager, never()).showNotification(mGroupSummary)
-        verify(mHeadsUpManager).showNotification(mGroupSibling1)
-        verify(mHeadsUpManager, never()).showNotification(mGroupSibling2)
-        assertTrue(mGroupSummary.hasInterrupted())
+        verify(headsUpManager, never()).showNotification(groupSummary)
+        verify(headsUpManager).showNotification(groupSibling1)
+        verify(headsUpManager, never()).showNotification(groupSibling2)
+        assertTrue(groupSummary.hasInterrupted())
     }
 
     @Test
     fun testTransferTwoIsolatedChildAlert_withGroupAlertAll() {
         // WHEN a notification should HUN and its inflation is finished
-        setShouldHeadsUp(mGroupSummary)
-        whenever(mNotifPipeline.allNotifs)
-            .thenReturn(listOf(mGroupSummary, mGroupChild1, mGroupChild2, mGroupPriority))
+        setShouldHeadsUp(groupSummary)
+        whenever(notifPipeline.allNotifs)
+            .thenReturn(listOf(groupSummary, groupChild1, groupChild2, groupPriority))
 
-        mCollectionListener.onEntryAdded(mGroupSummary)
-        mCollectionListener.onEntryAdded(mGroupChild1)
-        mCollectionListener.onEntryAdded(mGroupChild2)
-        val entryList = listOf(mGroupChild1, mGroupChild2)
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(entryList)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(entryList)
+        collectionListener.onEntryAdded(groupSummary)
+        collectionListener.onEntryAdded(groupChild1)
+        collectionListener.onEntryAdded(groupChild2)
+        val entryList = listOf(groupChild1, groupChild2)
+        beforeTransformGroupsListener.onBeforeTransformGroups(entryList)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(entryList)
 
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSummary), any())
-        finishBind(mGroupChild1)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupChild2), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any())
+        finishBind(groupChild1)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupChild2), any())
 
         // THEN we tell the HeadsUpManager to show the notification
-        verify(mHeadsUpManager, never()).showNotification(mGroupSummary)
-        verify(mHeadsUpManager).showNotification(mGroupChild1)
-        verify(mHeadsUpManager, never()).showNotification(mGroupChild2)
-        assertTrue(mGroupSummary.hasInterrupted())
+        verify(headsUpManager, never()).showNotification(groupSummary)
+        verify(headsUpManager).showNotification(groupChild1)
+        verify(headsUpManager, never()).showNotification(groupChild2)
+        assertTrue(groupSummary.hasInterrupted())
     }
 
     @Test
     fun testTransferToPriorityOnAddWithTwoSiblings() {
         // WHEN a notification should HUN and its inflation is finished
-        setShouldHeadsUp(mGroupSummary)
-        whenever(mNotifPipeline.allNotifs)
-            .thenReturn(listOf(mGroupSummary, mGroupSibling1, mGroupSibling2, mGroupPriority))
+        setShouldHeadsUp(groupSummary)
+        whenever(notifPipeline.allNotifs)
+            .thenReturn(listOf(groupSummary, groupSibling1, groupSibling2, groupPriority))
 
-        mCollectionListener.onEntryAdded(mGroupSummary)
-        mCollectionListener.onEntryAdded(mGroupPriority)
-        mCollectionListener.onEntryAdded(mGroupSibling1)
-        mCollectionListener.onEntryAdded(mGroupSibling2)
+        collectionListener.onEntryAdded(groupSummary)
+        collectionListener.onEntryAdded(groupPriority)
+        collectionListener.onEntryAdded(groupSibling1)
+        collectionListener.onEntryAdded(groupSibling2)
 
         val beforeTransformGroup = GroupEntryBuilder()
-            .setSummary(mGroupSummary)
-            .setChildren(listOf(mGroupSibling1, mGroupPriority, mGroupSibling2))
+            .setSummary(groupSummary)
+            .setChildren(listOf(groupSibling1, groupPriority, groupSibling2))
             .build()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(beforeTransformGroup))
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(beforeTransformGroup))
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
 
         val afterTransformGroup = GroupEntryBuilder()
-            .setSummary(mGroupSummary)
-            .setChildren(listOf(mGroupSibling1, mGroupSibling2))
+            .setSummary(groupSummary)
+            .setChildren(listOf(groupSibling1, groupSibling2))
             .build()
-        mBeforeFinalizeFilterListener
-            .onBeforeFinalizeFilter(listOf(mGroupPriority, afterTransformGroup))
+        beforeFinalizeFilterListener
+            .onBeforeFinalizeFilter(listOf(groupPriority, afterTransformGroup))
 
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSummary), any())
-        finishBind(mGroupPriority)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSibling1), any())
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSibling2), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any())
+        finishBind(groupPriority)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any())
 
         // THEN we tell the HeadsUpManager to show the notification
-        verify(mHeadsUpManager, never()).showNotification(mGroupSummary)
-        verify(mHeadsUpManager).showNotification(mGroupPriority)
-        verify(mHeadsUpManager, never()).showNotification(mGroupSibling1)
-        verify(mHeadsUpManager, never()).showNotification(mGroupSibling2)
-        assertTrue(mGroupSummary.hasInterrupted())
+        verify(headsUpManager, never()).showNotification(groupSummary)
+        verify(headsUpManager).showNotification(groupPriority)
+        verify(headsUpManager, never()).showNotification(groupSibling1)
+        verify(headsUpManager, never()).showNotification(groupSibling2)
+        assertTrue(groupSummary.hasInterrupted())
     }
 
     @Test
     fun testTransferToPriorityOnUpdateWithTwoSiblings() {
-        setShouldHeadsUp(mGroupSummary)
-        whenever(mNotifPipeline.allNotifs)
-            .thenReturn(listOf(mGroupSummary, mGroupSibling1, mGroupSibling2, mGroupPriority))
+        setShouldHeadsUp(groupSummary)
+        whenever(notifPipeline.allNotifs)
+            .thenReturn(listOf(groupSummary, groupSibling1, groupSibling2, groupPriority))
 
-        mCollectionListener.onEntryUpdated(mGroupSummary)
-        mCollectionListener.onEntryUpdated(mGroupPriority)
-        mCollectionListener.onEntryUpdated(mGroupSibling1)
-        mCollectionListener.onEntryUpdated(mGroupSibling2)
+        collectionListener.onEntryUpdated(groupSummary)
+        collectionListener.onEntryUpdated(groupPriority)
+        collectionListener.onEntryUpdated(groupSibling1)
+        collectionListener.onEntryUpdated(groupSibling2)
 
         val beforeTransformGroup = GroupEntryBuilder()
-            .setSummary(mGroupSummary)
-            .setChildren(listOf(mGroupSibling1, mGroupPriority, mGroupSibling2))
+            .setSummary(groupSummary)
+            .setChildren(listOf(groupSibling1, groupPriority, groupSibling2))
             .build()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(beforeTransformGroup))
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(beforeTransformGroup))
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
 
         val afterTransformGroup = GroupEntryBuilder()
-            .setSummary(mGroupSummary)
-            .setChildren(listOf(mGroupSibling1, mGroupSibling2))
+            .setSummary(groupSummary)
+            .setChildren(listOf(groupSibling1, groupSibling2))
             .build()
-        mBeforeFinalizeFilterListener
-            .onBeforeFinalizeFilter(listOf(mGroupPriority, afterTransformGroup))
+        beforeFinalizeFilterListener
+            .onBeforeFinalizeFilter(listOf(groupPriority, afterTransformGroup))
 
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSummary), any())
-        finishBind(mGroupPriority)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSibling1), any())
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSibling2), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any())
+        finishBind(groupPriority)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any())
 
-        verify(mHeadsUpManager, never()).showNotification(mGroupSummary)
-        verify(mHeadsUpManager).showNotification(mGroupPriority)
-        verify(mHeadsUpManager, never()).showNotification(mGroupSibling1)
-        verify(mHeadsUpManager, never()).showNotification(mGroupSibling2)
-        assertTrue(mGroupSummary.hasInterrupted())
+        verify(headsUpManager, never()).showNotification(groupSummary)
+        verify(headsUpManager).showNotification(groupPriority)
+        verify(headsUpManager, never()).showNotification(groupSibling1)
+        verify(headsUpManager, never()).showNotification(groupSibling2)
+        assertTrue(groupSummary.hasInterrupted())
     }
 
     @Test
     fun testTransferToPriorityOnUpdateWithTwoNonUpdatedSiblings() {
-        setShouldHeadsUp(mGroupSummary)
-        whenever(mNotifPipeline.allNotifs)
-            .thenReturn(listOf(mGroupSummary, mGroupSibling1, mGroupSibling2, mGroupPriority))
+        setShouldHeadsUp(groupSummary)
+        whenever(notifPipeline.allNotifs)
+            .thenReturn(listOf(groupSummary, groupSibling1, groupSibling2, groupPriority))
 
-        mCollectionListener.onEntryUpdated(mGroupSummary)
-        mCollectionListener.onEntryUpdated(mGroupPriority)
+        collectionListener.onEntryUpdated(groupSummary)
+        collectionListener.onEntryUpdated(groupPriority)
 
         val beforeTransformGroup = GroupEntryBuilder()
-            .setSummary(mGroupSummary)
-            .setChildren(listOf(mGroupSibling1, mGroupPriority, mGroupSibling2))
+            .setSummary(groupSummary)
+            .setChildren(listOf(groupSibling1, groupPriority, groupSibling2))
             .build()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(beforeTransformGroup))
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(beforeTransformGroup))
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
 
         val afterTransformGroup = GroupEntryBuilder()
-            .setSummary(mGroupSummary)
-            .setChildren(listOf(mGroupSibling1, mGroupSibling2))
+            .setSummary(groupSummary)
+            .setChildren(listOf(groupSibling1, groupSibling2))
             .build()
-        mBeforeFinalizeFilterListener
-            .onBeforeFinalizeFilter(listOf(mGroupPriority, afterTransformGroup))
+        beforeFinalizeFilterListener
+            .onBeforeFinalizeFilter(listOf(groupPriority, afterTransformGroup))
 
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSummary), any())
-        finishBind(mGroupPriority)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSibling1), any())
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSibling2), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any())
+        finishBind(groupPriority)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any())
 
-        verify(mHeadsUpManager, never()).showNotification(mGroupSummary)
-        verify(mHeadsUpManager).showNotification(mGroupPriority)
-        verify(mHeadsUpManager, never()).showNotification(mGroupSibling1)
-        verify(mHeadsUpManager, never()).showNotification(mGroupSibling2)
-        assertTrue(mGroupSummary.hasInterrupted())
+        verify(headsUpManager, never()).showNotification(groupSummary)
+        verify(headsUpManager).showNotification(groupPriority)
+        verify(headsUpManager, never()).showNotification(groupSibling1)
+        verify(headsUpManager, never()).showNotification(groupSibling2)
+        assertTrue(groupSummary.hasInterrupted())
     }
 
     @Test
     fun testNoTransferToPriorityOnUpdateOfTwoSiblings() {
-        setShouldHeadsUp(mGroupSummary)
-        whenever(mNotifPipeline.allNotifs)
-            .thenReturn(listOf(mGroupSummary, mGroupSibling1, mGroupSibling2, mGroupPriority))
+        setShouldHeadsUp(groupSummary)
+        whenever(notifPipeline.allNotifs)
+            .thenReturn(listOf(groupSummary, groupSibling1, groupSibling2, groupPriority))
 
-        mCollectionListener.onEntryUpdated(mGroupSummary)
-        mCollectionListener.onEntryUpdated(mGroupSibling1)
-        mCollectionListener.onEntryUpdated(mGroupSibling2)
+        collectionListener.onEntryUpdated(groupSummary)
+        collectionListener.onEntryUpdated(groupSibling1)
+        collectionListener.onEntryUpdated(groupSibling2)
 
         val beforeTransformGroup = GroupEntryBuilder()
-            .setSummary(mGroupSummary)
-            .setChildren(listOf(mGroupSibling1, mGroupPriority, mGroupSibling2))
+            .setSummary(groupSummary)
+            .setChildren(listOf(groupSibling1, groupPriority, groupSibling2))
             .build()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(beforeTransformGroup))
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(beforeTransformGroup))
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
 
         val afterTransformGroup = GroupEntryBuilder()
-            .setSummary(mGroupSummary)
-            .setChildren(listOf(mGroupSibling1, mGroupSibling2))
+            .setSummary(groupSummary)
+            .setChildren(listOf(groupSibling1, groupSibling2))
             .build()
-        mBeforeFinalizeFilterListener
-            .onBeforeFinalizeFilter(listOf(mGroupPriority, afterTransformGroup))
+        beforeFinalizeFilterListener
+            .onBeforeFinalizeFilter(listOf(groupPriority, afterTransformGroup))
 
-        finishBind(mGroupSummary)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupPriority), any())
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSibling1), any())
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSibling2), any())
+        finishBind(groupSummary)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupPriority), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any())
 
-        verify(mHeadsUpManager).showNotification(mGroupSummary)
-        verify(mHeadsUpManager, never()).showNotification(mGroupPriority)
-        verify(mHeadsUpManager, never()).showNotification(mGroupSibling1)
-        verify(mHeadsUpManager, never()).showNotification(mGroupSibling2)
+        verify(headsUpManager).showNotification(groupSummary)
+        verify(headsUpManager, never()).showNotification(groupPriority)
+        verify(headsUpManager, never()).showNotification(groupSibling1)
+        verify(headsUpManager, never()).showNotification(groupSibling2)
     }
 
     @Test
     fun testNoTransferTwoChildAlert_withGroupAlertSummary() {
-        setShouldHeadsUp(mGroupSummary)
-        whenever(mNotifPipeline.allNotifs)
-            .thenReturn(listOf(mGroupSummary, mGroupSibling1, mGroupSibling2))
+        setShouldHeadsUp(groupSummary)
+        whenever(notifPipeline.allNotifs)
+            .thenReturn(listOf(groupSummary, groupSibling1, groupSibling2))
 
-        mCollectionListener.onEntryAdded(mGroupSummary)
-        mCollectionListener.onEntryAdded(mGroupSibling1)
-        mCollectionListener.onEntryAdded(mGroupSibling2)
+        collectionListener.onEntryAdded(groupSummary)
+        collectionListener.onEntryAdded(groupSibling1)
+        collectionListener.onEntryAdded(groupSibling2)
         val groupEntry = GroupEntryBuilder()
-            .setSummary(mGroupSummary)
-            .setChildren(listOf(mGroupSibling1, mGroupSibling2))
+            .setSummary(groupSummary)
+            .setChildren(listOf(groupSibling1, groupSibling2))
             .build()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupEntry))
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupEntry))
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupEntry))
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupEntry))
 
-        finishBind(mGroupSummary)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSibling1), any())
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSibling2), any())
+        finishBind(groupSummary)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling1), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSibling2), any())
 
-        verify(mHeadsUpManager).showNotification(mGroupSummary)
-        verify(mHeadsUpManager, never()).showNotification(mGroupSibling1)
-        verify(mHeadsUpManager, never()).showNotification(mGroupSibling2)
+        verify(headsUpManager).showNotification(groupSummary)
+        verify(headsUpManager, never()).showNotification(groupSibling1)
+        verify(headsUpManager, never()).showNotification(groupSibling2)
     }
 
     @Test
     fun testNoTransferTwoChildAlert_withGroupAlertAll() {
-        setShouldHeadsUp(mGroupSummary)
-        whenever(mNotifPipeline.allNotifs)
-            .thenReturn(listOf(mGroupSummary, mGroupChild1, mGroupChild2))
+        setShouldHeadsUp(groupSummary)
+        whenever(notifPipeline.allNotifs)
+            .thenReturn(listOf(groupSummary, groupChild1, groupChild2))
 
-        mCollectionListener.onEntryAdded(mGroupSummary)
-        mCollectionListener.onEntryAdded(mGroupChild1)
-        mCollectionListener.onEntryAdded(mGroupChild2)
+        collectionListener.onEntryAdded(groupSummary)
+        collectionListener.onEntryAdded(groupChild1)
+        collectionListener.onEntryAdded(groupChild2)
         val groupEntry = GroupEntryBuilder()
-            .setSummary(mGroupSummary)
-            .setChildren(listOf(mGroupChild1, mGroupChild2))
+            .setSummary(groupSummary)
+            .setChildren(listOf(groupChild1, groupChild2))
             .build()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupEntry))
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupEntry))
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupEntry))
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupEntry))
 
-        finishBind(mGroupSummary)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupChild1), any())
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupChild2), any())
+        finishBind(groupSummary)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupChild1), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupChild2), any())
 
-        verify(mHeadsUpManager).showNotification(mGroupSummary)
-        verify(mHeadsUpManager, never()).showNotification(mGroupChild1)
-        verify(mHeadsUpManager, never()).showNotification(mGroupChild2)
+        verify(headsUpManager).showNotification(groupSummary)
+        verify(headsUpManager, never()).showNotification(groupChild1)
+        verify(headsUpManager, never()).showNotification(groupChild2)
     }
 
     @Test
     fun testNoTransfer_groupSummaryNotAlerting() {
         // When we have a group where the summary should not alert and exactly one child should
         // alert, we should never mark the group summary as interrupted (because it doesn't).
-        setShouldHeadsUp(mGroupSummary, false)
-        setShouldHeadsUp(mGroupChild1, true)
-        setShouldHeadsUp(mGroupChild2, false)
+        setShouldHeadsUp(groupSummary, false)
+        setShouldHeadsUp(groupChild1, true)
+        setShouldHeadsUp(groupChild2, false)
 
-        mCollectionListener.onEntryAdded(mGroupSummary)
-        mCollectionListener.onEntryAdded(mGroupChild1)
-        mCollectionListener.onEntryAdded(mGroupChild2)
+        collectionListener.onEntryAdded(groupSummary)
+        collectionListener.onEntryAdded(groupChild1)
+        collectionListener.onEntryAdded(groupChild2)
         val groupEntry = GroupEntryBuilder()
-            .setSummary(mGroupSummary)
-            .setChildren(listOf(mGroupChild1, mGroupChild2))
+            .setSummary(groupSummary)
+            .setChildren(listOf(groupChild1, groupChild2))
             .build()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupEntry))
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupEntry))
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(groupEntry))
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(groupEntry))
 
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupSummary), any())
-        finishBind(mGroupChild1)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(eq(mGroupChild2), any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupSummary), any())
+        finishBind(groupChild1)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(eq(groupChild2), any())
 
-        verify(mHeadsUpManager, never()).showNotification(mGroupSummary)
-        verify(mHeadsUpManager).showNotification(mGroupChild1)
-        verify(mHeadsUpManager, never()).showNotification(mGroupChild2)
-        assertFalse(mGroupSummary.hasInterrupted())
+        verify(headsUpManager, never()).showNotification(groupSummary)
+        verify(headsUpManager).showNotification(groupChild1)
+        verify(headsUpManager, never()).showNotification(groupChild2)
+        assertFalse(groupSummary.hasInterrupted())
     }
 
     @Test
     fun testOnRankingApplied_newEntryShouldAlert() {
         // GIVEN that mEntry has never interrupted in the past, and now should
         // and is new enough to do so
-        assertFalse(mEntry.hasInterrupted())
-        mCoordinator.setUpdateTime(mEntry, mSystemClock.currentTimeMillis())
-        setShouldHeadsUp(mEntry)
-        whenever(mNotifPipeline.allNotifs).thenReturn(listOf(mEntry))
+        assertFalse(entry.hasInterrupted())
+        coordinator.setUpdateTime(entry, systemClock.currentTimeMillis())
+        setShouldHeadsUp(entry)
+        whenever(notifPipeline.allNotifs).thenReturn(listOf(entry))
 
         // WHEN a ranking applied update occurs
-        mCollectionListener.onRankingApplied()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        collectionListener.onRankingApplied()
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // THEN the notification is shown
-        finishBind(mEntry)
-        verify(mHeadsUpManager).showNotification(mEntry)
+        finishBind(entry)
+        verify(headsUpManager).showNotification(entry)
     }
 
     @Test
     fun testOnRankingApplied_alreadyAlertedEntryShouldNotAlertAgain() {
         // GIVEN that mEntry has alerted in the past, even if it's new
-        mEntry.setInterruption()
-        mCoordinator.setUpdateTime(mEntry, mSystemClock.currentTimeMillis())
-        setShouldHeadsUp(mEntry)
-        whenever(mNotifPipeline.allNotifs).thenReturn(listOf(mEntry))
+        entry.setInterruption()
+        coordinator.setUpdateTime(entry, systemClock.currentTimeMillis())
+        setShouldHeadsUp(entry)
+        whenever(notifPipeline.allNotifs).thenReturn(listOf(entry))
 
         // WHEN a ranking applied update occurs
-        mCollectionListener.onRankingApplied()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        collectionListener.onRankingApplied()
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // THEN the notification is never bound or shown
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        verify(mHeadsUpManager, never()).showNotification(any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        verify(headsUpManager, never()).showNotification(any())
     }
 
     @Test
     fun testOnRankingApplied_entryUpdatedToHun() {
         // GIVEN that mEntry is added in a state where it should not HUN
-        setShouldHeadsUp(mEntry, false)
-        mCollectionListener.onEntryAdded(mEntry)
+        setShouldHeadsUp(entry, false)
+        collectionListener.onEntryAdded(entry)
 
         // and it is then updated such that it should now HUN
-        setShouldHeadsUp(mEntry)
-        whenever(mNotifPipeline.allNotifs).thenReturn(listOf(mEntry))
+        setShouldHeadsUp(entry)
+        whenever(notifPipeline.allNotifs).thenReturn(listOf(entry))
 
         // WHEN a ranking applied update occurs
-        mCollectionListener.onRankingApplied()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        collectionListener.onRankingApplied()
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // THEN the notification is shown
-        finishBind(mEntry)
-        verify(mHeadsUpManager).showNotification(mEntry)
+        finishBind(entry)
+        verify(headsUpManager).showNotification(entry)
     }
 
     @Test
     fun testOnRankingApplied_entryUpdatedButTooOld() {
         // GIVEN that mEntry is added in a state where it should not HUN
-        setShouldHeadsUp(mEntry, false)
-        mCollectionListener.onEntryAdded(mEntry)
+        setShouldHeadsUp(entry, false)
+        collectionListener.onEntryAdded(entry)
 
         // and it was actually added 10s ago
-        mCoordinator.setUpdateTime(mEntry, mSystemClock.currentTimeMillis() - 10000)
+        coordinator.setUpdateTime(entry, systemClock.currentTimeMillis() - 10000)
 
         // WHEN it is updated to HUN and then a ranking update occurs
-        setShouldHeadsUp(mEntry)
-        whenever(mNotifPipeline.allNotifs).thenReturn(listOf(mEntry))
-        mCollectionListener.onRankingApplied()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        setShouldHeadsUp(entry)
+        whenever(notifPipeline.allNotifs).thenReturn(listOf(entry))
+        collectionListener.onRankingApplied()
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // THEN the notification is never bound or shown
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        verify(mHeadsUpManager, never()).showNotification(any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        verify(headsUpManager, never()).showNotification(any())
     }
 
     @Test
     fun onEntryAdded_whenLaunchingFSI_doesLogDecision() {
         // GIVEN A new notification can FSI
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
-        mCollectionListener.onEntryAdded(mEntry)
+        setShouldFullScreen(entry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
+        collectionListener.onEntryAdded(entry)
 
-        verify(mLaunchFullScreenIntentProvider).launchFullScreenIntent(mEntry)
-        verify(mNotificationInterruptStateProvider).logFullScreenIntentDecision(
-                mEntry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
+        verify(launchFullScreenIntentProvider).launchFullScreenIntent(entry)
+        verifyLoggedFullScreenIntentDecision(
+            entry,
+            FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE
+        )
     }
 
     @Test
     fun onEntryAdded_whenNotLaunchingFSI_doesLogDecision() {
         // GIVEN A new notification can't FSI
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FULL_SCREEN_INTENT)
-        mCollectionListener.onEntryAdded(mEntry)
+        setShouldFullScreen(entry, FullScreenIntentDecision.NO_FULL_SCREEN_INTENT)
+        collectionListener.onEntryAdded(entry)
 
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
-        verify(mNotificationInterruptStateProvider).logFullScreenIntentDecision(
-                mEntry, FullScreenIntentDecision.NO_FULL_SCREEN_INTENT)
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
+        verifyLoggedFullScreenIntentDecision(entry, FullScreenIntentDecision.NO_FULL_SCREEN_INTENT)
     }
 
     @Test
     fun onEntryAdded_whenNotLaunchingFSIBecauseOfDnd_doesLogDecision() {
         // GIVEN A new notification can't FSI because of DND
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
-        mCollectionListener.onEntryAdded(mEntry)
+        setShouldFullScreen(entry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
+        collectionListener.onEntryAdded(entry)
 
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
-        verify(mNotificationInterruptStateProvider).logFullScreenIntentDecision(
-                mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
+        verifyLoggedFullScreenIntentDecision(
+            entry,
+            FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND
+        )
     }
 
     @Test
     fun testOnRankingApplied_noFSIOnUpdateWhenFlagOff() {
         // Ensure the feature flag is off
-        whenever(mFlags.fsiOnDNDUpdate()).thenReturn(false)
+        whenever(flags.fsiOnDNDUpdate()).thenReturn(false)
 
         // GIVEN that mEntry was previously suppressed from full-screen only by DND
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
-        mCollectionListener.onEntryAdded(mEntry)
+        setShouldFullScreen(entry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
+        collectionListener.onEntryAdded(entry)
 
         // Verify that this causes a log
-        verify(mNotificationInterruptStateProvider).logFullScreenIntentDecision(
-                mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
-        clearInvocations(mNotificationInterruptStateProvider)
+        verifyLoggedFullScreenIntentDecision(
+            entry,
+            FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND
+        )
+        clearInterruptionProviderInvocations()
 
         // and it is then updated to allow full screen
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
-        whenever(mNotifPipeline.allNotifs).thenReturn(listOf(mEntry))
-        mCollectionListener.onRankingApplied()
+        setShouldFullScreen(entry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
+        whenever(notifPipeline.allNotifs).thenReturn(listOf(entry))
+        collectionListener.onRankingApplied()
 
         // THEN it should not full screen because the feature is off
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
 
         // VERIFY that no additional logging happens either
-        verify(mNotificationInterruptStateProvider, never())
-                .logFullScreenIntentDecision(any(), any())
+        verifyNoFullScreenIntentDecisionLogged()
     }
 
     @Test
     fun testOnRankingApplied_updateToFullScreen() {
         // Turn on the feature
-        whenever(mFlags.fsiOnDNDUpdate()).thenReturn(true)
+        whenever(flags.fsiOnDNDUpdate()).thenReturn(true)
 
         // GIVEN that mEntry was previously suppressed from full-screen only by DND
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
-        mCollectionListener.onEntryAdded(mEntry)
+        setShouldFullScreen(entry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
+        collectionListener.onEntryAdded(entry)
 
         // at this point, it should not have full screened, but should have logged
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
-        verify(mNotificationInterruptStateProvider).logFullScreenIntentDecision(mEntry,
-                FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
-        clearInvocations(mNotificationInterruptStateProvider)
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
+        verifyLoggedFullScreenIntentDecision(
+            entry,
+            FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND
+        )
+        clearInterruptionProviderInvocations()
 
         // and it is then updated to allow full screen AND HUN
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
-        setShouldHeadsUp(mEntry)
-        whenever(mNotifPipeline.allNotifs).thenReturn(listOf(mEntry))
-        mCollectionListener.onRankingApplied()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        setShouldFullScreen(entry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
+        setShouldHeadsUp(entry)
+        whenever(notifPipeline.allNotifs).thenReturn(listOf(entry))
+        collectionListener.onRankingApplied()
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // THEN it should full screen and log but it should NOT HUN
-        verify(mLaunchFullScreenIntentProvider).launchFullScreenIntent(mEntry)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        verify(mHeadsUpManager, never()).showNotification(any())
-        verify(mNotificationInterruptStateProvider).logFullScreenIntentDecision(mEntry,
-                FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
-        clearInvocations(mNotificationInterruptStateProvider)
+        verify(launchFullScreenIntentProvider).launchFullScreenIntent(entry)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        verify(headsUpManager, never()).showNotification(any())
+        verifyLoggedFullScreenIntentDecision(
+            entry,
+            FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE
+        )
+        clearInterruptionProviderInvocations()
 
         // WHEN ranking updates again and the pipeline reruns
-        clearInvocations(mLaunchFullScreenIntentProvider)
-        mCollectionListener.onRankingApplied()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        clearInvocations(launchFullScreenIntentProvider)
+        collectionListener.onRankingApplied()
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // VERIFY that the FSI does not launch again or log
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
-        verify(mNotificationInterruptStateProvider, never())
-                .logFullScreenIntentDecision(any(), any())
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
+        verifyNoFullScreenIntentDecisionLogged()
     }
 
     @Test
     fun testOnRankingApplied_withOnlyDndSuppressionAllowsFsiLater() {
         // Turn on the feature
-        whenever(mFlags.fsiOnDNDUpdate()).thenReturn(true)
+        whenever(flags.fsiOnDNDUpdate()).thenReturn(true)
 
         // GIVEN that mEntry was previously suppressed from full-screen only by DND
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
-        mCollectionListener.onEntryAdded(mEntry)
+        setShouldFullScreen(entry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
+        collectionListener.onEntryAdded(entry)
 
         // at this point, it should not have full screened, but should have logged
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
-        verify(mNotificationInterruptStateProvider).logFullScreenIntentDecision(mEntry,
-                FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
-        clearInvocations(mNotificationInterruptStateProvider)
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
+        verifyLoggedFullScreenIntentDecision(
+            entry,
+            FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND
+        )
+        clearInterruptionProviderInvocations()
 
         // ranking is applied with only DND blocking FSI
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
-        mCollectionListener.onRankingApplied()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        setShouldFullScreen(entry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
+        collectionListener.onRankingApplied()
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // THEN it should still not yet full screen or HUN
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        verify(mHeadsUpManager, never()).showNotification(any())
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        verify(headsUpManager, never()).showNotification(any())
 
         // Same decision as before; is not logged
-        verify(mNotificationInterruptStateProvider, never())
-                .logFullScreenIntentDecision(any(), any())
-        clearInvocations(mNotificationInterruptStateProvider)
+        verifyNoFullScreenIntentDecisionLogged()
+        clearInterruptionProviderInvocations()
 
         // and it is then updated to allow full screen AND HUN
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
-        setShouldHeadsUp(mEntry)
-        whenever(mNotifPipeline.allNotifs).thenReturn(listOf(mEntry))
-        mCollectionListener.onRankingApplied()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        setShouldFullScreen(entry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
+        setShouldHeadsUp(entry)
+        whenever(notifPipeline.allNotifs).thenReturn(listOf(entry))
+        collectionListener.onRankingApplied()
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // THEN it should full screen and log but it should NOT HUN
-        verify(mLaunchFullScreenIntentProvider).launchFullScreenIntent(mEntry)
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        verify(mHeadsUpManager, never()).showNotification(any())
-        verify(mNotificationInterruptStateProvider).logFullScreenIntentDecision(mEntry,
-                FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
-        clearInvocations(mNotificationInterruptStateProvider)
+        verify(launchFullScreenIntentProvider).launchFullScreenIntent(entry)
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        verify(headsUpManager, never()).showNotification(any())
+        verifyLoggedFullScreenIntentDecision(
+            entry,
+            FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE
+        )
+        clearInterruptionProviderInvocations()
     }
 
     @Test
     fun testOnRankingApplied_newNonFullScreenAnswerInvalidatesCandidate() {
         // Turn on the feature
-        whenever(mFlags.fsiOnDNDUpdate()).thenReturn(true)
+        whenever(flags.fsiOnDNDUpdate()).thenReturn(true)
 
         // GIVEN that mEntry was previously suppressed from full-screen only by DND
-        whenever(mNotifPipeline.allNotifs).thenReturn(listOf(mEntry))
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
-        mCollectionListener.onEntryAdded(mEntry)
+        whenever(notifPipeline.allNotifs).thenReturn(listOf(entry))
+        setShouldFullScreen(entry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
+        collectionListener.onEntryAdded(entry)
 
         // at this point, it should not have full screened
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(mEntry)
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(entry)
 
         // now some other condition blocks FSI in addition to DND
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_BY_DND)
-        mCollectionListener.onRankingApplied()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        setShouldFullScreen(entry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_BY_DND)
+        collectionListener.onRankingApplied()
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // THEN it should NOT full screen or HUN
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
-        verify(mHeadsUpViewBinder, never()).bindHeadsUpView(any(), any())
-        verify(mHeadsUpManager, never()).showNotification(any())
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
+        verify(headsUpViewBinder, never()).bindHeadsUpView(any(), any())
+        verify(headsUpManager, never()).showNotification(any())
 
         // NOW the DND logic changes and FSI and HUN are available
-        clearInvocations(mLaunchFullScreenIntentProvider)
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
-        setShouldHeadsUp(mEntry)
-        mCollectionListener.onRankingApplied()
-        mBeforeTransformGroupsListener.onBeforeTransformGroups(listOf(mEntry))
-        mBeforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(mEntry))
+        clearInvocations(launchFullScreenIntentProvider)
+        setShouldFullScreen(entry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
+        setShouldHeadsUp(entry)
+        collectionListener.onRankingApplied()
+        beforeTransformGroupsListener.onBeforeTransformGroups(listOf(entry))
+        beforeFinalizeFilterListener.onBeforeFinalizeFilter(listOf(entry))
 
         // VERIFY that the FSI didn't happen, but that we do HUN
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
-        finishBind(mEntry)
-        verify(mHeadsUpManager).showNotification(mEntry)
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(any())
+        finishBind(entry)
+        verify(headsUpManager).showNotification(entry)
     }
 
     @Test
     fun testOnRankingApplied_noFSIWhenAlsoSuppressedForOtherReasons() {
         // Feature on
-        whenever(mFlags.fsiOnDNDUpdate()).thenReturn(true)
+        whenever(flags.fsiOnDNDUpdate()).thenReturn(true)
 
         // GIVEN that mEntry is suppressed by DND (functionally), but not *only* DND
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_BY_DND)
-        mCollectionListener.onEntryAdded(mEntry)
+        setShouldFullScreen(entry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_BY_DND)
+        collectionListener.onEntryAdded(entry)
 
         // and it is updated to full screen later
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
-        mCollectionListener.onRankingApplied()
+        setShouldFullScreen(entry, FullScreenIntentDecision.FSI_DEVICE_NOT_INTERACTIVE)
+        collectionListener.onRankingApplied()
 
         // THEN it should still not full screen because something else was blocking it before
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(mEntry)
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(entry)
     }
 
     @Test
     fun testOnRankingApplied_noFSIWhenTooOld() {
         // Feature on
-        whenever(mFlags.fsiOnDNDUpdate()).thenReturn(true)
+        whenever(flags.fsiOnDNDUpdate()).thenReturn(true)
 
         // GIVEN that mEntry is suppressed only by DND
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
-        mCollectionListener.onEntryAdded(mEntry)
+        setShouldFullScreen(entry, FullScreenIntentDecision.NO_FSI_SUPPRESSED_ONLY_BY_DND)
+        collectionListener.onEntryAdded(entry)
 
         // but it's >10s old
-        mCoordinator.addForFSIReconsideration(mEntry, mSystemClock.currentTimeMillis() - 10000)
+        coordinator.addForFSIReconsideration(entry, systemClock.currentTimeMillis() - 10000)
 
         // and it is updated to full screen later
-        setShouldFullScreen(mEntry, FullScreenIntentDecision.FSI_EXPECTED_NOT_TO_HUN)
-        mCollectionListener.onRankingApplied()
+        setShouldFullScreen(entry, FullScreenIntentDecision.FSI_EXPECTED_NOT_TO_HUN)
+        collectionListener.onRankingApplied()
 
         // THEN it should still not full screen because it's too old
-        verify(mLaunchFullScreenIntentProvider, never()).launchFullScreenIntent(mEntry)
+        verify(launchFullScreenIntentProvider, never()).launchFullScreenIntent(entry)
     }
 
     private fun setShouldHeadsUp(entry: NotificationEntry, should: Boolean = true) {
-        whenever(mNotificationInterruptStateProvider.shouldHeadsUp(entry)).thenReturn(should)
-        whenever(mNotificationInterruptStateProvider.checkHeadsUp(eq(entry), any()))
+        whenever(notificationInterruptStateProvider.shouldHeadsUp(entry)).thenReturn(should)
+        whenever(notificationInterruptStateProvider.checkHeadsUp(eq(entry), any()))
                 .thenReturn(should)
     }
 
     private fun setShouldFullScreen(entry: NotificationEntry, decision: FullScreenIntentDecision) {
-        whenever(mNotificationInterruptStateProvider.getFullScreenIntentDecision(entry))
+        whenever(notificationInterruptStateProvider.getFullScreenIntentDecision(entry))
             .thenReturn(decision)
     }
 
+    private fun verifyLoggedFullScreenIntentDecision(
+        entry: NotificationEntry,
+        decision: FullScreenIntentDecision
+    ) {
+        verify(notificationInterruptStateProvider).logFullScreenIntentDecision(entry, decision)
+    }
+
+    private fun verifyNoFullScreenIntentDecisionLogged() {
+        verify(notificationInterruptStateProvider, never())
+            .logFullScreenIntentDecision(any(), any())
+    }
+
+    private fun clearInterruptionProviderInvocations() {
+        clearInvocations(notificationInterruptStateProvider)
+    }
+
     private fun finishBind(entry: NotificationEntry) {
-        verify(mHeadsUpManager, never()).showNotification(entry)
+        verify(headsUpManager, never()).showNotification(entry)
         withArgCaptor<BindCallback> {
-            verify(mHeadsUpViewBinder).bindHeadsUpView(eq(entry), capture())
+            verify(headsUpViewBinder).bindHeadsUpView(eq(entry), capture())
         }.onBindFinished(entry)
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java
index 9b6d293..b5e77e0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java
@@ -16,14 +16,18 @@
 
 package com.android.systemui.statusbar.notification.collection.coordinator;
 
+import static android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE;
+
 import static com.android.systemui.statusbar.notification.collection.GroupEntry.ROOT_ENTRY;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -31,6 +35,7 @@
 
 import static java.util.Objects.requireNonNull;
 
+import android.database.ContentObserver;
 import android.os.Handler;
 import android.os.RemoteException;
 import android.testing.AndroidTestingRunner;
@@ -295,6 +300,42 @@
     }
 
     @Test
+    public void testEntryCancellationWillRebindViews() {
+        // Configure NotifUiAdjustmentProvider to set up SHOW_NOTIFICATION_SNOOZE value
+        mEntry = spy(mEntry);
+        mAdjustmentProvider.addDirtyListener(mock(Runnable.class));
+        when(mSecureSettings.getIntForUser(eq(SHOW_NOTIFICATION_SNOOZE), anyInt(), anyInt()))
+                .thenReturn(1);
+        ArgumentCaptor<ContentObserver> contentObserverCaptor = ArgumentCaptor.forClass(
+                ContentObserver.class);
+        verify(mSecureSettings).registerContentObserverForUser(eq(SHOW_NOTIFICATION_SNOOZE),
+                contentObserverCaptor.capture(), anyInt());
+        ContentObserver contentObserver = contentObserverCaptor.getValue();
+        contentObserver.onChange(false);
+
+        // GIVEN an inflated notification
+        mCollectionListener.onEntryInit(mEntry);
+        mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry));
+        verify(mNotifInflater).inflateViews(eq(mEntry), any(), any());
+        mNotifInflater.invokeInflateCallbackForEntry(mEntry);
+
+        // Verify that snooze is initially enabled: from Settings & notification is not cancelled
+        assertTrue(mAdjustmentProvider.calculateAdjustment(mEntry).isSnoozeEnabled());
+
+        // WHEN notification is cancelled, rebind views because snooze enabled value changes
+        when(mEntry.isCanceled()).thenReturn(true);
+        mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry));
+
+        assertFalse(mAdjustmentProvider.calculateAdjustment(mEntry).isSnoozeEnabled());
+
+        // THEN we rebind it
+        verify(mNotifInflater).rebindViews(eq(mEntry), any(), any());
+
+        // THEN we do not filter it because it's not the first inflation.
+        assertFalse(mUninflatedFilter.shouldFilterOut(mEntry, 0));
+    }
+
+    @Test
     public void testDoesntFilterInflatedNotifs() {
         // GIVEN an inflated notification
         mCollectionListener.onEntryInit(mEntry);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinatorTest.java
index 50b3fc7..d5c0c55 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinatorTest.java
@@ -25,6 +25,8 @@
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -48,6 +50,7 @@
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter;
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner;
+import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable;
 import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider;
 import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider;
 import com.android.systemui.statusbar.notification.collection.render.NodeController;
@@ -75,12 +78,15 @@
     @Mock private NodeController mAlertingHeaderController;
     @Mock private NodeController mSilentNodeController;
     @Mock private SectionHeaderController mSilentHeaderController;
+    @Mock private Pluggable.PluggableListener<NotifFilter> mInvalidationListener;
 
     @Captor private ArgumentCaptor<NotifFilter> mNotifFilterCaptor;
+    @Captor private ArgumentCaptor<StatusBarStateController.StateListener> mStateListenerCaptor;
 
     private NotificationEntry mEntry;
     private NotifFilter mCapturedSuspendedFilter;
     private NotifFilter mCapturedDozingFilter;
+    private StatusBarStateController.StateListener mStatusBarStateCallback;
     private RankingCoordinator mRankingCoordinator;
 
     private NotifSectioner mAlertingSectioner;
@@ -106,6 +112,10 @@
         verify(mNotifPipeline, times(2)).addPreGroupFilter(mNotifFilterCaptor.capture());
         mCapturedSuspendedFilter = mNotifFilterCaptor.getAllValues().get(0);
         mCapturedDozingFilter = mNotifFilterCaptor.getAllValues().get(1);
+        mCapturedDozingFilter.setInvalidationListener(mInvalidationListener);
+
+        verify(mStatusBarStateController, times(1)).addCallback(mStateListenerCaptor.capture());
+        mStatusBarStateCallback = mStateListenerCaptor.getAllValues().get(0);
 
         mAlertingSectioner = mRankingCoordinator.getAlertingSectioner();
         mSilentSectioner = mRankingCoordinator.getSilentSectioner();
@@ -170,6 +180,13 @@
 
         // THEN don't filter out the notification
         assertFalse(mCapturedDozingFilter.shouldFilterOut(mEntry, 0));
+
+        // WHEN it's not dozing and doze amount is 1
+        when(mStatusBarStateController.isDozing()).thenReturn(false);
+        when(mStatusBarStateController.getDozeAmount()).thenReturn(1f);
+
+        // THEN filter out the notification
+        assertTrue(mCapturedDozingFilter.shouldFilterOut(mEntry, 0));
     }
 
     @Test
@@ -267,6 +284,27 @@
         verify(mSilentHeaderController, times(2)).setClearSectionEnabled(eq(false));
     }
 
+    @Test
+    public void statusBarStateCallbackTest() {
+        mStatusBarStateCallback.onDozeAmountChanged(1f, 1f);
+        verify(mInvalidationListener, times(1))
+                .onPluggableInvalidated(mCapturedDozingFilter, "dozeAmount changed to one");
+        reset(mInvalidationListener);
+
+        mStatusBarStateCallback.onDozeAmountChanged(1f, 1f);
+        verify(mInvalidationListener, never()).onPluggableInvalidated(any(), any());
+        reset(mInvalidationListener);
+
+        mStatusBarStateCallback.onDozeAmountChanged(0.6f, 0.6f);
+        verify(mInvalidationListener, times(1))
+                .onPluggableInvalidated(mCapturedDozingFilter, "dozeAmount changed to not one");
+        reset(mInvalidationListener);
+
+        mStatusBarStateCallback.onDozeAmountChanged(0f, 0f);
+        verify(mInvalidationListener, never()).onPluggableInvalidated(any(), any());
+        reset(mInvalidationListener);
+    }
+
     private void assertInSection(NotificationEntry entry, NotifSectioner section) {
         for (NotifSectioner current: mSections) {
             if (current == section) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
index 3d8a744..4bb2c87 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
@@ -81,6 +81,7 @@
 import com.android.systemui.statusbar.notification.row.NotificationGutsManager.OnSettingsClickListener;
 import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
 import com.android.systemui.statusbar.phone.CentralSurfaces;
+import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.wmshell.BubblesManager;
 
@@ -134,6 +135,7 @@
     @Mock private AssistantFeedbackController mAssistantFeedbackController;
     @Mock private NotificationLockscreenUserManager mNotificationLockscreenUserManager;
     @Mock private StatusBarStateController mStatusBarStateController;
+    @Mock private HeadsUpManagerPhone mHeadsUpManagerPhone;
 
     @Before
     public void setUp() {
@@ -153,7 +155,8 @@
                 mNotificationLockscreenUserManager,
                 mStatusBarStateController,
                 mDeviceProvisionedController,
-                mMetricsLogger);
+                mMetricsLogger,
+                mHeadsUpManagerPhone);
         mGutsManager.setUpWithPresenter(mPresenter, mNotificationListContainer,
                 mOnSettingsClickListener);
         mGutsManager.setNotificationActivityStarter(mNotificationActivityStarter);
@@ -192,12 +195,15 @@
                 anyInt(),
                 anyBoolean(),
                 any(Runnable.class));
+        verify(mHeadsUpManagerPhone).setGutsShown(realRow.getEntry(), true);
 
         assertEquals(View.VISIBLE, guts.getVisibility());
-        mGutsManager.closeAndSaveGuts(false, false, false, 0, 0, false);
+        mGutsManager.closeAndSaveGuts(false, false, true, 0, 0, false);
 
         verify(guts).closeControls(anyBoolean(), anyBoolean(), anyInt(), anyInt(), anyBoolean());
         verify(row, times(1)).setGutsView(any());
+        mTestableLooper.processAllMessages();
+        verify(mHeadsUpManagerPhone).setGutsShown(realRow.getEntry(), false);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
index 68d67ca..89f8bdb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
@@ -89,7 +89,7 @@
     @Mock
     private KeyguardViewMediator mKeyguardViewMediator;
     @Mock
-    private BiometricUnlockController.BiometricModeListener mBiometricModeListener;
+    private BiometricUnlockController.BiometricUnlockEventsListener mBiometricUnlockEventsListener;
     @Mock
     private KeyguardStateController mKeyguardStateController;
     @Mock
@@ -145,7 +145,7 @@
                 mSystemClock
         );
         mBiometricUnlockController.setKeyguardViewController(mStatusBarKeyguardViewManager);
-        mBiometricUnlockController.addBiometricModeListener(mBiometricModeListener);
+        mBiometricUnlockController.addListener(mBiometricUnlockEventsListener);
         when(mUpdateMonitor.getStrongAuthTracker()).thenReturn(mStrongAuthTracker);
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java
index 31a1e4f..775d267 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java
@@ -57,6 +57,8 @@
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
 
+import dagger.Lazy;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -66,8 +68,6 @@
 
 import java.util.Optional;
 
-import dagger.Lazy;
-
 @SmallTest
 @RunWith(AndroidTestingRunner.class)
 public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase {
@@ -153,7 +153,7 @@
 
         // Trying to open it does nothing.
         mSbcqCallbacks.animateExpandNotificationsPanel();
-        verify(mNotificationPanelViewController, never()).expandShadeToNotifications();
+        verify(mNotificationPanelViewController, never()).expandToNotifications();
         mSbcqCallbacks.animateExpandSettingsPanel(null);
         verify(mNotificationPanelViewController, never()).expand(anyBoolean());
     }
@@ -171,9 +171,9 @@
 
         // Can now be opened.
         mSbcqCallbacks.animateExpandNotificationsPanel();
-        verify(mNotificationPanelViewController).expandShadeToNotifications();
+        verify(mNotificationPanelViewController).expandToNotifications();
         mSbcqCallbacks.animateExpandSettingsPanel(null);
-        verify(mNotificationPanelViewController).expandWithQs();
+        verify(mNotificationPanelViewController).expandToQs();
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
index 7db2197..32f0adf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
@@ -315,6 +315,7 @@
     @Mock private ViewRootImpl mViewRootImpl;
     @Mock private WindowOnBackInvokedDispatcher mOnBackInvokedDispatcher;
     @Mock private UserTracker mUserTracker;
+    @Mock private FingerprintManager mFingerprintManager;
     @Captor private ArgumentCaptor<OnBackInvokedCallback> mOnBackInvokedCallback;
     @Mock IPowerManager mPowerManagerService;
 
@@ -532,7 +533,8 @@
                 mCameraLauncherLazy,
                 () -> mLightRevealScrimViewModel,
                 mAlternateBouncerInteractor,
-                mUserTracker
+                mUserTracker,
+                () -> mFingerprintManager
         ) {
             @Override
             protected ViewRootImpl getViewRootImpl() {
@@ -855,7 +857,7 @@
                 eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT),
                 mOnBackInvokedCallback.capture());
 
-        when(mNotificationPanelViewController.canPanelBeCollapsed()).thenReturn(true);
+        when(mNotificationPanelViewController.canBeCollapsed()).thenReturn(true);
         mOnBackInvokedCallback.getValue().onBackInvoked();
         verify(mShadeController).animateCollapseShade();
     }
@@ -875,7 +877,7 @@
 
         OnBackAnimationCallback onBackAnimationCallback =
                 (OnBackAnimationCallback) (mOnBackInvokedCallback.getValue());
-        when(mNotificationPanelViewController.canPanelBeCollapsed()).thenReturn(true);
+        when(mNotificationPanelViewController.canBeCollapsed()).thenReturn(true);
 
         BackEvent fakeSwipeInFromLeftEdge = new BackEvent(20.0f, 100.0f, 1.0f, BackEvent.EDGE_LEFT);
         onBackAnimationCallback.onBackProgressed(fakeSwipeInFromLeftEdge);
@@ -897,7 +899,7 @@
 
         OnBackAnimationCallback onBackAnimationCallback =
                 (OnBackAnimationCallback) (mOnBackInvokedCallback.getValue());
-        when(mNotificationPanelViewController.canPanelBeCollapsed()).thenReturn(true);
+        when(mNotificationPanelViewController.canBeCollapsed()).thenReturn(true);
 
         BackEvent fakeSwipeInFromLeftEdge = new BackEvent(20.0f, 10.0f, 0.0f, BackEvent.EDGE_LEFT);
         onBackAnimationCallback.onBackProgressed(fakeSwipeInFromLeftEdge);
@@ -1233,7 +1235,7 @@
         setFoldedStates(FOLD_STATE_FOLDED);
         setGoToSleepStates(FOLD_STATE_FOLDED);
         mCentralSurfaces.setBarStateForTest(SHADE);
-        when(mNotificationPanelViewController.isShadeFullyOpen()).thenReturn(true);
+        when(mNotificationPanelViewController.isShadeFullyExpanded()).thenReturn(true);
 
         setDeviceState(FOLD_STATE_UNFOLDED);
 
@@ -1245,7 +1247,7 @@
         setFoldedStates(FOLD_STATE_FOLDED);
         setGoToSleepStates(FOLD_STATE_FOLDED);
         mCentralSurfaces.setBarStateForTest(KEYGUARD);
-        when(mNotificationPanelViewController.isShadeFullyOpen()).thenReturn(true);
+        when(mNotificationPanelViewController.isShadeFullyExpanded()).thenReturn(true);
 
         setDeviceState(FOLD_STATE_UNFOLDED);
 
@@ -1258,7 +1260,7 @@
         setFoldedStates(FOLD_STATE_FOLDED);
         setGoToSleepStates(FOLD_STATE_FOLDED);
         mCentralSurfaces.setBarStateForTest(SHADE);
-        when(mNotificationPanelViewController.isShadeFullyOpen()).thenReturn(false);
+        when(mNotificationPanelViewController.isShadeFullyExpanded()).thenReturn(false);
 
         setDeviceState(FOLD_STATE_UNFOLDED);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
index e5e5d94..3372dc3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
@@ -39,6 +39,7 @@
 import com.android.systemui.plugins.DarkIconDispatcher;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.shade.NotificationPanelViewController;
+import com.android.systemui.shade.ShadeHeadsUpTracker;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.HeadsUpStatusBarView;
 import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
@@ -66,6 +67,7 @@
             mock(NotificationStackScrollLayoutController.class);
     private final NotificationPanelViewController mPanelView =
             mock(NotificationPanelViewController.class);
+    private final ShadeHeadsUpTracker mShadeHeadsUpTracker = mock(ShadeHeadsUpTracker.class);
     private final DarkIconDispatcher mDarkIconDispatcher = mock(DarkIconDispatcher.class);
     private HeadsUpAppearanceController mHeadsUpAppearanceController;
     private NotificationTestHelper mTestHelper;
@@ -102,6 +104,7 @@
         mCommandQueue = mock(CommandQueue.class);
         mNotificationRoundnessManager = mock(NotificationRoundnessManager.class);
         mFeatureFlag = mock(FeatureFlags.class);
+        when(mPanelView.getShadeHeadsUpTracker()).thenReturn(mShadeHeadsUpTracker);
         when(mFeatureFlag.isEnabled(Flags.USE_ROUNDNESS_SOURCETYPES)).thenReturn(true);
         mHeadsUpAppearanceController = new HeadsUpAppearanceController(
                 mock(NotificationIconAreaController.class),
@@ -212,15 +215,15 @@
     public void testDestroy() {
         reset(mHeadsUpManager);
         reset(mDarkIconDispatcher);
-        reset(mPanelView);
+        reset(mShadeHeadsUpTracker);
         reset(mStackScrollerController);
 
         mHeadsUpAppearanceController.onViewDetached();
 
         verify(mHeadsUpManager).removeListener(any());
         verify(mDarkIconDispatcher).removeDarkReceiver((DarkIconDispatcher.DarkReceiver) any());
-        verify(mPanelView).removeTrackingHeadsUpListener(any());
-        verify(mPanelView).setHeadsUpAppearanceController(isNull());
+        verify(mShadeHeadsUpTracker).removeTrackingHeadsUpListener(any());
+        verify(mShadeHeadsUpTracker).setHeadsUpAppearanceController(isNull());
         verify(mStackScrollerController).removeOnExpandedHeightChangedListener(any());
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
index 5bb25f5..e83e50d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
@@ -45,6 +45,7 @@
 import com.android.systemui.shade.NotificationShadeWindowView;
 import com.android.systemui.shade.QuickSettingsController;
 import com.android.systemui.shade.ShadeController;
+import com.android.systemui.shade.ShadeNotificationPresenter;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.KeyguardIndicationController;
 import com.android.systemui.statusbar.LockscreenShadeTransitionController;
@@ -110,9 +111,12 @@
                 mock(NotificationStackScrollLayout.class));
         when(notificationShadeWindowView.getResources()).thenReturn(mContext.getResources());
 
+        NotificationPanelViewController npvc = mock(NotificationPanelViewController.class);
+        when(npvc.getShadeNotificationPresenter())
+                .thenReturn(mock(ShadeNotificationPresenter.class));
         mStatusBarNotificationPresenter = new StatusBarNotificationPresenter(
                 mContext,
-                mock(NotificationPanelViewController.class),
+                npvc,
                 mock(QuickSettingsController.class),
                 mock(HeadsUpManagerPhone.class),
                 notificationShadeWindowView,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt
index 44fbd5b..6306a36 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar.pipeline.mobile.data.repository
 
+import android.telephony.TelephonyManager.UNKNOWN_CARRIER_ID
 import com.android.systemui.log.table.TableLogBuffer
 import com.android.systemui.statusbar.pipeline.mobile.data.model.DataConnectionState
 import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel
@@ -29,6 +30,7 @@
     override val subId: Int,
     override val tableLogBuffer: TableLogBuffer,
 ) : MobileConnectionRepository {
+    override val carrierId = MutableStateFlow(UNKNOWN_CARRIER_ID)
     override val isEmergencyOnly = MutableStateFlow(false)
     override val isRoaming = MutableStateFlow(false)
     override val operatorAlphaShort: MutableStateFlow<String?> = MutableStateFlow(null)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcherTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcherTest.kt
index 0b202853..1fdcf7f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcherTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcherTest.kt
@@ -34,6 +34,7 @@
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.demo.validMobileEvent
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.MobileConnectionsRepositoryImpl
 import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
+import com.android.systemui.statusbar.pipeline.mobile.util.FakeSubscriptionManagerProxy
 import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
 import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
 import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
@@ -89,6 +90,7 @@
 
     private val fakeNetworkEventsFlow = MutableStateFlow<FakeNetworkEventModel?>(null)
     private val mobileMappings = FakeMobileMappingsProxy()
+    private val subscriptionManagerProxy = FakeSubscriptionManagerProxy()
 
     private val scope = CoroutineScope(IMMEDIATE)
 
@@ -117,6 +119,7 @@
             MobileConnectionsRepositoryImpl(
                 connectivityRepository,
                 subscriptionManager,
+                subscriptionManagerProxy,
                 telephonyManager,
                 logger,
                 summaryLogger,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt
index f2bb66a..423c476 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt
@@ -593,7 +593,6 @@
 
         val realRepo =
             MobileConnectionRepositoryImpl(
-                context,
                 SUB_ID,
                 defaultNetworkName = NetworkNameModel.Default("default"),
                 networkNameSeparator = SEP,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt
index 934e1c6..d1df6e3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt
@@ -42,6 +42,7 @@
 import android.telephony.TelephonyManager.DATA_UNKNOWN
 import android.telephony.TelephonyManager.ERI_OFF
 import android.telephony.TelephonyManager.ERI_ON
+import android.telephony.TelephonyManager.EXTRA_CARRIER_ID
 import android.telephony.TelephonyManager.EXTRA_PLMN
 import android.telephony.TelephonyManager.EXTRA_SHOW_PLMN
 import android.telephony.TelephonyManager.EXTRA_SHOW_SPN
@@ -116,7 +117,6 @@
 
         underTest =
             MobileConnectionRepositoryImpl(
-                context,
                 SUB_1_ID,
                 DEFAULT_NAME,
                 SEP,
@@ -359,6 +359,36 @@
         }
 
     @Test
+    fun carrierId_initialValueCaptured() =
+        testScope.runTest {
+            whenever(telephonyManager.simCarrierId).thenReturn(1234)
+
+            var latest: Int? = null
+            val job = underTest.carrierId.onEach { latest = it }.launchIn(this)
+
+            assertThat(latest).isEqualTo(1234)
+
+            job.cancel()
+        }
+
+    @Test
+    fun carrierId_updatesOnBroadcast() =
+        testScope.runTest {
+            whenever(telephonyManager.simCarrierId).thenReturn(1234)
+
+            var latest: Int? = null
+            val job = underTest.carrierId.onEach { latest = it }.launchIn(this)
+
+            fakeBroadcastDispatcher.registeredReceivers.forEach { receiver ->
+                receiver.onReceive(context, carrierIdIntent(carrierId = 4321))
+            }
+
+            assertThat(latest).isEqualTo(4321)
+
+            job.cancel()
+        }
+
+    @Test
     fun carrierNetworkChange() =
         testScope.runTest {
             var latest: Boolean? = null
@@ -796,6 +826,15 @@
         return MobileTelephonyHelpers.getTelephonyCallbackForType(telephonyManager)
     }
 
+    private fun carrierIdIntent(
+        subId: Int = SUB_1_ID,
+        carrierId: Int,
+    ): Intent =
+        Intent(TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED).apply {
+            putExtra(EXTRA_SUBSCRIPTION_ID, subId)
+            putExtra(EXTRA_CARRIER_ID, carrierId)
+        }
+
     private fun spnIntent(
         subId: Int = SUB_1_ID,
         showSpn: Boolean = true,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionTelephonySmokeTests.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionTelephonySmokeTests.kt
index 9da9ff7..4f15aed 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionTelephonySmokeTests.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionTelephonySmokeTests.kt
@@ -117,7 +117,6 @@
 
         underTest =
             MobileConnectionRepositoryImpl(
-                context,
                 SUB_1_ID,
                 DEFAULT_NAME,
                 SEP,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt
index d65277f..9d294cf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt
@@ -47,6 +47,7 @@
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.FullMobileConnectionRepository.Factory.Companion.tableBufferLogName
 import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
+import com.android.systemui.statusbar.pipeline.mobile.util.FakeSubscriptionManagerProxy
 import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlots
 import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
 import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepositoryImpl
@@ -98,6 +99,7 @@
     @Mock private lateinit var logBufferFactory: TableLogBufferFactory
 
     private val mobileMappings = FakeMobileMappingsProxy()
+    private val subscriptionManagerProxy = FakeSubscriptionManagerProxy()
 
     private val scope = CoroutineScope(IMMEDIATE)
 
@@ -153,7 +155,6 @@
         connectionFactory =
             MobileConnectionRepositoryImpl.Factory(
                 fakeBroadcastDispatcher,
-                context = context,
                 telephonyManager = telephonyManager,
                 bgDispatcher = IMMEDIATE,
                 logger = logger,
@@ -179,6 +180,7 @@
             MobileConnectionsRepositoryImpl(
                 connectivityRepository,
                 subscriptionManager,
+                subscriptionManagerProxy,
                 telephonyManager,
                 logger,
                 summaryLogger,
@@ -662,6 +664,8 @@
             var latest: Int? = null
             val job = underTest.defaultDataSubId.onEach { latest = it }.launchIn(this)
 
+            assertThat(latest).isEqualTo(INVALID_SUBSCRIPTION_ID)
+
             fakeBroadcastDispatcher.registeredReceivers.forEach { receiver ->
                 receiver.onReceive(
                     context,
@@ -686,6 +690,42 @@
         }
 
     @Test
+    fun defaultDataSubId_fetchesInitialValueOnStart() =
+        runBlocking(IMMEDIATE) {
+            subscriptionManagerProxy.defaultDataSubId = 2
+            var latest: Int? = null
+            val job = underTest.defaultDataSubId.onEach { latest = it }.launchIn(this)
+
+            assertThat(latest).isEqualTo(2)
+
+            job.cancel()
+        }
+
+    @Test
+    fun defaultDataSubId_fetchesCurrentOnRestart() =
+        runBlocking(IMMEDIATE) {
+            subscriptionManagerProxy.defaultDataSubId = 2
+            var latest: Int? = null
+            var job = underTest.defaultDataSubId.onEach { latest = it }.launchIn(this)
+
+            assertThat(latest).isEqualTo(2)
+
+            job.cancel()
+
+            // Collectors go away but come back later
+
+            latest = null
+
+            subscriptionManagerProxy.defaultDataSubId = 1
+
+            job = underTest.defaultDataSubId.onEach { latest = it }.launchIn(this)
+
+            assertThat(latest).isEqualTo(1)
+
+            job.cancel()
+        }
+
+    @Test
     fun mobileIsDefault_startsAsFalse() {
         assertThat(underTest.mobileIsDefault.value).isFalse()
     }
@@ -902,6 +942,7 @@
                 MobileConnectionsRepositoryImpl(
                     connectivityRepository,
                     subscriptionManager,
+                    subscriptionManagerProxy,
                     telephonyManager,
                     logger,
                     summaryLogger,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt
index 8d2c569..f054422e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt
@@ -17,11 +17,11 @@
 package com.android.systemui.statusbar.pipeline.mobile.domain.interactor
 
 import android.telephony.CellSignalStrength
-import com.android.settingslib.SignalIcon
 import com.android.settingslib.mobile.TelephonyIcons
 import com.android.systemui.log.table.TableLogBuffer
 import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository.Companion.DEFAULT_NUM_LEVELS
+import com.android.systemui.statusbar.pipeline.mobile.domain.model.NetworkTypeIconModel
 import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
 import kotlinx.coroutines.flow.MutableStateFlow
 
@@ -42,8 +42,10 @@
 
     override val mobileIsDefault = MutableStateFlow(true)
 
-    private val _iconGroup = MutableStateFlow<SignalIcon.MobileIconGroup>(TelephonyIcons.THREE_G)
-    override val networkTypeIconGroup = _iconGroup
+    override val networkTypeIconGroup =
+        MutableStateFlow<NetworkTypeIconModel>(
+            NetworkTypeIconModel.DefaultIcon(TelephonyIcons.THREE_G)
+        )
 
     override val networkName = MutableStateFlow(NetworkNameModel.IntentDerived("demo mode"))
 
@@ -73,10 +75,6 @@
 
     override val isForceHidden = MutableStateFlow(false)
 
-    fun setIconGroup(group: SignalIcon.MobileIconGroup) {
-        _iconGroup.value = group
-    }
-
     fun setIsEmergencyOnly(emergency: Boolean) {
         _isEmergencyOnly.value = emergency
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt
index d6fdad4..3ced7b2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt
@@ -59,7 +59,6 @@
     override val alwaysShowDataRatIcon = MutableStateFlow(false)
 
     override val alwaysUseCdmaLevel = MutableStateFlow(false)
-    override val defaultDataSubId = MutableStateFlow(DEFAULT_DATA_SUB_ID)
 
     override val mobileIsDefault = MutableStateFlow(false)
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractorTest.kt
index 2054e8b..8d7f0f6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractorTest.kt
@@ -19,7 +19,8 @@
 import android.telephony.CellSignalStrength
 import android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN
 import androidx.test.filters.SmallTest
-import com.android.settingslib.SignalIcon.MobileIconGroup
+import com.android.settingslib.mobile.MobileIconCarrierIdOverrides
+import com.android.settingslib.mobile.MobileIconCarrierIdOverridesImpl
 import com.android.settingslib.mobile.TelephonyIcons
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.statusbar.pipeline.mobile.data.model.DataConnectionState
@@ -31,18 +32,24 @@
 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconsInteractor.Companion.FIVE_G_OVERRIDE
 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconsInteractor.Companion.FOUR_G
 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconsInteractor.Companion.THREE_G
+import com.android.systemui.statusbar.pipeline.mobile.domain.model.NetworkTypeIconModel
 import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
+import com.android.systemui.util.mockito.any
 import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.launchIn
 import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.yield
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.UnconfinedTestDispatcher
+import kotlinx.coroutines.test.runTest
 import org.junit.Before
 import org.junit.Test
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyString
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 class MobileIconInteractorTest : SysuiTestCase() {
     private lateinit var underTest: MobileIconInteractor
@@ -50,29 +57,17 @@
     private val mobileIconsInteractor = FakeMobileIconsInteractor(mobileMappingsProxy, mock())
     private val connectionRepository = FakeMobileConnectionRepository(SUB_1_ID, mock())
 
-    private val scope = CoroutineScope(IMMEDIATE)
+    private val testDispatcher = UnconfinedTestDispatcher()
+    private val testScope = TestScope(testDispatcher)
 
     @Before
     fun setUp() {
-        underTest =
-            MobileIconInteractorImpl(
-                scope,
-                mobileIconsInteractor.activeDataConnectionHasDataEnabled,
-                mobileIconsInteractor.alwaysShowDataRatIcon,
-                mobileIconsInteractor.alwaysUseCdmaLevel,
-                mobileIconsInteractor.mobileIsDefault,
-                mobileIconsInteractor.defaultMobileIconMapping,
-                mobileIconsInteractor.defaultMobileIconGroup,
-                mobileIconsInteractor.defaultDataSubId,
-                mobileIconsInteractor.isDefaultConnectionFailed,
-                mobileIconsInteractor.isForceHidden,
-                connectionRepository,
-            )
+        underTest = createInteractor()
     }
 
     @Test
     fun gsm_level_default_unknown() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             connectionRepository.isGsm.value = true
 
             var latest: Int? = null
@@ -85,7 +80,7 @@
 
     @Test
     fun gsm_usesGsmLevel() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             connectionRepository.isGsm.value = true
             connectionRepository.primaryLevel.value = GSM_LEVEL
             connectionRepository.cdmaLevel.value = CDMA_LEVEL
@@ -100,7 +95,7 @@
 
     @Test
     fun gsm_alwaysShowCdmaTrue_stillUsesGsmLevel() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             connectionRepository.isGsm.value = true
             connectionRepository.primaryLevel.value = GSM_LEVEL
             connectionRepository.cdmaLevel.value = CDMA_LEVEL
@@ -116,7 +111,7 @@
 
     @Test
     fun notGsm_level_default_unknown() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             connectionRepository.isGsm.value = false
 
             var latest: Int? = null
@@ -128,7 +123,7 @@
 
     @Test
     fun notGsm_alwaysShowCdmaTrue_usesCdmaLevel() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             connectionRepository.isGsm.value = false
             connectionRepository.primaryLevel.value = GSM_LEVEL
             connectionRepository.cdmaLevel.value = CDMA_LEVEL
@@ -144,7 +139,7 @@
 
     @Test
     fun notGsm_alwaysShowCdmaFalse_usesPrimaryLevel() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             connectionRepository.isGsm.value = false
             connectionRepository.primaryLevel.value = GSM_LEVEL
             connectionRepository.cdmaLevel.value = CDMA_LEVEL
@@ -160,7 +155,7 @@
 
     @Test
     fun numberOfLevels_comesFromRepo() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             var latest: Int? = null
             val job = underTest.numberOfLevels.onEach { latest = it }.launchIn(this)
 
@@ -175,101 +170,106 @@
 
     @Test
     fun iconGroup_three_g() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             connectionRepository.resolvedNetworkType.value =
                 DefaultNetworkType(mobileMappingsProxy.toIconKey(THREE_G))
 
-            var latest: MobileIconGroup? = null
+            var latest: NetworkTypeIconModel? = null
             val job = underTest.networkTypeIconGroup.onEach { latest = it }.launchIn(this)
 
-            assertThat(latest).isEqualTo(TelephonyIcons.THREE_G)
+            assertThat(latest).isEqualTo(NetworkTypeIconModel.DefaultIcon(TelephonyIcons.THREE_G))
 
             job.cancel()
         }
 
     @Test
     fun iconGroup_updates_on_change() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             connectionRepository.resolvedNetworkType.value =
                 DefaultNetworkType(mobileMappingsProxy.toIconKey(THREE_G))
 
-            var latest: MobileIconGroup? = null
+            var latest: NetworkTypeIconModel? = null
             val job = underTest.networkTypeIconGroup.onEach { latest = it }.launchIn(this)
 
             connectionRepository.resolvedNetworkType.value =
                 DefaultNetworkType(mobileMappingsProxy.toIconKey(FOUR_G))
-            yield()
 
-            assertThat(latest).isEqualTo(TelephonyIcons.FOUR_G)
+            assertThat(latest).isEqualTo(NetworkTypeIconModel.DefaultIcon(TelephonyIcons.FOUR_G))
 
             job.cancel()
         }
 
     @Test
     fun iconGroup_5g_override_type() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             connectionRepository.resolvedNetworkType.value =
                 OverrideNetworkType(mobileMappingsProxy.toIconKeyOverride(FIVE_G_OVERRIDE))
 
-            var latest: MobileIconGroup? = null
+            var latest: NetworkTypeIconModel? = null
             val job = underTest.networkTypeIconGroup.onEach { latest = it }.launchIn(this)
 
-            assertThat(latest).isEqualTo(TelephonyIcons.NR_5G)
+            assertThat(latest).isEqualTo(NetworkTypeIconModel.DefaultIcon(TelephonyIcons.NR_5G))
 
             job.cancel()
         }
 
     @Test
     fun iconGroup_default_if_no_lookup() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             connectionRepository.resolvedNetworkType.value =
                 DefaultNetworkType(mobileMappingsProxy.toIconKey(NETWORK_TYPE_UNKNOWN))
 
-            var latest: MobileIconGroup? = null
+            var latest: NetworkTypeIconModel? = null
             val job = underTest.networkTypeIconGroup.onEach { latest = it }.launchIn(this)
 
-            assertThat(latest).isEqualTo(FakeMobileIconsInteractor.DEFAULT_ICON)
+            assertThat(latest)
+                .isEqualTo(NetworkTypeIconModel.DefaultIcon(FakeMobileIconsInteractor.DEFAULT_ICON))
 
             job.cancel()
         }
 
     @Test
     fun iconGroup_carrierMerged_usesOverride() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             connectionRepository.resolvedNetworkType.value = CarrierMergedNetworkType
 
-            var latest: MobileIconGroup? = null
+            var latest: NetworkTypeIconModel? = null
             val job = underTest.networkTypeIconGroup.onEach { latest = it }.launchIn(this)
 
-            assertThat(latest).isEqualTo(CarrierMergedNetworkType.iconGroupOverride)
+            assertThat(latest)
+                .isEqualTo(
+                    NetworkTypeIconModel.DefaultIcon(CarrierMergedNetworkType.iconGroupOverride)
+                )
 
             job.cancel()
         }
 
     @Test
-    fun `icon group - checks default data`() =
-        runBlocking(IMMEDIATE) {
-            mobileIconsInteractor.defaultDataSubId.value = SUB_1_ID
+    fun overrideIcon_usesCarrierIdOverride() =
+        testScope.runTest {
+            val overrides =
+                mock<MobileIconCarrierIdOverrides>().also {
+                    whenever(it.carrierIdEntryExists(anyInt())).thenReturn(true)
+                    whenever(it.getOverrideFor(anyInt(), anyString(), any())).thenReturn(1234)
+                }
+
+            underTest = createInteractor(overrides)
+
             connectionRepository.resolvedNetworkType.value =
                 DefaultNetworkType(mobileMappingsProxy.toIconKey(THREE_G))
 
-            var latest: MobileIconGroup? = null
+            var latest: NetworkTypeIconModel? = null
             val job = underTest.networkTypeIconGroup.onEach { latest = it }.launchIn(this)
 
-            assertThat(latest).isEqualTo(TelephonyIcons.THREE_G)
-
-            // Default data sub id changes to something else
-            mobileIconsInteractor.defaultDataSubId.value = 123
-            yield()
-
-            assertThat(latest).isEqualTo(TelephonyIcons.NOT_DEFAULT_DATA)
+            assertThat(latest)
+                .isEqualTo(NetworkTypeIconModel.OverriddenIcon(TelephonyIcons.THREE_G, 1234))
 
             job.cancel()
         }
 
     @Test
     fun alwaysShowDataRatIcon_matchesParent() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             var latest: Boolean? = null
             val job = underTest.alwaysShowDataRatIcon.onEach { latest = it }.launchIn(this)
 
@@ -284,7 +284,7 @@
 
     @Test
     fun alwaysUseCdmaLevel_matchesParent() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             var latest: Boolean? = null
             val job = underTest.alwaysUseCdmaLevel.onEach { latest = it }.launchIn(this)
 
@@ -299,7 +299,7 @@
 
     @Test
     fun test_isDefaultDataEnabled_matchesParent() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             var latest: Boolean? = null
             val job = underTest.isDefaultDataEnabled.onEach { latest = it }.launchIn(this)
 
@@ -314,7 +314,7 @@
 
     @Test
     fun test_isDefaultConnectionFailed_matchedParent() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             val job = underTest.isDefaultConnectionFailed.launchIn(this)
 
             mobileIconsInteractor.isDefaultConnectionFailed.value = false
@@ -328,12 +328,11 @@
 
     @Test
     fun dataState_connected() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             var latest: Boolean? = null
             val job = underTest.isDataConnected.onEach { latest = it }.launchIn(this)
 
             connectionRepository.dataConnectionState.value = DataConnectionState.Connected
-            yield()
 
             assertThat(latest).isTrue()
 
@@ -342,7 +341,7 @@
 
     @Test
     fun dataState_notConnected() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             var latest: Boolean? = null
             val job = underTest.isDataConnected.onEach { latest = it }.launchIn(this)
 
@@ -355,7 +354,7 @@
 
     @Test
     fun `isInService - uses repository value`() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             var latest: Boolean? = null
             val job = underTest.isInService.onEach { latest = it }.launchIn(this)
 
@@ -372,19 +371,17 @@
 
     @Test
     fun `roaming - is gsm - uses connection model`() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             var latest: Boolean? = null
             val job = underTest.isRoaming.onEach { latest = it }.launchIn(this)
 
             connectionRepository.cdmaRoaming.value = true
             connectionRepository.isGsm.value = true
             connectionRepository.isRoaming.value = false
-            yield()
 
             assertThat(latest).isFalse()
 
             connectionRepository.isRoaming.value = true
-            yield()
 
             assertThat(latest).isTrue()
 
@@ -393,21 +390,19 @@
 
     @Test
     fun `roaming - is cdma - uses cdma roaming bit`() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             var latest: Boolean? = null
             val job = underTest.isRoaming.onEach { latest = it }.launchIn(this)
 
             connectionRepository.cdmaRoaming.value = false
             connectionRepository.isGsm.value = false
             connectionRepository.isRoaming.value = true
-            yield()
 
             assertThat(latest).isFalse()
 
             connectionRepository.cdmaRoaming.value = true
             connectionRepository.isGsm.value = false
             connectionRepository.isRoaming.value = false
-            yield()
 
             assertThat(latest).isTrue()
 
@@ -416,7 +411,7 @@
 
     @Test
     fun `roaming - false while carrierNetworkChangeActive`() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             var latest: Boolean? = null
             val job = underTest.isRoaming.onEach { latest = it }.launchIn(this)
 
@@ -424,13 +419,11 @@
             connectionRepository.isGsm.value = false
             connectionRepository.isRoaming.value = true
             connectionRepository.carrierNetworkChangeActive.value = true
-            yield()
 
             assertThat(latest).isFalse()
 
             connectionRepository.cdmaRoaming.value = true
             connectionRepository.isGsm.value = true
-            yield()
 
             assertThat(latest).isFalse()
 
@@ -439,7 +432,7 @@
 
     @Test
     fun `network name - uses operatorAlphaShot when non null and repo is default`() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             var latest: NetworkNameModel? = null
             val job = underTest.networkName.onEach { latest = it }.launchIn(this)
 
@@ -448,20 +441,17 @@
             // Default network name, operator name is non-null, uses the operator name
             connectionRepository.networkName.value = DEFAULT_NAME
             connectionRepository.operatorAlphaShort.value = testOperatorName
-            yield()
 
             assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived(testOperatorName))
 
             // Default network name, operator name is null, uses the default
             connectionRepository.operatorAlphaShort.value = null
-            yield()
 
             assertThat(latest).isEqualTo(DEFAULT_NAME)
 
             // Derived network name, operator name non-null, uses the derived name
             connectionRepository.networkName.value = DERIVED_NAME
             connectionRepository.operatorAlphaShort.value = testOperatorName
-            yield()
 
             assertThat(latest).isEqualTo(DERIVED_NAME)
 
@@ -470,7 +460,7 @@
 
     @Test
     fun isForceHidden_matchesParent() =
-        runBlocking(IMMEDIATE) {
+        testScope.runTest {
             var latest: Boolean? = null
             val job = underTest.isForceHidden.onEach { latest = it }.launchIn(this)
 
@@ -483,9 +473,25 @@
             job.cancel()
         }
 
-    companion object {
-        private val IMMEDIATE = Dispatchers.Main.immediate
+    private fun createInteractor(
+        overrides: MobileIconCarrierIdOverrides = MobileIconCarrierIdOverridesImpl()
+    ) =
+        MobileIconInteractorImpl(
+            testScope.backgroundScope,
+            mobileIconsInteractor.activeDataConnectionHasDataEnabled,
+            mobileIconsInteractor.alwaysShowDataRatIcon,
+            mobileIconsInteractor.alwaysUseCdmaLevel,
+            mobileIconsInteractor.mobileIsDefault,
+            mobileIconsInteractor.defaultMobileIconMapping,
+            mobileIconsInteractor.defaultMobileIconGroup,
+            mobileIconsInteractor.isDefaultConnectionFailed,
+            mobileIconsInteractor.isForceHidden,
+            connectionRepository,
+            context,
+            overrides,
+        )
 
+    companion object {
         private const val GSM_LEVEL = 1
         private const val CDMA_LEVEL = 2
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractorTest.kt
index 898e897..c5ceaca 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractorTest.kt
@@ -88,6 +88,7 @@
                 connectivityRepository,
                 userSetupRepository,
                 testScope.backgroundScope,
+                context,
             )
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/LocationBasedMobileIconViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/LocationBasedMobileIconViewModelTest.kt
index a6d9152..e99be86 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/LocationBasedMobileIconViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/LocationBasedMobileIconViewModelTest.kt
@@ -24,6 +24,7 @@
 import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
 import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconInteractor
+import com.android.systemui.statusbar.pipeline.mobile.domain.model.NetworkTypeIconModel
 import com.android.systemui.statusbar.pipeline.mobile.ui.model.SignalIconModel
 import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconViewModelTest.Companion.defaultSignal
 import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
@@ -71,9 +72,9 @@
             setLevel(1)
             setIsDefaultDataEnabled(true)
             setIsFailedConnection(false)
-            setIconGroup(TelephonyIcons.THREE_G)
             setIsEmergencyOnly(false)
             setNumberOfLevels(4)
+            networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(TelephonyIcons.THREE_G)
             isDataConnected.value = true
         }
         commonImpl =
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt
index 8ea8f87..1b6ab4d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt
@@ -20,6 +20,7 @@
 import com.android.settingslib.AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH
 import com.android.settingslib.AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH_NONE
 import com.android.settingslib.mobile.TelephonyIcons.THREE_G
+import com.android.settingslib.mobile.TelephonyIcons.UNKNOWN
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.common.shared.model.ContentDescription
 import com.android.systemui.common.shared.model.Icon
@@ -27,6 +28,7 @@
 import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
 import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconInteractor
+import com.android.systemui.statusbar.pipeline.mobile.domain.model.NetworkTypeIconModel
 import com.android.systemui.statusbar.pipeline.mobile.ui.model.SignalIconModel
 import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
 import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
@@ -76,9 +78,9 @@
             setLevel(1)
             setIsDefaultDataEnabled(true)
             setIsFailedConnection(false)
-            setIconGroup(THREE_G)
             setIsEmergencyOnly(false)
             setNumberOfLevels(4)
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(THREE_G)
             isDataConnected.value = true
         }
         createAndSetViewModel()
@@ -255,7 +257,7 @@
                     THREE_G.dataType,
                     ContentDescription.Resource(THREE_G.dataContentDescription)
                 )
-            interactor.setIconGroup(THREE_G)
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(THREE_G)
 
             var latest: Icon? = null
             val job = underTest.networkTypeIcon.onEach { latest = it }.launchIn(this)
@@ -266,10 +268,11 @@
         }
 
     @Test
-    fun networkType_nullWhenDisabled() =
+    fun networkType_null_whenDisabled() =
         testScope.runTest {
-            interactor.setIconGroup(THREE_G)
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(THREE_G)
             interactor.setIsDataEnabled(false)
+            interactor.mobileIsDefault.value = true
             var latest: Icon? = null
             val job = underTest.networkTypeIcon.onEach { latest = it }.launchIn(this)
 
@@ -279,15 +282,21 @@
         }
 
     @Test
-    fun networkType_nullWhenFailedConnection() =
+    fun networkTypeIcon_notNull_whenEnabled() =
         testScope.runTest {
-            interactor.setIconGroup(THREE_G)
+            val expected =
+                Icon.Resource(
+                    THREE_G.dataType,
+                    ContentDescription.Resource(THREE_G.dataContentDescription)
+                )
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(THREE_G)
             interactor.setIsDataEnabled(true)
-            interactor.setIsFailedConnection(true)
+            interactor.isDataConnected.value = true
+            interactor.mobileIsDefault.value = true
             var latest: Icon? = null
             val job = underTest.networkTypeIcon.onEach { latest = it }.launchIn(this)
 
-            assertThat(latest).isNull()
+            assertThat(latest).isEqualTo(expected)
 
             job.cancel()
         }
@@ -301,11 +310,11 @@
                     ContentDescription.Resource(THREE_G.dataContentDescription)
                 )
 
-            interactor.setIconGroup(THREE_G)
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(THREE_G)
             var latest: Icon? = null
             val job = underTest.networkTypeIcon.onEach { latest = it }.launchIn(this)
 
-            interactor.setIconGroup(THREE_G)
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(THREE_G)
             assertThat(latest).isEqualTo(initial)
 
             interactor.isDataConnected.value = false
@@ -324,7 +333,7 @@
                     THREE_G.dataType,
                     ContentDescription.Resource(THREE_G.dataContentDescription)
                 )
-            interactor.setIconGroup(THREE_G)
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(THREE_G)
             interactor.setIsDataEnabled(true)
             var latest: Icon? = null
             val job = underTest.networkTypeIcon.onEach { latest = it }.launchIn(this)
@@ -342,8 +351,8 @@
     @Test
     fun networkType_alwaysShow_shownEvenWhenDisabled() =
         testScope.runTest {
-            interactor.setIconGroup(THREE_G)
-            interactor.setIsDataEnabled(true)
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(THREE_G)
+            interactor.setIsDataEnabled(false)
             interactor.alwaysShowDataRatIcon.value = true
 
             var latest: Icon? = null
@@ -362,7 +371,7 @@
     @Test
     fun networkType_alwaysShow_shownEvenWhenDisconnected() =
         testScope.runTest {
-            interactor.setIconGroup(THREE_G)
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(THREE_G)
             interactor.isDataConnected.value = false
             interactor.alwaysShowDataRatIcon.value = true
 
@@ -382,7 +391,7 @@
     @Test
     fun networkType_alwaysShow_shownEvenWhenFailedConnection() =
         testScope.runTest {
-            interactor.setIconGroup(THREE_G)
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(THREE_G)
             interactor.setIsFailedConnection(true)
             interactor.alwaysShowDataRatIcon.value = true
 
@@ -400,9 +409,24 @@
         }
 
     @Test
+    fun networkType_alwaysShow_notShownWhenInvalidDataTypeIcon() =
+        testScope.runTest {
+            // The UNKNOWN icon group doesn't have a valid data type icon ID
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(UNKNOWN)
+            interactor.alwaysShowDataRatIcon.value = true
+
+            var latest: Icon? = null
+            val job = underTest.networkTypeIcon.onEach { latest = it }.launchIn(this)
+
+            assertThat(latest).isNull()
+
+            job.cancel()
+        }
+
+    @Test
     fun `network type - alwaysShow - shown when not default`() =
         testScope.runTest {
-            interactor.setIconGroup(THREE_G)
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(THREE_G)
             interactor.mobileIsDefault.value = false
             interactor.alwaysShowDataRatIcon.value = true
 
@@ -422,7 +446,7 @@
     @Test
     fun `network type - not shown when not default`() =
         testScope.runTest {
-            interactor.setIconGroup(THREE_G)
+            interactor.networkTypeIconGroup.value = NetworkTypeIconModel.DefaultIcon(THREE_G)
             interactor.isDataConnected.value = true
             interactor.mobileIsDefault.value = false
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/util/FakeSubscriptionManagerProxy.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/util/FakeSubscriptionManagerProxy.kt
new file mode 100644
index 0000000..3dc7de6
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/util/FakeSubscriptionManagerProxy.kt
@@ -0,0 +1,27 @@
+/*
+ * 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.mobile.util
+
+import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
+
+/** Fake of [SubscriptionManagerProxy] for easy testing */
+class FakeSubscriptionManagerProxy(
+    /** Set the default data subId to be returned in [getDefaultDataSubscriptionId] */
+    var defaultDataSubId: Int = INVALID_SUBSCRIPTION_ID
+) : SubscriptionManagerProxy {
+    override fun getDefaultDataSubscriptionId(): Int = defaultDataSubId
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
index 391c8ca..01e94ba 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
@@ -62,7 +62,7 @@
 import android.window.WindowOnBackInvokedDispatcher;
 
 import androidx.annotation.NonNull;
-import androidx.core.animation.AnimatorTestRule;
+import androidx.core.animation.AnimatorTestRule2;
 import androidx.test.filters.SmallTest;
 
 import com.android.internal.logging.UiEventLogger;
@@ -110,7 +110,7 @@
     private final UiEventLoggerFake mUiEventLoggerFake = new UiEventLoggerFake();
 
     @ClassRule
-    public static AnimatorTestRule mAnimatorTestRule = new AnimatorTestRule();
+    public static AnimatorTestRule2 mAnimatorTestRule = new AnimatorTestRule2();
 
     @Before
     public void setUp() throws Exception {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/touch/TouchInsetManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/touch/TouchInsetManagerTest.java
index 66709971..eb932d2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/touch/TouchInsetManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/touch/TouchInsetManagerTest.java
@@ -110,13 +110,14 @@
 
         clearInvocations(mAttachedSurfaceControl);
         when(view.isAttachedToWindow()).thenReturn(false);
+        when(view.getRootSurfaceControl()).thenReturn(null);
 
         // Trigger detachment and verify touchable region is set.
         listener.getValue().onViewDetachedFromWindow(view);
 
         mFakeExecutor.runAllReady();
 
-        verify(mAttachedSurfaceControl).setTouchableRegion(any());
+        verify(mAttachedSurfaceControl).setTouchableRegion(eq(null));
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldAodAnimationControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldAodAnimationControllerTest.kt
index a87e61a..dfbd61b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldAodAnimationControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldAodAnimationControllerTest.kt
@@ -32,6 +32,7 @@
 import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.shade.NotificationPanelViewController
+import com.android.systemui.shade.ShadeFoldAnimator
 import com.android.systemui.statusbar.CommandQueue
 import com.android.systemui.statusbar.LightRevealScrim
 import com.android.systemui.statusbar.phone.CentralSurfaces
@@ -50,6 +51,8 @@
 import org.mockito.ArgumentCaptor
 import org.mockito.Captor
 import org.mockito.Mock
+import org.mockito.Mockito.never
+import org.mockito.Mockito.reset
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.verifyNoMoreInteractions
 import org.mockito.Mockito.`when` as whenever
@@ -79,6 +82,8 @@
 
     @Mock private lateinit var commandQueue: CommandQueue
 
+    @Mock lateinit var shadeFoldAnimator: ShadeFoldAnimator
+
     @Captor private lateinit var foldStateListenerCaptor: ArgumentCaptor<FoldStateListener>
 
     private lateinit var deviceStates: FoldableDeviceStates
@@ -95,17 +100,17 @@
         deviceStates = FoldableTestUtils.findDeviceStates(context)
 
         // TODO(b/254878364): remove this call to NPVC.getView()
-        whenever(notificationPanelViewController.view).thenReturn(viewGroup)
+        whenever(notificationPanelViewController.shadeFoldAnimator).thenReturn(shadeFoldAnimator)
+        whenever(shadeFoldAnimator.view).thenReturn(viewGroup)
         whenever(viewGroup.viewTreeObserver).thenReturn(viewTreeObserver)
         whenever(wakefulnessLifecycle.lastSleepReason)
             .thenReturn(PowerManager.GO_TO_SLEEP_REASON_DEVICE_FOLD)
         whenever(centralSurfaces.notificationPanelViewController)
             .thenReturn(notificationPanelViewController)
-        whenever(notificationPanelViewController.startFoldToAodAnimation(any(), any(), any()))
-            .then {
-                val onActionStarted = it.arguments[0] as Runnable
-                onActionStarted.run()
-            }
+        whenever(shadeFoldAnimator.startFoldToAodAnimation(any(), any(), any())).then {
+            val onActionStarted = it.arguments[0] as Runnable
+            onActionStarted.run()
+        }
 
         keyguardRepository = FakeKeyguardRepository()
         val featureFlags = FakeFeatureFlags().apply { set(FACE_AUTH_REFACTOR, true) }
@@ -174,6 +179,28 @@
         }
 
     @Test
+    fun onFolded_onScreenTurningOnInvokedTwice_doesNotLogLatency() =
+        runBlocking(IMMEDIATE) {
+            val job = underTest.listenForDozing(this)
+            keyguardRepository.setDozing(true)
+            setAodEnabled(enabled = true)
+
+            yield()
+
+            fold()
+            simulateScreenTurningOn()
+            reset(latencyTracker)
+
+            // This can happen > 1 time if the prox sensor is covered
+            simulateScreenTurningOn()
+
+            verify(latencyTracker, never()).onActionStart(any())
+            verify(latencyTracker, never()).onActionEnd(any())
+
+            job.cancel()
+        }
+
+    @Test
     fun onFolded_animationCancelled_doesNotLogLatency() =
         runBlocking(IMMEDIATE) {
             val job = underTest.listenForDozing(this)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/TestUnfoldProgressListener.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/TestUnfoldProgressListener.kt
index 39ea46a..e2aef31 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/TestUnfoldProgressListener.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/TestUnfoldProgressListener.kt
@@ -126,7 +126,7 @@
         }
 
         fun assertLastProgress(progress: Float) {
-            waitForCondition { progress == progressHistory.last() }
+            waitForCondition { progress == progressHistory.lastOrNull() }
         }
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/service/ObservableServiceConnectionTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/service/ObservableServiceConnectionTest.java
index f9bfafc..766a5ce 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/service/ObservableServiceConnectionTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/service/ObservableServiceConnectionTest.java
@@ -29,12 +29,15 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.UserInfo;
 import android.os.IBinder;
+import android.os.UserHandle;
 import android.testing.AndroidTestingRunner;
 
 import androidx.test.filters.SmallTest;
 
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.settings.FakeUserTracker;
 import com.android.systemui.util.concurrency.FakeExecutor;
 import com.android.systemui.util.time.FakeSystemClock;
 
@@ -44,6 +47,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.List;
 import java.util.Objects;
 
 @SmallTest
@@ -93,15 +97,22 @@
 
     FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock());
 
+    private FakeUserTracker mUserTracker;
+
+    private static final int MAIN_USER_ID = 10;
+
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
+        mUserTracker = new FakeUserTracker();
+        // Set the main user as the current user.
+        mUserTracker.set(List.of(new UserInfo(MAIN_USER_ID, "main", UserInfo.FLAG_MAIN)), 0);
     }
 
     @Test
     public void testConnect() {
         ObservableServiceConnection<Foo> connection = new ObservableServiceConnection<>(mContext,
-                mIntent, mExecutor, mTransformer);
+                mIntent, mUserTracker, mExecutor, mTransformer);
         // Register twice to ensure only one callback occurs.
         connection.addCallback(mCallback);
         connection.addCallback(mCallback);
@@ -121,15 +132,16 @@
     @Test
     public void testDisconnect() {
         ObservableServiceConnection<Foo> connection = new ObservableServiceConnection<>(mContext,
-                mIntent, mExecutor, mTransformer);
+                mIntent, mUserTracker, mExecutor, mTransformer);
         connection.addCallback(mCallback);
         connection.onServiceDisconnected(mComponentName);
+        mExecutor.runAllReady();
 
         // Disconnects before binds should be ignored.
         verify(mCallback, never()).onDisconnected(eq(connection), anyInt());
 
-        when(mContext.bindService(eq(mIntent), anyInt(), eq(mExecutor), eq(connection)))
-                .thenReturn(true);
+        when(mContext.bindServiceAsUser(eq(mIntent), eq(connection), anyInt(),
+                eq(UserHandle.of(MAIN_USER_ID)))).thenReturn(true);
         connection.bind();
         connection.onServiceDisconnected(mComponentName);
 
@@ -151,15 +163,16 @@
     @Test
     public void testUnbind() {
         ObservableServiceConnection<Foo> connection = new ObservableServiceConnection<>(mContext,
-                mIntent, mExecutor, mTransformer);
+                mIntent, mUserTracker, mExecutor, mTransformer);
         connection.addCallback(mCallback);
         connection.onServiceDisconnected(mComponentName);
+        mExecutor.runAllReady();
 
         // Disconnects before binds should be ignored.
         verify(mCallback, never()).onDisconnected(eq(connection), anyInt());
 
-        when(mContext.bindService(eq(mIntent), anyInt(), eq(mExecutor), eq(connection)))
-                .thenReturn(true);
+        when(mContext.bindServiceAsUser(eq(mIntent), eq(connection), anyInt(),
+                eq(UserHandle.of(MAIN_USER_ID)))).thenReturn(true);
         connection.bind();
 
         mExecutor.runAllReady();
@@ -175,10 +188,11 @@
     @Test
     public void testBindServiceThrowsError() {
         ObservableServiceConnection<Foo> connection = new ObservableServiceConnection<>(mContext,
-                mIntent, mExecutor, mTransformer);
+                mIntent, mUserTracker, mExecutor, mTransformer);
         connection.addCallback(mCallback);
 
-        when(mContext.bindService(eq(mIntent), anyInt(), eq(mExecutor), eq(connection)))
+        when(mContext.bindServiceAsUser(eq(mIntent), eq(connection), anyInt(),
+                eq(UserHandle.of(MAIN_USER_ID))))
                 .thenThrow(new SecurityException());
 
         // Verify that the exception was caught and that bind returns false, and we properly
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index 6520527..e824565 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -85,6 +85,9 @@
 import com.android.internal.colorextraction.ColorExtractor;
 import com.android.internal.logging.UiEventLogger;
 import com.android.internal.statusbar.IStatusBarService;
+import com.android.launcher3.icons.BubbleBadgeIconFactory;
+import com.android.launcher3.icons.BubbleIconFactory;
+import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.biometrics.AuthController;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
@@ -125,14 +128,11 @@
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.statusbar.policy.ZenModeController;
 import com.android.wm.shell.ShellTaskOrganizer;
-import com.android.wm.shell.TaskViewTransitions;
 import com.android.wm.shell.WindowManagerShellWrapper;
 import com.android.wm.shell.bubbles.Bubble;
-import com.android.wm.shell.bubbles.BubbleBadgeIconFactory;
 import com.android.wm.shell.bubbles.BubbleData;
 import com.android.wm.shell.bubbles.BubbleDataRepository;
 import com.android.wm.shell.bubbles.BubbleEntry;
-import com.android.wm.shell.bubbles.BubbleIconFactory;
 import com.android.wm.shell.bubbles.BubbleLogger;
 import com.android.wm.shell.bubbles.BubbleStackView;
 import com.android.wm.shell.bubbles.BubbleViewInfoTask;
@@ -148,6 +148,7 @@
 import com.android.wm.shell.sysui.ShellCommandHandler;
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
+import com.android.wm.shell.taskview.TaskViewTransitions;
 
 import org.junit.After;
 import org.junit.Before;
@@ -1225,8 +1226,13 @@
         BubbleViewInfoTask.BubbleViewInfo info = BubbleViewInfoTask.BubbleViewInfo.populate(context,
                 mBubbleController,
                 mBubbleController.getStackView(),
-                new BubbleIconFactory(mContext),
-                new BubbleBadgeIconFactory(mContext),
+                new BubbleIconFactory(mContext,
+                        mContext.getResources().getDimensionPixelSize(R.dimen.bubble_size)),
+                new BubbleBadgeIconFactory(mContext,
+                        mContext.getResources().getDimensionPixelSize(R.dimen.bubble_badge_size),
+                        mContext.getResources().getColor(R.color.important_conversation),
+                        mContext.getResources().getDimensionPixelSize(
+                                com.android.internal.R.dimen.importance_ring_stroke_width)),
                 bubble,
                 true /* skipInflation */);
         verify(userContext, times(1)).getPackageManager();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java
index 3179285..c3bb771 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java
@@ -25,7 +25,6 @@
 
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.wm.shell.ShellTaskOrganizer;
-import com.android.wm.shell.TaskViewTransitions;
 import com.android.wm.shell.WindowManagerShellWrapper;
 import com.android.wm.shell.bubbles.BubbleController;
 import com.android.wm.shell.bubbles.BubbleData;
@@ -42,6 +41,7 @@
 import com.android.wm.shell.sysui.ShellCommandHandler;
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
+import com.android.wm.shell.taskview.TaskViewTransitions;
 
 import java.util.Optional;
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricSettingsRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricSettingsRepository.kt
index d8b3270..65735f0 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricSettingsRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricSettingsRepository.kt
@@ -21,7 +21,6 @@
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.flow.flowOf
 
 class FakeBiometricSettingsRepository : BiometricSettingsRepository {
 
@@ -39,12 +38,17 @@
     private val _isStrongBiometricAllowed = MutableStateFlow(false)
     override val isStrongBiometricAllowed = _isStrongBiometricAllowed.asStateFlow()
 
+    private val _isNonStrongBiometricAllowed = MutableStateFlow(false)
+    override val isNonStrongBiometricAllowed: StateFlow<Boolean>
+        get() = _isNonStrongBiometricAllowed
+
     private val _isFingerprintEnabledByDevicePolicy = MutableStateFlow(false)
     override val isFingerprintEnabledByDevicePolicy =
         _isFingerprintEnabledByDevicePolicy.asStateFlow()
 
+    private val _isFaceAuthSupportedInCurrentPosture = MutableStateFlow(false)
     override val isFaceAuthSupportedInCurrentPosture: Flow<Boolean>
-        get() = flowOf(true)
+        get() = _isFaceAuthSupportedInCurrentPosture
 
     private val _isCurrentUserInLockdown = MutableStateFlow(false)
     override val isCurrentUserInLockdown: Flow<Boolean>
@@ -66,7 +70,19 @@
         _isFaceEnrolled.value = isFaceEnrolled
     }
 
+    fun setIsFaceAuthSupportedInCurrentPosture(value: Boolean) {
+        _isFaceAuthSupportedInCurrentPosture.value = value
+    }
+
     fun setIsFaceAuthEnabled(enabled: Boolean) {
         _isFaceAuthEnabled.value = enabled
     }
+
+    fun setIsUserInLockdown(value: Boolean) {
+        _isCurrentUserInLockdown.value = value
+    }
+
+    fun setIsNonStrongBiometricAllowed(value: Boolean) {
+        _isNonStrongBiometricAllowed.value = value
+    }
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeCommandQueue.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeCommandQueue.kt
new file mode 100644
index 0000000..fe94117
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeCommandQueue.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.systemui.keyguard.data.repository
+
+import android.content.Context
+import com.android.systemui.settings.DisplayTracker
+import com.android.systemui.statusbar.CommandQueue
+import org.mockito.Mockito.mock
+
+class FakeCommandQueue : CommandQueue(mock(Context::class.java), mock(DisplayTracker::class.java)) {
+    private val callbacks = mutableListOf<Callbacks>()
+
+    override fun addCallback(callback: Callbacks) {
+        callbacks.add(callback)
+    }
+
+    override fun removeCallback(callback: Callbacks) {
+        callbacks.remove(callback)
+    }
+
+    fun doForEachCallback(func: (callback: Callbacks) -> Unit) {
+        callbacks.forEach { func(it) }
+    }
+
+    fun callbackCount(): Int = callbacks.size
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeDeviceEntryFingerprintAuthRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeDeviceEntryFingerprintAuthRepository.kt
index 00b1a40..4bfd3d6 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeDeviceEntryFingerprintAuthRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeDeviceEntryFingerprintAuthRepository.kt
@@ -30,10 +30,19 @@
     override val isRunning: Flow<Boolean>
         get() = _isRunning
 
-    override val availableFpSensorType: BiometricType?
-        get() = null
+    private var fpSensorType = MutableStateFlow<BiometricType?>(null)
+    override val availableFpSensorType: Flow<BiometricType?>
+        get() = fpSensorType
 
     fun setLockedOut(lockedOut: Boolean) {
         _isLockedOut.value = lockedOut
     }
+
+    fun setIsRunning(value: Boolean) {
+        _isRunning.value = value
+    }
+
+    fun setAvailableFpSensorType(value: BiometricType?) {
+        fpSensorType.value = value
+    }
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardBouncerRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardBouncerRepository.kt
index 1dda472..8a6d2aa 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardBouncerRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardBouncerRepository.kt
@@ -48,8 +48,6 @@
     override val showMessage = _showMessage.asStateFlow()
     private val _resourceUpdateRequests = MutableStateFlow(false)
     override val resourceUpdateRequests = _resourceUpdateRequests.asStateFlow()
-    override val bouncerPromptReason = 0
-    override val bouncerErrorMessage: CharSequence? = null
     private val _isAlternateBouncerVisible = MutableStateFlow(false)
     override val alternateBouncerVisible = _isAlternateBouncerVisible.asStateFlow()
     override var lastAlternateBouncerVisibleTime: Long = 0L
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt
index 194ed02..d411590 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt
@@ -129,6 +129,10 @@
         _isKeyguardShowing.value = isShowing
     }
 
+    fun setKeyguardGoingAway(isGoingAway: Boolean) {
+        _isKeyguardGoingAway.value = isGoingAway
+    }
+
     fun setKeyguardOccluded(isOccluded: Boolean) {
         _isKeyguardOccluded.value = isOccluded
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeTrustRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeTrustRepository.kt
new file mode 100644
index 0000000..6690de8
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeTrustRepository.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.systemui.keyguard.data.repository
+
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+
+class FakeTrustRepository : TrustRepository {
+    private val _isCurrentUserTrusted = MutableStateFlow(false)
+    override val isCurrentUserTrusted: Flow<Boolean>
+        get() = _isCurrentUserTrusted
+
+    fun setCurrentUserTrusted(trust: Boolean) {
+        _isCurrentUserTrusted.value = trust
+    }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/FakeFgsManagerController.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/FakeFgsManagerController.kt
index ced7955..9ff7dd5 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/FakeFgsManagerController.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/FakeFgsManagerController.kt
@@ -23,11 +23,9 @@
 
 /** A fake [FgsManagerController] to be used in tests. */
 class FakeFgsManagerController(
-    isAvailable: Boolean = true,
     showFooterDot: Boolean = false,
     numRunningPackages: Int = 0,
 ) : FgsManagerController {
-    override val isAvailable: MutableStateFlow<Boolean> = MutableStateFlow(isAvailable)
 
     override var numRunningPackages = numRunningPackages
         set(value) {
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/user/data/repository/FakeUserRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/user/data/repository/FakeUserRepository.kt
index 53bb340..fbc2381 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/user/data/repository/FakeUserRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/user/data/repository/FakeUserRepository.kt
@@ -100,4 +100,8 @@
     fun setGuestUserAutoCreated(value: Boolean) {
         _isGuestUserAutoCreated = value
     }
+
+    fun setUserSwitching(value: Boolean) {
+        _userSwitchingInProgress.value = value
+    }
 }
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index e159f18..7463061 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -271,6 +271,14 @@
          */
         void onClientChangeLocked(boolean serviceInfoChanged);
 
+        /**
+         * Called back to notify the system the proxy client for a device has changed.
+         *
+         * Changes include if the proxy is unregistered, if its service info list has changed, or if
+         * its focus appearance has changed.
+         */
+        void onProxyChanged(int deviceId);
+
         int getCurrentUserIdLocked();
 
         Pair<float[], MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec(
@@ -315,8 +323,6 @@
 
         void attachAccessibilityOverlayToDisplay(int displayId, SurfaceControl sc);
 
-        void setCurrentUserFocusAppearance(int strokeWidth, int color);
-
     }
 
     public AbstractAccessibilityServiceConnection(Context context, ComponentName componentName,
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 5417009..51325e7 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -25,6 +25,9 @@
 import static android.accessibilityservice.AccessibilityTrace.FLAGS_USER_BROADCAST_RECEIVER;
 import static android.accessibilityservice.AccessibilityTrace.FLAGS_WINDOW_MAGNIFICATION_CONNECTION;
 import static android.accessibilityservice.AccessibilityTrace.FLAGS_WINDOW_MANAGER_INTERNAL;
+import static android.companion.virtual.VirtualDeviceManager.ACTION_VIRTUAL_DEVICE_REMOVED;
+import static android.companion.virtual.VirtualDeviceManager.EXTRA_VIRTUAL_DEVICE_ID;
+import static android.content.Context.DEVICE_ID_DEFAULT;
 import static android.provider.Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED;
 import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
 import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
@@ -189,7 +192,7 @@
         AccessibilityUserState.ServiceInfoChangeListener,
         AccessibilityWindowManager.AccessibilityEventSender,
         AccessibilitySecurityPolicy.AccessibilityUserManager,
-        SystemActionPerformer.SystemActionsChangedListener {
+        SystemActionPerformer.SystemActionsChangedListener, ProxyManager.SystemSupport{
 
     private static final boolean DEBUG = false;
 
@@ -471,7 +474,8 @@
                 new MagnificationScaleProvider(mContext));
         mMagnificationProcessor = new MagnificationProcessor(mMagnificationController);
         mCaptioningManagerImpl = new CaptioningManagerImpl(mContext);
-        mProxyManager = new ProxyManager(mLock, mA11yWindowManager, mContext);
+        mProxyManager = new ProxyManager(mLock, mA11yWindowManager, mContext, mMainHandler,
+                mUiAutomationManager, this);
         mFlashNotificationsController = new FlashNotificationsController(mContext);
         init();
     }
@@ -862,6 +866,19 @@
         };
         mContext.registerReceiverAsUser(receiver, UserHandle.ALL, filter, null, mMainHandler,
                 Context.RECEIVER_EXPORTED);
+
+        final BroadcastReceiver virtualDeviceReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                final int deviceId = intent.getIntExtra(
+                        EXTRA_VIRTUAL_DEVICE_ID, DEVICE_ID_DEFAULT);
+                mProxyManager.clearConnections(deviceId);
+            }
+        };
+
+        final IntentFilter virtualDeviceFilter = new IntentFilter(ACTION_VIRTUAL_DEVICE_REMOVED);
+        mContext.registerReceiver(virtualDeviceReceiver, virtualDeviceFilter,
+                Context.RECEIVER_NOT_EXPORTED);
     }
 
     /**
@@ -940,21 +957,42 @@
             final int resolvedUserId = mSecurityPolicy
                     .resolveCallingUserIdEnforcingPermissionsLocked(userId);
 
+            AccessibilityUserState userState = getUserStateLocked(resolvedUserId);
+            // Support a process moving from the default device to a single virtual
+            // device.
+            final int deviceId = mProxyManager.getFirstDeviceIdForUidLocked(
+                    Binder.getCallingUid());
+            Client client = new Client(callback, Binder.getCallingUid(), userState, deviceId);
             // If the client is from a process that runs across users such as
             // the system UI or the system we add it to the global state that
             // is shared across users.
-            AccessibilityUserState userState = getUserStateLocked(resolvedUserId);
-            Client client = new Client(callback, Binder.getCallingUid(), userState);
             if (mSecurityPolicy.isCallerInteractingAcrossUsers(userId)) {
+                if (mProxyManager.isProxyedDeviceId(deviceId)) {
+                    if (DEBUG) {
+                        Slog.v(LOG_TAG, "Added global client for proxy-ed pid: "
+                                + Binder.getCallingPid() + " for device id " + deviceId
+                                + " with package names " + Arrays.toString(client.mPackageNames));
+                    }
+                    return IntPair.of(mProxyManager.getStateLocked(deviceId,
+                                    mUiAutomationManager.isUiAutomationRunningLocked()),
+                            client.mLastSentRelevantEventTypes);
+                }
                 mGlobalClients.register(callback, client);
                 if (DEBUG) {
                     Slog.i(LOG_TAG, "Added global client for pid:" + Binder.getCallingPid());
                 }
-                return IntPair.of(
-                        combineUserStateAndProxyState(getClientStateLocked(userState),
-                                mProxyManager.getStateLocked()),
-                        client.mLastSentRelevantEventTypes);
             } else {
+                // If the display belongs to a proxy connections
+                if (mProxyManager.isProxyedDeviceId(deviceId)) {
+                    if (DEBUG) {
+                        Slog.v(LOG_TAG, "Added user client for proxy-ed pid: "
+                                + Binder.getCallingPid() + " for device id " + deviceId
+                                + " with package names " + Arrays.toString(client.mPackageNames));
+                    }
+                    return IntPair.of(mProxyManager.getStateLocked(deviceId,
+                                    mUiAutomationManager.isUiAutomationRunningLocked()),
+                            client.mLastSentRelevantEventTypes);
+                }
                 userState.mUserClients.register(callback, client);
                 // If this client is not for the current user we do not
                 // return a state since it is not for the foreground user.
@@ -963,12 +1001,10 @@
                     Slog.i(LOG_TAG, "Added user client for pid:" + Binder.getCallingPid()
                             + " and userId:" + mCurrentUserId);
                 }
-                return IntPair.of(
-                        (resolvedUserId == mCurrentUserId) ? combineUserStateAndProxyState(
-                                getClientStateLocked(userState), mProxyManager.getStateLocked())
-                                : 0,
-                        client.mLastSentRelevantEventTypes);
             }
+            return IntPair.of(
+                    (resolvedUserId == mCurrentUserId) ? getClientStateLocked(userState) : 0,
+                    client.mLastSentRelevantEventTypes);
         }
     }
 
@@ -1094,7 +1130,7 @@
     }
 
     private void dispatchAccessibilityEventLocked(AccessibilityEvent event) {
-        if (mProxyManager.isProxyed(event.getDisplayId())) {
+        if (mProxyManager.isProxyedDisplay(event.getDisplayId())) {
             mProxyManager.sendAccessibilityEventLocked(event);
         } else {
             notifyAccessibilityServicesDelayedLocked(event, false);
@@ -1160,6 +1196,12 @@
         final int resolvedUserId;
         final List<AccessibilityServiceInfo> serviceInfos;
         synchronized (mLock) {
+            final int deviceId = mProxyManager.getFirstDeviceIdForUidLocked(
+                    Binder.getCallingUid());
+            if (mProxyManager.isProxyedDeviceId(deviceId)) {
+                return mProxyManager.getInstalledAndEnabledServiceInfosLocked(
+                        AccessibilityServiceInfo.FEEDBACK_ALL_MASK, deviceId);
+            }
             // We treat calls from a profile as if made by its parent as profiles
             // share the accessibility state of the parent. The call below
             // performs the current profile parent resolution.
@@ -1195,6 +1237,12 @@
         }
 
         synchronized (mLock) {
+            final int deviceId = mProxyManager.getFirstDeviceIdForUidLocked(
+                    Binder.getCallingUid());
+            if (mProxyManager.isProxyedDeviceId(deviceId)) {
+                return mProxyManager.getInstalledAndEnabledServiceInfosLocked(feedbackType,
+                        deviceId);
+            }
             // We treat calls from a profile as if made by its parent as profiles
             // share the accessibility state of the parent. The call below
             // performs the current profile parent resolution.
@@ -1239,19 +1287,25 @@
             if (resolvedUserId != mCurrentUserId) {
                 return;
             }
-            List<AccessibilityServiceConnection> services =
-                    getUserStateLocked(resolvedUserId).mBoundServices;
-            int numServices = services.size() + mProxyManager.getNumProxysLocked();
-            interfacesToInterrupt = new ArrayList<>(numServices);
-            for (int i = 0; i < services.size(); i++) {
-                AccessibilityServiceConnection service = services.get(i);
-                IBinder a11yServiceBinder = service.mService;
-                IAccessibilityServiceClient a11yServiceInterface = service.mServiceInterface;
-                if ((a11yServiceBinder != null) && (a11yServiceInterface != null)) {
-                    interfacesToInterrupt.add(a11yServiceInterface);
+
+            final int deviceId = mProxyManager.getFirstDeviceIdForUidLocked(
+                    Binder.getCallingUid());
+            if (mProxyManager.isProxyedDeviceId(deviceId)) {
+                interfacesToInterrupt = new ArrayList<>();
+                mProxyManager.addServiceInterfacesLocked(interfacesToInterrupt, deviceId);
+            } else {
+                List<AccessibilityServiceConnection> services =
+                        getUserStateLocked(resolvedUserId).mBoundServices;
+                interfacesToInterrupt = new ArrayList<>(services.size());
+                for (int i = 0; i < services.size(); i++) {
+                    AccessibilityServiceConnection service = services.get(i);
+                    IBinder a11yServiceBinder = service.mService;
+                    IAccessibilityServiceClient a11yServiceInterface = service.mServiceInterface;
+                    if ((a11yServiceBinder != null) && (a11yServiceInterface != null)) {
+                        interfacesToInterrupt.add(a11yServiceInterface);
+                    }
                 }
             }
-            mProxyManager.addServiceInterfacesLocked(interfacesToInterrupt);
         }
         for (int i = 0, count = interfacesToInterrupt.size(); i < count; i++) {
             try {
@@ -1827,7 +1881,8 @@
         return result;
     }
 
-    private void notifyClearAccessibilityCacheLocked() {
+    @Override
+    public void notifyClearAccessibilityCacheLocked() {
         AccessibilityUserState state = getCurrentUserStateLocked();
         for (int i = state.mBoundServices.size() - 1; i >= 0; i--) {
             AccessibilityServiceConnection service = state.mBoundServices.get(i);
@@ -2031,18 +2086,15 @@
         mMainHandler.post(() -> {
             broadcastToClients(userState, ignoreRemoteException(client -> {
                 int relevantEventTypes;
-                boolean changed = false;
                 synchronized (mLock) {
                     relevantEventTypes = computeRelevantEventTypesLocked(userState, client);
-
-                    if (client.mLastSentRelevantEventTypes != relevantEventTypes) {
-                        client.mLastSentRelevantEventTypes = relevantEventTypes;
-                        changed = true;
+                    if (!mProxyManager.isProxyedDeviceId(client.mDeviceId)) {
+                        if (client.mLastSentRelevantEventTypes != relevantEventTypes) {
+                            client.mLastSentRelevantEventTypes = relevantEventTypes;
+                            client.mCallback.setRelevantEventTypes(relevantEventTypes);
+                        }
                     }
                 }
-                if (changed) {
-                    client.mCallback.setRelevantEventTypes(relevantEventTypes);
-                }
             }));
         });
     }
@@ -2062,7 +2114,6 @@
                 mUiAutomationManager.getServiceInfo(), client)
                 ? mUiAutomationManager.getRelevantEventTypes()
                 : 0;
-        relevantEventTypes |= mProxyManager.getRelevantEventTypesLocked();
         return relevantEventTypes;
     }
 
@@ -2116,7 +2167,7 @@
         }
     }
 
-    private static boolean isClientInPackageAllowlist(
+    static boolean isClientInPackageAllowlist(
             @Nullable AccessibilityServiceInfo serviceInfo, Client client) {
         if (serviceInfo == null) return false;
 
@@ -2309,24 +2360,20 @@
         updateAccessibilityEnabledSettingLocked(userState);
     }
 
-    private int combineUserStateAndProxyState(int userState, int proxyState) {
-        return userState | proxyState;
+    void scheduleUpdateClientsIfNeededLocked(AccessibilityUserState userState) {
+        scheduleUpdateClientsIfNeededLocked(userState, false);
     }
 
-    void scheduleUpdateClientsIfNeededLocked(AccessibilityUserState userState) {
+    void scheduleUpdateClientsIfNeededLocked(AccessibilityUserState userState,
+            boolean forceUpdate) {
         final int clientState = getClientStateLocked(userState);
-        final int proxyState = mProxyManager.getStateLocked();
-        if ((userState.getLastSentClientStateLocked() != clientState
-                || mProxyManager.getLastSentStateLocked() != proxyState)
+        if (((userState.getLastSentClientStateLocked() != clientState || forceUpdate))
                 && (mGlobalClients.getRegisteredCallbackCount() > 0
                 || userState.mUserClients.getRegisteredCallbackCount() > 0)) {
             userState.setLastSentClientStateLocked(clientState);
-            mProxyManager.setLastStateLocked(proxyState);
-            // Send both the user and proxy state to the app for now.
-            // TODO(b/250929565): Send proxy state to proxy clients
             mMainHandler.sendMessage(obtainMessage(
                     AccessibilityManagerService::sendStateToAllClients,
-                    this, combineUserStateAndProxyState(clientState, proxyState),
+                    this, clientState,
                     userState.mUserId));
         }
     }
@@ -2346,8 +2393,13 @@
             mTraceManager.logTrace(LOG_TAG + ".sendStateToClients",
                     FLAGS_ACCESSIBILITY_MANAGER_CLIENT, "clientState=" + clientState);
         }
-        clients.broadcast(ignoreRemoteException(
-                client -> client.setState(clientState)));
+        clients.broadcastForEachCookie(ignoreRemoteException(
+                client -> {
+                    Client managerClient = ((Client) client);
+                    if (!mProxyManager.isProxyedDeviceId(managerClient.mDeviceId)) {
+                        managerClient.mCallback.setState(clientState);
+                    }
+                }));
     }
 
     private void scheduleNotifyClientsOfServicesStateChangeLocked(
@@ -2370,8 +2422,14 @@
             mTraceManager.logTrace(LOG_TAG + ".notifyClientsOfServicesStateChange",
                     FLAGS_ACCESSIBILITY_MANAGER_CLIENT, "uiTimeout=" + uiTimeout);
         }
-        clients.broadcast(ignoreRemoteException(
-                client -> client.notifyServicesStateChanged(uiTimeout)));
+
+        clients.broadcastForEachCookie(ignoreRemoteException(
+                client -> {
+                    Client managerClient = ((Client) client);
+                    if (!mProxyManager.isProxyedDeviceId(managerClient.mDeviceId)) {
+                        managerClient.mCallback.notifyServicesStateChanged(uiTimeout);
+                    }
+                }));
     }
 
     private void scheduleUpdateInputFilter(AccessibilityUserState userState) {
@@ -2444,7 +2502,6 @@
                     }
                     inputFilter = mInputFilter;
                     setInputFilter = true;
-                    mProxyManager.setAccessibilityInputFilter(mInputFilter);
                 }
                 mInputFilter.setUserAndEnabledFeatures(userState.mUserId, flags);
                 mInputFilter.setCombinedGenericMotionEventSources(
@@ -2477,6 +2534,7 @@
                         "inputFilter=" + inputFilter);
             }
             mWindowManagerService.setInputFilter(inputFilter);
+            mProxyManager.setAccessibilityInputFilter(inputFilter);
         }
     }
 
@@ -2541,6 +2599,20 @@
      * @param userState the new user state
      */
     private void onUserStateChangedLocked(AccessibilityUserState userState) {
+        onUserStateChangedLocked(userState, false);
+    }
+
+    /**
+     * Called when any property of the user state has changed.
+     *
+     * @param userState the new user state
+     * @param forceUpdate whether to force an update of the app Clients.
+     */
+    private void onUserStateChangedLocked(AccessibilityUserState userState, boolean forceUpdate) {
+        if (DEBUG) {
+            Slog.v(LOG_TAG, "onUserStateChangedLocked for user " + userState.mUserId + " with "
+                    + "forceUpdate: " + forceUpdate);
+        }
         // TODO: Remove this hack
         mInitialized = true;
         updateLegacyCapabilitiesLocked(userState);
@@ -2553,7 +2625,7 @@
         scheduleUpdateFingerprintGestureHandling(userState);
         scheduleUpdateInputFilter(userState);
         updateRelevantEventsLocked(userState);
-        scheduleUpdateClientsIfNeededLocked(userState);
+        scheduleUpdateClientsIfNeededLocked(userState, forceUpdate);
         updateAccessibilityShortcutKeyTargetsLocked(userState);
         updateAccessibilityButtonTargetsLocked(userState);
         // Update the capabilities before the mode because we will check the current mode is
@@ -2600,7 +2672,7 @@
             if (display != null) {
                 if (observingWindows) {
                     mA11yWindowManager.startTrackingWindows(display.getDisplayId(),
-                            mProxyManager.isProxyed(display.getDisplayId()));
+                            mProxyManager.isProxyedDisplay(display.getDisplayId()));
                 } else {
                     mA11yWindowManager.stopTrackingWindows(display.getDisplayId());
                 }
@@ -2867,6 +2939,8 @@
                 mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, 0,
                 userState.mUserId);
+
+        mProxyManager.updateTimeoutsIfNeeded(nonInteractiveUiTimeout, interactiveUiTimeout);
         if (nonInteractiveUiTimeout != userState.getUserNonInteractiveUiTimeoutLocked()
                 || interactiveUiTimeout != userState.getUserInteractiveUiTimeoutLocked()) {
             userState.setUserNonInteractiveUiTimeoutLocked(nonInteractiveUiTimeout);
@@ -3632,8 +3706,14 @@
         }
 
         synchronized(mLock) {
-            final AccessibilityUserState userState = getCurrentUserStateLocked();
-            return getRecommendedTimeoutMillisLocked(userState);
+            final int deviceId = mProxyManager.getFirstDeviceIdForUidLocked(
+                    Binder.getCallingUid());
+            if (mProxyManager.isProxyedDeviceId(deviceId)) {
+                return mProxyManager.getRecommendedTimeoutMillisLocked(deviceId);
+            } else {
+                final AccessibilityUserState userState = getCurrentUserStateLocked();
+                return getRecommendedTimeoutMillisLocked(userState);
+            }
         }
     }
 
@@ -3712,6 +3792,11 @@
             mTraceManager.logTrace(LOG_TAG + ".getFocusStrokeWidth", FLAGS_ACCESSIBILITY_MANAGER);
         }
         synchronized (mLock) {
+            final int deviceId = mProxyManager.getFirstDeviceIdForUidLocked(
+                    Binder.getCallingUid());
+            if (mProxyManager.isProxyedDeviceId(deviceId)) {
+                return mProxyManager.getFocusStrokeWidthLocked(deviceId);
+            }
             final AccessibilityUserState userState = getCurrentUserStateLocked();
 
             return userState.getFocusStrokeWidthLocked();
@@ -3728,6 +3813,11 @@
             mTraceManager.logTrace(LOG_TAG + ".getFocusColor", FLAGS_ACCESSIBILITY_MANAGER);
         }
         synchronized (mLock) {
+            final int deviceId = mProxyManager.getFirstDeviceIdForUidLocked(
+                    Binder.getCallingUid());
+            if (mProxyManager.isProxyedDeviceId(deviceId)) {
+                return mProxyManager.getFocusColorLocked(deviceId);
+            }
             final AccessibilityUserState userState = getCurrentUserStateLocked();
 
             return userState.getFocusColorLocked();
@@ -3814,9 +3904,9 @@
             throw new IllegalArgumentException("The display " + displayId + " does not exist or is"
                     + " not tracked by accessibility.");
         }
-        if (mProxyManager.isProxyed(displayId)) {
+        if (mProxyManager.isProxyedDisplay(displayId)) {
             throw new IllegalArgumentException("The display " + displayId + " is already being"
-                    + "proxy-ed");
+                    + " proxy-ed");
         }
 
         final long identity = Binder.clearCallingIdentity();
@@ -3847,7 +3937,7 @@
     }
 
     boolean isDisplayProxyed(int displayId) {
-        return mProxyManager.isProxyed(displayId);
+        return mProxyManager.isProxyedDisplay(displayId);
     }
 
     @Override
@@ -3995,13 +4085,71 @@
 
     @Override
     public void onClientChangeLocked(boolean serviceInfoChanged) {
+        onClientChangeLocked(serviceInfoChanged, false);
+    }
+
+    /**
+     * Called when the state of a service or proxy has changed
+     * @param serviceInfoChanged if the service info has changed
+     * @param forceUpdate whether to force an update of state for app clients
+     */
+    public void onClientChangeLocked(boolean serviceInfoChanged, boolean forceUpdate) {
         AccessibilityUserState userState = getUserStateLocked(mCurrentUserId);
-        onUserStateChangedLocked(userState);
+        onUserStateChangedLocked(userState, forceUpdate);
         if (serviceInfoChanged) {
             scheduleNotifyClientsOfServicesStateChangeLocked(userState);
         }
     }
 
+
+    @Override
+    public void onProxyChanged(int deviceId) {
+        mProxyManager.onProxyChanged(deviceId);
+    }
+
+    /**
+     * Removes the device from tracking. This will reset any AccessibilityManagerClients to be
+     * associated with the default user id.
+     */
+    @Override
+    public void removeDeviceIdLocked(int deviceId) {
+        resetClientsLocked(deviceId, getCurrentUserStateLocked().mUserClients);
+        resetClientsLocked(deviceId, mGlobalClients);
+        // Force an update of A11yManagers if the state was previously a proxy state and needs to be
+        // returned to the default device state.
+        onClientChangeLocked(true, true);
+    }
+
+    private void resetClientsLocked(int deviceId,
+            RemoteCallbackList<IAccessibilityManagerClient> clients) {
+        if (clients == null || clients.getRegisteredCallbackCount() == 0) {
+            return;
+        }
+        synchronized (mLock) {
+            for (int i = 0; i < clients.getRegisteredCallbackCount(); i++) {
+                final Client appClient = ((Client) clients.getRegisteredCallbackCookie(i));
+                if (appClient.mDeviceId == deviceId) {
+                    appClient.mDeviceId = DEVICE_ID_DEFAULT;
+                }
+            }
+        }
+    }
+
+    @Override
+    public void updateWindowsForAccessibilityCallbackLocked() {
+        updateWindowsForAccessibilityCallbackLocked(getUserStateLocked(mCurrentUserId));
+    }
+
+    @Override
+    public RemoteCallbackList<IAccessibilityManagerClient> getGlobalClientsLocked() {
+        return mGlobalClients;
+    }
+
+    @Override
+    public RemoteCallbackList<IAccessibilityManagerClient> getCurrentUserClientsLocked() {
+        return getCurrentUserState().mUserClients;
+    }
+
     @Override
     public void onShellCommand(FileDescriptor in, FileDescriptor out,
             FileDescriptor err, String[] args, ShellCallback callback,
@@ -4313,13 +4461,22 @@
         final IAccessibilityManagerClient mCallback;
         final String[] mPackageNames;
         int mLastSentRelevantEventTypes;
+        int mUid;
+        int mDeviceId = DEVICE_ID_DEFAULT;
 
         private Client(IAccessibilityManagerClient callback, int clientUid,
-                AccessibilityUserState userState) {
+                AccessibilityUserState userState, int deviceId) {
             mCallback = callback;
             mPackageNames = mPackageManager.getPackagesForUid(clientUid);
+            mUid = clientUid;
+            mDeviceId = deviceId;
             synchronized (mLock) {
-                mLastSentRelevantEventTypes = computeRelevantEventTypesLocked(userState, this);
+                if (mProxyManager.isProxyedDeviceId(deviceId)) {
+                    mLastSentRelevantEventTypes =
+                            mProxyManager.computeRelevantEventTypesLocked(this);
+                } else {
+                    mLastSentRelevantEventTypes = computeRelevantEventTypesLocked(userState, this);
+                }
             }
         }
     }
@@ -4805,8 +4962,10 @@
         }
         mMainHandler.post(() -> {
             broadcastToClients(userState, ignoreRemoteException(client -> {
-                client.mCallback.setFocusAppearance(userState.getFocusStrokeWidthLocked(),
-                        userState.getFocusColorLocked());
+                if (!mProxyManager.isProxyedDeviceId(client.mDeviceId)) {
+                    client.mCallback.setFocusAppearance(userState.getFocusStrokeWidthLocked(),
+                            userState.getFocusColorLocked());
+                }
             }));
         });
 
@@ -5041,11 +5200,4 @@
         transaction.apply();
         transaction.close();
     }
-
-    @Override
-    public void setCurrentUserFocusAppearance(int strokeWidth, int color) {
-        synchronized (mLock) {
-            getCurrentUserStateLocked().setFocusAppearanceLocked(strokeWidth, color);
-        }
-    }
 }
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
index 0e25a06..baed181 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
@@ -201,7 +201,8 @@
         private List<AccessibilityWindowInfo> mWindows;
         private boolean mTrackingWindows = false;
         private boolean mHasWatchOutsideTouchWindow;
-        private int mProxyDisplayAccessibilityFocusedWindow;
+        private int mProxyDisplayAccessibilityFocusedWindow =
+                AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
         private boolean mIsProxy;
 
         /**
diff --git a/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java
index b19a502..ab01fc3 100644
--- a/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java
@@ -67,6 +67,7 @@
 public class ProxyAccessibilityServiceConnection extends AccessibilityServiceConnection {
     private static final String LOG_TAG = "ProxyAccessibilityServiceConnection";
 
+    private int mDeviceId;
     private int mDisplayId;
     private List<AccessibilityServiceInfo> mInstalledAndEnabledServices;
 
@@ -75,6 +76,9 @@
     /** The color of the focus rectangle */
     private int mFocusColor;
 
+    private int mInteractiveTimeout;
+    private int mNonInteractiveTimeout;
+
     ProxyAccessibilityServiceConnection(
             Context context,
             ComponentName componentName,
@@ -83,7 +87,7 @@
             AccessibilitySecurityPolicy securityPolicy,
             SystemSupport systemSupport, AccessibilityTrace trace,
             WindowManagerInternal windowManagerInternal,
-            AccessibilityWindowManager awm, int displayId) {
+            AccessibilityWindowManager awm, int displayId, int deviceId) {
         super(/* userState= */null, context, componentName, accessibilityServiceInfo, id,
                 mainHandler, lock, securityPolicy, systemSupport, trace, windowManagerInternal,
                 /* systemActionPerformer= */ null, awm, /* activityTaskManagerService= */ null);
@@ -93,6 +97,14 @@
                 R.dimen.accessibility_focus_highlight_stroke_width);
         mFocusColor = mContext.getResources().getColor(
                 R.color.accessibility_focus_highlight_color);
+        mDeviceId = deviceId;
+    }
+
+    int getDisplayId() {
+        return mDisplayId;
+    }
+    int getDeviceId() {
+        return mDeviceId;
     }
 
     /**
@@ -155,6 +167,8 @@
                 proxyInfo.setAccessibilityTool(isAccessibilityTool);
                 proxyInfo.setInteractiveUiTimeoutMillis(interactiveUiTimeout);
                 proxyInfo.setNonInteractiveUiTimeoutMillis(nonInteractiveUiTimeout);
+                mInteractiveTimeout = interactiveUiTimeout;
+                mNonInteractiveTimeout = nonInteractiveUiTimeout;
 
                 // If any one service info doesn't set package names, i.e. if it's interested in all
                 // apps, the proxy shouldn't filter by package name even if some infos specify this.
@@ -167,7 +181,7 @@
                 // Update connection with mAccessibilityServiceInfo values.
                 setDynamicallyConfigurableProperties(proxyInfo);
                 // Notify manager service.
-                mSystemSupport.onClientChangeLocked(true);
+                mSystemSupport.onProxyChanged(mDeviceId);
             }
         } finally {
             Binder.restoreCallingIdentity(identity);
@@ -235,12 +249,7 @@
 
             mFocusStrokeWidth = strokeWidth;
             mFocusColor = color;
-            // Sets the appearance data in the A11yUserState for now, since the A11yManagers are not
-            // separated.
-            // TODO(254545943): Separate proxy and non-proxy states so the focus appearance on the
-            // phone is not affected by the appearance of a proxy-ed app.
-            mSystemSupport.setCurrentUserFocusAppearance(mFocusStrokeWidth, mFocusColor);
-            mSystemSupport.onClientChangeLocked(false);
+            mSystemSupport.onProxyChanged(mDeviceId);
         }
     }
 
@@ -572,17 +581,51 @@
         throw new UnsupportedOperationException("setAnimationScale is not supported");
     }
 
+    public int getInteractiveTimeout() {
+        return mInteractiveTimeout;
+    }
+
+    public int getNonInteractiveTimeout() {
+        return mNonInteractiveTimeout;
+    }
+
+    /**
+     * Returns true if a timeout was updated.
+     */
+    public boolean updateTimeouts(int nonInteractiveUiTimeout, int interactiveUiTimeout) {
+        final int newInteractiveUiTimeout = interactiveUiTimeout != 0
+                ? interactiveUiTimeout
+                : mAccessibilityServiceInfo.getInteractiveUiTimeoutMillis();
+        final int newNonInteractiveUiTimeout = nonInteractiveUiTimeout != 0
+                ? nonInteractiveUiTimeout
+                : mAccessibilityServiceInfo.getNonInteractiveUiTimeoutMillis();
+        boolean updated = false;
+
+        if (mInteractiveTimeout != newInteractiveUiTimeout) {
+            mInteractiveTimeout =  newInteractiveUiTimeout;
+            updated = true;
+        }
+        if (mNonInteractiveTimeout != newNonInteractiveUiTimeout) {
+            mNonInteractiveTimeout = newNonInteractiveUiTimeout;
+            updated = true;
+        }
+        return updated;
+    }
+
     @Override
     public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) {
         if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return;
         synchronized (mLock) {
             pw.append("Proxy[displayId=" + mDisplayId);
+            pw.append(", deviceId=" + mDeviceId);
             pw.append(", feedbackType"
                     + AccessibilityServiceInfo.feedbackTypeToString(mFeedbackType));
             pw.append(", capabilities=" + mAccessibilityServiceInfo.getCapabilities());
             pw.append(", eventTypes="
                     + AccessibilityEvent.eventTypeToString(mEventTypes));
             pw.append(", notificationTimeout=" + mNotificationTimeout);
+            pw.append(", nonInteractiveUiTimeout=").append(String.valueOf(mNonInteractiveTimeout));
+            pw.append(", interactiveUiTimeout=").append(String.valueOf(mInteractiveTimeout));
             pw.append(", focusStrokeWidth=").append(String.valueOf(mFocusStrokeWidth));
             pw.append(", focusColor=").append(String.valueOf(mFocusColor));
             pw.append(", installedAndEnabledServiceCount=").append(String.valueOf(
diff --git a/services/accessibility/java/com/android/server/accessibility/ProxyManager.java b/services/accessibility/java/com/android/server/accessibility/ProxyManager.java
index e258de1..d417197 100644
--- a/services/accessibility/java/com/android/server/accessibility/ProxyManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/ProxyManager.java
@@ -14,26 +14,45 @@
  * limitations under the License.
  */
 package com.android.server.accessibility;
+
+import static android.content.Context.DEVICE_ID_DEFAULT;
+import static android.content.Context.DEVICE_ID_INVALID;
+
+import static com.android.internal.util.FunctionalUtils.ignoreRemoteException;
+
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.accessibilityservice.AccessibilityTrace;
 import android.accessibilityservice.IAccessibilityServiceClient;
+import android.annotation.NonNull;
+import android.companion.virtual.VirtualDeviceManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.hardware.display.DisplayManager;
 import android.os.Handler;
 import android.os.IBinder;
+import android.os.RemoteCallbackList;
 import android.os.RemoteException;
+import android.util.IntArray;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.SparseIntArray;
 import android.view.Display;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.IAccessibilityManagerClient;
 
+import com.android.internal.util.IntPair;
+import com.android.server.LocalServices;
+import com.android.server.companion.virtual.VirtualDeviceManagerInternal;
 import com.android.server.wm.WindowManagerInternal;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Set;
+import java.util.function.Consumer;
 
 /**
  * Manages proxy connections.
@@ -53,26 +72,72 @@
     static final String PROXY_COMPONENT_PACKAGE_NAME = "ProxyPackage";
     static final String PROXY_COMPONENT_CLASS_NAME = "ProxyClass";
 
+    // AMS#mLock
     private final Object mLock;
 
     private final Context mContext;
+    private final Handler mMainHandler;
 
-    // Used to determine if we should notify AccessibilityManager clients of updates.
-    // TODO(254545943): Separate this so each display id has its own state. Currently there is no
-    // way to identify from AccessibilityManager which proxy state should be returned.
-    private int mLastState = -1;
+    private final UiAutomationManager mUiAutomationManager;
 
-    private SparseArray<ProxyAccessibilityServiceConnection> mProxyA11yServiceConnections =
+    // Device Id -> state. Used to determine if we should notify AccessibilityManager clients of
+    // updates.
+    private final SparseIntArray mLastStates = new SparseIntArray();
+
+    // Each display id entry in a SparseArray represents a proxy a11y user.
+    private final SparseArray<ProxyAccessibilityServiceConnection> mProxyA11yServiceConnections =
             new SparseArray<>();
 
-    private AccessibilityWindowManager mA11yWindowManager;
+    private final AccessibilityWindowManager mA11yWindowManager;
 
     private AccessibilityInputFilter mA11yInputFilter;
 
-    ProxyManager(Object lock, AccessibilityWindowManager awm, Context context) {
+    private VirtualDeviceManagerInternal mLocalVdm;
+
+    private final SystemSupport mSystemSupport;
+
+    /**
+     * Callbacks into AccessibilityManagerService.
+     */
+    public interface SystemSupport {
+        /**
+         * Removes the device id from tracking.
+         */
+        void removeDeviceIdLocked(int deviceId);
+
+        /**
+         * Updates the windows tracking for the current user.
+         */
+        void updateWindowsForAccessibilityCallbackLocked();
+
+        /**
+         * Clears all caches.
+         */
+        void notifyClearAccessibilityCacheLocked();
+
+        /**
+         * Gets the clients for all users.
+         */
+        @NonNull
+        RemoteCallbackList<IAccessibilityManagerClient> getGlobalClientsLocked();
+
+        /**
+         * Gets the clients for the current user.
+         */
+        @NonNull
+        RemoteCallbackList<IAccessibilityManagerClient> getCurrentUserClientsLocked();
+    }
+
+    ProxyManager(Object lock, AccessibilityWindowManager awm,
+            Context context, Handler mainHandler, UiAutomationManager uiAutomationManager,
+            SystemSupport systemSupport) {
         mLock = lock;
         mA11yWindowManager = awm;
         mContext = context;
+        mMainHandler = mainHandler;
+        mUiAutomationManager = uiAutomationManager;
+        mSystemSupport = systemSupport;
+        mLocalVdm = LocalServices.getService(VirtualDeviceManagerInternal.class);
     }
 
     /**
@@ -89,6 +154,12 @@
             Slog.v(LOG_TAG, "Register proxy for display id: " + displayId);
         }
 
+        VirtualDeviceManager vdm = mContext.getSystemService(VirtualDeviceManager.class);
+        if (vdm == null) {
+            return;
+        }
+        final int deviceId = vdm.getDeviceIdForDisplayId(displayId);
+
         // Set a default AccessibilityServiceInfo that is used before the proxy's info is
         // populated. A proxy has the touch exploration and window capabilities.
         AccessibilityServiceInfo info = new AccessibilityServiceInfo();
@@ -101,7 +172,7 @@
                 new ProxyAccessibilityServiceConnection(context, info.getComponentName(), info,
                         id, mainHandler, mLock, securityPolicy, systemSupport, trace,
                         windowManagerInternal,
-                        mA11yWindowManager, displayId);
+                        mA11yWindowManager, displayId, deviceId);
 
         synchronized (mLock) {
             mProxyA11yServiceConnections.put(displayId, connection);
@@ -113,20 +184,16 @@
                     @Override
                     public void binderDied() {
                         client.asBinder().unlinkToDeath(this, 0);
-                        clearConnection(displayId);
+                        clearConnectionAndUpdateState(displayId);
                     }
                 };
         client.asBinder().linkToDeath(deathRecipient, 0);
 
-        // Notify apps that the service state has changed.
-        // A11yManager#A11yServicesStateChangeListener
-        synchronized (mLock) {
-            connection.mSystemSupport.onClientChangeLocked(true);
-        }
-
-        if (mA11yInputFilter != null) {
-            mA11yInputFilter.disableFeaturesForDisplayIfInstalled(displayId);
-        }
+        mMainHandler.post(() -> {
+            if (mA11yInputFilter != null) {
+                mA11yInputFilter.disableFeaturesForDisplayIfInstalled(displayId);
+            }
+        });
         connection.initializeServiceInterface(client);
     }
 
@@ -134,38 +201,101 @@
      * Unregister the proxy based on display id.
      */
     public boolean unregisterProxy(int displayId) {
-        return clearConnection(displayId);
-    }
-
-    private boolean clearConnection(int displayId) {
-        boolean removed = false;
-        synchronized (mLock) {
-            if (mProxyA11yServiceConnections.contains(displayId)) {
-                mProxyA11yServiceConnections.remove(displayId);
-                removed = true;
-                if (DEBUG) {
-                    Slog.v(LOG_TAG, "Unregister proxy for display id " + displayId);
-                }
-            }
-        }
-        if (removed) {
-            mA11yWindowManager.stopTrackingDisplayProxy(displayId);
-            if (mA11yInputFilter != null) {
-                final DisplayManager displayManager = (DisplayManager)
-                        mContext.getSystemService(Context.DISPLAY_SERVICE);
-                final Display proxyDisplay = displayManager.getDisplay(displayId);
-                if (proxyDisplay != null) {
-                    mA11yInputFilter.enableFeaturesForDisplayIfInstalled(proxyDisplay);
-                }
-            }
-        }
-        return removed;
+        return clearConnectionAndUpdateState(displayId);
     }
 
     /**
-     * Checks if a display id is being proxy-ed.
+     * Clears all proxy connections belonging to {@code deviceId}.
      */
-    public boolean isProxyed(int displayId) {
+    public void clearConnections(int deviceId) {
+        final IntArray displaysToClear = new IntArray();
+        synchronized (mLock) {
+            for (int i = 0; i < mProxyA11yServiceConnections.size(); i++) {
+                final ProxyAccessibilityServiceConnection proxy =
+                        mProxyA11yServiceConnections.valueAt(i);
+                if (proxy != null && proxy.getDeviceId() == deviceId) {
+                    displaysToClear.add(proxy.getDisplayId());
+                }
+            }
+        }
+        for (int i = 0; i < displaysToClear.size(); i++) {
+            clearConnectionAndUpdateState(displaysToClear.get(i));
+        }
+    }
+
+    /**
+     * Removes the system connection of an AccessibilityDisplayProxy.
+     *
+     * This will:
+     * <ul>
+     * <li> Reset Clients to belong to the default device if appropriate.
+     * <li> Stop identifying the display's a11y windows as belonging to a proxy.
+     * <li> Re-enable any input filters for the display.
+     * <li> Notify AMS that a proxy has been removed.
+     * </ul>
+     *
+     * @param displayId the display id of the connection to be cleared.
+     * @return whether the proxy was removed.
+     */
+    private boolean clearConnectionAndUpdateState(int displayId) {
+        boolean removedFromConnections = false;
+        int deviceId = DEVICE_ID_INVALID;
+        synchronized (mLock) {
+            if (mProxyA11yServiceConnections.contains(displayId)) {
+                deviceId = mProxyA11yServiceConnections.get(displayId).getDeviceId();
+                mProxyA11yServiceConnections.remove(displayId);
+                removedFromConnections = true;
+            }
+        }
+
+        if (removedFromConnections) {
+            updateStateForRemovedDisplay(displayId, deviceId);
+        }
+
+        if (DEBUG) {
+            Slog.v(LOG_TAG, "Unregistered proxy for display id " + displayId + ": "
+                    + removedFromConnections);
+        }
+        return removedFromConnections;
+    }
+
+    /**
+     * When the connection is removed from tracking in ProxyManager, propagate changes to other a11y
+     * system components like the input filter and IAccessibilityManagerClients.
+     */
+    public void updateStateForRemovedDisplay(int displayId, int deviceId) {
+        mA11yWindowManager.stopTrackingDisplayProxy(displayId);
+        // A11yInputFilter isn't thread-safe, so post on the system thread.
+        mMainHandler.post(
+                () -> {
+                    if (mA11yInputFilter != null) {
+                        final DisplayManager displayManager = (DisplayManager)
+                                mContext.getSystemService(Context.DISPLAY_SERVICE);
+                        final Display proxyDisplay = displayManager.getDisplay(displayId);
+                        if (proxyDisplay != null) {
+                            // A11yInputFilter isn't thread-safe, so post on the system thread.
+                            mA11yInputFilter.enableFeaturesForDisplayIfInstalled(proxyDisplay);
+                        }
+                    }
+                });
+        // If there isn't an existing proxy for the device id, reset clients. Resetting
+        // will usually happen, since in most cases there will only be one proxy for a
+        // device.
+        if (!isProxyedDeviceId(deviceId)) {
+            synchronized (mLock) {
+                mSystemSupport.removeDeviceIdLocked(deviceId);
+                mLastStates.delete(deviceId);
+            }
+        } else {
+            // Update with the states of the remaining proxies.
+            onProxyChanged(deviceId);
+        }
+    }
+
+    /**
+     * Returns {@code true} if {@code displayId} is being proxy-ed.
+     */
+    public boolean isProxyedDisplay(int displayId) {
         synchronized (mLock) {
             final boolean tracked = mProxyA11yServiceConnections.contains(displayId);
             if (DEBUG) {
@@ -176,6 +306,23 @@
     }
 
     /**
+     * Returns {@code true} if {@code deviceId} is being proxy-ed.
+     */
+    public boolean isProxyedDeviceId(int deviceId) {
+        if (deviceId == DEVICE_ID_DEFAULT && deviceId == DEVICE_ID_INVALID) {
+            return false;
+        }
+        boolean isTrackingDeviceId;
+        synchronized (mLock) {
+            isTrackingDeviceId = getFirstProxyForDeviceIdLocked(deviceId) != null;
+        }
+        if (DEBUG) {
+            Slog.v(LOG_TAG, "Tracking device " + deviceId + " : " + isTrackingDeviceId);
+        }
+        return isTrackingDeviceId;
+    }
+
+    /**
      * Sends AccessibilityEvents to a proxy given the event's displayId.
      */
     public void sendAccessibilityEventLocked(AccessibilityEvent event) {
@@ -213,15 +360,37 @@
     /**
      * If there is at least one proxy, accessibility is enabled.
      */
-    public int getStateLocked() {
+    public int getStateLocked(int deviceId, boolean automationRunning) {
         int clientState = 0;
-        final boolean a11yEnabled = mProxyA11yServiceConnections.size() > 0;
-        if (a11yEnabled) {
+        if (automationRunning) {
             clientState |= AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED;
         }
         for (int i = 0; i < mProxyA11yServiceConnections.size(); i++) {
             final ProxyAccessibilityServiceConnection proxy =
                     mProxyA11yServiceConnections.valueAt(i);
+            if (proxy != null && proxy.getDeviceId() == deviceId) {
+                // Combine proxy states.
+                clientState |= getStateForDisplayIdLocked(proxy);
+            }
+        }
+
+        if (DEBUG) {
+            Slog.v(LOG_TAG, "For device id " + deviceId + " a11y is enabled: "
+                    + ((clientState & AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED) != 0));
+            Slog.v(LOG_TAG, "For device id " + deviceId + " touch exploration is enabled: "
+                    + ((clientState & AccessibilityManager.STATE_FLAG_TOUCH_EXPLORATION_ENABLED)
+                            != 0));
+        }
+        return clientState;
+    }
+
+    /**
+     * If there is at least one proxy, accessibility is enabled.
+     */
+    public int getStateForDisplayIdLocked(ProxyAccessibilityServiceConnection proxy) {
+        int clientState = 0;
+        if (proxy != null) {
+            clientState |= AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED;
             if (proxy.mRequestTouchExplorationMode) {
                 clientState |= AccessibilityManager.STATE_FLAG_TOUCH_EXPLORATION_ENABLED;
             }
@@ -235,61 +404,396 @@
                             != 0));
         }
         return clientState;
-        // TODO(b/254545943): When A11yManager is separated, include support for other properties.
     }
 
     /**
-     * Gets the last state.
+     * Gets the last state for a device.
      */
-    public int getLastSentStateLocked() {
-        return mLastState;
+    public int getLastSentStateLocked(int deviceId) {
+        return mLastStates.get(deviceId, 0);
     }
 
     /**
-     * Sets the last state.
+     * Sets the last state for a device.
      */
-    public void setLastStateLocked(int proxyState) {
-        mLastState = proxyState;
+    public void setLastStateLocked(int deviceId, int proxyState) {
+        mLastStates.put(deviceId, proxyState);
     }
 
     /**
-     * Returns the relevant event types of every proxy.
-     * TODO(254545943): When A11yManager is separated, return based on the A11yManager display.
+     * Updates the relevant event types of the app clients that are shown on a display owned by the
+     * specified device.
+     *
+     * A client belongs to a device id, so event types (and other state) is determined by the device
+     * id. In most cases, a device owns a single display. But if multiple displays may belong to one
+     * Virtual Device, the app clients will get the aggregated event types for all proxy-ed displays
+     * belonging to a VirtualDevice.
      */
-    public int getRelevantEventTypesLocked() {
+    public void updateRelevantEventTypesLocked(int deviceId) {
+        if (!isProxyedDeviceId(deviceId)) {
+            return;
+        }
+        mMainHandler.post(() -> {
+            synchronized (mLock) {
+                broadcastToClientsLocked(ignoreRemoteException(client -> {
+                    int relevantEventTypes;
+                    if (client.mDeviceId == deviceId) {
+                        relevantEventTypes = computeRelevantEventTypesLocked(client);
+                        if (client.mLastSentRelevantEventTypes != relevantEventTypes) {
+                            client.mLastSentRelevantEventTypes = relevantEventTypes;
+                            client.mCallback.setRelevantEventTypes(relevantEventTypes);
+                        }
+                    }
+                }));
+            }
+        });
+    }
+
+    /**
+     * Returns the relevant event types for a Client.
+     */
+    int computeRelevantEventTypesLocked(AccessibilityManagerService.Client client) {
         int relevantEventTypes = 0;
         for (int i = 0; i < mProxyA11yServiceConnections.size(); i++) {
-            ProxyAccessibilityServiceConnection proxy =
+            final ProxyAccessibilityServiceConnection proxy =
                     mProxyA11yServiceConnections.valueAt(i);
-            relevantEventTypes |= proxy.getRelevantEventTypes();
+            if (proxy != null && proxy.getDeviceId() == client.mDeviceId) {
+                relevantEventTypes |= proxy.getRelevantEventTypes();
+                relevantEventTypes |= AccessibilityManagerService.isClientInPackageAllowlist(
+                        mUiAutomationManager.getServiceInfo(), client)
+                        ? mUiAutomationManager.getRelevantEventTypes()
+                        : 0;
+            }
         }
         if (DEBUG) {
-            Slog.v(LOG_TAG, "Relevant event types for all proxies: "
-                    + AccessibilityEvent.eventTypeToString(relevantEventTypes));
+            Slog.v(LOG_TAG, "Relevant event types for device id " + client.mDeviceId
+                    + ": " + AccessibilityEvent.eventTypeToString(relevantEventTypes));
         }
         return relevantEventTypes;
     }
 
     /**
-     * Gets the number of current proxy connections.
-     * @return
-     */
-    public int getNumProxysLocked() {
-        return mProxyA11yServiceConnections.size();
-    }
-
-    /**
      * Adds the service interfaces to a list.
-     * @param interfaces
+     * @param interfaces the list to add to.
+     * @param deviceId the device id of the interested app client.
      */
-    public void addServiceInterfacesLocked(List<IAccessibilityServiceClient> interfaces) {
+    public void addServiceInterfacesLocked(@NonNull List<IAccessibilityServiceClient> interfaces,
+            int deviceId) {
         for (int i = 0; i < mProxyA11yServiceConnections.size(); i++) {
             final ProxyAccessibilityServiceConnection proxy =
                     mProxyA11yServiceConnections.valueAt(i);
-            final IBinder proxyBinder = proxy.mService;
-            final IAccessibilityServiceClient proxyInterface = proxy.mServiceInterface;
-            if ((proxyBinder != null) && (proxyInterface != null)) {
-                interfaces.add(proxyInterface);
+            if (proxy != null && proxy.getDeviceId() == deviceId) {
+                final IBinder proxyBinder = proxy.mService;
+                final IAccessibilityServiceClient proxyInterface = proxy.mServiceInterface;
+                if ((proxyBinder != null) && (proxyInterface != null)) {
+                    interfaces.add(proxyInterface);
+                }
+            }
+        }
+    }
+
+    /**
+     * Gets the list of installed and enabled services for a device id.
+     *
+     * Note: Multiple display proxies may belong to the same device.
+     */
+    public List<AccessibilityServiceInfo> getInstalledAndEnabledServiceInfosLocked(int feedbackType,
+            int deviceId) {
+        List<AccessibilityServiceInfo> serviceInfos = new ArrayList<>();
+        for (int i = 0; i < mProxyA11yServiceConnections.size(); i++) {
+            final ProxyAccessibilityServiceConnection proxy =
+                    mProxyA11yServiceConnections.valueAt(i);
+            if (proxy != null && proxy.getDeviceId() == deviceId) {
+                // Return all proxy infos for ALL mask.
+                if (feedbackType == AccessibilityServiceInfo.FEEDBACK_ALL_MASK) {
+                    serviceInfos.addAll(proxy.getInstalledAndEnabledServices());
+                } else if ((proxy.mFeedbackType & feedbackType) != 0) {
+                    List<AccessibilityServiceInfo> proxyInfos =
+                            proxy.getInstalledAndEnabledServices();
+                    // Iterate through each info in the proxy.
+                    for (AccessibilityServiceInfo info : proxyInfos) {
+                        if ((info.feedbackType & feedbackType) != 0) {
+                            serviceInfos.add(info);
+                        }
+                    }
+                }
+            }
+        }
+        return serviceInfos;
+    }
+
+    /**
+     * Handles proxy changes.
+     *
+     * <p>
+     * Changes include if the proxy is unregistered, its service info list has
+     * changed, or its focus appearance has changed.
+     * <p>
+     * Some responses may include updating app clients. A client belongs to a device id, so state is
+     * determined by the device id. In most cases, a device owns a single display. But if multiple
+     * displays belong to one Virtual Device, the app clients will get a difference in
+     * behavior depending on what is being updated.
+     *
+     * The following state methods are updated for AccessibilityManager clients belonging to a
+     * proxied device:
+     * <ul>
+     * <li> A11yManager#setRelevantEventTypes - The combined event types of all proxies belonging to
+     * a device id.
+     * <li> A11yManager#setState - The combined states of all proxies belonging to a device id.
+     * <li> A11yManager#notifyServicesStateChanged(timeout) - The highest of all proxies belonging
+     * to a device id.
+     * <li> A11yManager#setFocusAppearance - The appearance of the most recently updated display id
+     * belonging to the device.
+     * </ul>
+     * This is similar to onUserStateChangeLocked and onClientChangeLocked, but does not require an
+     * A11yUserState and only checks proxy-relevant settings.
+     */
+    public void onProxyChanged(int deviceId) {
+        if (DEBUG) {
+            Slog.v(LOG_TAG, "onProxyChanged called for deviceId: " + deviceId);
+        }
+        //The following state updates are excluded:
+        //  - Input-related state
+        //  - Primary-device / hardware-specific state
+        synchronized (mLock) {
+            // A proxy may be registered after the client has been initialized in #addClient.
+            // For example, a user does not turn on accessibility until after the app has launched.
+            // Or the process was started with a default id context and should shift to a device.
+            // Update device ids of the clients if necessary.
+            updateDeviceIdsIfNeededLocked(deviceId);
+            // Start tracking of all displays if necessary.
+            mSystemSupport.updateWindowsForAccessibilityCallbackLocked();
+            // Calls A11yManager#setRelevantEventTypes (test these)
+            updateRelevantEventTypesLocked(deviceId);
+            // Calls A11yManager#setState
+            scheduleUpdateProxyClientsIfNeededLocked(deviceId);
+            //Calls A11yManager#notifyServicesStateChanged(timeout)
+            scheduleNotifyProxyClientsOfServicesStateChangeLocked(deviceId);
+            // Calls A11yManager#setFocusAppearance
+            updateFocusAppearanceLocked(deviceId);
+            mSystemSupport.notifyClearAccessibilityCacheLocked();
+        }
+    }
+
+    /**
+     * Updates the states of the app AccessibilityManagers.
+     */
+    public void scheduleUpdateProxyClientsIfNeededLocked(int deviceId) {
+        final int proxyState = getStateLocked(deviceId,
+                mUiAutomationManager.isUiAutomationRunningLocked());
+        if (DEBUG) {
+            Slog.v(LOG_TAG, "State for device id " + deviceId + " is " + proxyState);
+            Slog.v(LOG_TAG, "Last state for device id " + deviceId + " is "
+                    + getLastSentStateLocked(deviceId));
+        }
+        if ((getLastSentStateLocked(deviceId)) != proxyState) {
+            setLastStateLocked(deviceId, proxyState);
+            mMainHandler.post(() -> {
+                synchronized (mLock) {
+                    broadcastToClientsLocked(ignoreRemoteException(client -> {
+                        if (client.mDeviceId == deviceId) {
+                            client.mCallback.setState(proxyState);
+                        }
+                    }));
+                }
+            });
+        }
+    }
+
+    /**
+     * Notifies AccessibilityManager of services state changes, which includes changes to the
+     * list of service infos and timeouts.
+     *
+     * @see AccessibilityManager.AccessibilityServicesStateChangeListener
+     */
+    public void scheduleNotifyProxyClientsOfServicesStateChangeLocked(int deviceId) {
+        if (DEBUG) {
+            Slog.v(LOG_TAG, "Notify services state change at device id " + deviceId);
+        }
+        mMainHandler.post(()-> {
+            broadcastToClientsLocked(ignoreRemoteException(client -> {
+                if (client.mDeviceId == deviceId) {
+                    synchronized (mLock) {
+                        client.mCallback.notifyServicesStateChanged(
+                                getRecommendedTimeoutMillisLocked(deviceId));
+                    }
+                }
+            }));
+        });
+    }
+
+    /**
+     * Updates the focus appearance of AccessibilityManagerClients.
+     */
+    public void updateFocusAppearanceLocked(int deviceId) {
+        if (DEBUG) {
+            Slog.v(LOG_TAG, "Update proxy focus appearance at device id " + deviceId);
+        }
+        // Reasonably assume that all proxies belonging to a virtual device should have the
+        // same focus appearance, and if they should be different these should belong to different
+        // virtual devices.
+        final ProxyAccessibilityServiceConnection proxy = getFirstProxyForDeviceIdLocked(deviceId);
+        if (proxy != null) {
+            mMainHandler.post(()-> {
+                broadcastToClientsLocked(ignoreRemoteException(client -> {
+                    if (client.mDeviceId == proxy.getDeviceId()) {
+                        client.mCallback.setFocusAppearance(
+                                proxy.getFocusStrokeWidthLocked(),
+                                proxy.getFocusColorLocked());
+                    }
+                }));
+            });
+        }
+    }
+
+    private ProxyAccessibilityServiceConnection getFirstProxyForDeviceIdLocked(int deviceId) {
+        for (int i = 0; i < mProxyA11yServiceConnections.size(); i++) {
+            final ProxyAccessibilityServiceConnection proxy =
+                    mProxyA11yServiceConnections.valueAt(i);
+            if (proxy != null && proxy.getDeviceId() == deviceId) {
+                return proxy;
+            }
+        }
+        return null;
+    }
+
+    private void broadcastToClientsLocked(
+            @NonNull Consumer<AccessibilityManagerService.Client> clientAction) {
+        final RemoteCallbackList<IAccessibilityManagerClient> userClients =
+                mSystemSupport.getCurrentUserClientsLocked();
+        final RemoteCallbackList<IAccessibilityManagerClient> globalClients =
+                mSystemSupport.getGlobalClientsLocked();
+        userClients.broadcastForEachCookie(clientAction);
+        globalClients.broadcastForEachCookie(clientAction);
+    }
+
+    /**
+     * Updates the timeout and notifies app clients.
+     *
+     * For real users, timeouts are tracked in A11yUserState. For proxies, timeouts are in the
+     * service connection. The value in user state is preferred, but if this value is 0 the service
+     * info value is used.
+     *
+     * This follows the pattern in readUserRecommendedUiTimeoutSettingsLocked.
+     *
+     * TODO(b/250929565): ProxyUserState or similar should hold the timeouts
+     */
+    public void updateTimeoutsIfNeeded(int nonInteractiveUiTimeout, int interactiveUiTimeout) {
+        synchronized (mLock) {
+            for (int i = 0; i < mProxyA11yServiceConnections.size(); i++) {
+                final ProxyAccessibilityServiceConnection proxy =
+                        mProxyA11yServiceConnections.valueAt(i);
+                if (proxy != null) {
+                    if (proxy.updateTimeouts(nonInteractiveUiTimeout, interactiveUiTimeout)) {
+                        scheduleNotifyProxyClientsOfServicesStateChangeLocked(proxy.getDeviceId());
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Gets the recommended timeout belonging to a Virtual Device.
+     *
+     * This is the highest of all display proxies belonging to the virtual device.
+     */
+    public long getRecommendedTimeoutMillisLocked(int deviceId) {
+        int combinedInteractiveTimeout = 0;
+        int combinedNonInteractiveTimeout = 0;
+        for (int i = 0; i < mProxyA11yServiceConnections.size(); i++) {
+            final ProxyAccessibilityServiceConnection proxy =
+                    mProxyA11yServiceConnections.valueAt(i);
+            if (proxy != null && proxy.getDeviceId() == deviceId) {
+                final int proxyInteractiveUiTimeout =
+                        (proxy != null) ? proxy.getInteractiveTimeout() : 0;
+                final int nonInteractiveUiTimeout =
+                        (proxy != null) ? proxy.getNonInteractiveTimeout() : 0;
+                combinedInteractiveTimeout = Math.max(proxyInteractiveUiTimeout,
+                        combinedInteractiveTimeout);
+                combinedNonInteractiveTimeout = Math.max(nonInteractiveUiTimeout,
+                        combinedNonInteractiveTimeout);
+            }
+        }
+        return IntPair.of(combinedInteractiveTimeout, combinedNonInteractiveTimeout);
+    }
+
+    /**
+     * Gets the first focus stroke width belonging to the device.
+     */
+    public int getFocusStrokeWidthLocked(int deviceId) {
+        final ProxyAccessibilityServiceConnection proxy = getFirstProxyForDeviceIdLocked(deviceId);
+        if (proxy != null) {
+            return proxy.getFocusStrokeWidthLocked();
+        }
+        return 0;
+
+    }
+
+    /**
+     * Gets the first focus color belonging to the device.
+     */
+    public int getFocusColorLocked(int deviceId) {
+        final ProxyAccessibilityServiceConnection proxy = getFirstProxyForDeviceIdLocked(deviceId);
+        if (proxy != null) {
+            return proxy.getFocusColorLocked();
+        }
+        return 0;
+    }
+
+    /**
+     * Returns the first device id given a UID.
+     * @param callingUid the UID to check.
+     * @return the first matching device id, or DEVICE_ID_INVALID.
+     */
+    public int getFirstDeviceIdForUidLocked(int callingUid) {
+        int firstDeviceId = DEVICE_ID_INVALID;
+        final VirtualDeviceManagerInternal localVdm = getLocalVdm();
+        if (localVdm == null) {
+            return firstDeviceId;
+        }
+        final Set<Integer> deviceIds = localVdm.getDeviceIdsForUid(callingUid);
+        for (Integer uidDeviceId : deviceIds) {
+            if (uidDeviceId != DEVICE_ID_DEFAULT && uidDeviceId != DEVICE_ID_INVALID) {
+                firstDeviceId = uidDeviceId;
+                break;
+            }
+        }
+        return firstDeviceId;
+    }
+
+    /**
+     * Sets a Client device id if the app uid belongs to the virtual device.
+     */
+    public void updateDeviceIdsIfNeededLocked(int deviceId) {
+        final RemoteCallbackList<IAccessibilityManagerClient> userClients =
+                mSystemSupport.getCurrentUserClientsLocked();
+        final RemoteCallbackList<IAccessibilityManagerClient> globalClients =
+                mSystemSupport.getGlobalClientsLocked();
+
+        updateDeviceIdsIfNeededLocked(deviceId, userClients);
+        updateDeviceIdsIfNeededLocked(deviceId, globalClients);
+    }
+
+    /**
+     * Updates the device ids of IAccessibilityManagerClients if needed.
+     */
+    public void updateDeviceIdsIfNeededLocked(int deviceId,
+            @NonNull RemoteCallbackList<IAccessibilityManagerClient> clients) {
+        final VirtualDeviceManagerInternal localVdm = getLocalVdm();
+        if (localVdm == null) {
+            return;
+        }
+
+        for (int i = 0; i < clients.getRegisteredCallbackCount(); i++) {
+            final AccessibilityManagerService.Client client =
+                    ((AccessibilityManagerService.Client) clients.getRegisteredCallbackCookie(i));
+            if (deviceId != DEVICE_ID_DEFAULT && deviceId != DEVICE_ID_INVALID
+                    && localVdm.getDeviceIdsForUid(client.mUid).contains(deviceId)) {
+                if (DEBUG) {
+                    Slog.v(LOG_TAG, "Packages moved to device id " + deviceId + " are "
+                            + Arrays.toString(client.mPackageNames));
+                }
+                client.mDeviceId = deviceId;
             }
         }
     }
@@ -306,9 +810,18 @@
     }
 
     void setAccessibilityInputFilter(AccessibilityInputFilter filter) {
+        if (DEBUG) {
+            Slog.v(LOG_TAG, "Set proxy input filter to " + filter);
+        }
         mA11yInputFilter = filter;
     }
 
+    VirtualDeviceManagerInternal getLocalVdm() {
+        if (mLocalVdm == null) {
+            mLocalVdm =  LocalServices.getService(VirtualDeviceManagerInternal.class);
+        }
+        return mLocalVdm;
+    }
 
     /**
      * Prints information belonging to each display that is controlled by an
@@ -320,13 +833,38 @@
             pw.println("Proxy manager state:");
             pw.println("    Number of proxy connections: " + mProxyA11yServiceConnections.size());
             pw.println("    Registered proxy connections:");
+            final RemoteCallbackList<IAccessibilityManagerClient> userClients =
+                    mSystemSupport.getCurrentUserClientsLocked();
+            final RemoteCallbackList<IAccessibilityManagerClient> globalClients =
+                    mSystemSupport.getGlobalClientsLocked();
             for (int i = 0; i < mProxyA11yServiceConnections.size(); i++) {
                 final ProxyAccessibilityServiceConnection proxy =
                         mProxyA11yServiceConnections.valueAt(i);
                 if (proxy != null) {
                     proxy.dump(fd, pw, args);
                 }
+                pw.println();
+                pw.println("        User clients for proxy's virtual device id");
+                printClientsForDeviceId(pw, userClients, proxy.getDeviceId());
+                pw.println();
+                pw.println("        Global clients for proxy's virtual device id");
+                printClientsForDeviceId(pw, globalClients, proxy.getDeviceId());
+
             }
         }
     }
-}
\ No newline at end of file
+
+    private void printClientsForDeviceId(PrintWriter pw,
+            RemoteCallbackList<IAccessibilityManagerClient> clients, int deviceId) {
+        if (clients != null) {
+            for (int j = 0; j < clients.getRegisteredCallbackCount(); j++) {
+                final AccessibilityManagerService.Client client =
+                        (AccessibilityManagerService.Client)
+                                clients.getRegisteredCallbackCookie(j);
+                if (client.mDeviceId == deviceId) {
+                    pw.println("            " + Arrays.toString(client.mPackageNames) + "\n");
+                }
+            }
+        }
+    }
+}
diff --git a/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java b/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java
index 2188b99..2f3e4c0 100644
--- a/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java
@@ -24,6 +24,7 @@
 import android.app.UiAutomation;
 import android.content.ComponentName;
 import android.content.Context;
+import android.os.Binder;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.IBinder.DeathRecipient;
@@ -34,6 +35,7 @@
 import android.view.accessibility.AccessibilityEvent;
 
 import com.android.internal.util.DumpUtils;
+import com.android.server.utils.Slogf;
 import com.android.server.wm.WindowManagerInternal;
 
 import java.io.FileDescriptor;
@@ -51,12 +53,8 @@
 
     private UiAutomationService mUiAutomationService;
 
-    private AccessibilityServiceInfo mUiAutomationServiceInfo;
-
     private AbstractAccessibilityServiceConnection.SystemSupport mSystemSupport;
 
-    private AccessibilityTrace mTrace;
-
     private int mUiAutomationFlags;
 
     UiAutomationManager(Object lock) {
@@ -97,9 +95,10 @@
             WindowManagerInternal windowManagerInternal,
             SystemActionPerformer systemActionPerformer,
             AccessibilityWindowManager awm, int flags) {
+        accessibilityServiceInfo.setComponentName(COMPONENT_NAME);
+        Slogf.i(LOG_TAG, "Registering UiTestAutomationService (id=%s) when called by user %d",
+                accessibilityServiceInfo.getId(), Binder.getCallingUserHandle().getIdentifier());
         synchronized (mLock) {
-            accessibilityServiceInfo.setComponentName(COMPONENT_NAME);
-
             if (mUiAutomationService != null) {
                 throw new IllegalStateException(
                         "UiAutomationService " + mUiAutomationService.mServiceInterface
@@ -116,7 +115,6 @@
 
             mUiAutomationFlags = flags;
             mSystemSupport = systemSupport;
-            mTrace = trace;
             // Ignore registering UiAutomation if it is not allowed to use the accessibility
             // subsystem.
             if (!useAccessibility()) {
@@ -126,7 +124,6 @@
                     mainHandler, mLock, securityPolicy, systemSupport, trace, windowManagerInternal,
                     systemActionPerformer, awm);
             mUiAutomationServiceOwner = owner;
-            mUiAutomationServiceInfo = accessibilityServiceInfo;
             mUiAutomationService.mServiceInterface = serviceClient;
             try {
                 mUiAutomationService.mServiceInterface.asBinder().linkToDeath(mUiAutomationService,
diff --git a/services/art-profile b/services/art-profile
index c2ef53c..95ed8e3 100644
--- a/services/art-profile
+++ b/services/art-profile
@@ -2371,10 +2371,10 @@
 HSPLcom/android/server/am/UserController;->updateStartedUserArrayLU()V
 HSPLcom/android/server/am/UserState;-><init>(Landroid/os/UserHandle;)V
 HSPLcom/android/server/app/GameManagerService$LocalService;->getResolutionScalingFactor(Ljava/lang/String;I)F
-HSPLcom/android/server/app/GameManagerService$UidObserver$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/app/GameManagerService$UidObserver;I)V
-HSPLcom/android/server/app/GameManagerService$UidObserver$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z
-HSPLcom/android/server/app/GameManagerService$UidObserver;->disableGameMode(I)V+]Ljava/util/Set;Ljava/util/HashSet;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;
-HSPLcom/android/server/app/GameManagerService$UidObserver;->onUidStateChanged(IIJI)V+]Lcom/android/server/app/GameManagerService$UidObserver;Lcom/android/server/app/GameManagerService$UidObserver;]Ljava/util/stream/Stream;Ljava/util/stream/ReferencePipeline$Head;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Ljava/util/Set;Ljava/util/HashSet;
+HSPLcom/android/server/app/GameManagerService$MyUidObserver$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/app/GameManagerService$MyUidObserver;I)V
+HSPLcom/android/server/app/GameManagerService$MyUidObserver$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z
+HSPLcom/android/server/app/GameManagerService$MyUidObserver;->disableGameMode(I)V+]Ljava/util/Set;Ljava/util/HashSet;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;
+HSPLcom/android/server/app/GameManagerService$MyUidObserver;->onUidStateChanged(IIJI)V+]Lcom/android/server/app/GameManagerService$MyUidObserver;Lcom/android/server/app/GameManagerService$MyUidObserver;]Ljava/util/stream/Stream;Ljava/util/stream/ReferencePipeline$Head;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Ljava/util/Set;Ljava/util/HashSet;
 HSPLcom/android/server/app/GameManagerService;->-$$Nest$fgetmContext(Lcom/android/server/app/GameManagerService;)Landroid/content/Context;
 HSPLcom/android/server/app/GameManagerService;->-$$Nest$fgetmForegroundGameUids(Lcom/android/server/app/GameManagerService;)Ljava/util/Set;
 HSPLcom/android/server/app/GameManagerService;->-$$Nest$fgetmUidObserverLock(Lcom/android/server/app/GameManagerService;)Ljava/lang/Object;
@@ -9213,7 +9213,7 @@
 HPLcom/android/server/power/hint/HintManagerService$AppHintSession;->close()V
 HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;->reportActualWorkDuration([J[J)V+]Lcom/android/server/power/hint/HintManagerService$NativeWrapper;Lcom/android/server/power/hint/HintManagerService$NativeWrapper;]Lcom/android/server/power/hint/HintManagerService$AppHintSession;Lcom/android/server/power/hint/HintManagerService$AppHintSession;
 HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;->sendHint(I)V+]Lcom/android/server/power/hint/HintManagerService$NativeWrapper;Lcom/android/server/power/hint/HintManagerService$NativeWrapper;]Lcom/android/server/power/hint/HintManagerService$AppHintSession;Lcom/android/server/power/hint/HintManagerService$AppHintSession;
-HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;->updateHintAllowed()Z+]Lcom/android/server/power/hint/HintManagerService$UidObserver;Lcom/android/server/power/hint/HintManagerService$UidObserver;]Lcom/android/server/power/hint/HintManagerService$AppHintSession;Lcom/android/server/power/hint/HintManagerService$AppHintSession;
+HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;->updateHintAllowed()Z+]Lcom/android/server/power/hint/HintManagerService$MyUidObserver;Lcom/android/server/power/hint/HintManagerService$MyUidObserver;]Lcom/android/server/power/hint/HintManagerService$AppHintSession;Lcom/android/server/power/hint/HintManagerService$AppHintSession;
 HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;->updateTargetWorkDuration(J)V
 HSPLcom/android/server/power/hint/HintManagerService$BinderService;-><init>(Lcom/android/server/power/hint/HintManagerService;)V
 HSPLcom/android/server/power/hint/HintManagerService$BinderService;->createHintSession(Landroid/os/IBinder;[IJ)Landroid/os/IHintSession;
@@ -9224,13 +9224,13 @@
 HSPLcom/android/server/power/hint/HintManagerService$NativeWrapper;->halInit()V
 HSPLcom/android/server/power/hint/HintManagerService$NativeWrapper;->halReportActualWorkDuration(J[J[J)V
 HSPLcom/android/server/power/hint/HintManagerService$NativeWrapper;->halSendHint(JI)V
-HSPLcom/android/server/power/hint/HintManagerService$UidObserver$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/power/hint/HintManagerService$UidObserver;II)V
-HSPLcom/android/server/power/hint/HintManagerService$UidObserver$$ExternalSyntheticLambda1;->run()V
-HSPLcom/android/server/power/hint/HintManagerService$UidObserver;->$r8$lambda$ej6eMAvAGZXPb5YUxpIPNazvUW4(Lcom/android/server/power/hint/HintManagerService$UidObserver;II)V
-HSPLcom/android/server/power/hint/HintManagerService$UidObserver;-><init>(Lcom/android/server/power/hint/HintManagerService;)V
-HSPLcom/android/server/power/hint/HintManagerService$UidObserver;->isUidForeground(I)Z+]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/power/hint/HintManagerService$UidObserver;->lambda$onUidStateChanged$1(II)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
-HSPLcom/android/server/power/hint/HintManagerService$UidObserver;->onUidStateChanged(IIJI)V+]Landroid/os/Handler;Landroid/os/Handler;
+HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/power/hint/HintManagerService$MyUidObserver;II)V
+HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver$$ExternalSyntheticLambda1;->run()V
+HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->$r8$lambda$ej6eMAvAGZXPb5YUxpIPNazvUW4(Lcom/android/server/power/hint/HintManagerService$MyUidObserver;II)V
+HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;-><init>(Lcom/android/server/power/hint/HintManagerService;)V
+HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->isUidForeground(I)Z+]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->lambda$onUidStateChanged$1(II)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
+HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->onUidStateChanged(IIJI)V+]Landroid/os/Handler;Landroid/os/Handler;
 HSPLcom/android/server/power/hint/HintManagerService;->-$$Nest$fgetmActiveSessions(Lcom/android/server/power/hint/HintManagerService;)Landroid/util/ArrayMap;
 HSPLcom/android/server/power/hint/HintManagerService;->-$$Nest$fgetmLock(Lcom/android/server/power/hint/HintManagerService;)Ljava/lang/Object;
 HSPLcom/android/server/power/hint/HintManagerService;->-$$Nest$fgetmNativeWrapper(Lcom/android/server/power/hint/HintManagerService;)Lcom/android/server/power/hint/HintManagerService$NativeWrapper;
@@ -10370,8 +10370,8 @@
 HPLcom/android/server/vibrator/Vibration;-><init>(Landroid/os/IBinder;Lcom/android/server/vibrator/Vibration$CallerInfo;)V
 HPLcom/android/server/vibrator/VibrationEffectAdapters;->apply(Landroid/os/VibrationEffect;Ljava/util/List;Ljava/lang/Object;)Landroid/os/VibrationEffect;+]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Lcom/android/server/vibrator/VibrationEffectAdapters$SegmentsAdapter;Lcom/android/server/vibrator/StepToRampAdapter;,Lcom/android/server/vibrator/RampDownAdapter;,Lcom/android/server/vibrator/RampToStepAdapter;,Lcom/android/server/vibrator/ClippingAmplitudeAndFrequencyAdapter;]Landroid/os/VibrationEffect$Composed;Landroid/os/VibrationEffect$Composed;
 HPLcom/android/server/vibrator/VibrationScaler;->scale(Landroid/os/VibrationEffect;I)Landroid/os/VibrationEffect;
-HPLcom/android/server/vibrator/VibrationSettings$UidObserver;->isUidForeground(I)Z
-HSPLcom/android/server/vibrator/VibrationSettings$UidObserver;->onUidStateChanged(IIJI)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HPLcom/android/server/vibrator/VibrationSettings$MyUidObserver;->isUidForeground(I)Z
+HSPLcom/android/server/vibrator/VibrationSettings$MyUidObserver;->onUidStateChanged(IIJI)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/vibrator/VibrationSettings;->getCurrentIntensity(I)I
 HPLcom/android/server/vibrator/VibrationSettings;->shouldIgnoreVibration(Lcom/android/server/vibrator/Vibration$CallerInfo;)Lcom/android/server/vibrator/Vibration$Status;
 HPLcom/android/server/vibrator/VibrationStats$StatsInfo;-><init>(IIILcom/android/server/vibrator/Vibration$Status;Lcom/android/server/vibrator/VibrationStats;J)V
@@ -13493,7 +13493,7 @@
 Lcom/android/server/power/hint/HintManagerService$BinderService;
 Lcom/android/server/power/hint/HintManagerService$Injector;
 Lcom/android/server/power/hint/HintManagerService$NativeWrapper;
-Lcom/android/server/power/hint/HintManagerService$UidObserver;
+Lcom/android/server/power/hint/HintManagerService$MyUidObserver;
 Lcom/android/server/power/hint/HintManagerService;
 Lcom/android/server/power/stats/BatteryExternalStatsWorker$$ExternalSyntheticLambda0;
 Lcom/android/server/power/stats/BatteryExternalStatsWorker$$ExternalSyntheticLambda3;
diff --git a/services/autofill/java/com/android/server/autofill/FieldClassificationEventLogger.java b/services/autofill/java/com/android/server/autofill/FieldClassificationEventLogger.java
new file mode 100644
index 0000000..ffb4632
--- /dev/null
+++ b/services/autofill/java/com/android/server/autofill/FieldClassificationEventLogger.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.autofill;
+
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FIELD_CLASSIFICATION_EVENT_REPORTED;
+import static com.android.server.autofill.Helper.sVerbose;
+
+import android.util.Slog;
+
+import com.android.internal.util.FrameworkStatsLog;
+
+import java.util.Optional;
+
+/**
+ * Helper class to log Field Classification stats.
+ */
+public final class FieldClassificationEventLogger {
+    private static final String TAG = "FieldClassificationEventLogger";
+    private Optional<FieldClassificationEventInternal> mEventInternal;
+
+    private FieldClassificationEventLogger() {
+        mEventInternal = Optional.empty();
+    }
+
+    /**
+     * A factory constructor to create FieldClassificationEventLogger.
+     */
+    public static FieldClassificationEventLogger createLogger() {
+        return new FieldClassificationEventLogger();
+    }
+
+    /**
+     * Reset mEventInternal before logging for a new request. It shall be called for each
+     * FieldClassification request.
+     */
+    public void startNewLogForRequest() {
+        if (!mEventInternal.isEmpty()) {
+            Slog.w(TAG, "FieldClassificationEventLogger is not empty before starting for a new "
+                    + "request");
+        }
+        mEventInternal = Optional.of(new FieldClassificationEventInternal());
+    }
+
+    /**
+     * Set latency as long as mEventInternal presents.
+     */
+    public void maybeSetLatencyMillis(long timestamp) {
+        mEventInternal.ifPresent(event -> {
+            event.mLatencyClassificationRequestMillis = timestamp;
+        });
+    }
+
+    /**
+     * Log an AUTOFILL_FIELD_CLASSIFICATION_EVENT_REPORTED event.
+     */
+    public void logAndEndEvent() {
+        if (!mEventInternal.isPresent()) {
+            Slog.w(TAG, "Shouldn't be logging AutofillFieldClassificationEventInternal again for "
+                    + "same event");
+            return;
+        }
+        FieldClassificationEventInternal event = mEventInternal.get();
+        if (sVerbose) {
+            Slog.v(TAG, "Log AutofillFieldClassificationEventReported:"
+                    + " mLatencyClassificationRequestMillis="
+                    + event.mLatencyClassificationRequestMillis);
+        }
+        FrameworkStatsLog.write(
+                AUTOFILL_FIELD_CLASSIFICATION_EVENT_REPORTED,
+                event.mLatencyClassificationRequestMillis);
+        mEventInternal = Optional.empty();
+    }
+
+    private static final class FieldClassificationEventInternal {
+        long mLatencyClassificationRequestMillis = -1;
+
+        FieldClassificationEventInternal() {
+        }
+    }
+}
diff --git a/services/autofill/java/com/android/server/autofill/FillResponseEventLogger.java b/services/autofill/java/com/android/server/autofill/FillResponseEventLogger.java
index 6b8246c..8f2ab71 100644
--- a/services/autofill/java/com/android/server/autofill/FillResponseEventLogger.java
+++ b/services/autofill/java/com/android/server/autofill/FillResponseEventLogger.java
@@ -17,16 +17,16 @@
 package com.android.server.autofill;
 
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED;
-import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__DISPLAY_PRESENTATION_TYPE__UNKNOWN_AUTOFILL_DISPLAY_PRESENTATION_TYPE;
-import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__DISPLAY_PRESENTATION_TYPE__MENU;
-import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__DISPLAY_PRESENTATION_TYPE__INLINE;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__DISPLAY_PRESENTATION_TYPE__DIALOG;
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__DISPLAY_PRESENTATION_TYPE__INLINE;
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__DISPLAY_PRESENTATION_TYPE__MENU;
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__DISPLAY_PRESENTATION_TYPE__UNKNOWN_AUTOFILL_DISPLAY_PRESENTATION_TYPE;
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__AUTHENTICATION_RESULT__AUTHENTICATION_FAILURE;
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__AUTHENTICATION_RESULT__AUTHENTICATION_RESULT_UNKNOWN;
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__AUTHENTICATION_RESULT__AUTHENTICATION_SUCCESS;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__AUTHENTICATION_TYPE__AUTHENTICATION_TYPE_UNKNOWN;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__AUTHENTICATION_TYPE__DATASET_AUTHENTICATION;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__AUTHENTICATION_TYPE__FULL_AUTHENTICATION;
-import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__AUTHENTICATION_RESULT__AUTHENTICATION_RESULT_UNKNOWN;
-import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__AUTHENTICATION_RESULT__AUTHENTICATION_SUCCESS;
-import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__AUTHENTICATION_RESULT__AUTHENTICATION_FAILURE;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_CANCELLED;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_FAILURE;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_FILL_RESPONSE_REPORTED__RESPONSE_STATUS__RESPONSE_STATUS_SESSION_DESTROYED;
@@ -37,12 +37,7 @@
 
 import android.annotation.IntDef;
 import android.annotation.Nullable;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.provider.Settings;
 import android.service.autofill.Dataset;
-import android.text.TextUtils;
 import android.util.Slog;
 import android.view.autofill.AutofillId;
 
@@ -154,6 +149,9 @@
   // succeeded.
   public static final int AVAILABLE_COUNT_WHEN_FILL_REQUEST_FAILED_OR_TIMEOUT = -1;
 
+  // Log a magic number to indicate that the FillResponse contains a saveTriggerId.
+  public static final int HAVE_SAVE_TRIGGER_ID = 1;
+
   private final int mSessionId;
   private Optional<FillResponseEventInternal> mEventInternal;
 
diff --git a/services/autofill/java/com/android/server/autofill/HintsHelper.java b/services/autofill/java/com/android/server/autofill/HintsHelper.java
new file mode 100644
index 0000000..9b26602
--- /dev/null
+++ b/services/autofill/java/com/android/server/autofill/HintsHelper.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.autofill;
+
+import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_ADDRESS;
+import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD;
+import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_DEBIT_CARD;
+import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_EMAIL_ADDRESS;
+import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_GENERIC_CARD;
+import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_PASSWORD;
+import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_PAYMENT_CARD;
+import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_USERNAME;
+
+import android.util.ArraySet;
+
+import java.util.Set;
+
+/**
+ * Helper class to manage autofill hints.
+ * Provides utility methods like converting SaveTypes to applicable HintsConstants.
+ */
+public class HintsHelper {
+    // Username fields
+    public static final String AUTOFILL_HINT_NEW_USERNAME = "newUsername";
+    public static final String AUTOFILL_HINT_USERNAME = "username";
+
+    // Password fields
+    public static final String AUTOFILL_HINT_NEW_PASSWORD = "newPassword";
+    public static final String AUTOFILL_HINT_PASSWORD = "password";
+
+    // Email hints
+    public static final String AUTOFILL_HINT_EMAIL_ADDRESS = "emailAddress";
+
+    // Phone number hints
+    public static final String AUTOFILL_HINT_PHONE_COUNTRY_CODE = "phoneCountryCode";
+    public static final String AUTOFILL_HINT_PHONE = "phone";
+    public static final String AUTOFILL_HINT_PHONE_NATIONAL = "phoneNational";
+    public static final String AUTOFILL_HINT_PHONE_NUMBER = "phoneNumber";
+    public static final String AUTOFILL_HINT_PHONE_NUMBER_DEVICE = "phoneNumberDevice";
+
+    // Credit card hints
+    public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE =
+            "creditCardExpirationDate";
+    public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = "creditCardExpirationDay";
+    public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH =
+            "creditCardExpirationMonth";
+    public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR =
+            "creditCardExpirationYear";
+    public static final String AUTOFILL_HINT_CREDIT_CARD_NUMBER = "creditCardNumber";
+    public static final String AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE = "creditCardSecurityCode";
+
+    // Address hints
+    public static final String AUTOFILL_HINT_POSTAL_ADDRESS = "postalAddress";
+    public static final String AUTOFILL_HINT_POSTAL_ADDRESS_APT_NUMBER = "aptNumber";
+    public static final String AUTOFILL_HINT_POSTAL_ADDRESS_COUNTRY = "addressCountry";
+    public static final String AUTOFILL_HINT_POSTAL_ADDRESS_DEPENDENT_LOCALITY =
+            "dependentLocality";
+    public static final String AUTOFILL_HINT_POSTAL_ADDRESS_EXTENDED_ADDRESS = "extendedAddress";
+    public static final String AUTOFILL_HINT_POSTAL_ADDRESS_EXTENDED_POSTAL_CODE =
+            "extendedPostalCode";
+    public static final String AUTOFILL_HINT_POSTAL_ADDRESS_LOCALITY = "addressLocality";
+    public static final String AUTOFILL_HINT_POSTAL_ADDRESS_REGION = "addressRegion";
+    public static final String AUTOFILL_HINT_POSTAL_ADDRESS_STREET_ADDRESS = "streetAddress";
+    public static final String AUTOFILL_HINT_POSTAL_CODE = "postalCode";
+
+    private HintsHelper() {}
+
+    /**
+     * Converts saveType to Autofill HintsConstants.
+     * @param saveType
+     * @return
+     */
+    public static Set<String> getHintsForSaveType(int saveType) {
+        ArraySet<String> hintSet = new ArraySet<>();
+        switch (saveType) {
+            case SAVE_DATA_TYPE_PASSWORD:
+                hintSet.add(AUTOFILL_HINT_NEW_USERNAME);
+                hintSet.add(AUTOFILL_HINT_USERNAME);
+                hintSet.add(AUTOFILL_HINT_NEW_PASSWORD);
+                hintSet.add(AUTOFILL_HINT_PASSWORD);
+                return hintSet;
+            case SAVE_DATA_TYPE_USERNAME:
+                hintSet.add(AUTOFILL_HINT_NEW_USERNAME);
+                hintSet.add(AUTOFILL_HINT_USERNAME);
+                return hintSet;
+            case SAVE_DATA_TYPE_EMAIL_ADDRESS:
+                hintSet.add(AUTOFILL_HINT_EMAIL_ADDRESS);
+                return hintSet;
+            case SAVE_DATA_TYPE_CREDIT_CARD:
+            case SAVE_DATA_TYPE_DEBIT_CARD:
+            case SAVE_DATA_TYPE_PAYMENT_CARD:
+            case SAVE_DATA_TYPE_GENERIC_CARD:
+                hintSet.add(AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE);
+                hintSet.add(AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY);
+                hintSet.add(AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH);
+                hintSet.add(AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR);
+                hintSet.add(AUTOFILL_HINT_CREDIT_CARD_NUMBER);
+                hintSet.add(AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE);
+                return hintSet;
+            case SAVE_DATA_TYPE_ADDRESS:
+                hintSet.add(AUTOFILL_HINT_POSTAL_ADDRESS);
+                hintSet.add(AUTOFILL_HINT_POSTAL_ADDRESS_APT_NUMBER);
+                hintSet.add(AUTOFILL_HINT_POSTAL_ADDRESS_COUNTRY);
+                hintSet.add(AUTOFILL_HINT_POSTAL_ADDRESS_DEPENDENT_LOCALITY);
+                hintSet.add(AUTOFILL_HINT_POSTAL_ADDRESS_EXTENDED_ADDRESS);
+                hintSet.add(AUTOFILL_HINT_POSTAL_ADDRESS_EXTENDED_POSTAL_CODE);
+                hintSet.add(AUTOFILL_HINT_POSTAL_ADDRESS_LOCALITY);
+                hintSet.add(AUTOFILL_HINT_POSTAL_ADDRESS_REGION);
+                hintSet.add(AUTOFILL_HINT_POSTAL_ADDRESS_STREET_ADDRESS);
+                hintSet.add(AUTOFILL_HINT_POSTAL_CODE);
+                return hintSet;
+            default:
+                return hintSet;
+        }
+    }
+}
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFieldClassificationService.java b/services/autofill/java/com/android/server/autofill/RemoteFieldClassificationService.java
index 99a2291..feae56e 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFieldClassificationService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFieldClassificationService.java
@@ -30,6 +30,7 @@
 import android.content.pm.ServiceInfo;
 import android.os.ICancellationSignal;
 import android.os.RemoteException;
+import android.os.SystemClock;
 import android.service.assist.classification.FieldClassificationRequest;
 import android.service.assist.classification.FieldClassificationResponse;
 import android.service.assist.classification.FieldClassificationService;
@@ -132,7 +133,7 @@
 
     public void onFieldClassificationRequest(@NonNull FieldClassificationRequest request,
             FieldClassificationServiceCallbacks fieldClassificationServiceCallbacks) {
-
+        final long startTime = SystemClock.elapsedRealtime();
         if (sVerbose) {
             Slog.v(TAG, "onFieldClassificationRequest request:" + request);
         }
@@ -144,6 +145,7 @@
                                 new IFieldClassificationCallback.Stub() {
                                     @Override
                                     public void onCancellable(ICancellationSignal cancellation) {
+                                        logLatency(startTime);
                                         if (sDebug) {
                                             Log.d(TAG, "onCancellable");
                                         }
@@ -151,15 +153,15 @@
 
                                     @Override
                                     public void onSuccess(FieldClassificationResponse response) {
+                                        logLatency(startTime);
                                         if (sDebug) {
                                             Log.d(TAG, "onSuccess Response: " + response);
                                         }
-                                        fieldClassificationServiceCallbacks
-                                                .onClassificationRequestSuccess(response);
                                     }
 
                                     @Override
                                     public void onFailure() {
+                                        logLatency(startTime);
                                         if (sDebug) {
                                             Log.d(TAG, "onFailure");
                                         }
@@ -174,4 +176,12 @@
                                     public void cancel() throws RemoteException {}
                                 }));
     }
+
+    private void logLatency(long startTime) {
+        final FieldClassificationEventLogger logger = FieldClassificationEventLogger.createLogger();
+        logger.startNewLogForRequest();
+        logger.maybeSetLatencyMillis(
+                SystemClock.elapsedRealtime() - startTime);
+        logger.logAndEndEvent();
+    }
 }
diff --git a/services/autofill/java/com/android/server/autofill/SaveEventLogger.java b/services/autofill/java/com/android/server/autofill/SaveEventLogger.java
index 4b7d5bd..e5435c2 100644
--- a/services/autofill/java/com/android/server/autofill/SaveEventLogger.java
+++ b/services/autofill/java/com/android/server/autofill/SaveEventLogger.java
@@ -23,8 +23,10 @@
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_NOT_SHOWN_REASON__NO_SAVE_REASON_NONE;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_NOT_SHOWN_REASON__NO_SAVE_REASON_NO_SAVE_INFO;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_NOT_SHOWN_REASON__NO_SAVE_REASON_NO_VALUE_CHANGED;
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_NOT_SHOWN_REASON__NO_SAVE_REASON_SESSION_DESTROYED;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_NOT_SHOWN_REASON__NO_SAVE_REASON_UNKNOWN;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_NOT_SHOWN_REASON__NO_SAVE_REASON_WITH_DELAY_SAVE_FLAG;
+import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_NOT_SHOWN_REASON__NO_SAVE_REASON_WITH_DONT_SAVE_ON_FINISH_FLAG;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_SHOWN_REASON__SAVE_UI_SHOWN_REASON_OPTIONAL_ID_CHANGE;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_SHOWN_REASON__SAVE_UI_SHOWN_REASON_REQUIRED_ID_CHANGE;
 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_SHOWN_REASON__SAVE_UI_SHOWN_REASON_TRIGGER_ID_SET;
@@ -32,11 +34,6 @@
 import static com.android.server.autofill.Helper.sVerbose;
 
 import android.annotation.IntDef;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.provider.Settings;
-import android.text.TextUtils;
 import android.util.Slog;
 
 import com.android.internal.util.FrameworkStatsLog;
@@ -74,10 +71,12 @@
       NO_SAVE_REASON_NONE,
       NO_SAVE_REASON_NO_SAVE_INFO,
       NO_SAVE_REASON_WITH_DELAY_SAVE_FLAG,
+      NO_SAVE_REASON_WITH_DONT_SAVE_ON_FINISH_FLAG,
       NO_SAVE_REASON_HAS_EMPTY_REQUIRED,
       NO_SAVE_REASON_NO_VALUE_CHANGED,
       NO_SAVE_REASON_FIELD_VALIDATION_FAILED,
-      NO_SAVE_REASON_DATASET_MATCH
+      NO_SAVE_REASON_DATASET_MATCH,
+      NO_SAVE_REASON_SESSION_DESTROYED
   })
   @Retention(RetentionPolicy.SOURCE)
   public @interface SaveUiNotShownReason {
@@ -108,6 +107,10 @@
       AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_NOT_SHOWN_REASON__NO_SAVE_REASON_FIELD_VALIDATION_FAILED;
   public static final int NO_SAVE_REASON_DATASET_MATCH =
       AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_NOT_SHOWN_REASON__NO_SAVE_REASON_DATASET_MATCH;
+  public static final int NO_SAVE_REASON_SESSION_DESTROYED =
+      AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_NOT_SHOWN_REASON__NO_SAVE_REASON_SESSION_DESTROYED;
+  public static final int NO_SAVE_REASON_WITH_DONT_SAVE_ON_FINISH_FLAG =
+      AUTOFILL_SAVE_EVENT_REPORTED__SAVE_UI_NOT_SHOWN_REASON__NO_SAVE_REASON_WITH_DONT_SAVE_ON_FINISH_FLAG;
 
   private final int mSessionId;
   private Optional<SaveEventInternal> mEventInternal;
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 4af6b89e..8d039fc 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -41,16 +41,15 @@
 import static android.view.autofill.AutofillManager.getSmartSuggestionModeToString;
 
 import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
-import static com.android.server.autofill.FillRequestEventLogger.AUGMENTED_AUTOFILL_REQUEST_ID;
 import static com.android.server.autofill.FillRequestEventLogger.TRIGGER_REASON_NORMAL_TRIGGER;
 import static com.android.server.autofill.FillRequestEventLogger.TRIGGER_REASON_PRE_TRIGGER;
 import static com.android.server.autofill.FillRequestEventLogger.TRIGGER_REASON_SERVED_FROM_CACHED_RESPONSE;
 import static com.android.server.autofill.FillResponseEventLogger.AVAILABLE_COUNT_WHEN_FILL_REQUEST_FAILED_OR_TIMEOUT;
+import static com.android.server.autofill.FillResponseEventLogger.HAVE_SAVE_TRIGGER_ID;
 import static com.android.server.autofill.FillResponseEventLogger.RESPONSE_STATUS_FAILURE;
-import static com.android.server.autofill.FillResponseEventLogger.RESPONSE_STATUS_SUCCESS;
-import static com.android.server.autofill.FillResponseEventLogger.RESPONSE_STATUS_FAILURE;
-import static com.android.server.autofill.FillResponseEventLogger.RESPONSE_STATUS_TIMEOUT;
 import static com.android.server.autofill.FillResponseEventLogger.RESPONSE_STATUS_SESSION_DESTROYED;
+import static com.android.server.autofill.FillResponseEventLogger.RESPONSE_STATUS_SUCCESS;
+import static com.android.server.autofill.FillResponseEventLogger.RESPONSE_STATUS_TIMEOUT;
 import static com.android.server.autofill.Helper.containsCharsInOrder;
 import static com.android.server.autofill.Helper.createSanitizers;
 import static com.android.server.autofill.Helper.getNumericValue;
@@ -60,8 +59,22 @@
 import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_NO_FOCUS;
 import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_REQUEST_FAILED;
 import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_REQUEST_TIMEOUT;
+import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY;
 import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_VIEW_CHANGED;
 import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED;
+import static com.android.server.autofill.SaveEventLogger.NO_SAVE_REASON_DATASET_MATCH;
+import static com.android.server.autofill.SaveEventLogger.NO_SAVE_REASON_FIELD_VALIDATION_FAILED;
+import static com.android.server.autofill.SaveEventLogger.NO_SAVE_REASON_HAS_EMPTY_REQUIRED;
+import static com.android.server.autofill.SaveEventLogger.NO_SAVE_REASON_NONE;
+import static com.android.server.autofill.SaveEventLogger.NO_SAVE_REASON_NO_SAVE_INFO;
+import static com.android.server.autofill.SaveEventLogger.NO_SAVE_REASON_NO_VALUE_CHANGED;
+import static com.android.server.autofill.SaveEventLogger.NO_SAVE_REASON_SESSION_DESTROYED;
+import static com.android.server.autofill.SaveEventLogger.NO_SAVE_REASON_WITH_DELAY_SAVE_FLAG;
+import static com.android.server.autofill.SaveEventLogger.NO_SAVE_REASON_WITH_DONT_SAVE_ON_FINISH_FLAG;
+import static com.android.server.autofill.SaveEventLogger.SAVE_UI_SHOWN_REASON_OPTIONAL_ID_CHANGE;
+import static com.android.server.autofill.SaveEventLogger.SAVE_UI_SHOWN_REASON_REQUIRED_ID_CHANGE;
+import static com.android.server.autofill.SaveEventLogger.SAVE_UI_SHOWN_REASON_TRIGGER_ID_SET;
+import static com.android.server.autofill.SaveEventLogger.SAVE_UI_SHOWN_REASON_UNKNOWN;
 import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS;
 import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUCTURE;
 
@@ -158,7 +171,9 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
@@ -457,6 +472,14 @@
     @GuardedBy("mLock")
     private FillResponseEventLogger mFillResponseEventLogger;
 
+    @NonNull
+    @GuardedBy("mLock")
+    private SaveEventLogger mSaveEventLogger;
+
+    @NonNull
+    @GuardedBy("mLock")
+    private SessionCommittedEventLogger mSessionCommittedEventLogger;
+
     /**
      * Fill dialog request would likely be sent slightly later.
      */
@@ -1176,7 +1199,8 @@
         // structure is taken. This causes only one fill request per burst of focus changes.
         cancelCurrentRequestLocked();
 
-        if (mClassificationState.mHintsToAutofillIdMap == null) {
+        if (mService.getMaster().isPccClassificationEnabled()
+                && mClassificationState.mHintsToAutofillIdMap == null) {
             if (sVerbose) {
                 Slog.v(TAG, "triggering field classification");
             }
@@ -1326,6 +1350,8 @@
         mPresentationStatsEventLogger = PresentationStatsEventLogger.forSessionId(sessionId);
         mFillRequestEventLogger = FillRequestEventLogger.forSessionId(sessionId);
         mFillResponseEventLogger = FillResponseEventLogger.forSessionId(sessionId);
+        mSessionCommittedEventLogger = SessionCommittedEventLogger.forSessionId(sessionId);
+        mSaveEventLogger = SaveEventLogger.forSessionId(sessionId);
         synchronized (mLock) {
             mSessionFlags = new SessionFlags();
             mSessionFlags.mAugmentedAutofillOnly = forAugmentedAutofillOnly;
@@ -1575,30 +1601,53 @@
 
         synchronized (mLock) {
             response = getEffectiveFillResponse(response);
+            if (isEmptyResponse(response)) {
+                // Treat it as a null response.
+                processNullResponseLocked(requestId, requestFlags);
+            }
             processResponseLocked(response, null, requestFlags);
         }
     }
 
+    private boolean isEmptyResponse(FillResponse response) {
+        if (response == null) return true;
+        SaveInfo saveInfo = response.getSaveInfo();
+        synchronized (mLock) {
+            return ((response.getDatasets() == null || response.getDatasets().isEmpty())
+                    && response.getAuthentication() == null
+                    && (saveInfo == null
+                        || (ArrayUtils.isEmpty(saveInfo.getOptionalIds())
+                            && ArrayUtils.isEmpty(saveInfo.getRequiredIds())
+                            && ((saveInfo.getFlags() & SaveInfo.FLAG_DELAY_SAVE) == 0)))
+                    && (ArrayUtils.isEmpty(response.getFieldClassificationIds())
+                        || (!mSessionFlags.mClientSuggestionsEnabled
+                        && !mService.isFieldClassificationEnabledLocked())));
+        }
+    }
+
     private FillResponse getEffectiveFillResponse(FillResponse response) {
         // TODO(b/266379948): label dataset source
-        if (!mService.getMaster().isPccClassificationEnabled()) return response;
+
+        DatasetComputationContainer autofillProviderContainer = new DatasetComputationContainer();
+        computeDatasetsForProviderAndUpdateContainer(response, autofillProviderContainer);
+
+        if (!mService.getMaster().isPccClassificationEnabled())  {
+            return createShallowCopy(response, autofillProviderContainer);
+        }
         synchronized (mLock) {
             if (mClassificationState.mState != ClassificationState.STATE_RESPONSE
                     || mClassificationState.mLastFieldClassificationResponse == null) {
-                return response;
+                return createShallowCopy(response, autofillProviderContainer);
             }
             if (!mClassificationState.processResponse()) return response;
         }
         boolean preferAutofillProvider = mService.getMaster().preferProviderOverPcc();
         boolean shouldUseFallback = mService.getMaster().shouldUsePccFallback();
         if (preferAutofillProvider && !shouldUseFallback) {
-            return response;
+            return createShallowCopy(response, autofillProviderContainer);
         }
 
-        DatasetComputationContainer autofillProviderContainer = new DatasetComputationContainer();
         DatasetComputationContainer detectionPccContainer = new DatasetComputationContainer();
-
-        computeDatasetsForProviderAndUpdateContainer(response, autofillProviderContainer);
         computeDatasetsForPccAndUpdateContainer(response, detectionPccContainer);
 
         DatasetComputationContainer resultContainer;
@@ -1617,7 +1666,50 @@
         }
         // Create FillResponse with effectiveDatasets, and all the rest value from the original
         // response.
-        return FillResponse.shallowCopy(response, new ArrayList<>(resultContainer.mDatasets));
+        return createShallowCopy(response, resultContainer);
+    }
+
+    private FillResponse createShallowCopy(
+            FillResponse response, DatasetComputationContainer container) {
+        return FillResponse.shallowCopy(
+                response,
+                new ArrayList<>(container.mDatasets),
+                getEligibleSaveInfo(response));
+    }
+
+    private SaveInfo getEligibleSaveInfo(FillResponse response) {
+        SaveInfo saveInfo = response.getSaveInfo();
+        if (saveInfo == null || (!ArrayUtils.isEmpty(saveInfo.getOptionalIds())
+                || !ArrayUtils.isEmpty(saveInfo.getRequiredIds())
+                || (saveInfo.getFlags() & SaveInfo.FLAG_DELAY_SAVE) != 0)) {
+            return saveInfo;
+        }
+        synchronized (mLock) {
+            ArrayMap<String, Set<AutofillId>> hintsToAutofillIdMap =
+                    mClassificationState.mHintsToAutofillIdMap;
+            if (hintsToAutofillIdMap == null || hintsToAutofillIdMap.isEmpty()) {
+                return saveInfo;
+            }
+
+            ArraySet<AutofillId> ids = new ArraySet<>();
+            int saveType = saveInfo.getType();
+            if (saveType == SaveInfo.SAVE_DATA_TYPE_GENERIC) {
+                for (Set<AutofillId> autofillIds: hintsToAutofillIdMap.values()) {
+                    ids.addAll(autofillIds);
+                }
+            } else {
+                Set<String> hints = HintsHelper.getHintsForSaveType(saveType);
+                for (Map.Entry<String, Set<AutofillId>> entry: hintsToAutofillIdMap.entrySet()) {
+                    String hint = entry.getKey();
+                    if (hints.contains(hint)) {
+                        ids.addAll(entry.getValue());
+                    }
+                }
+            }
+            AutofillId[] autofillIds = new AutofillId[ids.size()];
+            ids.toArray(autofillIds);
+            return SaveInfo.copy(saveInfo, autofillIds);
+        }
     }
 
     /**
@@ -1628,7 +1720,7 @@
         Set<AutofillId> mAutofillIds = new ArraySet<>();
         // Set of datasets. Kept separately, to be able to be used directly for composing
         // FillResponse.
-        Set<Dataset> mDatasets = new ArraySet<>();
+        Set<Dataset> mDatasets = new LinkedHashSet<>();
         ArrayMap<AutofillId, Set<Dataset>> mAutofillIdToDatasetMap = new ArrayMap<>();
     }
 
@@ -1674,7 +1766,7 @@
         List<Dataset> datasets = response.getDatasets();
         if (datasets == null) return;
         ArrayMap<AutofillId, Set<Dataset>> autofillIdToDatasetMap = new ArrayMap<>();
-        Set<Dataset> eligibleDatasets = new ArraySet<>();
+        Set<Dataset> eligibleDatasets = new LinkedHashSet<>();
         Set<AutofillId> eligibleAutofillIds = new ArraySet<>();
         for (Dataset dataset : response.getDatasets()) {
             if (dataset.getFieldIds() == null || dataset.getFieldIds().isEmpty()) continue;
@@ -1696,6 +1788,9 @@
                     }
                 }
 
+                // If the dataset doesn't have any non-null autofill id's, pass over.
+                if (newSize == 0) continue;
+
                 if (conversionRequired) {
                     ArrayList<AutofillId> fieldIds = new ArrayList<>(newSize);
                     ArrayList<AutofillValue> fieldValues = new ArrayList<>(newSize);
@@ -1771,7 +1866,7 @@
 
             ArrayMap<AutofillId, Set<Dataset>> map = new ArrayMap<>();
 
-            Set<Dataset> eligibleDatasets = new ArraySet<>();
+            Set<Dataset> eligibleDatasets = new LinkedHashSet<>();
             Set<AutofillId> eligibleAutofillIds = new ArraySet<>();
 
             for (int i = 0; i < datasets.size(); i++) {
@@ -1978,6 +2073,12 @@
     @Override
     public void onSaveRequestSuccess(@NonNull String servicePackageName,
             @Nullable IntentSender intentSender) {
+        // Log onSaveRequest result.
+        mSaveEventLogger.maybeSetIsSaved(true);
+        final long saveRequestFinishTimestamp = SystemClock.elapsedRealtime() - mLatencyBaseTime;
+        mSaveEventLogger.maybeSetLatencySaveFinishMillis(saveRequestFinishTimestamp);
+        mSaveEventLogger.logAndEndEvent();
+
         synchronized (mLock) {
             mSessionFlags.mShowingSaveUi = false;
 
@@ -1990,6 +2091,8 @@
         LogMaker log = newLogMaker(MetricsEvent.AUTOFILL_DATA_SAVE_REQUEST, servicePackageName)
                 .setType(intentSender == null ? MetricsEvent.TYPE_SUCCESS : MetricsEvent.TYPE_OPEN);
         mMetricsLogger.write(log);
+
+
         if (intentSender != null) {
             if (sDebug) Slog.d(TAG, "Starting intent sender on save()");
             startIntentSenderAndFinishSession(intentSender);
@@ -2004,6 +2107,12 @@
     public void onSaveRequestFailure(@Nullable CharSequence message,
             @NonNull String servicePackageName) {
         boolean showMessage = !TextUtils.isEmpty(message);
+
+        // Log onSaveRequest result.
+        final long saveRequestFinishTimestamp = SystemClock.elapsedRealtime() - mLatencyBaseTime;
+        mSaveEventLogger.maybeSetLatencySaveFinishMillis(saveRequestFinishTimestamp);
+        mSaveEventLogger.logAndEndEvent();
+
         synchronized (mLock) {
             mSessionFlags.mShowingSaveUi = false;
 
@@ -2029,6 +2138,7 @@
         }
         mMetricsLogger.write(log);
 
+
         if (showMessage) {
             getUiForShowing().showError(message, this);
         }
@@ -2118,13 +2228,17 @@
     // AutoFillUiCallback
     @Override
     public void save() {
+        mSaveEventLogger.maybeSetSaveButtonClicked(true);
         synchronized (mLock) {
             if (mDestroyed) {
                 Slog.w(TAG, "Call to Session#save() rejected - session: "
                         + id + " destroyed");
+                mSaveEventLogger.logAndEndEvent();
                 return;
             }
         }
+        final long saveRequestStartTimestamp = SystemClock.elapsedRealtime() - mLatencyBaseTime;
+        mSaveEventLogger.maybeSetLatencySaveRequestMillis(saveRequestStartTimestamp);
         mHandler.sendMessage(obtainMessage(
                 AutofillManagerServiceImpl::handleSessionSave,
                 mService, this));
@@ -2133,12 +2247,14 @@
     // AutoFillUiCallback
     @Override
     public void cancelSave() {
+        mSaveEventLogger.maybeSetDialogDismissed(true);
         synchronized (mLock) {
             mSessionFlags.mShowingSaveUi = false;
 
             if (mDestroyed) {
                 Slog.w(TAG, "Call to Session#cancelSave() rejected - session: "
                         + id + " destroyed");
+                mSaveEventLogger.logAndEndEvent();
                 return;
             }
         }
@@ -2961,6 +3077,8 @@
         if (mDestroyed) {
             Slog.w(TAG, "Call to Session#showSaveLocked() rejected - session: "
                     + id + " destroyed");
+            mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_SESSION_DESTROYED);
+            mSaveEventLogger.logAndEndEvent();
             return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ false,
                     Event.NO_SAVE_UI_REASON_NONE);
         }
@@ -2980,6 +3098,8 @@
          */
         if (saveInfo == null) {
             if (sVerbose) Slog.v(TAG, "showSaveLocked(" + this.id + "): no saveInfo from service");
+            mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_NO_SAVE_INFO);
+            mSaveEventLogger.logAndEndEvent();
             return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
                     Event.NO_SAVE_UI_REASON_NO_SAVE_INFO);
         }
@@ -2987,6 +3107,8 @@
         if ((saveInfo.getFlags() & SaveInfo.FLAG_DELAY_SAVE) != 0) {
             // TODO(b/113281366): log metrics
             if (sDebug) Slog.v(TAG, "showSaveLocked(" + this.id + "): service asked to delay save");
+            mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_WITH_DELAY_SAVE_FLAG);
+            mSaveEventLogger.logAndEndEvent();
             return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ false,
                     Event.NO_SAVE_UI_REASON_WITH_DELAY_SAVE_FLAG);
         }
@@ -3060,6 +3182,8 @@
                                         + "didn't change: " + value);
                             }
                             changed = false;
+                        } else {
+                            mSaveEventLogger.maybeSetIsNewField(true);
                         }
                     } else {
                         isUpdate = true;
@@ -3083,6 +3207,9 @@
         int saveDialogNotShowReason;
         if (!allRequiredAreNotEmpty) {
             saveDialogNotShowReason = Event.NO_SAVE_UI_REASON_HAS_EMPTY_REQUIRED;
+
+            mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_HAS_EMPTY_REQUIRED);
+            mSaveEventLogger.logAndEndEvent();
         } else {
             // Must look up all optional ids in 2 scenarios:
             // - if no required id changed but an optional id did, it should trigger save / update
@@ -3118,6 +3245,8 @@
                             }
                             if (filledValue != null) {
                                 isUpdate = true;
+                            } else {
+                                mSaveEventLogger.maybeSetIsNewField(true);
                             }
                             atLeastOneChanged = true;
                         }
@@ -3136,6 +3265,8 @@
             }
             if (!atLeastOneChanged) {
                 saveDialogNotShowReason = Event.NO_SAVE_UI_REASON_NO_VALUE_CHANGED;
+                mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_NO_VALUE_CHANGED);
+                mSaveEventLogger.logAndEndEvent();
             } else {
                 if (sDebug) {
                     Slog.d(TAG, "at least one field changed, validate fields for save UI");
@@ -3154,6 +3285,9 @@
                         Slog.e(TAG, "Not showing save UI because validation failed:", e);
                         log.setType(MetricsEvent.TYPE_FAILURE);
                         mMetricsLogger.write(log);
+                        mSaveEventLogger.maybeSetSaveUiNotShownReason(
+                            NO_SAVE_REASON_FIELD_VALIDATION_FAILED);
+                        mSaveEventLogger.logAndEndEvent();
                         return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
                                 Event.NO_SAVE_UI_REASON_FIELD_VALIDATION_FAILED);
                     }
@@ -3161,6 +3295,9 @@
                     mMetricsLogger.write(log);
                     if (!isValid) {
                         Slog.i(TAG, "not showing save UI because fields failed validation");
+                        mSaveEventLogger.maybeSetSaveUiNotShownReason(
+                            NO_SAVE_REASON_FIELD_VALIDATION_FAILED);
+                        mSaveEventLogger.logAndEndEvent();
                         return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
                                 Event.NO_SAVE_UI_REASON_FIELD_VALIDATION_FAILED);
                     }
@@ -3201,6 +3338,8 @@
                             Slog.d(TAG, "ignoring Save UI because all fields match contents of "
                                     + "dataset #" + i + ": " + dataset);
                         }
+                        mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_DATASET_MATCH);
+                        mSaveEventLogger.logAndEndEvent();
                         return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
                                 Event.NO_SAVE_UI_REASON_DATASET_MATCH);
                     }
@@ -3222,14 +3361,18 @@
                 }
                 if (serviceLabel == null || serviceIcon == null) {
                     wtf(null, "showSaveLocked(): no service label or icon");
+                    mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_NONE);
+                    mSaveEventLogger.logAndEndEvent();
                     return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
                             Event.NO_SAVE_UI_REASON_NONE);
                 }
-
+                final long saveUiDisplayStartTimestamp = SystemClock.elapsedRealtime();
                 getUiForShowing().showSaveUi(serviceLabel, serviceIcon,
                         mService.getServicePackageName(), saveInfo, this,
                         mComponentName, this, mPendingSaveUi, isUpdate, mCompatMode,
                         response.getShowSaveDialogIcon());
+                mSaveEventLogger.maybeSetLatencySaveUiDisplayMillis(
+                    SystemClock.elapsedRealtime()- saveUiDisplayStartTimestamp);
                 if (client != null) {
                     try {
                         client.setSaveUiState(id, true);
@@ -3401,11 +3544,15 @@
         if (mDestroyed) {
             Slog.w(TAG, "Call to Session#callSaveLocked() rejected - session: "
                     + id + " destroyed");
+            mSaveEventLogger.maybeSetIsSaved(false);
+            mSaveEventLogger.logAndEndEvent();
             return;
         }
         if (mRemoteFillService == null) {
             wtf(null, "callSaveLocked() called without a remote service. "
                     + "mForAugmentedAutofillOnly: %s", mSessionFlags.mAugmentedAutofillOnly);
+            mSaveEventLogger.maybeSetIsSaved(false);
+            mSaveEventLogger.logAndEndEvent();
             return;
         }
 
@@ -3413,6 +3560,8 @@
 
         if (mContexts == null) {
             Slog.w(TAG, "callSaveLocked(): no contexts");
+            mSaveEventLogger.maybeSetIsSaved(false);
+            mSaveEventLogger.logAndEndEvent();
             return;
         }
 
@@ -3829,6 +3978,8 @@
                     mPresentationStatsEventLogger.maybeSetRequestId(response.getRequestId());
                     mPresentationStatsEventLogger.maybeSetAvailableCount(
                             response.getDatasets(), mCurrentViewId);
+                    mFillResponseEventLogger.maybeSetAvailableCount(
+                        response.getDatasets(), mCurrentViewId);
                 }
 
                 if (isSameViewEntered) {
@@ -3999,6 +4150,11 @@
             if (mDestroyed) {
                 Slog.w(TAG, "Call to Session#onFillReady() rejected - session: "
                         + id + " destroyed");
+                mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_SESSION_DESTROYED);
+                mSaveEventLogger.logAndEndEvent();
+                mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
+                    NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY);
+                mPresentationStatsEventLogger.logAndEndEvent();
                 return;
             }
         }
@@ -4030,7 +4186,7 @@
 
         synchronized (mLock) {
             // Time passed since Session was created
-            long suggestionSentRelativeTimestamp =
+            final long suggestionSentRelativeTimestamp =
                     SystemClock.elapsedRealtime() - mLatencyBaseTime;
             mPresentationStatsEventLogger.maybeSetSuggestionSentTimestampMs(
                     (int) (suggestionSentRelativeTimestamp));
@@ -4398,10 +4554,19 @@
             saveTriggerId = saveInfo.getTriggerId();
             if (saveTriggerId != null) {
                 writeLog(MetricsEvent.AUTOFILL_EXPLICIT_SAVE_TRIGGER_DEFINITION);
+                mSaveEventLogger.maybeSetSaveUiShownReason(SAVE_UI_SHOWN_REASON_TRIGGER_ID_SET);
             }
             flags = saveInfo.getFlags();
             mSaveOnAllViewsInvisible = (flags & SaveInfo.FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE) != 0;
 
+            mFillResponseEventLogger.maybeSetSaveUiTriggerIds(HAVE_SAVE_TRIGGER_ID);
+
+            // Start to log Save event.
+            mSaveEventLogger.maybeSetRequestId(response.getRequestId());
+            mSaveEventLogger.maybeSetAppPackageUid(uid);
+            mSaveEventLogger.maybeSetSaveUiTriggerIds(HAVE_SAVE_TRIGGER_ID);
+            mSaveEventLogger.maybeSetFlag(flags);
+
             // We only need to track views if we want to save once they become invisible.
             if (mSaveOnAllViewsInvisible) {
                 if (trackedViews == null) {
@@ -4409,18 +4574,28 @@
                 }
                 if (saveInfo.getRequiredIds() != null) {
                     Collections.addAll(trackedViews, saveInfo.getRequiredIds());
+                    mSaveEventLogger.maybeSetSaveUiShownReason(
+                        SAVE_UI_SHOWN_REASON_REQUIRED_ID_CHANGE);
                 }
 
                 if (saveInfo.getOptionalIds() != null) {
                     Collections.addAll(trackedViews, saveInfo.getOptionalIds());
+                    mSaveEventLogger.maybeSetSaveUiShownReason(
+                        SAVE_UI_SHOWN_REASON_OPTIONAL_ID_CHANGE);
                 }
             }
             if ((flags & SaveInfo.FLAG_DONT_SAVE_ON_FINISH) != 0) {
+                mSaveEventLogger.maybeSetSaveUiShownReason(
+                    SAVE_UI_SHOWN_REASON_UNKNOWN);
+                mSaveEventLogger.maybeSetSaveUiNotShownReason(
+                    NO_SAVE_REASON_WITH_DONT_SAVE_ON_FINISH_FLAG);
                 saveOnFinish = false;
             }
 
         } else {
             flags = 0;
+            mSaveEventLogger.maybeSetSaveUiNotShownReason(
+                NO_SAVE_REASON_NO_SAVE_INFO);
             saveTriggerId = null;
         }
 
@@ -4761,7 +4936,7 @@
     @GuardedBy("mLock")
     private void setViewStatesLocked(FillResponse response, int state, boolean clearResponse) {
         final List<Dataset> datasets = response.getDatasets();
-        if (datasets != null) {
+        if (datasets != null && !datasets.isEmpty()) {
             for (int i = 0; i < datasets.size(); i++) {
                 final Dataset dataset = datasets.get(i);
                 if (dataset == null) {
diff --git a/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java b/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java
index f3a949d..dd7d38f 100644
--- a/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java
+++ b/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java
@@ -133,18 +133,6 @@
             @UserIdInt int userId, int associationId) {
         final AssociationInfo association = resolveAssociation(packageName, userId, associationId);
 
-        // Check if the request's data type has been requested before.
-        List<SystemDataTransferRequest> storedRequests =
-                mSystemDataTransferRequestStore.readRequestsByAssociationId(userId,
-                        associationId);
-        for (SystemDataTransferRequest storedRequest : storedRequests) {
-            if (storedRequest instanceof PermissionSyncRequest) {
-                Slog.e(LOG_TAG, "The request has been sent before, you can not send "
-                        + "the same request type again.");
-                return null;
-            }
-        }
-
         Slog.i(LOG_TAG, "Creating permission sync intent for userId [" + userId
                 + "] associationId [" + associationId + "]");
 
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 092eb4e..d54aa7c 100644
--- a/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java
+++ b/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java
@@ -301,25 +301,31 @@
 
         int sdk = Build.VERSION.SDK_INT;
         String release = Build.VERSION.RELEASE;
-        if (Build.isDebuggable()) {
-            // Debug builds cannot pass attestation verification. Use hardcoded key instead.
+
+        if (sdk < SECURE_CHANNEL_AVAILABLE_SDK || remoteSdk < SECURE_CHANNEL_AVAILABLE_SDK) {
+            // If either device is Android T or below, use raw channel
+            // TODO: depending on the release version, either
+            //       1) using a RawTransport for old T versions
+            //       2) or an Ukey2 handshaked transport for UKey2 backported T versions
+            Slog.d(TAG, "Secure channel is not supported. Using raw transport");
+            transport = new RawTransport(transport.getAssociationId(), transport.getFd(), mContext);
+        } else if (Build.isDebuggable()) {
+            // 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(transport.getAssociationId(), transport.getFd(),
                     mContext, testKey, null);
-        } else if (remoteSdk == NON_ANDROID) {
+        } else if (sdk == NON_ANDROID || remoteSdk == NON_ANDROID) {
+            // If either device is not Android, then use app-specific pre-shared key
             // TODO: pass in a real preSharedKey
+            Slog.d(TAG, "Creating a PSK-authenticated secure channel");
             transport = new SecureTransport(transport.getAssociationId(), transport.getFd(),
                     mContext, new byte[0], null);
-        } else if (sdk >= SECURE_CHANNEL_AVAILABLE_SDK
-                && remoteSdk >= SECURE_CHANNEL_AVAILABLE_SDK) {
-            Slog.i(TAG, "Creating a secure channel");
+        } else {
+            // If none of the above applies, then use secure channel with attestation verification
+            Slog.d(TAG, "Creating a secure channel");
             transport = new SecureTransport(transport.getAssociationId(), transport.getFd(),
                     mContext);
-        } else {
-            // TODO: depending on the release version, either
-            //       1) using a RawTransport for old T versions
-            //       2) or an Ukey2 handshaked transport for UKey2 backported T versions
         }
         addMessageListenersToTransport(transport);
         transport.start();
diff --git a/services/companion/java/com/android/server/companion/virtual/InputController.java b/services/companion/java/com/android/server/companion/virtual/InputController.java
index 484e956..1a0588e 100644
--- a/services/companion/java/com/android/server/companion/virtual/InputController.java
+++ b/services/companion/java/com/android/server/companion/virtual/InputController.java
@@ -93,7 +93,8 @@
 
     /* Token -> file descriptor associations. */
     @GuardedBy("mLock")
-    private final Map<IBinder, InputDeviceDescriptor> mInputDeviceDescriptors = new ArrayMap<>();
+    private final ArrayMap<IBinder, InputDeviceDescriptor> mInputDeviceDescriptors =
+            new ArrayMap<>();
 
     private final Handler mHandler;
     private final NativeWrapper mNativeWrapper;
@@ -303,7 +304,8 @@
     @GuardedBy("mLock")
     private void updateActivePointerDisplayIdLocked() {
         InputDeviceDescriptor mostRecentlyCreatedMouse = null;
-        for (InputDeviceDescriptor otherInputDeviceDescriptor : mInputDeviceDescriptors.values()) {
+        for (int i = 0; i < mInputDeviceDescriptors.size(); ++i) {
+            InputDeviceDescriptor otherInputDeviceDescriptor = mInputDeviceDescriptors.valueAt(i);
             if (otherInputDeviceDescriptor.isMouse()) {
                 if (mostRecentlyCreatedMouse == null
                         || (otherInputDeviceDescriptor.getCreationOrderNumber()
@@ -338,8 +340,8 @@
         }
 
         synchronized (mLock) {
-            for (InputDeviceDescriptor value : mInputDeviceDescriptors.values()) {
-                if (value.mName.equals(deviceName)) {
+            for (int i = 0; i < mInputDeviceDescriptors.size(); ++i) {
+                if (mInputDeviceDescriptors.valueAt(i).mName.equals(deviceName)) {
                     throw new DeviceCreationException(
                             "Input device name already in use: " + deviceName);
                 }
@@ -471,7 +473,8 @@
         fout.println("    InputController: ");
         synchronized (mLock) {
             fout.println("      Active descriptors: ");
-            for (InputDeviceDescriptor inputDeviceDescriptor : mInputDeviceDescriptors.values()) {
+            for (int i = 0; i < mInputDeviceDescriptors.size(); ++i) {
+                InputDeviceDescriptor inputDeviceDescriptor = mInputDeviceDescriptors.valueAt(i);
                 fout.println("        ptr: " + inputDeviceDescriptor.getNativePointer());
                 fout.println("          displayId: " + inputDeviceDescriptor.getDisplayId());
                 fout.println("          creationOrder: "
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
index b338d89..ae88f24 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
@@ -126,7 +126,7 @@
     private final VirtualDeviceManagerService mService;
     private final PendingTrampolineCallback mPendingTrampolineCallback;
     private final int mOwnerUid;
-    private final int mDeviceId;
+    private int mDeviceId;
     // Thou shall not hold the mVirtualDeviceLock over the mInputController calls.
     // Holding the lock can lead to lock inversion with GlobalWindowManagerLock.
     // 1. After display is created the window manager calls into VDM during construction
@@ -348,6 +348,7 @@
     @Override // Binder call
     public void launchPendingIntent(int displayId, PendingIntent pendingIntent,
             ResultReceiver resultReceiver) {
+        Objects.requireNonNull(pendingIntent);
         synchronized (mVirtualDeviceLock) {
             if (!mVirtualDisplays.contains(displayId)) {
                 throw new SecurityException("Display ID " + displayId
@@ -404,6 +405,7 @@
         super.close_enforcePermission();
         // Remove about-to-be-closed virtual device from the service before butchering it.
         mService.removeVirtualDevice(mDeviceId);
+        mDeviceId = Context.DEVICE_ID_INVALID;
 
         VirtualDisplayWrapper[] virtualDisplaysToBeReleased;
         synchronized (mVirtualDeviceLock) {
@@ -497,6 +499,7 @@
     @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     public void createVirtualDpad(VirtualDpadConfig config, @NonNull IBinder deviceToken) {
         super.createVirtualDpad_enforcePermission();
+        Objects.requireNonNull(config);
         synchronized (mVirtualDeviceLock) {
             if (!mVirtualDisplays.contains(config.getAssociatedDisplayId())) {
                 throw new SecurityException(
@@ -517,6 +520,7 @@
     @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     public void createVirtualKeyboard(VirtualKeyboardConfig config, @NonNull IBinder deviceToken) {
         super.createVirtualKeyboard_enforcePermission();
+        Objects.requireNonNull(config);
         synchronized (mVirtualDeviceLock) {
             if (!mVirtualDisplays.contains(config.getAssociatedDisplayId())) {
                 throw new SecurityException(
@@ -539,6 +543,7 @@
     @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
     public void createVirtualMouse(VirtualMouseConfig config, @NonNull IBinder deviceToken) {
         super.createVirtualMouse_enforcePermission();
+        Objects.requireNonNull(config);
         synchronized (mVirtualDeviceLock) {
             if (!mVirtualDisplays.contains(config.getAssociatedDisplayId())) {
                 throw new SecurityException(
@@ -560,6 +565,7 @@
     public void createVirtualTouchscreen(VirtualTouchscreenConfig config,
             @NonNull IBinder deviceToken) {
         super.createVirtualTouchscreen_enforcePermission();
+        Objects.requireNonNull(config);
         synchronized (mVirtualDeviceLock) {
             if (!mVirtualDisplays.contains(config.getAssociatedDisplayId())) {
                 throw new SecurityException(
@@ -590,6 +596,7 @@
     public void createVirtualNavigationTouchpad(VirtualNavigationTouchpadConfig config,
             @NonNull IBinder deviceToken) {
         super.createVirtualNavigationTouchpad_enforcePermission();
+        Objects.requireNonNull(config);
         synchronized (mVirtualDeviceLock) {
             if (!mVirtualDisplays.contains(config.getAssociatedDisplayId())) {
                 throw new SecurityException(
@@ -1046,18 +1053,30 @@
      */
     void showToastWhereUidIsRunning(int uid, String text, @Toast.Duration int duration,
             Looper looper) {
+        ArrayList<Integer> displayIdsForUid = getDisplayIdsWhereUidIsRunning(uid);
+        if (displayIdsForUid.isEmpty()) {
+            return;
+        }
+        DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
+        for (int i = 0; i < displayIdsForUid.size(); i++) {
+            Display display = displayManager.getDisplay(displayIdsForUid.get(i));
+            if (display != null && display.isValid()) {
+                Toast.makeText(mContext.createDisplayContext(display), looper, text,
+                        duration).show();
+            }
+        }
+    }
+
+    private ArrayList<Integer> getDisplayIdsWhereUidIsRunning(int uid) {
+        ArrayList<Integer> displayIdsForUid = new ArrayList<>();
         synchronized (mVirtualDeviceLock) {
-            DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
             for (int i = 0; i < mVirtualDisplays.size(); i++) {
                 if (mVirtualDisplays.valueAt(i).getWindowPolicyController().containsUid(uid)) {
-                    Display display = displayManager.getDisplay(mVirtualDisplays.keyAt(i));
-                    if (display != null && display.isValid()) {
-                        Toast.makeText(mContext.createDisplayContext(display), looper, text,
-                                duration).show();
-                    }
+                    displayIdsForUid.add(mVirtualDisplays.keyAt(i));
                 }
             }
         }
+        return displayIdsForUid;
     }
 
     boolean isDisplayOwnedByVirtualDevice(int displayId) {
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
index 3b1983f..291c0587 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
@@ -66,7 +66,10 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Consumer;
@@ -86,6 +89,14 @@
     private static AtomicInteger sNextUniqueIndex = new AtomicInteger(
             Context.DEVICE_ID_DEFAULT + 1);
 
+    private final CompanionDeviceManager.OnAssociationsChangedListener mCdmAssociationListener =
+            new CompanionDeviceManager.OnAssociationsChangedListener() {
+                @Override
+                public void onAssociationsChanged(@NonNull List<AssociationInfo> associations) {
+                    syncVirtualDevicesToCdmAssociations(associations);
+                }
+            };
+
     /**
      * Mapping from device IDs to virtual devices.
      */
@@ -204,11 +215,56 @@
         final long identity = Binder.clearCallingIdentity();
         try {
             getContext().sendBroadcastAsUser(i, UserHandle.ALL);
+
+            synchronized (mVirtualDeviceManagerLock) {
+                if (mVirtualDevices.size() == 0) {
+                    unregisterCdmAssociationListener();
+                }
+            }
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
     }
 
+    private void syncVirtualDevicesToCdmAssociations(List<AssociationInfo> associations) {
+        Set<VirtualDeviceImpl> virtualDevicesToRemove = new HashSet<>();
+        synchronized (mVirtualDeviceManagerLock) {
+            if (mVirtualDevices.size() == 0) {
+                return;
+            }
+
+            Set<Integer> activeAssociationIds = new HashSet<>(associations.size());
+            for (AssociationInfo association : associations) {
+                activeAssociationIds.add(association.getId());
+            }
+
+            for (int i = 0; i < mVirtualDevices.size(); i++) {
+                VirtualDeviceImpl virtualDevice = mVirtualDevices.valueAt(i);
+                if (!activeAssociationIds.contains(virtualDevice.getAssociationId())) {
+                    virtualDevicesToRemove.add(virtualDevice);
+                }
+            }
+        }
+
+        for (VirtualDeviceImpl virtualDevice : virtualDevicesToRemove) {
+            virtualDevice.close();
+        }
+
+    }
+
+    private void registerCdmAssociationListener() {
+        final CompanionDeviceManager cdm = getContext().getSystemService(
+                CompanionDeviceManager.class);
+        cdm.addOnAssociationsChangedListener(getContext().getMainExecutor(),
+                mCdmAssociationListener);
+    }
+
+    private void unregisterCdmAssociationListener() {
+        final CompanionDeviceManager cdm = getContext().getSystemService(
+                CompanionDeviceManager.class);
+        cdm.removeOnAssociationsChangedListener(mCdmAssociationListener);
+    }
+
     class VirtualDeviceManagerImpl extends IVirtualDeviceManager.Stub {
 
         private final VirtualDeviceImpl.PendingTrampolineCallback mPendingTrampolineCallback =
@@ -254,7 +310,20 @@
             if (associationInfo == null) {
                 throw new IllegalArgumentException("No association with ID " + associationId);
             }
+            Objects.requireNonNull(params);
+            Objects.requireNonNull(activityListener);
+            Objects.requireNonNull(soundEffectListener);
+
             synchronized (mVirtualDeviceManagerLock) {
+                if (mVirtualDevices.size() == 0) {
+                    final long callindId = Binder.clearCallingIdentity();
+                    try {
+                        registerCdmAssociationListener();
+                    } finally {
+                        Binder.restoreCallingIdentity(callindId);
+                    }
+                }
+
                 final UserHandle userHandle = getCallingUserHandle();
                 final CameraAccessController cameraAccessController =
                         getCameraAccessController(userHandle);
@@ -275,6 +344,7 @@
         public int createVirtualDisplay(VirtualDisplayConfig virtualDisplayConfig,
                 IVirtualDisplayCallback callback, IVirtualDevice virtualDevice, String packageName)
                 throws RemoteException {
+            Objects.requireNonNull(virtualDisplayConfig);
             final int callingUid = getCallingUid();
             if (!PermissionUtils.validateCallingPackageName(getContext(), packageName)) {
                 throw new SecurityException(
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
index c5eb25b..3fd6fe8 100644
--- a/services/core/java/com/android/server/PinnerService.java
+++ b/services/core/java/com/android/server/PinnerService.java
@@ -26,8 +26,8 @@
 import android.app.ActivityManager;
 import android.app.ActivityManagerInternal;
 import android.app.IActivityManager;
-import android.app.IUidObserver;
 import android.app.SearchManager;
+import android.app.UidObserver;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -360,35 +360,18 @@
 
     private void registerUidListener() {
         try {
-            mAm.registerUidObserver(new IUidObserver.Stub() {
+            mAm.registerUidObserver(new UidObserver() {
                 @Override
-                public void onUidGone(int uid, boolean disabled) throws RemoteException {
+                public void onUidGone(int uid, boolean disabled) {
                     mPinnerHandler.sendMessage(PooledLambda.obtainMessage(
                             PinnerService::handleUidGone, PinnerService.this, uid));
                 }
 
                 @Override
-                public void onUidActive(int uid) throws RemoteException {
+                public void onUidActive(int uid)  {
                     mPinnerHandler.sendMessage(PooledLambda.obtainMessage(
                             PinnerService::handleUidActive, PinnerService.this, uid));
                 }
-
-                @Override
-                public void onUidIdle(int uid, boolean disabled) throws RemoteException {
-                }
-
-                @Override
-                public void onUidStateChanged(int uid, int procState, long procStateSeq,
-                        int capability) throws RemoteException {
-                }
-
-                @Override
-                public void onUidCachedChanged(int uid, boolean cached) throws RemoteException {
-                }
-
-                @Override
-                public void onUidProcAdjChanged(int uid) throws RemoteException {
-                }
             }, UID_OBSERVER_GONE | UID_OBSERVER_ACTIVE, 0, null);
         } catch (RemoteException e) {
             Slog.e(TAG, "Failed to register uid observer", e);
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index e0d1c1e..73dbb86a 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -73,6 +73,9 @@
 import android.content.pm.UserInfo;
 import android.content.res.ObbInfo;
 import android.database.ContentObserver;
+import android.media.MediaCodecList;
+import android.media.MediaCodecInfo;
+import android.media.MediaFormat;
 import android.net.Uri;
 import android.os.BatteryManager;
 import android.os.Binder;
@@ -954,10 +957,27 @@
         }
     }
 
+    private boolean isHevcDecoderSupported() {
+        MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+        MediaCodecInfo[] codecInfos = codecList.getCodecInfos();
+        for (MediaCodecInfo codecInfo : codecInfos) {
+            if (codecInfo.isEncoder()) {
+                continue;
+            }
+            String[] supportedTypes = codecInfo.getSupportedTypes();
+            for (String type : supportedTypes) {
+                if (type.equalsIgnoreCase(MediaFormat.MIMETYPE_VIDEO_HEVC)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
     private void configureTranscoding() {
         // See MediaProvider TranscodeHelper#getBooleanProperty for more information
         boolean transcodeEnabled = false;
-        boolean defaultValue = true;
+        boolean defaultValue = isHevcDecoderSupported() ? true : false;
 
         if (SystemProperties.getBoolean("persist.sys.fuse.transcode_user_control", false)) {
             transcodeEnabled = SystemProperties.getBoolean("persist.sys.fuse.transcode_enabled",
diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java
index 78d4708..e8c85ce 100644
--- a/services/core/java/com/android/server/VcnManagementService.java
+++ b/services/core/java/com/android/server/VcnManagementService.java
@@ -1074,9 +1074,10 @@
                             subGrp, mLastSnapshot, mConfigs.get(subGrp));
                     for (int restrictedTransport : restrictedTransports) {
                         if (ncCopy.hasTransport(restrictedTransport)) {
-                            if (restrictedTransport == TRANSPORT_CELLULAR) {
-                                // Only make a cell network as restricted when the VCN is in
-                                // active mode.
+                            if (restrictedTransport == TRANSPORT_CELLULAR
+                                    || restrictedTransport == TRANSPORT_TEST) {
+                                // For cell or test network, only mark it as restricted when
+                                // the VCN is in active mode.
                                 isRestricted |= (vcn.getStatus() == VCN_STATUS_CODE_ACTIVE);
                             } else {
                                 isRestricted = true;
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 8fe61e7..78cbf2b 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -807,9 +807,9 @@
         ServiceRecord r = res.record;
         // Note, when startService() or startForegroundService() is called on an already
         // running SHORT_SERVICE FGS, the call will succeed (i.e. we won't throw
-        // ForegroundServiceStartNotAllowedException), even when the service is alerady timed
-        // out. This is because these APIs will essnetially only change the "started" state
-        // of the service, and it won't afect "the foreground-ness" of the service, or the type
+        // ForegroundServiceStartNotAllowedException), even when the service is already timed
+        // out. This is because these APIs will essentially only change the "started" state
+        // of the service, and it won't affect "the foreground-ness" of the service, or the type
         // of the FGS.
         // However, this call will still _not_ extend the SHORT_SERVICE timeout either.
         // Also, if the app tries to change the type of the FGS later (using
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 82c4796a..ae5dbe1 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -151,8 +151,9 @@
 
     static final String KEY_USE_TIERED_CACHED_ADJ = "use_tiered_cached_adj";
     static final String KEY_TIERED_CACHED_ADJ_DECAY_TIME = "tiered_cached_adj_decay_time";
+    static final String KEY_USE_MODERN_TRIM = "use_modern_trim";
 
-    private static final int DEFAULT_MAX_CACHED_PROCESSES = 32;
+    private static final int DEFAULT_MAX_CACHED_PROCESSES = 1024;
     private static final boolean DEFAULT_PRIORITIZE_ALARM_BROADCASTS = true;
     private static final long DEFAULT_FGSERVICE_MIN_SHOWN_TIME = 2*1000;
     private static final long DEFAULT_FGSERVICE_MIN_REPORT_TIME = 3*1000;
@@ -212,6 +213,8 @@
     private static final boolean DEFAULT_USE_TIERED_CACHED_ADJ = false;
     private static final long DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME = 60 * 1000;
 
+    private static final boolean DEFAULT_USE_MODERN_TRIM = false;
+
     /**
      * Same as {@link TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_NOT_ALLOWED}
      */
@@ -876,7 +879,7 @@
     private static final String KEY_MAX_EMPTY_TIME_MILLIS =
             "max_empty_time_millis";
 
-    private static final long DEFAULT_MAX_EMPTY_TIME_MILLIS = 30 * 60 * 1000;
+    private static final long DEFAULT_MAX_EMPTY_TIME_MILLIS = 1000L * 60L * 60L * 1000L;
 
     volatile long mMaxEmptyTimeMillis = DEFAULT_MAX_EMPTY_TIME_MILLIS;
 
@@ -1052,6 +1055,9 @@
     /** @see #KEY_TIERED_CACHED_ADJ_DECAY_TIME */
     public long TIERED_CACHED_ADJ_DECAY_TIME = DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME;
 
+    /** @see #KEY_USE_MODERN_TRIM */
+    public boolean USE_MODERN_TRIM = DEFAULT_USE_MODERN_TRIM;
+
     private final OnPropertiesChangedListener mOnDeviceConfigChangedListener =
             new OnPropertiesChangedListener() {
                 @Override
@@ -1227,6 +1233,9 @@
                             case KEY_TIERED_CACHED_ADJ_DECAY_TIME:
                                 updateUseTieredCachedAdj();
                                 break;
+                            case KEY_USE_MODERN_TRIM:
+                                updateUseModernTrim();
+                                break;
                             default:
                                 updateFGSPermissionEnforcementFlagsIfNecessary(name);
                                 break;
@@ -1302,6 +1311,13 @@
                 com.android.internal.R.integer.config_customizedMaxCachedProcesses);
         CUR_MAX_CACHED_PROCESSES = mCustomizedMaxCachedProcesses;
         CUR_MAX_EMPTY_PROCESSES = computeEmptyProcessLimit(CUR_MAX_CACHED_PROCESSES);
+
+        final int rawMaxEmptyProcesses = computeEmptyProcessLimit(
+                Integer.min(CUR_MAX_CACHED_PROCESSES, MAX_CACHED_PROCESSES));
+        CUR_TRIM_EMPTY_PROCESSES = rawMaxEmptyProcesses / 2;
+        CUR_TRIM_CACHED_PROCESSES = (Integer.min(CUR_MAX_CACHED_PROCESSES, MAX_CACHED_PROCESSES)
+                    - rawMaxEmptyProcesses) / 3;
+
     }
 
     public void start(ContentResolver resolver) {
@@ -1867,12 +1883,11 @@
         }
         CUR_MAX_EMPTY_PROCESSES = computeEmptyProcessLimit(CUR_MAX_CACHED_PROCESSES);
 
-        // Note the trim levels do NOT depend on the override process limit, we want
-        // to consider the same level the point where we do trimming regardless of any
-        // additional enforced limit.
-        final int rawMaxEmptyProcesses = computeEmptyProcessLimit(MAX_CACHED_PROCESSES);
-        CUR_TRIM_EMPTY_PROCESSES = rawMaxEmptyProcesses/2;
-        CUR_TRIM_CACHED_PROCESSES = (MAX_CACHED_PROCESSES-rawMaxEmptyProcesses)/3;
+        final int rawMaxEmptyProcesses = computeEmptyProcessLimit(
+                Integer.min(CUR_MAX_CACHED_PROCESSES, MAX_CACHED_PROCESSES));
+        CUR_TRIM_EMPTY_PROCESSES = rawMaxEmptyProcesses / 2;
+        CUR_TRIM_CACHED_PROCESSES = (Integer.min(CUR_MAX_CACHED_PROCESSES, MAX_CACHED_PROCESSES)
+                    - rawMaxEmptyProcesses) / 3;
     }
 
     private void updateProactiveKillsEnabled() {
@@ -1991,6 +2006,13 @@
             DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME);
     }
 
+    private void updateUseModernTrim() {
+        USE_MODERN_TRIM = DeviceConfig.getBoolean(
+            DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+            KEY_USE_MODERN_TRIM,
+            DEFAULT_USE_MODERN_TRIM);
+    }
+
     private void updateFGSPermissionEnforcementFlagsIfNecessary(@NonNull String name) {
         ForegroundServiceTypePolicy.getDefaultPolicy()
                 .updatePermissionEnforcementFlagIfNecessary(name);
diff --git a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
index 9079ba8..5dd0a3f 100644
--- a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
+++ b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
@@ -16,6 +16,11 @@
 
 package com.android.server.am;
 
+import android.util.Log;
+import android.util.LogWriter;
+
+import java.io.PrintWriter;
+
 /**
  * Common class for the various debug {@link android.util.Log} output configuration in the activity
  * manager package.
@@ -38,6 +43,10 @@
     // Default log tag for the activity manager package.
     static final String TAG_AM = "ActivityManager";
 
+    // Default writer that emits "info" log events for the activity manager package.
+    static final PrintWriter LOG_WRITER_INFO = new PrintWriter(
+            new LogWriter(Log.INFO, TAG_AM));
+
     // Enable all debug log categories.
     static final boolean DEBUG_ALL = false;
 
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 8d8ed19..ef7d5ae 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -135,6 +135,7 @@
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER;
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PROCESSES;
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SERVICE;
+import static com.android.server.am.ActivityManagerDebugConfig.LOG_WRITER_INFO;
 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BACKUP;
 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BROADCAST;
 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CLEANUP;
@@ -6984,8 +6985,9 @@
                 mActivityTaskManager.onScreenAwakeChanged(isAwake);
                 mOomAdjProfiler.onWakefulnessChanged(wakefulness);
                 mOomAdjuster.onWakefulnessChanged(wakefulness);
+
+                updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
             }
-            updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
         }
     }
 
@@ -8645,13 +8647,16 @@
             }
         }
 
+        boolean recoverable = eventType.equals("native_recoverable_crash");
+
         EventLogTags.writeAmCrash(Binder.getCallingPid(),
                 UserHandle.getUserId(Binder.getCallingUid()), processName,
                 r == null ? -1 : r.info.flags,
                 crashInfo.exceptionClassName,
                 crashInfo.exceptionMessage,
                 crashInfo.throwFileName,
-                crashInfo.throwLineNumber);
+                crashInfo.throwLineNumber,
+                recoverable ? 1 : 0);
 
         int processClassEnum = processName.equals("system_server") ? ServerProtoEnums.SYSTEM_SERVER
                 : (r != null) ? r.getProcessClassEnum()
@@ -8719,7 +8724,13 @@
                 eventType, r, processName, null, null, null, null, null, null, crashInfo,
                 new Float(loadingProgress), incrementalMetrics, null);
 
-        mAppErrors.crashApplication(r, crashInfo);
+        // For GWP-ASan recoverable crashes, don't make the app crash (the whole point of
+        // 'recoverable' is that the app doesn't crash). Normally, for nonrecoreable native crashes,
+        // debuggerd will terminate the process, but there's a backup where ActivityManager will
+        // also kill it. Avoid that.
+        if (!recoverable) {
+            mAppErrors.crashApplication(r, crashInfo);
+        }
     }
 
     public void handleApplicationStrictModeViolation(
@@ -13638,8 +13649,9 @@
                                 || action.startsWith("android.intent.action.UID_")
                                 || action.startsWith("android.intent.action.EXTERNAL_")) {
                             if (DEBUG_BROADCAST) {
-                                Slog.wtf(TAG, "System internals registering for " + filter
-                                        + " with app priority; this will race with apps!",
+                                Slog.wtf(TAG,
+                                        "System internals registering for " + filter.toLongString()
+                                                + " with app priority; this will race with apps!",
                                         new Throwable());
                             }
 
@@ -13734,17 +13746,6 @@
                                 + "RECEIVER_NOT_EXPORTED flag");
             }
 
-            // STOPSHIP(b/259139792): Allow apps that are currently targeting U and in process of
-            // updating their receivers to be exempt from this requirement until their receivers
-            // are flagged.
-            if (requireExplicitFlagForDynamicReceivers) {
-                if ("com.shannon.imsservice".equals(callerPackage)) {
-                    // Note, a versionCode check for this package is not performed because this
-                    // package consumes the SecurityException, so it wouldn't be caught during
-                    // presubmit.
-                    requireExplicitFlagForDynamicReceivers = false;
-                }
-            }
             if (!onlyProtectedBroadcasts) {
                 if (receiver == null && !explicitExportStateDefined) {
                     // sticky broadcast, no flag specified (flag isn't required)
@@ -18713,27 +18714,25 @@
 
     @Override
     public void waitForBroadcastIdle() {
-        waitForBroadcastIdle(/* printWriter= */ null);
+        waitForBroadcastIdle(LOG_WRITER_INFO);
     }
 
-    public void waitForBroadcastIdle(@Nullable PrintWriter pw) {
+    public void waitForBroadcastIdle(@NonNull PrintWriter pw) {
         enforceCallingPermission(permission.DUMP, "waitForBroadcastIdle()");
         BroadcastLoopers.waitForIdle(pw);
         for (BroadcastQueue queue : mBroadcastQueues) {
             queue.waitForIdle(pw);
         }
-        if (pw != null) {
-            pw.println("All broadcast queues are idle!");
-            pw.flush();
-        }
+        pw.println("All broadcast queues are idle!");
+        pw.flush();
     }
 
     @Override
     public void waitForBroadcastBarrier() {
-        waitForBroadcastBarrier(/* printWriter= */ null, false, false);
+        waitForBroadcastBarrier(LOG_WRITER_INFO, false, false);
     }
 
-    public void waitForBroadcastBarrier(@Nullable PrintWriter pw,
+    public void waitForBroadcastBarrier(@NonNull PrintWriter pw,
             boolean flushBroadcastLoopers, boolean flushApplicationThreads) {
         enforceCallingPermission(permission.DUMP, "waitForBroadcastBarrier()");
         if (flushBroadcastLoopers) {
@@ -18751,11 +18750,7 @@
      * Wait for all pending {@link IApplicationThread} events to be processed in
      * all currently running apps.
      */
-    public void waitForApplicationBarrier(@Nullable PrintWriter pw) {
-        if (pw == null) {
-            pw = new PrintWriter(new LogWriter(Log.VERBOSE, TAG));
-        }
-
+    public void waitForApplicationBarrier(@NonNull PrintWriter pw) {
         final CountDownLatch finishedLatch = new CountDownLatch(1);
         final AtomicInteger pingCount = new AtomicInteger(0);
         final AtomicInteger pongCount = new AtomicInteger(0);
@@ -18780,7 +18775,7 @@
                     final IApplicationThread thread = app.getOnewayThread();
                     if (thread != null) {
                         mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(app,
-                                OomAdjuster.OOM_ADJ_REASON_NONE);
+                                CachedAppOptimizer.UNFREEZE_REASON_PING);
                         pingCount.incrementAndGet();
                         try {
                             thread.schedulePing(pongCallback);
@@ -18803,15 +18798,18 @@
             try {
                 if (finishedLatch.await(1, TimeUnit.SECONDS)) {
                     pw.println("Finished application barriers!");
+                    pw.flush();
                     return;
                 } else {
                     pw.println("Waiting for application barriers, at " + pongCount.get() + " of "
                             + pingCount.get() + "...");
+                    pw.flush();
                 }
             } catch (InterruptedException ignored) {
             }
         }
         pw.println("Gave up waiting for application barriers!");
+        pw.flush();
     }
 
     void setIgnoreDeliveryGroupPolicy(@NonNull String broadcastAction) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 72e17d8..e080a80 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -38,6 +38,7 @@
 import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_LOW;
 import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_MODERATE;
 import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_NORMAL;
+import static com.android.server.am.ActivityManagerDebugConfig.LOG_WRITER_INFO;
 import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
 import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.am.AppBatteryTracker.BatteryUsage.BATTERY_USAGE_COUNT;
@@ -58,12 +59,12 @@
 import android.app.IActivityTaskManager;
 import android.app.IProcessObserver;
 import android.app.IStopUserCallback;
-import android.app.IUidObserver;
 import android.app.IUserSwitchObserver;
 import android.app.KeyguardManager;
 import android.app.ProcessStateEnum;
 import android.app.ProfilerInfo;
 import android.app.RemoteServiceException.CrashedByAdbException;
+import android.app.UidObserver;
 import android.app.UserSwitchObserver;
 import android.app.WaitResult;
 import android.app.usage.AppStandbyInfo;
@@ -112,6 +113,7 @@
 import android.util.ArraySet;
 import android.util.DebugUtils;
 import android.util.DisplayMetrics;
+import android.util.TeeWriter;
 import android.util.proto.ProtoOutputStream;
 import android.view.Display;
 import android.window.SplashScreen;
@@ -1093,7 +1095,7 @@
                 synchronized (mInternal.mProcLock) {
                     mInternal.mOomAdjuster.mCachedAppOptimizer.compactApp(app,
                             CachedAppOptimizer.CompactProfile.FULL,
-                            CachedAppOptimizer.CompactSource.APP, true);
+                            CachedAppOptimizer.CompactSource.SHELL, true);
                 }
                 pw.println("Finished full compaction for " + app.mPid);
             } else if (isSomeCompact) {
@@ -1101,7 +1103,7 @@
                 synchronized (mInternal.mProcLock) {
                     mInternal.mOomAdjuster.mCachedAppOptimizer.compactApp(app,
                             CachedAppOptimizer.CompactProfile.SOME,
-                            CachedAppOptimizer.CompactSource.APP, true);
+                            CachedAppOptimizer.CompactSource.SHELL, true);
                 }
                 pw.println("Finished some compaction for " + app.mPid);
             }
@@ -1856,7 +1858,7 @@
         return 0;
     }
 
-    static final class MyUidObserver extends IUidObserver.Stub
+    static final class MyUidObserver extends UidObserver
             implements ActivityManagerService.OomAdjObserver {
         final IActivityManager mInterface;
         final ActivityManagerService mInternal;
@@ -1881,8 +1883,7 @@
         }
 
         @Override
-        public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability)
-                throws RemoteException {
+        public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
             synchronized (this) {
                 final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
                 try {
@@ -1901,7 +1902,7 @@
         }
 
         @Override
-        public void onUidGone(int uid, boolean disabled) throws RemoteException {
+        public void onUidGone(int uid, boolean disabled) {
             synchronized (this) {
                 final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
                 try {
@@ -1919,7 +1920,7 @@
         }
 
         @Override
-        public void onUidActive(int uid) throws RemoteException {
+        public void onUidActive(int uid) {
             synchronized (this) {
                 final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
                 try {
@@ -1933,7 +1934,7 @@
         }
 
         @Override
-        public void onUidIdle(int uid, boolean disabled) throws RemoteException {
+        public void onUidIdle(int uid, boolean disabled) {
             synchronized (this) {
                 final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
                 try {
@@ -1951,7 +1952,7 @@
         }
 
         @Override
-        public void onUidCachedChanged(int uid, boolean cached) throws RemoteException {
+        public void onUidCachedChanged(int uid, boolean cached) {
             synchronized (this) {
                 final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
                 try {
@@ -1965,10 +1966,6 @@
         }
 
         @Override
-        public void onUidProcAdjChanged(int uid) throws RemoteException {
-        }
-
-        @Override
         public void onOomAdjMessage(String msg) {
             synchronized (this) {
                 final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
@@ -3364,11 +3361,13 @@
     }
 
     int runWaitForBroadcastIdle(PrintWriter pw) throws RemoteException {
+        pw = new PrintWriter(new TeeWriter(LOG_WRITER_INFO, pw));
         mInternal.waitForBroadcastIdle(pw);
         return 0;
     }
 
     int runWaitForBroadcastBarrier(PrintWriter pw) throws RemoteException {
+        pw = new PrintWriter(new TeeWriter(LOG_WRITER_INFO, pw));
         boolean flushBroadcastLoopers = false;
         boolean flushApplicationThreads = false;
         String opt;
@@ -3387,6 +3386,7 @@
     }
 
     int runWaitForApplicationBarrier(PrintWriter pw) throws RemoteException {
+        pw = new PrintWriter(new TeeWriter(LOG_WRITER_INFO, pw));
         mInternal.waitForApplicationBarrier(pw);
         return 0;
     }
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 08c1de6..c343ec2 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -534,6 +534,8 @@
             }
         }
 
+        mService.mOomAdjuster.mCachedAppOptimizer.unfreezeProcess(initialPid,
+                CachedAppOptimizer.UNFREEZE_REASON_PROCESS_END);
         proc.scheduleCrashLocked(message, exceptionTypeId, extras);
         if (force) {
             // If the app is responsive, the scheduled crash will happen as expected
diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java
index dd6598f..25ac956 100644
--- a/services/core/java/com/android/server/am/AppProfiler.java
+++ b/services/core/java/com/android/server/am/AppProfiler.java
@@ -45,7 +45,6 @@
 import static com.android.server.am.ActivityManagerService.getKsmInfo;
 import static com.android.server.am.ActivityManagerService.stringifyKBSize;
 import static com.android.server.am.LowMemDetector.ADJ_MEM_FACTOR_NOTHING;
-import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_NONE;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SWITCH;
 import static com.android.server.wm.ActivityTaskManagerService.DUMP_ACTIVITIES_CMD;
 
@@ -1006,6 +1005,37 @@
             mBgHandler.obtainMessage(BgHandler.MEMORY_PRESSURE_CHANGED, mLastMemoryLevel, memFactor)
                     .sendToTarget();
         }
+
+        if (mService.mConstants.USE_MODERN_TRIM) {
+            // Modern trim is not sent based on lowmem state
+            // Dispatch UI_HIDDEN to processes that need it
+            mService.mProcessList.forEachLruProcessesLOSP(true, app -> {
+                final ProcessProfileRecord profile = app.mProfile;
+                final IApplicationThread thread;
+                final ProcessStateRecord state = app.mState;
+                if (state.hasProcStateChanged()) {
+                    state.setProcStateChanged(false);
+                }
+                int procState = app.mState.getCurProcState();
+                if (((procState >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
+                        && procState < ActivityManager.PROCESS_STATE_CACHED_ACTIVITY)
+                        || app.mState.isSystemNoUi()) && app.mProfile.hasPendingUiClean()) {
+                    // If this application is now in the background and it
+                    // had done UI, then give it the special trim level to
+                    // have it free UI resources.
+                    if ((thread = app.getThread()) != null) {
+                        try {
+                            thread.scheduleTrimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
+                            app.mProfile.setPendingUiClean(false);
+                        } catch (RemoteException e) {
+
+                        }
+                    }
+                }
+            });
+            return false;
+        }
+
         mLastMemoryLevel = memFactor;
         mLastNumProcesses = mService.mProcessList.getLruSizeLOSP();
         boolean allChanged;
@@ -1119,7 +1149,7 @@
                     Slog.v(TAG_OOM_ADJ, msg + app.processName + " to " + level);
                 }
                 mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(app,
-                        OOM_ADJ_REASON_NONE);
+                        CachedAppOptimizer.UNFREEZE_REASON_TRIM_MEMORY);
                 thread.scheduleTrimMemory(level);
             } catch (RemoteException e) {
             }
diff --git a/services/core/java/com/android/server/am/AppRestrictionController.java b/services/core/java/com/android/server/am/AppRestrictionController.java
index 6928bd3..88f6bc9 100644
--- a/services/core/java/com/android/server/am/AppRestrictionController.java
+++ b/services/core/java/com/android/server/am/AppRestrictionController.java
@@ -101,6 +101,7 @@
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
+import android.app.UidObserver;
 import android.app.role.OnRoleHoldersChangedListener;
 import android.app.role.RoleManager;
 import android.app.usage.AppStandbyInfo;
@@ -136,6 +137,7 @@
 import android.provider.DeviceConfig.Properties;
 import android.provider.Settings;
 import android.telephony.TelephonyManager;
+import android.telephony.TelephonyManager.CarrierPrivilegesCallback;
 import android.text.TextUtils;
 import android.util.ArraySet;
 import android.util.AtomicFile;
@@ -311,10 +313,18 @@
     private final Object mCarrierPrivilegedLock = new Object();
 
     /**
-     * List of carrier-privileged apps that should be excluded from standby.
+     * List of carrier-privileged apps that should be excluded from standby,
+     * the key of this array here is the phone id.
      */
     @GuardedBy("mCarrierPrivilegedLock")
-    private List<String> mCarrierPrivilegedApps;
+    private final SparseArray<Set<String>> mCarrierPrivilegedApps = new SparseArray<>();
+
+    /**
+     * Holding the callbacks to the carrier privileged app changes.
+     *
+     * it's lock free.
+     */
+    private volatile ArrayList<PhoneCarrierPrivilegesCallback> mCarrierPrivilegesCallbacks;
 
     /**
      * Whether or not we've loaded the restriction settings from the persistent storage.
@@ -357,19 +367,6 @@
                             onUidAdded(uid);
                         }
                     }
-                }
-                // fall through.
-                case Intent.ACTION_PACKAGE_CHANGED: {
-                    final String pkgName = intent.getData().getSchemeSpecificPart();
-                    final String[] cmpList = intent.getStringArrayExtra(
-                            Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST);
-                    // If this is PACKAGE_ADDED (cmpList == null), or if it's a whole-package
-                    // enable/disable event (cmpList is just the package name itself), drop
-                    // our carrier privileged app & system-app caches and let them refresh
-                    if (cmpList == null
-                            || (cmpList.length == 1 && pkgName.equals(cmpList[0]))) {
-                        clearCarrierPrivilegedApps();
-                    }
                 } break;
                 case Intent.ACTION_PACKAGE_FULLY_REMOVED: {
                     final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
@@ -412,6 +409,10 @@
                         onUserRemoved(userId);
                     }
                 } break;
+                case TelephonyManager.ACTION_MULTI_SIM_CONFIG_CHANGED: {
+                    unregisterCarrierPrivilegesCallbacks();
+                    registerCarrierPrivilegesCallbacks();
+                } break;
             }
         }
     };
@@ -1439,7 +1440,7 @@
             };
 
     private final IUidObserver mUidObserver =
-            new IUidObserver.Stub() {
+            new UidObserver() {
                 @Override
                 public void onUidStateChanged(int uid, int procState, long procStateSeq,
                         int capability) {
@@ -1463,14 +1464,6 @@
                 public void onUidActive(int uid) {
                     mBgHandler.obtainMessage(BgHandler.MSG_UID_ACTIVE, uid, 0).sendToTarget();
                 }
-
-                @Override
-                public void onUidCachedChanged(int uid, boolean cached) {
-                }
-
-                @Override
-                public void onUidProcAdjChanged(int uid) {
-                }
             };
 
     /**
@@ -1508,6 +1501,7 @@
         initRolesInInterest();
         registerForUidObservers();
         registerForSystemBroadcasts();
+        registerCarrierPrivilegesCallbacks();
         mNotificationHelper.onSystemReady();
         mInjector.getAppStateTracker().addBackgroundRestrictedAppListener(
                 mBackgroundRestrictionListener);
@@ -2823,6 +2817,7 @@
         final PackageManagerInternal pm = mInjector.getPackageManagerInternal();
         final AppStandbyInternal appStandbyInternal = mInjector.getAppStandbyInternal();
         final AppOpsManager appOpsManager = mInjector.getAppOpsManager();
+        final ActivityManagerService activityManagerService = mInjector.getActivityManagerService();
         final int userId = UserHandle.getUserId(uid);
         if (isSystemModule(pkg)) {
             return REASON_SYSTEM_MODULE;
@@ -2836,7 +2831,7 @@
             return REASON_DPO_PROTECTED_APP;
         } else if (appStandbyInternal.isActiveDeviceAdmin(pkg, userId)) {
             return REASON_ACTIVE_DEVICE_ADMIN;
-        } else if (mActivityManagerService.mConstants.mFlagSystemExemptPowerRestrictionsEnabled
+        } else if (activityManagerService.mConstants.mFlagSystemExemptPowerRestrictionsEnabled
                 && appOpsManager.checkOpNoThrow(
                 AppOpsManager.OP_SYSTEM_EXEMPT_FROM_POWER_RESTRICTIONS, uid, pkg)
                 == AppOpsManager.MODE_ALLOWED) {
@@ -2879,32 +2874,61 @@
 
     private boolean isCarrierApp(String packageName) {
         synchronized (mCarrierPrivilegedLock) {
-            if (mCarrierPrivilegedApps == null) {
-                fetchCarrierPrivilegedAppsCPL();
-            }
             if (mCarrierPrivilegedApps != null) {
-                return mCarrierPrivilegedApps.contains(packageName);
+                for (int i = mCarrierPrivilegedApps.size() - 1; i >= 0; i--) {
+                    if (mCarrierPrivilegedApps.valueAt(i).contains(packageName)) {
+                        return true;
+                    }
+                }
             }
             return false;
         }
     }
 
-    private void clearCarrierPrivilegedApps() {
-        if (DEBUG_BG_RESTRICTION_CONTROLLER) {
-            Slog.i(TAG, "Clearing carrier privileged apps list");
+    private void registerCarrierPrivilegesCallbacks() {
+        final TelephonyManager telephonyManager = mInjector.getTelephonyManager();
+        if (telephonyManager == null) {
+            return;
         }
-        synchronized (mCarrierPrivilegedLock) {
-            mCarrierPrivilegedApps = null; // Need to be refetched.
+
+        final int numPhones = telephonyManager.getActiveModemCount();
+        final ArrayList<PhoneCarrierPrivilegesCallback> callbacks = new ArrayList<>();
+        for (int i = 0; i < numPhones; i++) {
+            final PhoneCarrierPrivilegesCallback callback = new PhoneCarrierPrivilegesCallback(i);
+            callbacks.add(callback);
+            telephonyManager.registerCarrierPrivilegesCallback(i, mBgExecutor, callback);
+        }
+        mCarrierPrivilegesCallbacks = callbacks;
+    }
+
+    private void unregisterCarrierPrivilegesCallbacks() {
+        final TelephonyManager telephonyManager = mInjector.getTelephonyManager();
+        if (telephonyManager == null) {
+            return;
+        }
+        final ArrayList<PhoneCarrierPrivilegesCallback> callbacks = mCarrierPrivilegesCallbacks;
+        if (callbacks != null) {
+            for (int i = callbacks.size() - 1; i >= 0; i--) {
+                telephonyManager.unregisterCarrierPrivilegesCallback(callbacks.get(i));
+            }
+            mCarrierPrivilegesCallbacks = null;
         }
     }
 
-    @GuardedBy("mCarrierPrivilegedLock")
-    private void fetchCarrierPrivilegedAppsCPL() {
-        final TelephonyManager telephonyManager = mInjector.getTelephonyManager();
-        mCarrierPrivilegedApps =
-                telephonyManager.getCarrierPrivilegedPackagesForAllActiveSubscriptions();
-        if (DEBUG_BG_RESTRICTION_CONTROLLER) {
-            Slog.d(TAG, "apps with carrier privilege " + mCarrierPrivilegedApps);
+    private class PhoneCarrierPrivilegesCallback implements CarrierPrivilegesCallback {
+        private final int mPhoneId;
+
+        PhoneCarrierPrivilegesCallback(int phoneId) {
+            mPhoneId = phoneId;
+        }
+
+        @Override
+        public void onCarrierPrivilegesChanged(@NonNull Set<String> privilegedPackageNames,
+                @NonNull Set<Integer> privilegedUids) {
+            synchronized (mCarrierPrivilegedLock) {
+                mCarrierPrivilegedApps.put(mPhoneId,
+                        Collections.unmodifiableSet(privilegedPackageNames));
+            }
         }
     }
 
@@ -3272,7 +3296,6 @@
     private void registerForSystemBroadcasts() {
         final IntentFilter packageFilter = new IntentFilter();
         packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
-        packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
         packageFilter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED);
         packageFilter.addDataScheme("package");
         mContext.registerReceiverForAllUsers(mBroadcastReceiver, packageFilter, null, mBgHandler);
@@ -3285,6 +3308,9 @@
         bootFilter.addAction(Intent.ACTION_LOCKED_BOOT_COMPLETED);
         mContext.registerReceiverAsUser(mBootReceiver, UserHandle.SYSTEM,
                 bootFilter, null, mBgHandler);
+        final IntentFilter telFilter = new IntentFilter(
+                TelephonyManager.ACTION_MULTI_SIM_CONFIG_CHANGED);
+        mContext.registerReceiverForAllUsers(mBroadcastReceiver, telFilter, null, mBgHandler);
     }
 
     private void unregisterForSystemBroadcasts() {
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index d9ba845..ed297d0 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -654,6 +654,7 @@
         synchronized (mLock) {
             final long elapsedRealtime = SystemClock.elapsedRealtime();
             mHandler.post(() -> {
+                mCpuWakeupStats.onUidRemoved(uid);
                 synchronized (mStats) {
                     mStats.removeUidStatsLocked(uid, elapsedRealtime);
                 }
@@ -764,6 +765,7 @@
             final long elapsedRealtime = SystemClock.elapsedRealtime();
             final long uptime = SystemClock.uptimeMillis();
             mHandler.post(() -> {
+                mCpuWakeupStats.noteUidProcessState(uid, state);
                 synchronized (mStats) {
                     mStats.noteUidProcessStateLocked(uid, state, elapsedRealtime, uptime);
                 }
diff --git a/services/core/java/com/android/server/am/BroadcastFilter.java b/services/core/java/com/android/server/am/BroadcastFilter.java
index a92723e..7494277 100644
--- a/services/core/java/com/android/server/am/BroadcastFilter.java
+++ b/services/core/java/com/android/server/am/BroadcastFilter.java
@@ -16,6 +16,7 @@
 
 package com.android.server.am;
 
+import android.annotation.Nullable;
 import android.content.IntentFilter;
 import android.util.PrintWriterPrinter;
 import android.util.Printer;
@@ -55,6 +56,16 @@
         exported = _exported;
     }
 
+    public @Nullable String getReceiverClassName() {
+        if (receiverId != null) {
+            final int index = receiverId.lastIndexOf('@');
+            if (index > 0) {
+                return receiverId.substring(0, index);
+            }
+        }
+        return null;
+    }
+
     @NeverCompile
     public void dumpDebug(ProtoOutputStream proto, long fieldId) {
         long token = proto.start(fieldId);
diff --git a/services/core/java/com/android/server/am/BroadcastLoopers.java b/services/core/java/com/android/server/am/BroadcastLoopers.java
index a5535cb..92547ea 100644
--- a/services/core/java/com/android/server/am/BroadcastLoopers.java
+++ b/services/core/java/com/android/server/am/BroadcastLoopers.java
@@ -17,7 +17,6 @@
 package com.android.server.am;
 
 import android.annotation.NonNull;
-import android.annotation.Nullable;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
@@ -74,7 +73,7 @@
      * defined by {@link MessageQueue#isIdle()}. Note that {@link Message#when}
      * still in the future are ignored for the purposes of the idle test.
      */
-    public static void waitForIdle(@Nullable PrintWriter pw) {
+    public static void waitForIdle(@NonNull PrintWriter pw) {
         waitForCondition(pw, (looper, latch) -> {
             final MessageQueue queue = looper.getQueue();
             queue.addIdleHandler(() -> {
@@ -89,7 +88,7 @@
      * Note that {@link Message#when} still in the future are ignored for the purposes
      * of the idle test.
      */
-    public static void waitForBarrier(@Nullable PrintWriter pw) {
+    public static void waitForBarrier(@NonNull PrintWriter pw) {
         waitForCondition(pw, (looper, latch) -> {
             (new Handler(looper)).post(() -> {
                 latch.countDown();
@@ -100,7 +99,7 @@
     /**
      * Wait for all registered {@link Looper} instances to meet a certain condition.
      */
-    private static void waitForCondition(@Nullable PrintWriter pw,
+    private static void waitForCondition(@NonNull PrintWriter pw,
             @NonNull BiConsumer<Looper, CountDownLatch> condition) {
         final CountDownLatch latch;
         synchronized (sLoopers) {
@@ -122,18 +121,12 @@
             final long now = SystemClock.uptimeMillis();
             if (now >= lastPrint + 1000) {
                 lastPrint = now;
-                logv("Waiting for " + latch.getCount() + " loopers to drain...", pw);
+                pw.println("Waiting for " + latch.getCount() + " loopers to drain...");
+                pw.flush();
             }
             SystemClock.sleep(100);
         }
-        logv("Loopers drained!", pw);
-    }
-
-    private static void logv(@NonNull String msg, @Nullable PrintWriter pw) {
-        Slog.v(TAG, msg);
-        if (pw != null) {
-            pw.println(msg);
-            pw.flush();
-        }
+        pw.println("Loopers drained!");
+        pw.flush();
     }
 }
diff --git a/services/core/java/com/android/server/am/BroadcastProcessQueue.java b/services/core/java/com/android/server/am/BroadcastProcessQueue.java
index 0cdd4e9..dbb351b 100644
--- a/services/core/java/com/android/server/am/BroadcastProcessQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastProcessQueue.java
@@ -188,7 +188,7 @@
     private @Reason int mRunnableAtReason = REASON_EMPTY;
     private boolean mRunnableAtInvalidated;
 
-    private boolean mProcessCached;
+    private boolean mUidCached;
     private boolean mProcessInstrumented;
     private boolean mProcessPersistent;
 
@@ -382,27 +382,30 @@
     /**
      * Update the actively running "warm" process for this process.
      */
-    public void setProcess(@Nullable ProcessRecord app) {
+    public void setProcessAndUidCached(@Nullable ProcessRecord app, boolean uidCached) {
         this.app = app;
         if (app != null) {
-            setProcessCached(app.isCached());
+            setUidCached(uidCached);
             setProcessInstrumented(app.getActiveInstrumentation() != null);
             setProcessPersistent(app.isPersistent());
         } else {
-            setProcessCached(false);
+            setUidCached(uidCached);
             setProcessInstrumented(false);
             setProcessPersistent(false);
         }
+
+        // Since we may have just changed our PID, invalidate cached strings
+        mCachedToString = null;
+        mCachedToShortString = null;
     }
 
     /**
      * Update if this process is in the "cached" state, typically signaling that
      * broadcast dispatch should be paused or delayed.
      */
-    @VisibleForTesting
-    void setProcessCached(boolean cached) {
-        if (mProcessCached != cached) {
-            mProcessCached = cached;
+    private void setUidCached(boolean uidCached) {
+        if (mUidCached != uidCached) {
+            mUidCached = uidCached;
             invalidateRunnableAt();
         }
     }
@@ -412,7 +415,7 @@
      * signaling that broadcast dispatch should bypass all pauses or delays, to
      * avoid holding up test suites.
      */
-    public void setProcessInstrumented(boolean instrumented) {
+    private void setProcessInstrumented(boolean instrumented) {
         if (mProcessInstrumented != instrumented) {
             mProcessInstrumented = instrumented;
             invalidateRunnableAt();
@@ -423,7 +426,7 @@
      * Update if this process is in the "persistent" state, which signals broadcast dispatch should
      * bypass all pauses or delays to prevent the system from becoming out of sync with itself.
      */
-    public void setProcessPersistent(boolean persistent) {
+    private void setProcessPersistent(boolean persistent) {
         if (mProcessPersistent != persistent) {
             mProcessPersistent = persistent;
             invalidateRunnableAt();
@@ -860,6 +863,7 @@
     static final int REASON_CONTAINS_RESULT_TO = 15;
     static final int REASON_CONTAINS_INSTRUMENTED = 16;
     static final int REASON_CONTAINS_MANIFEST = 17;
+    static final int REASON_FOREGROUND_ACTIVITIES = 18;
 
     @IntDef(flag = false, prefix = { "REASON_" }, value = {
             REASON_EMPTY,
@@ -879,6 +883,7 @@
             REASON_CONTAINS_RESULT_TO,
             REASON_CONTAINS_INSTRUMENTED,
             REASON_CONTAINS_MANIFEST,
+            REASON_FOREGROUND_ACTIVITIES,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Reason {}
@@ -902,6 +907,7 @@
             case REASON_CONTAINS_RESULT_TO: return "CONTAINS_RESULT_TO";
             case REASON_CONTAINS_INSTRUMENTED: return "CONTAINS_INSTRUMENTED";
             case REASON_CONTAINS_MANIFEST: return "CONTAINS_MANIFEST";
+            case REASON_FOREGROUND_ACTIVITIES: return "FOREGROUND_ACTIVITIES";
             default: return Integer.toString(reason);
         }
     }
@@ -959,6 +965,11 @@
             } else if (mProcessInstrumented) {
                 mRunnableAt = runnableAt + constants.DELAY_URGENT_MILLIS;
                 mRunnableAtReason = REASON_INSTRUMENTED;
+            } else if (app != null && app.hasForegroundActivities()) {
+                // TODO: Listen for uid state changes to check when an uid goes in and out of
+                // the TOP state.
+                mRunnableAt = runnableAt + constants.DELAY_URGENT_MILLIS;
+                mRunnableAtReason = REASON_FOREGROUND_ACTIVITIES;
             } else if (mCountOrdered > 0) {
                 mRunnableAt = runnableAt;
                 mRunnableAtReason = REASON_CONTAINS_ORDERED;
@@ -974,7 +985,7 @@
             } else if (mProcessPersistent) {
                 mRunnableAt = runnableAt;
                 mRunnableAtReason = REASON_PERSISTENT;
-            } else if (mProcessCached) {
+            } else if (mUidCached) {
                 if (r.deferUntilActive) {
                     // All enqueued broadcasts are deferrable, defer
                     if (mCountDeferred == mCountEnqueued) {
@@ -1039,13 +1050,13 @@
      * Check overall health, confirming things are in a reasonable state and
      * that we're not wedged.
      */
-    public void checkHealthLocked() {
-        checkHealthLocked(mPending);
-        checkHealthLocked(mPendingUrgent);
-        checkHealthLocked(mPendingOffload);
+    public void assertHealthLocked() {
+        assertHealthLocked(mPending);
+        assertHealthLocked(mPendingUrgent);
+        assertHealthLocked(mPendingOffload);
     }
 
-    private void checkHealthLocked(@NonNull ArrayDeque<SomeArgs> queue) {
+    private void assertHealthLocked(@NonNull ArrayDeque<SomeArgs> queue) {
         if (queue.isEmpty()) return;
 
         final Iterator<SomeArgs> it = queue.descendingIterator();
@@ -1128,16 +1139,16 @@
     @Override
     public String toString() {
         if (mCachedToString == null) {
-            mCachedToString = "BroadcastProcessQueue{"
-                    + Integer.toHexString(System.identityHashCode(this))
-                    + " " + processName + "/" + UserHandle.formatUid(uid) + "}";
+            mCachedToString = "BroadcastProcessQueue{" + toShortString() + "}";
         }
         return mCachedToString;
     }
 
     public String toShortString() {
         if (mCachedToShortString == null) {
-            mCachedToShortString = processName + "/" + UserHandle.formatUid(uid);
+            mCachedToShortString = Integer.toHexString(System.identityHashCode(this))
+                    + " " + ((app != null) ? app.getPid() : "?") + ":" + processName + "/"
+                    + UserHandle.formatUid(uid);
         }
         return mCachedToShortString;
     }
@@ -1183,7 +1194,7 @@
     @NeverCompile
     private void dumpProcessState(@NonNull IndentingPrintWriter pw) {
         final StringBuilder sb = new StringBuilder();
-        if (mProcessCached) {
+        if (mUidCached) {
             sb.append("CACHED");
         }
         if (mProcessInstrumented) {
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index 75e9336..6d1344d 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -69,14 +69,6 @@
         Slog.v(TAG, msg);
     }
 
-    static void logv(@NonNull String msg, @Nullable PrintWriter pw) {
-        logv(msg);
-        if (pw != null) {
-            pw.println(msg);
-            pw.flush();
-        }
-    }
-
     static void checkState(boolean expression, @NonNull String msg) {
         if (!expression) {
             throw new IllegalStateException(msg);
@@ -219,7 +211,7 @@
      * since running apps can continue sending new broadcasts in perpetuity;
      * consider using {@link #waitForBarrier} instead.
      */
-    public abstract void waitForIdle(@Nullable PrintWriter pw);
+    public abstract void waitForIdle(@NonNull PrintWriter pw);
 
     /**
      * Wait until any currently waiting broadcasts have been dispatched.
@@ -230,7 +222,7 @@
      * Callers are advised that this method will <em>not</em> wait for any
      * future broadcasts that are newly enqueued after being invoked.
      */
-    public abstract void waitForBarrier(@Nullable PrintWriter pw);
+    public abstract void waitForBarrier(@NonNull PrintWriter pw);
 
     /**
      * Delays delivering broadcasts to the specified package.
diff --git a/services/core/java/com/android/server/am/BroadcastQueueImpl.java b/services/core/java/com/android/server/am/BroadcastQueueImpl.java
index fcddff0..bd36c3f 100644
--- a/services/core/java/com/android/server/am/BroadcastQueueImpl.java
+++ b/services/core/java/com/android/server/am/BroadcastQueueImpl.java
@@ -37,7 +37,6 @@
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BROADCAST;
 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_MU;
-import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER;
 import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_START_RECEIVER;
 
 import android.annotation.NonNull;
@@ -836,8 +835,8 @@
                         OOM_ADJ_REASON_START_RECEIVER);
             }
         } else if (filter.receiverList.app != null) {
-            mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(filter.receiverList.app,
-                    OOM_ADJ_REASON_START_RECEIVER);
+            mService.mOomAdjuster.unfreezeTemporarily(filter.receiverList.app,
+                    CachedAppOptimizer.UNFREEZE_REASON_START_RECEIVER);
         }
 
         try {
@@ -1130,8 +1129,9 @@
                     }
                     if (sendResult) {
                         if (r.callerApp != null) {
-                            mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(
-                                    r.callerApp, OOM_ADJ_REASON_FINISH_RECEIVER);
+                            mService.mOomAdjuster.unfreezeTemporarily(
+                                    r.callerApp,
+                                    CachedAppOptimizer.UNFREEZE_REASON_FINISH_RECEIVER);
                         }
                         try {
                             if (DEBUG_BROADCAST) {
diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
index 1f0b162..a4bdf61 100644
--- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
+++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
@@ -28,15 +28,16 @@
 import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL;
 import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_STOPPED;
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST;
+import static com.android.server.am.ActivityManagerDebugConfig.LOG_WRITER_INFO;
 import static com.android.server.am.BroadcastProcessQueue.insertIntoRunnableList;
 import static com.android.server.am.BroadcastProcessQueue.reasonToString;
 import static com.android.server.am.BroadcastProcessQueue.removeFromRunnableList;
 import static com.android.server.am.BroadcastRecord.deliveryStateToString;
+import static com.android.server.am.BroadcastRecord.getReceiverClassName;
 import static com.android.server.am.BroadcastRecord.getReceiverPackageName;
 import static com.android.server.am.BroadcastRecord.getReceiverProcessName;
 import static com.android.server.am.BroadcastRecord.getReceiverUid;
 import static com.android.server.am.BroadcastRecord.isDeliveryStateTerminal;
-import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER;
 import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_START_RECEIVER;
 
 import android.annotation.NonNull;
@@ -71,6 +72,7 @@
 import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.SparseBooleanArray;
 import android.util.TimeUtils;
 import android.util.proto.ProtoOutputStream;
 
@@ -208,6 +210,16 @@
     private final AtomicReference<ArraySet<BroadcastRecord>> mReplacedBroadcastsCache =
             new AtomicReference<>();
 
+    /**
+     * Map from UID to its last known "cached" state.
+     * <p>
+     * We manually maintain this data structure since the lifecycle of
+     * {@link ProcessRecord} and {@link BroadcastProcessQueue} can be
+     * mismatched.
+     */
+    @GuardedBy("mService")
+    private final SparseBooleanArray mUidCached = new SparseBooleanArray();
+
     private final BroadcastConstants mConstants;
     private final BroadcastConstants mFgConstants;
     private final BroadcastConstants mBgConstants;
@@ -234,21 +246,15 @@
     private final Handler.Callback mLocalCallback = (msg) -> {
         switch (msg.what) {
             case MSG_UPDATE_RUNNING_LIST: {
-                synchronized (mService) {
-                    updateRunningListLocked();
-                }
+                updateRunningList();
                 return true;
             }
             case MSG_DELIVERY_TIMEOUT_SOFT: {
-                synchronized (mService) {
-                    deliveryTimeoutSoftLocked((BroadcastProcessQueue) msg.obj, msg.arg1);
-                }
+                deliveryTimeoutSoft((BroadcastProcessQueue) msg.obj, msg.arg1);
                 return true;
             }
             case MSG_DELIVERY_TIMEOUT_HARD: {
-                synchronized (mService) {
-                    deliveryTimeoutHardLocked((BroadcastProcessQueue) msg.obj);
-                }
+                deliveryTimeoutHard((BroadcastProcessQueue) msg.obj);
                 return true;
             }
             case MSG_BG_ACTIVITY_START_TIMEOUT: {
@@ -262,9 +268,7 @@
                 return true;
             }
             case MSG_CHECK_HEALTH: {
-                synchronized (mService) {
-                    checkHealthLocked();
-                }
+                checkHealth();
                 return true;
             }
         }
@@ -353,6 +357,12 @@
         }
     }
 
+    private void updateRunningList() {
+        synchronized (mService) {
+            updateRunningListLocked();
+        }
+    }
+
     /**
      * Consider updating the list of "running" queues.
      * <p>
@@ -484,7 +494,7 @@
         // relevant per-process queue
         final BroadcastProcessQueue queue = getProcessQueue(app);
         if (queue != null) {
-            queue.setProcess(app);
+            setQueueProcess(queue, app);
         }
 
         boolean didSomething = false;
@@ -525,7 +535,7 @@
         // relevant per-process queue
         final BroadcastProcessQueue queue = getProcessQueue(app);
         if (queue != null) {
-            queue.setProcess(null);
+            setQueueProcess(queue, null);
         }
 
         if ((mRunningColdStart != null) && (mRunningColdStart == queue)) {
@@ -927,8 +937,8 @@
         final ProcessRecord app = r.resultToApp;
         final IApplicationThread thread = (app != null) ? app.getOnewayThread() : null;
         if (thread != null) {
-            mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(
-                    app, OOM_ADJ_REASON_FINISH_RECEIVER);
+            mService.mOomAdjuster.unfreezeTemporarily(
+                    app, CachedAppOptimizer.UNFREEZE_REASON_FINISH_RECEIVER);
             if (r.shareIdentity && app.uid != r.callingUid) {
                 mService.mPackageManagerInt.grantImplicitAccess(r.userId, r.intent,
                         UserHandle.getAppId(app.uid), r.callingUid, true);
@@ -953,6 +963,13 @@
         r.resultTo = null;
     }
 
+    private void deliveryTimeoutSoft(@NonNull BroadcastProcessQueue queue,
+            int softTimeoutMillis) {
+        synchronized (mService) {
+            deliveryTimeoutSoftLocked(queue, softTimeoutMillis);
+        }
+    }
+
     private void deliveryTimeoutSoftLocked(@NonNull BroadcastProcessQueue queue,
             int softTimeoutMillis) {
         if (queue.app != null) {
@@ -969,6 +986,12 @@
         }
     }
 
+    private void deliveryTimeoutHard(@NonNull BroadcastProcessQueue queue) {
+        synchronized (mService) {
+            deliveryTimeoutHardLocked(queue);
+        }
+    }
+
     private void deliveryTimeoutHardLocked(@NonNull BroadcastProcessQueue queue) {
         finishReceiverActiveLocked(queue, BroadcastRecord.DELIVERY_TIMEOUT,
                 "deliveryTimeoutHardLocked");
@@ -1040,7 +1063,10 @@
         if (deliveryState == BroadcastRecord.DELIVERY_TIMEOUT) {
             r.anrCount++;
             if (app != null && !app.isDebugging()) {
-                mService.appNotResponding(queue.app, TimeoutRecord.forBroadcastReceiver(r.intent));
+                final String packageName = getReceiverPackageName(receiver);
+                final String className = getReceiverClassName(receiver);
+                mService.appNotResponding(queue.app,
+                        TimeoutRecord.forBroadcastReceiver(r.intent, packageName, className));
             }
         } else {
             mLocalHandler.removeMessages(MSG_DELIVERY_TIMEOUT_SOFT, queue);
@@ -1244,7 +1270,7 @@
      * the given {@link Predicate}.
      */
     private boolean testAllProcessQueues(@NonNull Predicate<BroadcastProcessQueue> test,
-            @NonNull String label, @Nullable PrintWriter pw) {
+            @NonNull String label, @NonNull PrintWriter pw) {
         for (int i = 0; i < mProcessQueues.size(); i++) {
             BroadcastProcessQueue leaf = mProcessQueues.valueAt(i);
             while (leaf != null) {
@@ -1252,14 +1278,16 @@
                     final long now = SystemClock.uptimeMillis();
                     if (now > mLastTestFailureTime + DateUtils.SECOND_IN_MILLIS) {
                         mLastTestFailureTime = now;
-                        logv("Test " + label + " failed due to " + leaf.toShortString(), pw);
+                        pw.println("Test " + label + " failed due to " + leaf.toShortString());
+                        pw.flush();
                     }
                     return false;
                 }
                 leaf = leaf.processNameNext;
             }
         }
-        logv("Test " + label + " passed", pw);
+        pw.println("Test " + label + " passed");
+        pw.flush();
         return true;
     }
 
@@ -1326,11 +1354,17 @@
             @Override
             public void onUidCachedChanged(int uid, boolean cached) {
                 synchronized (mService) {
+                    if (cached) {
+                        mUidCached.put(uid, true);
+                    } else {
+                        mUidCached.delete(uid);
+                    }
+
                     BroadcastProcessQueue leaf = mProcessQueues.get(uid);
                     while (leaf != null) {
                         // Update internal state by refreshing values previously
                         // read from any known running process
-                        leaf.setProcess(leaf.app);
+                        setQueueProcess(leaf, leaf.app);
                         updateQueueDeferred(leaf);
                         updateRunnableList(leaf);
                         leaf = leaf.processNameNext;
@@ -1346,30 +1380,30 @@
 
     @Override
     public boolean isIdleLocked() {
-        return isIdleLocked(null);
+        return isIdleLocked(LOG_WRITER_INFO);
     }
 
-    public boolean isIdleLocked(@Nullable PrintWriter pw) {
+    public boolean isIdleLocked(@NonNull PrintWriter pw) {
         return testAllProcessQueues(q -> q.isIdle(), "idle", pw);
     }
 
     @Override
     public boolean isBeyondBarrierLocked(@UptimeMillisLong long barrierTime) {
-        return isBeyondBarrierLocked(barrierTime, null);
+        return isBeyondBarrierLocked(barrierTime, LOG_WRITER_INFO);
     }
 
     public boolean isBeyondBarrierLocked(@UptimeMillisLong long barrierTime,
-            @Nullable PrintWriter pw) {
+            @NonNull PrintWriter pw) {
         return testAllProcessQueues(q -> q.isBeyondBarrierLocked(barrierTime), "barrier", pw);
     }
 
     @Override
-    public void waitForIdle(@Nullable PrintWriter pw) {
+    public void waitForIdle(@NonNull PrintWriter pw) {
         waitFor(() -> isIdleLocked(pw));
     }
 
     @Override
-    public void waitForBarrier(@Nullable PrintWriter pw) {
+    public void waitForBarrier(@NonNull PrintWriter pw) {
         final long now = SystemClock.uptimeMillis();
         waitFor(() -> isBeyondBarrierLocked(now, pw));
     }
@@ -1435,52 +1469,19 @@
         // TODO: implement
     }
 
-    /**
-     * Check overall health, confirming things are in a reasonable state and
-     * that we're not wedged. If we determine we're in an unhealthy state, dump
-     * current state once and stop future health checks to avoid spamming.
-     */
-    @VisibleForTesting
-    void checkHealthLocked() {
+    private void checkHealth() {
+        synchronized (mService) {
+            checkHealthLocked();
+        }
+    }
+
+    private void checkHealthLocked() {
         try {
-            // Verify all runnable queues are sorted
-            BroadcastProcessQueue prev = null;
-            BroadcastProcessQueue next = mRunnableHead;
-            while (next != null) {
-                checkState(next.runnableAtPrev == prev, "runnableAtPrev");
-                checkState(next.isRunnable(), "isRunnable " + next);
-                if (prev != null) {
-                    checkState(next.getRunnableAt() >= prev.getRunnableAt(),
-                            "getRunnableAt " + next + " vs " + prev);
-                }
-                prev = next;
-                next = next.runnableAtNext;
-            }
-
-            // Verify all running queues are active
-            for (BroadcastProcessQueue queue : mRunning) {
-                if (queue != null) {
-                    checkState(queue.isActive(), "isActive " + queue);
-                }
-            }
-
-            // Verify that pending cold start hasn't been orphaned
-            if (mRunningColdStart != null) {
-                checkState(getRunningIndexOf(mRunningColdStart) >= 0,
-                        "isOrphaned " + mRunningColdStart);
-            }
-
-            // Verify health of all known process queues
-            for (int i = 0; i < mProcessQueues.size(); i++) {
-                BroadcastProcessQueue leaf = mProcessQueues.valueAt(i);
-                while (leaf != null) {
-                    leaf.checkHealthLocked();
-                    leaf = leaf.processNameNext;
-                }
-            }
+            assertHealthLocked();
 
             // If no health issues found above, check again in the future
-            mLocalHandler.sendEmptyMessageDelayed(MSG_CHECK_HEALTH, DateUtils.MINUTE_IN_MILLIS);
+            mLocalHandler.sendEmptyMessageDelayed(MSG_CHECK_HEALTH,
+                    DateUtils.MINUTE_IN_MILLIS);
 
         } catch (Exception e) {
             // Throw up a message to indicate that something went wrong, and
@@ -1490,13 +1491,66 @@
         }
     }
 
+    /**
+     * Check overall health, confirming things are in a reasonable state and
+     * that we're not wedged. If we determine we're in an unhealthy state, dump
+     * current state once and stop future health checks to avoid spamming.
+     */
+    @VisibleForTesting
+    void assertHealthLocked() {
+        // Verify all runnable queues are sorted
+        BroadcastProcessQueue prev = null;
+        BroadcastProcessQueue next = mRunnableHead;
+        while (next != null) {
+            checkState(next.runnableAtPrev == prev, "runnableAtPrev");
+            checkState(next.isRunnable(), "isRunnable " + next);
+            if (prev != null) {
+                checkState(next.getRunnableAt() >= prev.getRunnableAt(),
+                        "getRunnableAt " + next + " vs " + prev);
+            }
+            prev = next;
+            next = next.runnableAtNext;
+        }
+
+        // Verify all running queues are active
+        for (BroadcastProcessQueue queue : mRunning) {
+            if (queue != null) {
+                checkState(queue.isActive(), "isActive " + queue);
+            }
+        }
+
+        // Verify that pending cold start hasn't been orphaned
+        if (mRunningColdStart != null) {
+            checkState(getRunningIndexOf(mRunningColdStart) >= 0,
+                    "isOrphaned " + mRunningColdStart);
+        }
+
+        // Verify health of all known process queues
+        for (int i = 0; i < mProcessQueues.size(); i++) {
+            BroadcastProcessQueue leaf = mProcessQueues.valueAt(i);
+            while (leaf != null) {
+                leaf.assertHealthLocked();
+                leaf = leaf.processNameNext;
+            }
+        }
+    }
+
     private void updateWarmProcess(@NonNull BroadcastProcessQueue queue) {
         if (!queue.isProcessWarm()) {
-            queue.setProcess(mService.getProcessRecordLocked(queue.processName, queue.uid));
+            setQueueProcess(queue, mService.getProcessRecordLocked(queue.processName, queue.uid));
         }
     }
 
     /**
+     * Update the {@link ProcessRecord} associated with the given
+     * {@link BroadcastProcessQueue}.
+     */
+    private void setQueueProcess(@NonNull BroadcastProcessQueue queue,
+            @Nullable ProcessRecord app) {
+        queue.setProcessAndUidCached(app, mUidCached.get(queue.uid, false));
+    }
+
+    /**
      * Inform other parts of OS that the given broadcast queue has started
      * running, typically for internal bookkeeping.
      */
@@ -1510,8 +1564,8 @@
                 mService.updateLruProcessLocked(queue.app, false, null);
             }
 
-            mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(queue.app,
-                    OOM_ADJ_REASON_START_RECEIVER);
+            mService.mOomAdjuster.unfreezeTemporarily(queue.app,
+                    CachedAppOptimizer.UNFREEZE_REASON_START_RECEIVER);
 
             if (queue.runningOomAdjusted) {
                 queue.app.mState.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_RECEIVER);
@@ -1686,7 +1740,7 @@
         }
 
         BroadcastProcessQueue created = new BroadcastProcessQueue(mConstants, processName, uid);
-        created.setProcess(mService.getProcessRecordLocked(processName, uid));
+        setQueueProcess(created, mService.getProcessRecordLocked(processName, uid));
 
         if (leaf == null) {
             mProcessQueues.put(uid, created);
@@ -1809,12 +1863,18 @@
         ipw.decreaseIndent();
         ipw.println();
 
-        ipw.println(" Broadcasts with ignored delivery group policies:");
+        ipw.println("Broadcasts with ignored delivery group policies:");
         ipw.increaseIndent();
         mService.dumpDeliveryGroupPolicyIgnoredActions(ipw);
         ipw.decreaseIndent();
         ipw.println();
 
+        ipw.println("Cached UIDs:");
+        ipw.increaseIndent();
+        ipw.println(mUidCached.toString());
+        ipw.decreaseIndent();
+        ipw.println();
+
         if (dumpConstants) {
             mConstants.dump(ipw);
         }
diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java
index e6ef3b4..c368290 100644
--- a/services/core/java/com/android/server/am/BroadcastRecord.java
+++ b/services/core/java/com/android/server/am/BroadcastRecord.java
@@ -832,6 +832,14 @@
         }
     }
 
+    static @Nullable String getReceiverClassName(@NonNull Object receiver) {
+        if (receiver instanceof BroadcastFilter) {
+            return ((BroadcastFilter) receiver).getReceiverClassName();
+        } else /* if (receiver instanceof ResolveInfo) */ {
+            return ((ResolveInfo) receiver).activityInfo.name;
+        }
+    }
+
     static int getReceiverPriority(@NonNull Object receiver) {
         if (receiver instanceof BroadcastFilter) {
             return ((BroadcastFilter) receiver).getPriority();
@@ -1068,9 +1076,7 @@
             if (label == null) {
                 label = intent.toString();
             }
-            mCachedToString = "BroadcastRecord{"
-                + Integer.toHexString(System.identityHashCode(this))
-                + " u" + userId + " " + label + "}";
+            mCachedToString = "BroadcastRecord{" + toShortString() + "}";
         }
         return mCachedToString;
     }
@@ -1082,7 +1088,7 @@
                 label = intent.toString();
             }
             mCachedToShortString = Integer.toHexString(System.identityHashCode(this))
-                    + ":" + label + "/u" + userId;
+                    + " " + label + "/u" + userId;
         }
         return mCachedToShortString;
     }
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index b293bcf..78edbba 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -18,20 +18,24 @@
 
 import static android.app.ActivityManager.UidFrozenStateChangedCallback.UID_FROZEN_STATE_FROZEN;
 import static android.app.ActivityManager.UidFrozenStateChangedCallback.UID_FROZEN_STATE_UNFROZEN;
+import static android.content.ComponentCallbacks2.TRIM_MEMORY_BACKGROUND;
 
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_COMPACTION;
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FREEZER;
 import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
 
+import android.annotation.IntDef;
 import android.app.ActivityManager;
 import android.app.ActivityThread;
 import android.app.ApplicationExitInfo;
+import android.app.IApplicationThread;
 import android.database.ContentObserver;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Message;
 import android.os.PowerManagerInternal;
 import android.os.Process;
+import android.os.RemoteException;
 import android.os.SystemClock;
 import android.os.Trace;
 import android.provider.DeviceConfig;
@@ -54,6 +58,8 @@
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.EnumMap;
@@ -94,6 +100,70 @@
     @VisibleForTesting static final String KEY_FREEZER_EXEMPT_INST_PKG =
             "freeze_exempt_inst_pkg";
 
+
+    static final int UNFREEZE_REASON_NONE =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_NONE;
+    static final int UNFREEZE_REASON_ACTIVITY =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_ACTIVITY;
+    static final int UNFREEZE_REASON_FINISH_RECEIVER =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_FINISH_RECEIVER;
+    static final int UNFREEZE_REASON_START_RECEIVER =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_START_RECEIVER;
+    static final int UNFREEZE_REASON_BIND_SERVICE =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_BIND_SERVICE;
+    static final int UNFREEZE_REASON_UNBIND_SERVICE =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_UNBIND_SERVICE;
+    static final int UNFREEZE_REASON_START_SERVICE =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_START_SERVICE;
+    static final int UNFREEZE_REASON_GET_PROVIDER =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_GET_PROVIDER;
+    static final int UNFREEZE_REASON_REMOVE_PROVIDER =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_REMOVE_PROVIDER;
+    static final int UNFREEZE_REASON_UI_VISIBILITY =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_UI_VISIBILITY;
+    static final int UNFREEZE_REASON_ALLOWLIST =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_ALLOWLIST;
+    static final int UNFREEZE_REASON_PROCESS_BEGIN =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_PROCESS_BEGIN;
+    static final int UNFREEZE_REASON_PROCESS_END =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_PROCESS_END;
+    static final int UNFREEZE_REASON_TRIM_MEMORY =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_TRIM_MEMORY;
+    static final int UNFREEZE_REASON_PING =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_PING;
+    static final int UNFREEZE_REASON_FILE_LOCKS =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_FILE_LOCKS;
+    static final int UNFREEZE_REASON_FILE_LOCK_CHECK_FAILURE =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_FILE_LOCK_CHECK_FAILURE;
+    static final int UNFREEZE_REASON_BINDER_TXNS =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_BINDER_TXNS;
+    static final int UNFREEZE_REASON_FEATURE_FLAGS =
+            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_FEATURE_FLAGS;
+
+    @IntDef(prefix = {"UNFREEZE_REASON_"}, value = {
+        UNFREEZE_REASON_NONE,
+        UNFREEZE_REASON_ACTIVITY,
+        UNFREEZE_REASON_FINISH_RECEIVER,
+        UNFREEZE_REASON_START_RECEIVER,
+        UNFREEZE_REASON_BIND_SERVICE,
+        UNFREEZE_REASON_UNBIND_SERVICE,
+        UNFREEZE_REASON_START_SERVICE,
+        UNFREEZE_REASON_GET_PROVIDER,
+        UNFREEZE_REASON_REMOVE_PROVIDER,
+        UNFREEZE_REASON_UI_VISIBILITY,
+        UNFREEZE_REASON_ALLOWLIST,
+        UNFREEZE_REASON_PROCESS_BEGIN,
+        UNFREEZE_REASON_PROCESS_END,
+        UNFREEZE_REASON_TRIM_MEMORY,
+        UNFREEZE_REASON_PING,
+        UNFREEZE_REASON_FILE_LOCKS,
+        UNFREEZE_REASON_FILE_LOCK_CHECK_FAILURE,
+        UNFREEZE_REASON_BINDER_TXNS,
+        UNFREEZE_REASON_FEATURE_FLAGS,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface UnfreezeReason {}
+
     // RSS Indices
     private static final int RSS_TOTAL_INDEX = 0;
     private static final int RSS_FILE_INDEX = 1;
@@ -131,7 +201,7 @@
     // Format of this string should be a comma separated list of integers.
     @VisibleForTesting static final String DEFAULT_COMPACT_PROC_STATE_THROTTLE =
             String.valueOf(ActivityManager.PROCESS_STATE_RECEIVER);
-    @VisibleForTesting static final long DEFAULT_FREEZER_DEBOUNCE_TIMEOUT = 600_000L;
+    @VisibleForTesting static final long DEFAULT_FREEZER_DEBOUNCE_TIMEOUT = 10_000L;
     @VisibleForTesting static final Boolean DEFAULT_FREEZER_EXEMPT_INST_PKG = true;
 
     @VisibleForTesting static final Uri CACHED_APP_FREEZER_ENABLED_URI = Settings.Global.getUriFor(
@@ -159,8 +229,8 @@
         FULL // File+anon compaction
     }
 
-    // This indicates the process OOM memory state that initiated the compaction request
-    public enum CompactSource { APP, PERSISTENT, BFGS }
+    // This indicates who initiated the compaction request
+    public enum CompactSource { APP, SHELL }
 
     public enum CancelCompactReason {
         SCREEN_ON, // screen was turned on which cancels all compactions.
@@ -306,10 +376,6 @@
     @GuardedBy("mPhenotypeFlagLock")
     @VisibleForTesting volatile long mCompactThrottleFullFull = DEFAULT_COMPACT_THROTTLE_4;
     @GuardedBy("mPhenotypeFlagLock")
-    @VisibleForTesting volatile long mCompactThrottleBFGS = DEFAULT_COMPACT_THROTTLE_5;
-    @GuardedBy("mPhenotypeFlagLock")
-    @VisibleForTesting volatile long mCompactThrottlePersistent = DEFAULT_COMPACT_THROTTLE_6;
-    @GuardedBy("mPhenotypeFlagLock")
     @VisibleForTesting volatile long mCompactThrottleMinOomAdj =
             DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ;
     @GuardedBy("mPhenotypeFlagLock")
@@ -568,8 +634,6 @@
             pw.println("  " + KEY_COMPACT_THROTTLE_2 + "=" + mCompactThrottleSomeFull);
             pw.println("  " + KEY_COMPACT_THROTTLE_3 + "=" + mCompactThrottleFullSome);
             pw.println("  " + KEY_COMPACT_THROTTLE_4 + "=" + mCompactThrottleFullFull);
-            pw.println("  " + KEY_COMPACT_THROTTLE_5 + "=" + mCompactThrottleBFGS);
-            pw.println("  " + KEY_COMPACT_THROTTLE_6 + "=" + mCompactThrottlePersistent);
             pw.println("  " + KEY_COMPACT_THROTTLE_MIN_OOM_ADJ + "=" + mCompactThrottleMinOomAdj);
             pw.println("  " + KEY_COMPACT_THROTTLE_MAX_OOM_ADJ + "=" + mCompactThrottleMaxOomAdj);
             pw.println("  " + KEY_COMPACT_STATSD_SAMPLE_RATE + "=" + mCompactStatsdSampleRate);
@@ -661,32 +725,6 @@
         }
     }
 
-    // This method returns true only if requirements are met. Note, that requirements are different
-    // from throttles applied at the time a compaction is trying to be executed in the sense that
-    // these are not subject to change dependent on time or memory as throttles usually do.
-    @GuardedBy("mProcLock")
-    boolean meetsCompactionRequirements(ProcessRecord proc) {
-        if (mAm.mInternal.isPendingTopUid(proc.uid)) {
-            // In case the OOM Adjust has not yet been propagated we see if this is
-            // pending on becoming top app in which case we should not compact.
-            if (DEBUG_COMPACTION) {
-                Slog.d(TAG_AM, "Skip compaction since UID is active for  " + proc.processName);
-            }
-            return false;
-        }
-
-        if (proc.mState.hasForegroundActivities()) {
-            if (DEBUG_COMPACTION) {
-                Slog.e(TAG_AM,
-                        "Skip compaction as process " + proc.processName
-                                + " has foreground activities");
-            }
-            return false;
-        }
-
-        return true;
-    }
-
     @GuardedBy("mProcLock")
     boolean compactApp(
             ProcessRecord app, CompactProfile compactProfile, CompactSource source, boolean force) {
@@ -710,7 +748,7 @@
                 return false;
         }
 
-        if (!app.mOptRecord.hasPendingCompact() && (meetsCompactionRequirements(app) || force)) {
+        if (!app.mOptRecord.hasPendingCompact()) {
             final String processName = (app.processName != null ? app.processName : "");
             if (DEBUG_COMPACTION) {
                 Slog.d(TAG_AM,
@@ -728,8 +766,7 @@
         if (DEBUG_COMPACTION) {
             Slog.d(TAG_AM,
                     " compactApp Skipped for " + app.processName + " pendingCompact= "
-                            + app.mOptRecord.hasPendingCompact() + " meetsCompactionRequirements="
-                            + meetsCompactionRequirements(app) + ". Requested compact profile: "
+                            + app.mOptRecord.hasPendingCompact() + ". Requested compact profile: "
                             + app.mOptRecord.getReqCompactProfile().name() + ". Compact source "
                             + app.mOptRecord.getReqCompactSource().name());
         }
@@ -764,18 +801,6 @@
         return stats;
     }
 
-    @GuardedBy("mProcLock")
-    boolean shouldCompactPersistent(ProcessRecord app, long now) {
-        return (app.mOptRecord.getLastCompactTime() == 0
-                || (now - app.mOptRecord.getLastCompactTime()) > mCompactThrottlePersistent);
-    }
-
-    @GuardedBy("mProcLock")
-    boolean shouldCompactBFGS(ProcessRecord app, long now) {
-        return (app.mOptRecord.getLastCompactTime() == 0
-                || (now - app.mOptRecord.getLastCompactTime()) > mCompactThrottleBFGS);
-    }
-
     void compactAllSystem() {
         if (useCompaction()) {
             if (DEBUG_COMPACTION) {
@@ -888,7 +913,7 @@
                     }
 
                     if (!enable && opt.isFrozen()) {
-                        unfreezeAppLSP(process, OomAdjuster.OOM_ADJ_REASON_NONE);
+                        unfreezeAppLSP(process, UNFREEZE_REASON_FEATURE_FLAGS);
 
                         // Set freezerOverride *after* calling unfreezeAppLSP (it resets the flag)
                         opt.setFreezerOverride(true);
@@ -1063,8 +1088,6 @@
                 mCompactThrottleSomeFull = Integer.parseInt(throttleSomeFullFlag);
                 mCompactThrottleFullSome = Integer.parseInt(throttleFullSomeFlag);
                 mCompactThrottleFullFull = Integer.parseInt(throttleFullFullFlag);
-                mCompactThrottleBFGS = Integer.parseInt(throttleBFGSFlag);
-                mCompactThrottlePersistent = Integer.parseInt(throttlePersistentFlag);
                 mCompactThrottleMinOomAdj = Long.parseLong(throttleMinOomAdjFlag);
                 mCompactThrottleMaxOomAdj = Long.parseLong(throttleMaxOomAdjFlag);
             } catch (NumberFormatException e) {
@@ -1077,8 +1100,6 @@
             mCompactThrottleSomeFull = DEFAULT_COMPACT_THROTTLE_2;
             mCompactThrottleFullSome = DEFAULT_COMPACT_THROTTLE_3;
             mCompactThrottleFullFull = DEFAULT_COMPACT_THROTTLE_4;
-            mCompactThrottleBFGS = DEFAULT_COMPACT_THROTTLE_5;
-            mCompactThrottlePersistent = DEFAULT_COMPACT_THROTTLE_6;
             mCompactThrottleMinOomAdj = DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ;
             mCompactThrottleMaxOomAdj = DEFAULT_COMPACT_THROTTLE_MAX_OOM_ADJ;
         }
@@ -1194,7 +1215,7 @@
 
     // This will ensure app will be out of the freezer for at least mFreezerDebounceTimeout.
     @GuardedBy("mAm")
-    void unfreezeTemporarily(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) {
+    void unfreezeTemporarily(ProcessRecord app, @UnfreezeReason int reason) {
         if (mUseFreezer) {
             synchronized (mProcLock) {
                 if (app.mOptRecord.isFrozen() || app.mOptRecord.isPendingFreeze()) {
@@ -1213,6 +1234,17 @@
             return;
         }
 
+        if (mAm.mConstants.USE_MODERN_TRIM
+                && app.mState.getSetAdj() >= ProcessList.CACHED_APP_MIN_ADJ) {
+            final IApplicationThread thread = app.getThread();
+            if (thread != null) {
+                try {
+                    thread.scheduleTrimMemory(TRIM_MEMORY_BACKGROUND);
+                } catch (RemoteException e) {
+                    // do nothing
+                }
+            }
+        }
         mFreezeHandler.sendMessageDelayed(
                 mFreezeHandler.obtainMessage(
                     SET_FROZEN_PROCESS_MSG, DO_FREEZE, 0, app),
@@ -1224,7 +1256,7 @@
     }
 
     @GuardedBy({"mAm", "mProcLock", "mFreezerLock"})
-    void unfreezeAppInternalLSP(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) {
+    void unfreezeAppInternalLSP(ProcessRecord app, @UnfreezeReason int reason) {
         final int pid = app.getPid();
         final ProcessCachedOptimizerRecord opt = app.mOptRecord;
         if (opt.isPendingFreeze()) {
@@ -1318,7 +1350,7 @@
     }
 
     @GuardedBy({"mAm", "mProcLock"})
-    void unfreezeAppLSP(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) {
+    void unfreezeAppLSP(ProcessRecord app, @UnfreezeReason int reason) {
         synchronized (mFreezerLock) {
             unfreezeAppInternalLSP(app, reason);
         }
@@ -1430,23 +1462,23 @@
 
     @GuardedBy({"mService", "mProcLock"})
     void onOomAdjustChanged(int oldAdj, int newAdj, ProcessRecord app) {
-        // Cancel any currently executing compactions
-        // if the process moved out of cached state
-        if (newAdj < oldAdj && newAdj < ProcessList.CACHED_APP_MIN_ADJ) {
-            cancelCompactionForProcess(app, CancelCompactReason.OOM_IMPROVEMENT);
-        }
-
-        if (oldAdj <= ProcessList.PERCEPTIBLE_APP_ADJ
-                && (newAdj == ProcessList.PREVIOUS_APP_ADJ || newAdj == ProcessList.HOME_APP_ADJ)) {
-            if (ENABLE_FILE_COMPACT) {
-                // Perform a minor compaction when a perceptible app becomes the prev/home app
-                compactApp(app, CompactProfile.SOME, CompactSource.APP, false);
+        if (useCompaction()) {
+            // Cancel any currently executing compactions
+            // if the process moved out of cached state
+            if (newAdj < oldAdj && newAdj < ProcessList.CACHED_APP_MIN_ADJ) {
+                cancelCompactionForProcess(app, CancelCompactReason.OOM_IMPROVEMENT);
             }
-        } else if (oldAdj < ProcessList.CACHED_APP_MIN_ADJ
-                && newAdj >= ProcessList.CACHED_APP_MIN_ADJ
-                && newAdj <= ProcessList.CACHED_APP_MAX_ADJ) {
-            // Perform a major compaction when any app enters cached
-            compactApp(app, CompactProfile.FULL, CompactSource.APP, false);
+        }
+    }
+
+    /**
+     * Callback received after a process has been frozen.
+     */
+    void onProcessFrozen(ProcessRecord frozenProc) {
+        if (useCompaction()) {
+            synchronized (mProcLock) {
+                compactApp(frozenProc, CompactProfile.FULL, CompactSource.APP, false);
+            }
         }
     }
 
@@ -1620,26 +1652,6 @@
                             return true;
                         }
                     }
-                } else if (source == CompactSource.PERSISTENT) {
-                    if (start - lastCompactTime < mCompactThrottlePersistent) {
-                        if (DEBUG_COMPACTION) {
-                            Slog.d(TAG_AM,
-                                    "Skipping persistent compaction for " + name
-                                            + ": too soon. throttle=" + mCompactThrottlePersistent
-                                            + " last=" + (start - lastCompactTime) + "ms ago");
-                        }
-                        return true;
-                    }
-                } else if (source == CompactSource.BFGS) {
-                    if (start - lastCompactTime < mCompactThrottleBFGS) {
-                        if (DEBUG_COMPACTION) {
-                            Slog.d(TAG_AM,
-                                    "Skipping bfgs compaction for " + name
-                                            + ": too soon. throttle=" + mCompactThrottleBFGS
-                                            + " last=" + (start - lastCompactTime) + "ms ago");
-                        }
-                        return true;
-                    }
                 }
             }
 
@@ -1950,10 +1962,13 @@
                                 + name + "(" + pid + "): " + e);
                         synchronized (mAm) {
                             synchronized (mProcLock) {
-                                unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
+                                unfreezeAppLSP(proc, UNFREEZE_REASON_FILE_LOCK_CHECK_FAILURE);
                             }
                         }
                     }
+                    if (proc.mOptRecord.isFrozen()) {
+                        onProcessFrozen(proc);
+                    }
                 }
                     break;
                 case REPORT_UNFREEZE_MSG:
@@ -1975,13 +1990,18 @@
         }
 
         @GuardedBy({"mAm", "mProcLock"})
-        private void rescheduleFreeze(final ProcessRecord proc, final String reason) {
+        private void rescheduleFreeze(final ProcessRecord proc, final String reason,
+                @UnfreezeReason int reasonCode) {
             Slog.d(TAG_AM, "Reschedule freeze for process " + proc.getPid()
                     + " " + proc.processName + " (" + reason + ")");
-            unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
+            unfreezeAppLSP(proc, reasonCode);
             freezeAppAsyncLSP(proc);
         }
 
+        /**
+         * Freeze a process.
+         * @param proc process to be frozen
+         */
         @GuardedBy({"mAm"})
         private void freezeProcess(final ProcessRecord proc) {
             int pid = proc.getPid(); // Unlocked intentionally
@@ -2015,6 +2035,10 @@
                 if (pid == 0 || opt.isFrozen()) {
                     // Already frozen or not a real process, either one being
                     // launched or one being killed
+                    if (DEBUG_FREEZER) {
+                        Slog.d(TAG_AM, "Skipping freeze for process " + pid
+                                + " " + name + ". Already frozen or not a real process");
+                    }
                     return;
                 }
 
@@ -2024,7 +2048,7 @@
                 // transactions that might be pending.
                 try {
                     if (freezeBinder(pid, true, FREEZE_BINDER_TIMEOUT_MS) != 0) {
-                        rescheduleFreeze(proc, "outstanding txns");
+                        rescheduleFreeze(proc, "outstanding txns", UNFREEZE_REASON_BINDER_TXNS);
                         return;
                     }
                 } catch (RuntimeException e) {
@@ -2056,7 +2080,7 @@
                 frozen = opt.isFrozen();
 
                 final UidRecord uidRec = proc.getUidRecord();
-                if (frozen && uidRec.areAllProcessesFrozen()) {
+                if (frozen && uidRec != null && uidRec.areAllProcessesFrozen()) {
                     uidRec.setFrozen(true);
                     mFreezeHandler.sendMessage(mFreezeHandler.obtainMessage(
                             UID_FROZEN_STATE_CHANGED_MSG, proc));
@@ -2076,7 +2100,8 @@
                         pid,
                         name,
                         unfrozenDuration,
-                        FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE);
+                        FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE,
+                        UNFREEZE_REASON_NONE);
             }
 
             try {
@@ -2085,7 +2110,7 @@
 
                 if ((freezeInfo & TXNS_PENDING_WHILE_FROZEN) != 0) {
                     synchronized (mProcLock) {
-                        rescheduleFreeze(proc, "new pending txns");
+                        rescheduleFreeze(proc, "new pending txns", UNFREEZE_REASON_BINDER_TXNS);
                     }
                     return;
                 }
@@ -2102,7 +2127,7 @@
         }
 
         private void reportUnfreeze(int pid, int frozenDuration, String processName,
-                @OomAdjuster.OomAdjReason int reason) {
+                @UnfreezeReason int reason) {
 
             EventLog.writeEvent(EventLogTags.AM_UNFREEZE, pid, processName);
 
@@ -2114,38 +2139,8 @@
                         pid,
                         processName,
                         frozenDuration,
-                        getUnfreezeReasonCode(reason));
-            }
-        }
-
-        private int getUnfreezeReasonCode(@OomAdjuster.OomAdjReason int oomAdjReason) {
-            switch (oomAdjReason) {
-                case OomAdjuster.OOM_ADJ_REASON_ACTIVITY:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__ACTIVITY;
-                case OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__FINISH_RECEIVER;
-                case OomAdjuster.OOM_ADJ_REASON_START_RECEIVER:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__START_RECEIVER;
-                case OomAdjuster.OOM_ADJ_REASON_BIND_SERVICE:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__BIND_SERVICE;
-                case OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__UNBIND_SERVICE;
-                case OomAdjuster.OOM_ADJ_REASON_START_SERVICE:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__START_SERVICE;
-                case OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__GET_PROVIDER;
-                case OomAdjuster.OOM_ADJ_REASON_REMOVE_PROVIDER:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__REMOVE_PROVIDER;
-                case OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__UI_VISIBILITY;
-                case OomAdjuster.OOM_ADJ_REASON_ALLOWLIST:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__ALLOWLIST;
-                case OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__PROCESS_BEGIN;
-                case OomAdjuster.OOM_ADJ_REASON_PROCESS_END:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__PROCESS_END;
-                default:
-                    return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE;
+                        FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE, // deprecated
+                        reason);
             }
         }
 
@@ -2171,7 +2166,7 @@
                                 Slog.d(TAG_AM, app.processName + " (" + pid + ") blocks "
                                         + pr.processName + " (" + blocked + ")");
                                 // Found at least one blocked non-cached process
-                                unfreezeAppLSP(app, OomAdjuster.OOM_ADJ_REASON_NONE);
+                                unfreezeAppLSP(app, UNFREEZE_REASON_FILE_LOCKS);
                                 break;
                             }
                         }
@@ -2207,4 +2202,35 @@
             mPidCompacting = -1;
         }
     }
+
+    static int getUnfreezeReasonCodeFromOomAdjReason(@OomAdjuster.OomAdjReason int oomAdjReason) {
+        switch (oomAdjReason) {
+            case OomAdjuster.OOM_ADJ_REASON_ACTIVITY:
+                return UNFREEZE_REASON_ACTIVITY;
+            case OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER:
+                return UNFREEZE_REASON_FINISH_RECEIVER;
+            case OomAdjuster.OOM_ADJ_REASON_START_RECEIVER:
+                return UNFREEZE_REASON_START_RECEIVER;
+            case OomAdjuster.OOM_ADJ_REASON_BIND_SERVICE:
+                return UNFREEZE_REASON_BIND_SERVICE;
+            case OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE:
+                return UNFREEZE_REASON_UNBIND_SERVICE;
+            case OomAdjuster.OOM_ADJ_REASON_START_SERVICE:
+                return UNFREEZE_REASON_START_SERVICE;
+            case OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER:
+                return UNFREEZE_REASON_GET_PROVIDER;
+            case OomAdjuster.OOM_ADJ_REASON_REMOVE_PROVIDER:
+                return UNFREEZE_REASON_REMOVE_PROVIDER;
+            case OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY:
+                return UNFREEZE_REASON_UI_VISIBILITY;
+            case OomAdjuster.OOM_ADJ_REASON_ALLOWLIST:
+                return UNFREEZE_REASON_ALLOWLIST;
+            case OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN:
+                return UNFREEZE_REASON_PROCESS_BEGIN;
+            case OomAdjuster.OOM_ADJ_REASON_PROCESS_END:
+                return UNFREEZE_REASON_PROCESS_END;
+            default:
+                return UNFREEZE_REASON_NONE;
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags
index 50841ae..81b24215 100644
--- a/services/core/java/com/android/server/am/EventLogTags.logtags
+++ b/services/core/java/com/android/server/am/EventLogTags.logtags
@@ -53,7 +53,7 @@
 30037 am_process_start_timeout (User|1|5),(PID|1|5),(UID|1|5),(Process Name|3)
 
 # Unhandled exception
-30039 am_crash (User|1|5),(PID|1|5),(Process Name|3),(Flags|1|5),(Exception|3),(Message|3),(File|3),(Line|1|5)
+30039 am_crash (User|1|5),(PID|1|5),(Process Name|3),(Flags|1|5),(Exception|3),(Message|3),(File|3),(Line|1|5),(Recoverable|1|5)
 # Log.wtf() called
 30040 am_wtf (User|1|5),(PID|1|5),(Process Name|3),(Flags|1|5),(Tag|3),(Message|3)
 
diff --git a/services/core/java/com/android/server/am/NativeCrashListener.java b/services/core/java/com/android/server/am/NativeCrashListener.java
index 94eb076..cd119e7 100644
--- a/services/core/java/com/android/server/am/NativeCrashListener.java
+++ b/services/core/java/com/android/server/am/NativeCrashListener.java
@@ -64,12 +64,15 @@
     class NativeCrashReporter extends Thread {
         ProcessRecord mApp;
         int mSignal;
+        boolean mGwpAsanRecoverableCrash;
         String mCrashReport;
 
-        NativeCrashReporter(ProcessRecord app, int signal, String report) {
+        NativeCrashReporter(ProcessRecord app, int signal, boolean gwpAsanRecoverableCrash,
+                            String report) {
             super("NativeCrashReport");
             mApp = app;
             mSignal = signal;
+            mGwpAsanRecoverableCrash = gwpAsanRecoverableCrash;
             mCrashReport = report;
         }
 
@@ -85,7 +88,9 @@
                 ci.stackTrace = mCrashReport;
 
                 if (DEBUG) Slog.v(TAG, "Calling handleApplicationCrash()");
-                mAm.handleApplicationCrashInner("native_crash", mApp, mApp.processName, ci);
+                mAm.handleApplicationCrashInner(
+                        mGwpAsanRecoverableCrash ? "native_recoverable_crash" : "native_crash",
+                        mApp, mApp.processName, ci);
                 if (DEBUG) Slog.v(TAG, "<-- handleApplicationCrash() returned");
             } catch (Exception e) {
                 Slog.e(TAG, "Unable to report native crash", e);
@@ -207,9 +212,14 @@
             // permits crash_dump to connect to it. This allows us to trust the
             // received values.
 
-            // first, the pid and signal number
-            int headerBytes = readExactly(fd, buf, 0, 8);
-            if (headerBytes != 8) {
+            // Activity Manager protocol:
+            //  - 32-bit network-byte-order: pid
+            //  - 32-bit network-byte-order: signal number
+            //  - byte: gwpAsanRecoverableCrash
+            //  - bytes: raw text of the dump
+            //  - null terminator
+            int headerBytes = readExactly(fd, buf, 0, 9);
+            if (headerBytes != 9) {
                 // protocol failure; give up
                 Slog.e(TAG, "Unable to read from debuggerd");
                 return;
@@ -217,69 +227,76 @@
 
             int pid = unpackInt(buf, 0);
             int signal = unpackInt(buf, 4);
+            boolean gwpAsanRecoverableCrash = buf[8] != 0;
             if (DEBUG) {
-                Slog.v(TAG, "Read pid=" + pid + " signal=" + signal);
+                Slog.v(TAG, "Read pid=" + pid + " signal=" + signal
+                        + " recoverable=" + gwpAsanRecoverableCrash);
+            }
+            if (pid < 0) {
+                Slog.e(TAG, "Bogus pid!");
+                return;
             }
 
             // now the text of the dump
-            if (pid > 0) {
-                final ProcessRecord pr;
-                synchronized (mAm.mPidsSelfLocked) {
-                    pr = mAm.mPidsSelfLocked.get(pid);
-                }
-                if (pr != null) {
-                    // Don't attempt crash reporting for persistent apps
-                    if (pr.isPersistent()) {
-                        if (DEBUG) {
-                            Slog.v(TAG, "Skipping report for persistent app " + pr);
-                        }
-                        return;
-                    }
-
-                    int bytes;
-                    do {
-                        // get some data
-                        bytes = Os.read(fd, buf, 0, buf.length);
-                        if (bytes > 0) {
-                            if (MORE_DEBUG) {
-                                String s = new String(buf, 0, bytes, "UTF-8");
-                                Slog.v(TAG, "READ=" + bytes + "> " + s);
-                            }
-                            // did we just get the EOD null byte?
-                            if (buf[bytes-1] == 0) {
-                                os.write(buf, 0, bytes-1);  // exclude the EOD token
-                                break;
-                            }
-                            // no EOD, so collect it and read more
-                            os.write(buf, 0, bytes);
-                        }
-                    } while (bytes > 0);
-
-                    // Okay, we've got the report.
-                    if (DEBUG) Slog.v(TAG, "processing");
-
-                    // Mark the process record as being a native crash so that the
-                    // cleanup mechanism knows we're still submitting the report
-                    // even though the process will vanish as soon as we let
-                    // debuggerd proceed.
-                    synchronized (mAm) {
-                        synchronized (mAm.mProcLock) {
-                            pr.mErrorState.setCrashing(true);
-                            pr.mErrorState.setForceCrashReport(true);
-                        }
-                    }
-
-                    // Crash reporting is synchronous but we want to let debuggerd
-                    // go about it business right away, so we spin off the actual
-                    // reporting logic on a thread and let it take it's time.
-                    final String reportString = new String(os.toByteArray(), "UTF-8");
-                    (new NativeCrashReporter(pr, signal, reportString)).start();
-                } else {
-                    Slog.w(TAG, "Couldn't find ProcessRecord for pid " + pid);
-                }
-            } else {
-                Slog.e(TAG, "Bogus pid!");
+            final ProcessRecord pr;
+            synchronized (mAm.mPidsSelfLocked) {
+                pr = mAm.mPidsSelfLocked.get(pid);
             }
+            if (pr == null) {
+                Slog.w(TAG, "Couldn't find ProcessRecord for pid " + pid);
+                return;
+            }
+
+            // Don't attempt crash reporting for persistent apps
+            if (pr.isPersistent()) {
+                if (DEBUG) {
+                    Slog.v(TAG, "Skipping report for persistent app " + pr);
+                }
+                return;
+            }
+
+            int bytes;
+            do {
+                // get some data
+                bytes = Os.read(fd, buf, 0, buf.length);
+                if (bytes > 0) {
+                    if (MORE_DEBUG) {
+                        String s = new String(buf, 0, bytes, "UTF-8");
+                        Slog.v(TAG, "READ=" + bytes + "> " + s);
+                    }
+                    // did we just get the EOD null byte?
+                    if (buf[bytes - 1] == 0) {
+                        os.write(buf, 0, bytes - 1); // exclude the EOD token
+                        break;
+                    }
+                    // no EOD, so collect it and read more
+                    os.write(buf, 0, bytes);
+                }
+            } while (bytes > 0);
+
+            // Okay, we've got the report.
+            if (DEBUG) Slog.v(TAG, "processing");
+
+            // Mark the process record as being a native crash so that the
+            // cleanup mechanism knows we're still submitting the report even
+            // though the process will vanish as soon as we let debuggerd
+            // proceed. This isn't relevant for recoverable crashes, as we don't
+            // show the user an "app crashed" dialogue because the app (by
+            // design) didn't crash.
+            if (!gwpAsanRecoverableCrash) {
+                synchronized (mAm) {
+                    synchronized (mAm.mProcLock) {
+                        pr.mErrorState.setCrashing(true);
+                        pr.mErrorState.setForceCrashReport(true);
+                    }
+                }
+            }
+
+            // Crash reporting is synchronous but we want to let debuggerd
+            // go about it business right away, so we spin off the actual
+            // reporting logic on a thread and let it take it's time.
+            final String reportString = new String(os.toByteArray(), "UTF-8");
+            (new NativeCrashReporter(pr, signal, gwpAsanRecoverableCrash, reportString)).start();
         } catch (Exception e) {
             Slog.e(TAG, "Exception dealing with report", e);
             // ugh, fail.
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 7a92434..a98571b 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -24,6 +24,7 @@
 import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHONE;
 import static android.app.ActivityManager.PROCESS_CAPABILITY_NONE;
 import static android.app.ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK;
+import static android.app.ActivityManager.PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK;
 import static android.app.ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
 import static android.app.ActivityManager.PROCESS_STATE_BOUND_TOP;
 import static android.app.ActivityManager.PROCESS_STATE_CACHED_ACTIVITY;
@@ -348,6 +349,7 @@
     private final ArrayList<UidRecord> mTmpBecameIdle = new ArrayList<UidRecord>();
     private final ActiveUids mTmpUidRecords;
     private final ArrayDeque<ProcessRecord> mTmpQueue;
+    private final ArraySet<ProcessRecord> mTmpProcessSet = new ArraySet<>();
     private final ArraySet<ProcessRecord> mPendingProcessSet = new ArraySet<>();
     private final ArraySet<ProcessRecord> mProcessesInCycle = new ArraySet<>();
 
@@ -2273,6 +2275,15 @@
                                 capability |= PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK;
                             }
                         }
+                        if ((cstate.getCurCapability()
+                                & PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK) != 0) {
+                            if (clientProcState <= PROCESS_STATE_IMPORTANT_FOREGROUND) {
+                                // This is used to grant network access to User Initiated Jobs.
+                                if (cr.hasFlag(Context.BIND_BYPASS_USER_NETWORK_RESTRICTIONS)) {
+                                    capability |= PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK;
+                                }
+                            }
+                        }
 
                         if (shouldSkipDueToCycle(app, cstate, procState, adj, cycleReEval)) {
                             continue;
@@ -2926,30 +2937,8 @@
 
         int changes = 0;
 
-        // don't compact during bootup
-        if (mCachedAppOptimizer.useCompaction() && mService.mBooted) {
-            // Cached and prev/home compaction
-            // reminder: here, setAdj is previous state, curAdj is upcoming state
-            if (state.getCurAdj() != state.getSetAdj()) {
-                mCachedAppOptimizer.onOomAdjustChanged(state.getSetAdj(), state.getCurAdj(), app);
-            } else if (mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE) {
-                // See if we can compact persistent and bfgs services now that screen is off
-                if (state.getSetAdj() < FOREGROUND_APP_ADJ
-                        && !state.isRunningRemoteAnimation()
-                        // Because these can fire independent of oom_adj/procstate changes, we need
-                        // to throttle the actual dispatch of these requests in addition to the
-                        // processing of the requests. As a result, there is throttling both here
-                        // and in CachedAppOptimizer.
-                        && mCachedAppOptimizer.shouldCompactPersistent(app, now)) {
-                    mCachedAppOptimizer.compactApp(app, CachedAppOptimizer.CompactProfile.FULL,
-                            CachedAppOptimizer.CompactSource.PERSISTENT, false);
-                } else if (state.getCurProcState()
-                                == ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
-                        && mCachedAppOptimizer.shouldCompactBFGS(app, now)) {
-                    mCachedAppOptimizer.compactApp(app, CachedAppOptimizer.CompactProfile.FULL,
-                            CachedAppOptimizer.CompactSource.BFGS, false);
-                }
-            }
+        if (state.getCurAdj() != state.getSetAdj()) {
+            mCachedAppOptimizer.onOomAdjustChanged(state.getSetAdj(), state.getCurAdj(), app);
         }
 
         if (state.getCurAdj() != state.getSetAdj()) {
@@ -3447,7 +3436,8 @@
         final ProcessCachedOptimizerRecord opt = app.mOptRecord;
         // if an app is already frozen and shouldNotFreeze becomes true, immediately unfreeze
         if (opt.isFrozen() && opt.shouldNotFreeze()) {
-            mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
+            mCachedAppOptimizer.unfreezeAppLSP(app,
+                    CachedAppOptimizer.getUnfreezeReasonCodeFromOomAdjReason(oomAdjReason));
             return;
         }
 
@@ -3457,7 +3447,33 @@
                 && !opt.shouldNotFreeze()) {
             mCachedAppOptimizer.freezeAppAsyncLSP(app);
         } else if (state.getSetAdj() < CACHED_APP_MIN_ADJ) {
-            mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
+            mCachedAppOptimizer.unfreezeAppLSP(app,
+                    CachedAppOptimizer.getUnfreezeReasonCodeFromOomAdjReason(oomAdjReason));
         }
     }
+
+    @GuardedBy("mService")
+    void unfreezeTemporarily(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) {
+        if (!mCachedAppOptimizer.useFreezer()) {
+            return;
+        }
+
+        final ProcessCachedOptimizerRecord opt = app.mOptRecord;
+        if (!opt.isFrozen() && !opt.isPendingFreeze()) {
+            return;
+        }
+
+        final ArrayList<ProcessRecord> processes = mTmpProcessList;
+        final ActiveUids uids = mTmpUidRecords;
+        mTmpProcessSet.add(app);
+        collectReachableProcessesLocked(mTmpProcessSet, processes, uids);
+        mTmpProcessSet.clear();
+        // Now processes contains app's downstream and app
+        final int size = processes.size();
+        for (int i = 0; i < size; i++) {
+            ProcessRecord proc = processes.get(i);
+            mCachedAppOptimizer.unfreezeTemporarily(proc, reason);
+        }
+        processes.clear();
+    }
 }
diff --git a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java
index 1d48cb2..70a696c 100644
--- a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java
+++ b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java
@@ -22,7 +22,9 @@
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ANR;
 import static com.android.server.am.ActivityManagerService.MY_PID;
 import static com.android.server.am.ProcessRecord.TAG;
+import static com.android.server.stats.pull.ProcfsMemoryUtil.readMemorySnapshotFromProcfs;
 
+import android.annotation.Nullable;
 import android.app.ActivityManager;
 import android.app.AnrController;
 import android.app.ApplicationErrorReport;
@@ -56,6 +58,7 @@
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.server.ResourcePressureUtil;
 import com.android.server.criticalevents.CriticalEventLog;
+import com.android.server.stats.pull.ProcfsMemoryUtil.MemorySnapshot;
 import com.android.server.wm.WindowProcessController;
 
 import java.io.File;
@@ -396,6 +399,8 @@
                 });
             }
         }
+        // Build memory headers for the ANRing process.
+        String memoryHeaders = buildMemoryHeadersFor(pid);
 
         // Get critical event log before logging the ANR so that it doesn't occur in the log.
         latencyTracker.criticalEventLogStarted();
@@ -496,7 +501,7 @@
         File tracesFile = StackTracesDumpHelper.dumpStackTraces(firstPids,
                 isSilentAnr ? null : processCpuTracker, isSilentAnr ? null : lastPids,
                 nativePidsFuture, tracesFileException, firstPidEndOffset, annotation,
-                criticalEventLog, auxiliaryTaskExecutor, latencyTracker);
+                criticalEventLog, memoryHeaders, auxiliaryTaskExecutor, latencyTracker);
 
         if (isMonitorCpuUsage()) {
             // Wait for the first call to finish
@@ -710,6 +715,27 @@
             resolver.getUserId()) != 0;
     }
 
+    private @Nullable String buildMemoryHeadersFor(int pid) {
+        if (pid <= 0) {
+            Slog.i(TAG, "Memory header requested with invalid pid: " + pid);
+            return null;
+        }
+        MemorySnapshot snapshot = readMemorySnapshotFromProcfs(pid);
+        if (snapshot == null) {
+            Slog.i(TAG, "Failed to get memory snapshot for pid:" + pid);
+            return null;
+        }
+
+        StringBuilder memoryHeaders = new StringBuilder();
+        memoryHeaders.append("RssHwmKb: ")
+            .append(snapshot.rssHighWaterMarkInKilobytes)
+            .append("\n");
+        memoryHeaders.append("RssKb: ").append(snapshot.rssInKilobytes).append("\n");
+        memoryHeaders.append("RssAnonKb: ").append(snapshot.anonRssInKilobytes).append("\n");
+        memoryHeaders.append("RssShmemKb: ").append(snapshot.rssShmemKilobytes).append("\n");
+        memoryHeaders.append("VmSwapKb: ").append(snapshot.swapInKilobytes).append("\n");
+        return memoryHeaders.toString();
+    }
     /**
      * Unless configured otherwise, swallow ANRs in background processes & kill the process.
      * Non-private access is for tests only.
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 4e401b2..b1322ef 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -70,7 +70,7 @@
 import android.app.ApplicationExitInfo.SubReason;
 import android.app.IApplicationThread;
 import android.app.IProcessObserver;
-import android.app.IUidObserver;
+import android.app.UidObserver;
 import android.compat.annotation.ChangeId;
 import android.compat.annotation.EnabledAfter;
 import android.content.BroadcastReceiver;
@@ -4900,12 +4900,14 @@
         final boolean isAllowed =
                 isProcStateAllowedWhileIdleOrPowerSaveMode(uidRec.getCurProcState(),
                         uidRec.getCurCapability())
-                || isProcStateAllowedWhileOnRestrictBackground(uidRec.getCurProcState());
+                || isProcStateAllowedWhileOnRestrictBackground(uidRec.getCurProcState(),
+                        uidRec.getCurCapability());
         // Denotes whether uid's process state was previously allowed network access.
         final boolean wasAllowed =
                 isProcStateAllowedWhileIdleOrPowerSaveMode(uidRec.getSetProcState(),
                         uidRec.getSetCapability())
-                || isProcStateAllowedWhileOnRestrictBackground(uidRec.getSetProcState());
+                || isProcStateAllowedWhileOnRestrictBackground(uidRec.getSetProcState(),
+                        uidRec.getSetCapability());
 
         // When the uid is coming to foreground, AMS should inform the app thread that it should
         // block for the network rules to get updated before launching an activity.
@@ -5279,7 +5281,7 @@
         return new Pair<>(numForegroundServices, procs);
     }
 
-    private final class ImperceptibleKillRunner extends IUidObserver.Stub {
+    private final class ImperceptibleKillRunner extends UidObserver {
         private static final String EXTRA_PID = "pid";
         private static final String EXTRA_UID = "uid";
         private static final String EXTRA_TIMESTAMP = "timestamp";
@@ -5535,24 +5537,8 @@
         }
 
         @Override
-        public void onUidActive(int uid) {
-        }
-
-        @Override
-        public void onUidIdle(int uid, boolean disabled) {
-        }
-
-        @Override
         public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
             mHandler.obtainMessage(H.MSG_UID_STATE_CHANGED, uid, procState).sendToTarget();
         }
-
-        @Override
-        public void onUidCachedChanged(int uid, boolean cached) {
-        }
-
-        @Override
-        public void onUidProcAdjChanged(int uid) {
-        }
     };
 }
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 50d00b4..afae623 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -16,10 +16,13 @@
 
 package com.android.server.am;
 
+import static com.android.internal.util.Preconditions.checkArgument;
 import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
 import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.am.ActivityManagerService.MY_PID;
 
+import static java.util.Objects.requireNonNull;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
@@ -63,7 +66,6 @@
 import java.io.PrintWriter;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Objects;
 
 /**
  * Full information about a particular process that
@@ -1050,6 +1052,11 @@
         return mState.isCached();
     }
 
+    @GuardedBy(anyOf = {"mService", "mProcLock"})
+    public boolean hasForegroundActivities() {
+        return mState.hasForegroundActivities();
+    }
+
     boolean hasActivities() {
         return mWindowProcessController.hasActivities();
     }
@@ -1345,16 +1352,19 @@
      * {@param originatingToken} if you have one such originating token, this is useful for tracing
      * back the grant in the case of the notification token.
      */
-    void addOrUpdateBackgroundStartPrivileges(Binder entity,
-            BackgroundStartPrivileges backgroundStartPrivileges) {
-        Objects.requireNonNull(entity);
+    void addOrUpdateBackgroundStartPrivileges(@NonNull Binder entity,
+            @NonNull BackgroundStartPrivileges backgroundStartPrivileges) {
+        requireNonNull(entity, "entity");
+        requireNonNull(backgroundStartPrivileges, "backgroundStartPrivileges");
+        checkArgument(backgroundStartPrivileges.allowsAny(),
+                "backgroundStartPrivileges does not allow anything");
         mWindowProcessController.addOrUpdateBackgroundStartPrivileges(entity,
                 backgroundStartPrivileges);
         setBackgroundStartPrivileges(entity, backgroundStartPrivileges);
     }
 
-    void removeBackgroundStartPrivileges(Binder entity) {
-        Objects.requireNonNull(entity);
+    void removeBackgroundStartPrivileges(@NonNull Binder entity) {
+        requireNonNull(entity, "entity");
         mWindowProcessController.removeBackgroundStartPrivileges(entity);
         setBackgroundStartPrivileges(entity, null);
     }
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index 18ef66f..edf0dbd 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -850,10 +850,11 @@
             mAppForAllowingBgActivityStartsByStart =
                     mBackgroundStartPrivilegesByStartMerged.allowsAny()
                     ? proc : null;
-            if (mBackgroundStartPrivilegesByStartMerged.allowsAny()
-                    || mIsAllowedBgActivityStartsByBinding) {
+            BackgroundStartPrivileges backgroundStartPrivileges =
+                    getBackgroundStartPrivilegesWithExclusiveToken();
+            if (backgroundStartPrivileges.allowsAny()) {
                 proc.addOrUpdateBackgroundStartPrivileges(this,
-                        getBackgroundStartPrivilegesWithExclusiveToken());
+                        backgroundStartPrivileges);
             } else {
                 proc.removeBackgroundStartPrivileges(this);
             }
diff --git a/services/core/java/com/android/server/am/StackTracesDumpHelper.java b/services/core/java/com/android/server/am/StackTracesDumpHelper.java
index 9373328..10ddc2f 100644
--- a/services/core/java/com/android/server/am/StackTracesDumpHelper.java
+++ b/services/core/java/com/android/server/am/StackTracesDumpHelper.java
@@ -85,7 +85,8 @@
             Future<ArrayList<Integer>> nativePidsFuture, StringWriter logExceptionCreatingFile,
             @NonNull Executor auxiliaryTaskExecutor, AnrLatencyTracker latencyTracker) {
         return dumpStackTraces(firstPids, processCpuTracker, lastPids, nativePidsFuture,
-                logExceptionCreatingFile, null, null, null, auxiliaryTaskExecutor, latencyTracker);
+                logExceptionCreatingFile, null, null, null, null, auxiliaryTaskExecutor,
+                latencyTracker);
     }
 
     /**
@@ -99,7 +100,7 @@
             AnrLatencyTracker latencyTracker) {
         return dumpStackTraces(firstPids, processCpuTracker, lastPids, nativePidsFuture,
                 logExceptionCreatingFile, null, subject, criticalEventSection,
-                auxiliaryTaskExecutor, latencyTracker);
+                /* memoryHeaders= */ null, auxiliaryTaskExecutor, latencyTracker);
     }
 
     /**
@@ -110,7 +111,8 @@
             ProcessCpuTracker processCpuTracker, SparseBooleanArray lastPids,
             Future<ArrayList<Integer>> nativePidsFuture, StringWriter logExceptionCreatingFile,
             AtomicLong firstPidEndOffset, String subject, String criticalEventSection,
-            @NonNull Executor auxiliaryTaskExecutor, AnrLatencyTracker latencyTracker) {
+            String memoryHeaders, @NonNull Executor auxiliaryTaskExecutor,
+            AnrLatencyTracker latencyTracker) {
         try {
 
             if (latencyTracker != null) {
@@ -150,9 +152,10 @@
                 return null;
             }
 
-            if (subject != null || criticalEventSection != null) {
+            if (subject != null || criticalEventSection != null || memoryHeaders != null) {
                 appendtoANRFile(tracesFile.getAbsolutePath(),
-                        (subject != null ? "Subject: " + subject + "\n\n" : "")
+                        (subject != null ? "Subject: " + subject + "\n" : "")
+                        + (memoryHeaders != null ? memoryHeaders + "\n\n" : "")
                         + (criticalEventSection != null ? criticalEventSection : ""));
             }
 
diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java
index 893c8b5..d369af6 100644
--- a/services/core/java/com/android/server/app/GameManagerService.java
+++ b/services/core/java/com/android/server/app/GameManagerService.java
@@ -40,8 +40,8 @@
 import android.app.GameState;
 import android.app.IGameManagerService;
 import android.app.IGameModeListener;
-import android.app.IUidObserver;
 import android.app.StatsManager;
+import android.app.UidObserver;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -169,7 +169,7 @@
     private final Object mUidObserverLock = new Object();
     @VisibleForTesting
     @Nullable
-    final UidObserver mUidObserver;
+    final MyUidObserver mUidObserver;
     @GuardedBy("mUidObserverLock")
     private final Set<Integer> mForegroundGameUids = new HashSet<>();
 
@@ -209,7 +209,7 @@
         } else {
             mGameServiceController = null;
         }
-        mUidObserver = new UidObserver();
+        mUidObserver = new MyUidObserver();
         try {
             ActivityManager.getService().registerUidObserver(mUidObserver,
                     ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE,
@@ -2143,10 +2143,7 @@
      */
     private static native void nativeSetOverrideFrameRate(int uid, float frameRate);
 
-    final class UidObserver extends IUidObserver.Stub {
-        @Override
-        public void onUidIdle(int uid, boolean disabled) {}
-
+    final class MyUidObserver extends UidObserver {
         @Override
         public void onUidGone(int uid, boolean disabled) {
             synchronized (mUidObserverLock) {
@@ -2155,9 +2152,6 @@
         }
 
         @Override
-        public void onUidActive(int uid) {}
-
-        @Override
         public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
             synchronized (mUidObserverLock) {
                 if (ActivityManager.isProcStateBackground(procState)) {
@@ -2197,11 +2191,5 @@
                 mPowerManagerInternal.setPowerMode(Mode.GAME, false);
             }
         }
-
-        @Override
-        public void onUidCachedChanged(int uid, boolean cached) {}
-
-        @Override
-        public void onUidProcAdjChanged(int uid) {}
     }
 }
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 965a07b..81ba4b8 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -1548,19 +1548,20 @@
     }
 
     private void enforceGetAppOpsStatsPermissionIfNeeded(int uid, String packageName) {
-        final int callingUid = Binder.getCallingUid();
         // We get to access everything
-        if (callingUid == Process.myPid()) {
+        final int callingPid = Binder.getCallingPid();
+        if (callingPid == Process.myPid()) {
             return;
         }
         // Apps can access their own data
+        final int callingUid = Binder.getCallingUid();
         if (uid == callingUid && packageName != null
                 && checkPackage(uid, packageName) == MODE_ALLOWED) {
             return;
         }
         // Otherwise, you need a permission...
-        mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS,
-                Binder.getCallingPid(), callingUid, null);
+        mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS, callingPid,
+                callingUid, null);
     }
 
     /**
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index 6758581..43063af 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -1359,6 +1359,9 @@
                         "LE Audio device addr=" + address + " now available").printLog(TAG));
             }
 
+            // Reset LEA suspend state each time a new sink is connected
+            mAudioSystem.setParameters("LeAudioSuspended=false");
+
             mConnectedDevices.put(DeviceInfo.makeDeviceListKey(device, address),
                     new DeviceInfo(device, name, address, AudioSystem.AUDIO_FORMAT_DEFAULT));
             mDeviceBroker.postAccessoryPlugMediaUnmute(device);
@@ -1404,6 +1407,9 @@
 
     @GuardedBy("mDevicesLock")
     private void makeLeAudioDeviceUnavailableLater(String address, int device, int delayMs) {
+        // prevent any activity on the LEA output to avoid unwanted
+        // reconnection of the sink.
+        mAudioSystem.setParameters("LeAudioSuspended=true");
         // the device will be made unavailable later, so consider it disconnected right away
         mConnectedDevices.remove(DeviceInfo.makeDeviceListKey(device, address));
         // send the delayed message to make the device unavailable later
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 5893f1e..ac55f28 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -51,6 +51,7 @@
 import android.app.BroadcastOptions;
 import android.app.IUidObserver;
 import android.app.NotificationManager;
+import android.app.UidObserver;
 import android.app.role.OnRoleHoldersChangedListener;
 import android.app.role.RoleManager;
 import android.bluetooth.BluetoothAdapter;
@@ -929,7 +930,7 @@
 
     // Defines the format for the connection "address" for ALSA devices
     public static String makeAlsaAddressString(int card, int device) {
-        return "card=" + card + ";device=" + device + ";";
+        return "card=" + card + ";device=" + device;
     }
 
     public static final class Lifecycle extends SystemService {
@@ -959,29 +960,16 @@
         }
     }
 
-    final private IUidObserver mUidObserver = new IUidObserver.Stub() {
-        @Override public void onUidStateChanged(int uid, int procState, long procStateSeq,
-            int capability) {
-        }
-
+    final private IUidObserver mUidObserver = new UidObserver() {
         @Override public void onUidGone(int uid, boolean disabled) {
             // Once the uid is no longer running, no need to keep trying to disable its audio.
             disableAudioForUid(false, uid);
         }
 
-        @Override public void onUidActive(int uid) throws RemoteException {
-        }
-
-        @Override public void onUidIdle(int uid, boolean disabled) {
-        }
-
         @Override public void onUidCachedChanged(int uid, boolean cached) {
             disableAudioForUid(cached, uid);
         }
 
-        @Override public void onUidProcAdjChanged(int uid) {
-        }
-
         private void disableAudioForUid(boolean disable, int uid) {
             queueMsgUnderWakeLock(mAudioHandler, MSG_DISABLE_AUDIO_FOR_UID,
                     disable ? 1 : 0 /* arg1 */,  uid /* arg2 */,
@@ -4424,13 +4412,14 @@
                 return;
         }
 
-        // Forcefully set LE audio volume as a workaround, since in some cases
-        // (like the outgoing call) the value of 'device' is not DEVICE_OUT_BLE_*
-        // even when BLE is connected.
+        // In some cases (like the outgoing or rejected call) the value of 'device' is not
+        // DEVICE_OUT_BLE_* even when BLE is connected. Changing the volume level in such case
+        // may cuase the other devices volume level leaking into the LeAudio device settings.
         if (!AudioSystem.isLeAudioDeviceType(device)) {
-            Log.w(TAG, "setLeAudioVolumeOnModeUpdate got unexpected device=" + device
-                    + ", forcing to device=" + AudioSystem.DEVICE_OUT_BLE_HEADSET);
-            device = AudioSystem.DEVICE_OUT_BLE_HEADSET;
+            Log.w(TAG, "setLeAudioVolumeOnModeUpdate ignoring invalid device="
+                    + device + ", mode=" + mode + ", index=" + index + " maxIndex=" + maxIndex
+                    + " streamType=" + streamType);
+            return;
         }
 
         if (DEBUG_VOL) {
@@ -7544,6 +7533,7 @@
         DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.add(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE);
         DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.add(AudioSystem.DEVICE_OUT_LINE);
         DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.addAll(AudioSystem.DEVICE_OUT_ALL_A2DP_SET);
+        DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.addAll(AudioSystem.DEVICE_OUT_ALL_BLE_SET);
         DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.addAll(AudioSystem.DEVICE_OUT_ALL_USB_SET);
         DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.add(AudioSystem.DEVICE_OUT_HDMI);
     }
@@ -11602,6 +11592,7 @@
             return false;
         }
 
+        final long token = Binder.clearCallingIdentity();
         try {
             if (!projectionService.isCurrentProjection(projection)) {
                 Log.w(TAG, "App passed invalid MediaProjection token");
@@ -11611,6 +11602,8 @@
             Log.e(TAG, "Can't call .isCurrentProjection() on IMediaProjectionManager"
                     + projectionService.asBinder(), e);
             return false;
+        } finally {
+            Binder.restoreCallingIdentity(token);
         }
 
         try {
diff --git a/services/core/java/com/android/server/audio/BtHelper.java b/services/core/java/com/android/server/audio/BtHelper.java
index 2dcdc54..631d7f5 100644
--- a/services/core/java/com/android/server/audio/BtHelper.java
+++ b/services/core/java/com/android/server/audio/BtHelper.java
@@ -493,6 +493,7 @@
         mScoAudioState = SCO_STATE_INACTIVE;
         broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
         AudioSystem.setParameters("A2dpSuspended=false");
+        AudioSystem.setParameters("LeAudioSuspended=false");
         mDeviceBroker.setBluetoothScoOn(false, "resetBluetoothSco");
     }
 
diff --git a/services/core/java/com/android/server/biometrics/log/BiometricContext.java b/services/core/java/com/android/server/biometrics/log/BiometricContext.java
index 79ce6b4..3dcea19 100644
--- a/services/core/java/com/android/server/biometrics/log/BiometricContext.java
+++ b/services/core/java/com/android/server/biometrics/log/BiometricContext.java
@@ -20,6 +20,7 @@
 import android.annotation.Nullable;
 import android.content.Context;
 import android.hardware.biometrics.AuthenticateOptions;
+import android.hardware.biometrics.IBiometricContextListener;
 import android.hardware.biometrics.common.OperationContext;
 import android.view.Surface;
 
@@ -65,6 +66,7 @@
      * Current fold state from
      * {@link android.hardware.biometrics.IBiometricContextListener.FoldState}.
      */
+    @IBiometricContextListener.FoldState
     int getFoldState();
 
     /** Current device display rotation. */
diff --git a/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java b/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java
index dea8030..21ade1b 100644
--- a/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java
+++ b/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java
@@ -84,8 +84,6 @@
     private final AuthSessionCoordinator mAuthSessionCoordinator;
     private final WindowManager mWindowManager;
     @Nullable private final Handler mHandler;
-    private boolean mIsAod = false;
-    private boolean mIsAwake = false;
     private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED;
     private int mFoldState = IBiometricContextListener.FoldState.UNKNOWN;
 
@@ -117,16 +115,6 @@
         try {
             service.setBiometicContextListener(new IBiometricContextListener.Stub() {
                 @Override
-                public void onDozeChanged(boolean isAod, boolean isAwake) {
-                    final boolean changed = (mIsAod != isAod) || (mIsAwake != isAwake);
-                    if (changed) {
-                        mIsAod = isAod;
-                        mIsAwake = isAwake;
-                        notifyChanged();
-                    }
-                }
-
-                @Override
                 public void onFoldChanged(int foldState) {
                     mFoldState = foldState;
                     // no need to notify, not sent to HAL
@@ -185,12 +173,18 @@
 
     @Override
     public boolean isAod() {
-        return mIsAod;
+        return mDisplayState == AuthenticateOptions.DISPLAY_STATE_AOD;
     }
 
     @Override
     public boolean isAwake() {
-        return mIsAwake;
+        switch (mDisplayState) {
+            case AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN:
+            case AuthenticateOptions.DISPLAY_STATE_SCREENSAVER:
+            case AuthenticateOptions.DISPLAY_STATE_UNKNOWN:
+                return true;
+        }
+        return false;
     }
 
     @Override
@@ -252,7 +246,7 @@
     public String toString() {
         return "[keyguard session: " + getKeyguardEntrySessionInfo() + ", "
                 + "bp session: " + getBiometricPromptSessionInfo() + ", "
-                + "isAod: " + isAod() + ", "
+                + "displayState: " + getDisplayState() + ", "
                 + "isAwake: " + isAwake() +  ", "
                 + "isDisplayOn: " + isDisplayOn() +  ", "
                 + "dock: " + getDockedState() + ", "
diff --git a/services/core/java/com/android/server/biometrics/log/OperationContextExt.java b/services/core/java/com/android/server/biometrics/log/OperationContextExt.java
index 2934339..d1de80b 100644
--- a/services/core/java/com/android/server/biometrics/log/OperationContextExt.java
+++ b/services/core/java/com/android/server/biometrics/log/OperationContextExt.java
@@ -19,8 +19,10 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.Intent;
+import android.hardware.biometrics.AuthenticateOptions;
 import android.hardware.biometrics.IBiometricContextListener;
 import android.hardware.biometrics.common.AuthenticateReason;
+import android.hardware.biometrics.common.DisplayState;
 import android.hardware.biometrics.common.OperationContext;
 import android.hardware.biometrics.common.OperationReason;
 import android.hardware.biometrics.common.WakeReason;
@@ -204,11 +206,17 @@
         return mIsDisplayOn;
     }
 
-    /** {@link OperationContext#isAod}. */
+    /** @deprecated prefer {@link #getDisplayState()} to {@link OperationContext#isAod}. */
     public boolean isAod() {
         return mAidlContext.isAod;
     }
 
+    /** {@link OperationContext#displayState}. */
+    @DisplayState
+    public int getDisplayState() {
+        return mAidlContext.displayState;
+    }
+
     /** {@link OperationContext#isCrypto}. */
     public boolean isCrypto() {
         return mAidlContext.isCrypto;
@@ -233,6 +241,7 @@
     /** Update this object with the latest values from the given context. */
     OperationContextExt update(@NonNull BiometricContext biometricContext) {
         mAidlContext.isAod = biometricContext.isAod();
+        mAidlContext.displayState = toAidlDisplayState(biometricContext.getDisplayState());
         setFirstSessionId(biometricContext);
 
         mIsDisplayOn = biometricContext.isDisplayOn();
@@ -243,6 +252,21 @@
         return this;
     }
 
+    @DisplayState
+    private static int toAidlDisplayState(@AuthenticateOptions.DisplayState int state) {
+        switch (state) {
+            case AuthenticateOptions.DISPLAY_STATE_AOD:
+                return DisplayState.AOD;
+            case AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN:
+                return DisplayState.LOCKSCREEN;
+            case AuthenticateOptions.DISPLAY_STATE_NO_UI:
+                return DisplayState.NO_UI;
+            case AuthenticateOptions.DISPLAY_STATE_SCREENSAVER:
+                return DisplayState.SCREENSAVER;
+        }
+        return DisplayState.UNKNOWN;
+    }
+
     private void setFirstSessionId(@NonNull BiometricContext biometricContext) {
         mSessionInfo = biometricContext.getKeyguardEntrySessionInfo();
         if (mSessionInfo != null) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
index 84e2fb4..7ae31b2 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
@@ -40,6 +40,7 @@
 import com.android.server.biometrics.Utils;
 import com.android.server.biometrics.log.BiometricContext;
 import com.android.server.biometrics.log.BiometricLogger;
+import com.android.server.biometrics.log.OperationContextExt;
 import com.android.server.biometrics.sensors.AuthSessionCoordinator;
 import com.android.server.biometrics.sensors.AuthenticationClient;
 import com.android.server.biometrics.sensors.BiometricNotificationUtils;
@@ -165,8 +166,17 @@
         final AidlSession session = getFreshDaemon();
 
         if (session.hasContextMethods()) {
-            return session.getSession().authenticateWithContext(
-                    mOperationId, getOperationContext().toAidlContext(getOptions()));
+            final OperationContextExt opContext = getOperationContext();
+            final ICancellationSignal cancel = session.getSession().authenticateWithContext(
+                    mOperationId, opContext.toAidlContext(getOptions()));
+            getBiometricContext().subscribe(opContext, ctx -> {
+                try {
+                    session.getSession().onContextChanged(ctx);
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Unable to notify context changed", e);
+                }
+            });
+            return cancel;
         } else {
             return session.getSession().authenticate(mOperationId);
         }
@@ -174,6 +184,8 @@
 
     @Override
     protected void stopHalOperation() {
+        unsubscribeBiometricContext();
+
         if (mCancellationSignal != null) {
             try {
                 mCancellationSignal.cancel();
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java
index fa23ccd..9dc1782 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java
@@ -31,6 +31,7 @@
 import com.android.server.biometrics.BiometricsProto;
 import com.android.server.biometrics.log.BiometricContext;
 import com.android.server.biometrics.log.BiometricLogger;
+import com.android.server.biometrics.log.OperationContextExt;
 import com.android.server.biometrics.sensors.AcquisitionClient;
 import com.android.server.biometrics.sensors.ClientMonitorCallback;
 import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
@@ -86,6 +87,8 @@
 
     @Override
     protected void stopHalOperation() {
+        unsubscribeBiometricContext();
+
         if (mCancellationSignal != null) {
             try {
                 mCancellationSignal.cancel();
@@ -119,8 +122,17 @@
         final AidlSession session = getFreshDaemon();
 
         if (session.hasContextMethods()) {
-            return session.getSession().detectInteractionWithContext(
-                    getOperationContext().toAidlContext(mOptions));
+            final OperationContextExt opContext = getOperationContext();
+            final ICancellationSignal cancel = session.getSession().detectInteractionWithContext(
+                    opContext.toAidlContext(mOptions));
+            getBiometricContext().subscribe(opContext, ctx -> {
+                try {
+                    session.getSession().onContextChanged(ctx);
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Unable to notify context changed", e);
+                }
+            });
+            return cancel;
         } else {
             return session.getSession().detectInteraction();
         }
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java
index 792b52e..722c9af 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java
@@ -39,6 +39,7 @@
 import com.android.server.biometrics.Utils;
 import com.android.server.biometrics.log.BiometricContext;
 import com.android.server.biometrics.log.BiometricLogger;
+import com.android.server.biometrics.log.OperationContextExt;
 import com.android.server.biometrics.sensors.BaseClientMonitor;
 import com.android.server.biometrics.sensors.BiometricNotificationUtils;
 import com.android.server.biometrics.sensors.BiometricUtils;
@@ -198,9 +199,18 @@
                 HardwareAuthTokenUtils.toHardwareAuthToken(mHardwareAuthToken);
 
         if (session.hasContextMethods()) {
-            return session.getSession().enrollWithContext(
+            final OperationContextExt opContext = getOperationContext();
+            final ICancellationSignal cancel = session.getSession().enrollWithContext(
                     hat, EnrollmentType.DEFAULT, features, mHwPreviewHandle,
-                    getOperationContext().toAidlContext());
+                    opContext.toAidlContext());
+            getBiometricContext().subscribe(opContext, ctx -> {
+                try {
+                    session.getSession().onContextChanged(ctx);
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Unable to notify context changed", e);
+                }
+            });
+            return cancel;
         } else {
             return session.getSession().enroll(hat, EnrollmentType.DEFAULT, features,
                     mHwPreviewHandle);
@@ -209,6 +219,8 @@
 
     @Override
     protected void stopHalOperation() {
+        unsubscribeBiometricContext();
+
         if (mCancellationSignal != null) {
             try {
                 mCancellationSignal.cancel();
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
index 01ffc7e..128ef0b 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
@@ -82,7 +82,9 @@
 import com.android.server.SystemService;
 import com.android.server.biometrics.Utils;
 import com.android.server.biometrics.log.BiometricContext;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
 import com.android.server.biometrics.sensors.BiometricStateCallback;
+import com.android.server.biometrics.sensors.ClientMonitorCallback;
 import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
 import com.android.server.biometrics.sensors.LockoutResetDispatcher;
 import com.android.server.biometrics.sensors.LockoutTracker;
@@ -97,7 +99,9 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
@@ -1138,12 +1142,28 @@
         if (Utils.isVirtualEnabled(getContext())) {
             Slog.i(TAG, "Sync virtual enrollments");
             final int userId = ActivityManager.getCurrentUser();
+            final CountDownLatch latch = new CountDownLatch(mRegistry.getProviders().size());
             for (ServiceProvider provider : mRegistry.getProviders()) {
                 for (FingerprintSensorPropertiesInternal props : provider.getSensorProperties()) {
-                    provider.scheduleInternalCleanup(props.sensorId, userId, null /* callback */,
-                            true /* favorHalEnrollments */);
+                    provider.scheduleInternalCleanup(props.sensorId, userId,
+                            new ClientMonitorCallback() {
+                                @Override
+                                public void onClientFinished(
+                                        @NonNull BaseClientMonitor clientMonitor,
+                                        boolean success) {
+                                    latch.countDown();
+                                    if (!success) {
+                                        Slog.e(TAG, "Sync virtual enrollments failed");
+                                    }
+                                }
+                            }, true /* favorHalEnrollments */);
                 }
             }
+            try {
+                latch.await(3, TimeUnit.SECONDS);
+            } catch (Exception e) {
+                Slog.e(TAG, "Failed to wait for sync finishing", e);
+            }
         }
     }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
index 435e81d..2bfc239 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
@@ -262,6 +262,14 @@
         final AidlSession session = getFreshDaemon();
 
         final OperationContextExt opContext = getOperationContext();
+        final ICancellationSignal cancel;
+        if (session.hasContextMethods()) {
+            cancel = session.getSession().authenticateWithContext(
+                    mOperationId, opContext.toAidlContext(getOptions()));
+        } else {
+            cancel = session.getSession().authenticate(mOperationId);
+        }
+
         getBiometricContext().subscribe(opContext, ctx -> {
             if (session.hasContextMethods()) {
                 try {
@@ -283,12 +291,7 @@
             mALSProbeCallback.getProbe().enable();
         }
 
-        if (session.hasContextMethods()) {
-            return session.getSession().authenticateWithContext(
-                    mOperationId, opContext.toAidlContext(getOptions()));
-        } else {
-            return session.getSession().authenticate(mOperationId);
-        }
+        return cancel;
     }
 
     @Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java
index 16d16fc..46f62d3 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java
@@ -31,6 +31,7 @@
 import com.android.server.biometrics.BiometricsProto;
 import com.android.server.biometrics.log.BiometricContext;
 import com.android.server.biometrics.log.BiometricLogger;
+import com.android.server.biometrics.log.OperationContextExt;
 import com.android.server.biometrics.sensors.AcquisitionClient;
 import com.android.server.biometrics.sensors.ClientMonitorCallback;
 import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
@@ -79,12 +80,15 @@
     @Override
     protected void stopHalOperation() {
         mSensorOverlays.hide(getSensorId());
+        unsubscribeBiometricContext();
 
-        try {
-            mCancellationSignal.cancel();
-        } catch (RemoteException e) {
-            Slog.e(TAG, "Remote exception", e);
-            mCallback.onClientFinished(this, false /* success */);
+        if (mCancellationSignal != null) {
+            try {
+                mCancellationSignal.cancel();
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Remote exception", e);
+                mCallback.onClientFinished(this, false /* success */);
+            }
         }
     }
 
@@ -106,8 +110,17 @@
         final AidlSession session = getFreshDaemon();
 
         if (session.hasContextMethods()) {
-            return session.getSession().detectInteractionWithContext(
-                    getOperationContext().toAidlContext(mOptions));
+            final OperationContextExt opContext = getOperationContext();
+            final ICancellationSignal cancel = session.getSession().detectInteractionWithContext(
+                    opContext.toAidlContext(mOptions));
+            getBiometricContext().subscribe(opContext, ctx -> {
+                try {
+                    session.getSession().onContextChanged(ctx);
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Unable to notify context changed", e);
+                }
+            });
+            return cancel;
         } else {
             return session.getSession().detectInteraction();
         }
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index af5609a..299f865 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -75,10 +75,11 @@
 
     private static final int MSG_UPDATE_AMBIENT_LUX = 1;
     private static final int MSG_BRIGHTNESS_ADJUSTMENT_SAMPLE = 2;
-    private static final int MSG_INVALIDATE_SHORT_TERM_MODEL = 3;
+    private static final int MSG_INVALIDATE_CURRENT_SHORT_TERM_MODEL = 3;
     private static final int MSG_UPDATE_FOREGROUND_APP = 4;
     private static final int MSG_UPDATE_FOREGROUND_APP_SYNC = 5;
     private static final int MSG_RUN_UPDATE = 6;
+    private static final int MSG_INVALIDATE_PAUSED_SHORT_TERM_MODEL = 7;
 
     // Callbacks for requesting updates to the display's power state
     private final Callbacks mCallbacks;
@@ -216,12 +217,11 @@
     private float mBrightnessAdjustmentSampleOldLux;
     private float mBrightnessAdjustmentSampleOldBrightness;
 
-    // When the short term model is invalidated, we don't necessarily reset it (i.e. clear the
-    // user's adjustment) immediately, but wait for a drastic enough change in the ambient light.
-    // The anchor determines what were the light levels when the user has set their preference, and
-    // we use a relative threshold to determine when to revert to the OEM curve.
-    private boolean mShortTermModelValid;
-    private float mShortTermModelAnchor;
+    // The short term models, current and previous. Eg, we might use the "paused" one to save out
+    // the interactive short term model when switching to idle screen brightness mode, and
+    // vice-versa.
+    private final ShortTermModel mShortTermModel;
+    private final ShortTermModel mPausedShortTermModel;
 
     // Controls High Brightness Mode.
     private HighBrightnessModeController mHbmController;
@@ -309,8 +309,8 @@
         mAmbientBrightnessThresholdsIdle = ambientBrightnessThresholdsIdle;
         mScreenBrightnessThresholds = screenBrightnessThresholds;
         mScreenBrightnessThresholdsIdle = screenBrightnessThresholdsIdle;
-        mShortTermModelValid = true;
-        mShortTermModelAnchor = -1;
+        mShortTermModel = new ShortTermModel();
+        mPausedShortTermModel = new ShortTermModel();
         mHandler = new AutomaticBrightnessHandler(looper);
         mAmbientLightRingBuffer =
             new AmbientLightRingBuffer(mNormalLightSensorRate, mAmbientLightHorizonLong, mClock);
@@ -492,10 +492,10 @@
             Slog.d(TAG, "Display policy transitioning from " + oldPolicy + " to " + policy);
         }
         if (!isInteractivePolicy(policy) && isInteractivePolicy(oldPolicy) && !isInIdleMode()) {
-            mHandler.sendEmptyMessageDelayed(MSG_INVALIDATE_SHORT_TERM_MODEL,
+            mHandler.sendEmptyMessageDelayed(MSG_INVALIDATE_CURRENT_SHORT_TERM_MODEL,
                     mCurrentBrightnessMapper.getShortTermModelTimeout());
         } else if (isInteractivePolicy(policy) && !isInteractivePolicy(oldPolicy)) {
-            mHandler.removeMessages(MSG_INVALIDATE_SHORT_TERM_MODEL);
+            mHandler.removeMessages(MSG_INVALIDATE_CURRENT_SHORT_TERM_MODEL);
         }
         return true;
     }
@@ -516,25 +516,13 @@
 
     private boolean setScreenBrightnessByUser(float lux, float brightness) {
         mCurrentBrightnessMapper.addUserDataPoint(lux, brightness);
-        mShortTermModelValid = true;
-        mShortTermModelAnchor = lux;
-        if (mLoggingEnabled) {
-            Slog.d(TAG, "ShortTermModel: anchor=" + mShortTermModelAnchor);
-        }
+        mShortTermModel.setUserBrightness(lux, brightness);
         return true;
     }
 
     public void resetShortTermModel() {
         mCurrentBrightnessMapper.clearUserDataPoints();
-        mShortTermModelValid = true;
-        mShortTermModelAnchor = -1;
-    }
-
-    private void invalidateShortTermModel() {
-        if (mLoggingEnabled) {
-            Slog.d(TAG, "ShortTermModel: invalidate user data");
-        }
-        mShortTermModelValid = false;
+        mShortTermModel.reset();
     }
 
     public boolean setBrightnessConfiguration(BrightnessConfiguration configuration,
@@ -595,8 +583,12 @@
             pw.println("  mShortTermModelTimeout(idle)="
                     + mIdleModeBrightnessMapper.getShortTermModelTimeout());
         }
-        pw.println("  mShortTermModelAnchor=" + mShortTermModelAnchor);
-        pw.println("  mShortTermModelValid=" + mShortTermModelValid);
+        pw.println("  mShortTermModel=");
+        mShortTermModel.dump(pw);
+        pw.println("  mPausedShortTermModel=");
+        mPausedShortTermModel.dump(pw);
+
+        pw.println();
         pw.println("  mBrightnessAdjustmentSamplePending=" + mBrightnessAdjustmentSamplePending);
         pw.println("  mBrightnessAdjustmentSampleOldLux=" + mBrightnessAdjustmentSampleOldLux);
         pw.println("  mBrightnessAdjustmentSampleOldBrightness="
@@ -740,15 +732,9 @@
         }
         mHbmController.onAmbientLuxChange(mAmbientLux);
 
+
         // If the short term model was invalidated and the change is drastic enough, reset it.
-        if (!mShortTermModelValid && mShortTermModelAnchor != -1) {
-            if (mCurrentBrightnessMapper.shouldResetShortTermModel(
-                    mAmbientLux, mShortTermModelAnchor)) {
-                resetShortTermModel();
-            } else {
-                mShortTermModelValid = true;
-            }
-        }
+        mShortTermModel.maybeReset(mAmbientLux);
     }
 
     private float calculateAmbientLux(long now, long horizon) {
@@ -1118,8 +1104,29 @@
             return;
         }
         Slog.i(TAG, "Switching to Idle Screen Brightness Mode");
+        // Stash short term model
+        ShortTermModel tempShortTermModel = new ShortTermModel();
+        tempShortTermModel.set(mCurrentBrightnessMapper.getUserLux(),
+                mCurrentBrightnessMapper.getUserBrightness(), /* valid= */ true);
+
+        // Send delayed timeout
+        mHandler.sendEmptyMessageAtTime(MSG_INVALIDATE_PAUSED_SHORT_TERM_MODEL,
+                mClock.uptimeMillis()
+                        + mCurrentBrightnessMapper.getShortTermModelTimeout());
+
+        Slog.i(TAG, "mPreviousShortTermModel" + mPausedShortTermModel);
+        // new brightness mapper
         mCurrentBrightnessMapper = mIdleModeBrightnessMapper;
-        resetShortTermModel();
+
+        // if previous stm has been invalidated, and lux has drastically changed, just use
+        // the new, reset stm.
+        // if previous stm is still valid then revalidate it
+        if (mPausedShortTermModel != null && !mPausedShortTermModel.maybeReset(mAmbientLux)) {
+            setScreenBrightnessByUser(mPausedShortTermModel.mAnchor,
+                    mPausedShortTermModel.mBrightness);
+        }
+        mPausedShortTermModel.copyFrom(tempShortTermModel);
+
         update();
     }
 
@@ -1128,8 +1135,28 @@
             return;
         }
         Slog.i(TAG, "Switching to Interactive Screen Brightness Mode");
+        ShortTermModel tempShortTermModel = new ShortTermModel();
+        tempShortTermModel.set(mCurrentBrightnessMapper.getUserLux(),
+                mCurrentBrightnessMapper.getUserBrightness(), /* valid= */ true);
+        mHandler.removeMessages(MSG_INVALIDATE_PAUSED_SHORT_TERM_MODEL);
+        // Send delayed timeout
+        mHandler.sendEmptyMessageAtTime(MSG_INVALIDATE_PAUSED_SHORT_TERM_MODEL,
+                mClock.uptimeMillis()
+                        + mCurrentBrightnessMapper.getShortTermModelTimeout());
+        Slog.i(TAG, "mPreviousShortTermModel" + mPausedShortTermModel.toString());
+
+        // restore interactive mapper.
         mCurrentBrightnessMapper = mInteractiveModeBrightnessMapper;
-        resetShortTermModel();
+
+        // if previous stm has been invalidated, and lux has drastically changed, just use
+        // the new, reset stm.
+        // if previous stm is still valid then revalidate it
+        if (!mPausedShortTermModel.maybeReset(mAmbientLux)) {
+            setScreenBrightnessByUser(mPausedShortTermModel.mAnchor,
+                    mPausedShortTermModel.mBrightness);
+        }
+        mPausedShortTermModel.copyFrom(tempShortTermModel);
+
         update();
     }
 
@@ -1164,6 +1191,77 @@
         }
     }
 
+    private class ShortTermModel {
+        // When the short term model is invalidated, we don't necessarily reset it (i.e. clear the
+        // user's adjustment) immediately, but wait for a drastic enough change in the ambient
+        // light.
+        // The anchor determines what were the light levels when the user has set their preference,
+        // and we use a relative threshold to determine when to revert to the OEM curve.
+        private float mAnchor = -1f;
+        private float mBrightness;
+        private boolean mIsValid = true;
+
+        private void reset() {
+            mAnchor = -1f;
+            mBrightness = -1f;
+            mIsValid = true;
+        }
+
+        private void invalidate() {
+            mIsValid = false;
+            if (mLoggingEnabled) {
+                Slog.d(TAG, "ShortTermModel: invalidate user data");
+            }
+        }
+
+        private void setUserBrightness(float lux, float brightness) {
+            mAnchor = lux;
+            mBrightness = brightness;
+            mIsValid = true;
+            if (mLoggingEnabled) {
+                Slog.d(TAG, "ShortTermModel: anchor=" + mAnchor);
+            }
+        }
+
+        private boolean maybeReset(float currentLux) {
+            // If the short term model was invalidated and the change is drastic enough, reset it.
+            // Otherwise, we revalidate it.
+            if (!mIsValid && mAnchor != -1) {
+                if (mCurrentBrightnessMapper != null
+                        && mCurrentBrightnessMapper.shouldResetShortTermModel(
+                        currentLux, mAnchor)) {
+                    resetShortTermModel();
+                } else {
+                    mIsValid = true;
+                }
+                return mIsValid;
+            }
+            return false;
+        }
+
+        private void set(float anchor, float brightness, boolean valid) {
+            mAnchor = anchor;
+            mBrightness = brightness;
+            mIsValid = valid;
+        }
+        private void copyFrom(ShortTermModel from) {
+            mAnchor = from.mAnchor;
+            mBrightness = from.mBrightness;
+            mIsValid = from.mIsValid;
+        }
+
+        public String toString() {
+            return " mAnchor: " + mAnchor
+                    + "\n mBrightness: " + mBrightness
+                    + "\n mIsValid: " + mIsValid;
+        }
+
+        void dump(PrintWriter pw) {
+            pw.println(this);
+        }
+
+    }
+
     private final class AutomaticBrightnessHandler extends Handler {
         public AutomaticBrightnessHandler(Looper looper) {
             super(looper, null, true /*async*/);
@@ -1184,8 +1282,8 @@
                     collectBrightnessAdjustmentSample();
                     break;
 
-                case MSG_INVALIDATE_SHORT_TERM_MODEL:
-                    invalidateShortTermModel();
+                case MSG_INVALIDATE_CURRENT_SHORT_TERM_MODEL:
+                    mShortTermModel.invalidate();
                     break;
 
                 case MSG_UPDATE_FOREGROUND_APP:
@@ -1195,6 +1293,10 @@
                 case MSG_UPDATE_FOREGROUND_APP_SYNC:
                     updateForegroundAppSync();
                     break;
+
+                case MSG_INVALIDATE_PAUSED_SHORT_TERM_MODEL:
+                    mPausedShortTermModel.invalidate();
+                    break;
             }
         }
     }
diff --git a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
index d047183..3456e3e 100644
--- a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
+++ b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
@@ -363,13 +363,17 @@
     public abstract void recalculateSplines(boolean applyAdjustment, float[] adjustment);
 
     /**
-     * Returns the timeout for the short term model
+     * Returns the timeout, in milliseconds for the short term model
      *
      * Timeout after which we remove the effects any user interactions might've had on the
      * brightness mapping. This timeout doesn't start until we transition to a non-interactive
      * display policy so that we don't reset while users are using their devices, but also so that
      * we don't erroneously keep the short-term model if the device is dozing but the
      * display is fully on.
+     *
+     * This timeout is also used when the device switches from interactive screen brightness mode
+     * to idle screen brightness mode, to preserve the user's preference when they resume usage of
+     * the device, within the specified timeframe.
      */
     public abstract long getShortTermModelTimeout();
 
diff --git a/services/core/java/com/android/server/display/BrightnessThrottler.java b/services/core/java/com/android/server/display/BrightnessThrottler.java
index eccee52..cfdcd63 100644
--- a/services/core/java/com/android/server/display/BrightnessThrottler.java
+++ b/services/core/java/com/android/server/display/BrightnessThrottler.java
@@ -16,7 +16,10 @@
 
 package com.android.server.display;
 
+import static com.android.server.display.DisplayDeviceConfig.DEFAULT_ID;
+
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.content.Context;
 import android.hardware.display.BrightnessInfo;
 import android.hardware.display.DisplayManager;
@@ -33,8 +36,8 @@
 import android.util.Slog;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.display.DisplayDeviceConfig.BrightnessThrottlingData;
-import com.android.server.display.DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel;
+import com.android.server.display.DisplayDeviceConfig.ThermalBrightnessThrottlingData;
+import com.android.server.display.DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -63,49 +66,69 @@
     private final DeviceConfigInterface mDeviceConfig;
 
     private int mThrottlingStatus;
-    private BrightnessThrottlingData mThrottlingData;
-    private BrightnessThrottlingData mDdcThrottlingData;
+
+    // Maps the throttling ID to the data. Sourced from DisplayDeviceConfig.
+    @NonNull
+    private HashMap<String, ThermalBrightnessThrottlingData> mDdcThermalThrottlingDataMap;
+
+    // Current throttling data being used.
+    // Null if we do not support throttling.
+    @Nullable
+    private ThermalBrightnessThrottlingData mThermalThrottlingData;
+
     private float mBrightnessCap = PowerManager.BRIGHTNESS_MAX;
     private @BrightnessInfo.BrightnessMaxReason int mBrightnessMaxReason =
         BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE;
     private String mUniqueDisplayId;
 
     // The most recent string that has been set from DeviceConfig
-    private String mBrightnessThrottlingDataString;
+    private String mThermalBrightnessThrottlingDataString;
+
+    // The brightness throttling configuration that should be used.
+    private String mThermalBrightnessThrottlingDataId;
 
     // This is a collection of brightness throttling data that has been written as overrides from
     // the DeviceConfig. This will always take priority over the display device config data.
-    private HashMap<String, BrightnessThrottlingData> mBrightnessThrottlingDataOverride =
-            new HashMap<>(1);
+    // We need to store the data for every display device, so we do not need to update this each
+    // time the underlying display device changes.
+    // This map is indexed by uniqueDisplayId, to provide maps for throttlingId -> throttlingData.
+    // HashMap< uniqueDisplayId, HashMap< throttlingDataId, ThermalBrightnessThrottlingData >>
+    private final HashMap<String, HashMap<String, ThermalBrightnessThrottlingData>>
+            mThermalBrightnessThrottlingDataOverride = new HashMap<>(1);
 
-    BrightnessThrottler(Handler handler, BrightnessThrottlingData throttlingData,
-            Runnable throttlingChangeCallback, String uniqueDisplayId) {
-        this(new Injector(), handler, handler, throttlingData, throttlingChangeCallback,
-                uniqueDisplayId);
+    BrightnessThrottler(Handler handler, Runnable throttlingChangeCallback, String uniqueDisplayId,
+            String throttlingDataId,
+            @NonNull HashMap<String, ThermalBrightnessThrottlingData>
+                    thermalBrightnessThrottlingDataMap) {
+        this(new Injector(), handler, handler, throttlingChangeCallback,
+                uniqueDisplayId, throttlingDataId, thermalBrightnessThrottlingDataMap);
     }
 
     @VisibleForTesting
     BrightnessThrottler(Injector injector, Handler handler, Handler deviceConfigHandler,
-            BrightnessThrottlingData throttlingData, Runnable throttlingChangeCallback,
-            String uniqueDisplayId) {
+            Runnable throttlingChangeCallback, String uniqueDisplayId, String throttlingDataId,
+            @NonNull HashMap<String, ThermalBrightnessThrottlingData>
+                    thermalBrightnessThrottlingDataMap) {
         mInjector = injector;
 
         mHandler = handler;
         mDeviceConfigHandler = deviceConfigHandler;
-        mThrottlingData = throttlingData;
-        mDdcThrottlingData = throttlingData;
+        mDdcThermalThrottlingDataMap = thermalBrightnessThrottlingDataMap;
         mThrottlingChangeCallback = throttlingChangeCallback;
         mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler);
 
         mUniqueDisplayId = uniqueDisplayId;
         mDeviceConfig = injector.getDeviceConfig();
         mDeviceConfigListener = new DeviceConfigListener();
-
-        resetThrottlingData(mThrottlingData, mUniqueDisplayId);
+        mThermalBrightnessThrottlingDataId = throttlingDataId;
+        mDdcThermalThrottlingDataMap = thermalBrightnessThrottlingDataMap;
+        loadThermalBrightnessThrottlingDataFromDeviceConfig();
+        loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig(mDdcThermalThrottlingDataMap,
+                mThermalBrightnessThrottlingDataId, mUniqueDisplayId);
     }
 
     boolean deviceSupportsThrottling() {
-        return mThrottlingData != null;
+        return mThermalThrottlingData != null;
     }
 
     float getBrightnessCap() {
@@ -133,23 +156,14 @@
         mThrottlingStatus = THROTTLING_INVALID;
     }
 
-    private void resetThrottlingData() {
-        resetThrottlingData(mDdcThrottlingData, mUniqueDisplayId);
-    }
-
-    void resetThrottlingData(BrightnessThrottlingData throttlingData, String displayId) {
-        stop();
-
-        mUniqueDisplayId = displayId;
-        mDdcThrottlingData = throttlingData;
-        mDeviceConfigListener.startListening();
-        reloadBrightnessThrottlingDataOverride();
-        mThrottlingData = mBrightnessThrottlingDataOverride.getOrDefault(mUniqueDisplayId,
-                throttlingData);
-
-        if (deviceSupportsThrottling()) {
-            mSkinThermalStatusObserver.startObserving();
-        }
+    void loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig(
+            HashMap<String, ThermalBrightnessThrottlingData> ddcThrottlingDataMap,
+            String brightnessThrottlingDataId,
+            String uniqueDisplayId) {
+        mDdcThermalThrottlingDataMap = ddcThrottlingDataMap;
+        mThermalBrightnessThrottlingDataId = brightnessThrottlingDataId;
+        mUniqueDisplayId = uniqueDisplayId;
+        resetThermalThrottlingData();
     }
 
     private float verifyAndConstrainBrightnessCap(float brightness) {
@@ -171,11 +185,11 @@
     private void thermalStatusChanged(@Temperature.ThrottlingStatus int newStatus) {
         if (mThrottlingStatus != newStatus) {
             mThrottlingStatus = newStatus;
-            updateThrottling();
+            updateThermalThrottling();
         }
     }
 
-    private void updateThrottling() {
+    private void updateThermalThrottling() {
         if (!deviceSupportsThrottling()) {
             return;
         }
@@ -183,9 +197,9 @@
         float brightnessCap = PowerManager.BRIGHTNESS_MAX;
         int brightnessMaxReason = BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE;
 
-        if (mThrottlingStatus != THROTTLING_INVALID) {
+        if (mThrottlingStatus != THROTTLING_INVALID && mThermalThrottlingData != null) {
             // Throttling levels are sorted by increasing severity
-            for (ThrottlingLevel level : mThrottlingData.throttlingLevels) {
+            for (ThrottlingLevel level : mThermalThrottlingData.throttlingLevels) {
                 if (level.thermalStatus <= mThrottlingStatus) {
                     brightnessCap = level.brightness;
                     brightnessMaxReason = BrightnessInfo.BRIGHTNESS_MAX_REASON_THERMAL;
@@ -218,27 +232,40 @@
 
     private void dumpLocal(PrintWriter pw) {
         pw.println("BrightnessThrottler:");
-        pw.println("  mThrottlingData=" + mThrottlingData);
-        pw.println("  mDdcThrottlingData=" + mDdcThrottlingData);
+        pw.println("  mThermalBrightnessThrottlingDataId=" + mThermalBrightnessThrottlingDataId);
+        pw.println("  mThermalThrottlingData=" + mThermalThrottlingData);
         pw.println("  mUniqueDisplayId=" + mUniqueDisplayId);
         pw.println("  mThrottlingStatus=" + mThrottlingStatus);
         pw.println("  mBrightnessCap=" + mBrightnessCap);
         pw.println("  mBrightnessMaxReason=" +
             BrightnessInfo.briMaxReasonToString(mBrightnessMaxReason));
-        pw.println("  mBrightnessThrottlingDataOverride=" + mBrightnessThrottlingDataOverride);
-        pw.println("  mBrightnessThrottlingDataString=" + mBrightnessThrottlingDataString);
+        pw.println("  mDdcThermalThrottlingDataMap=" + mDdcThermalThrottlingDataMap);
+        pw.println("  mThermalBrightnessThrottlingDataOverride="
+                + mThermalBrightnessThrottlingDataOverride);
+        pw.println("  mThermalBrightnessThrottlingDataString="
+                + mThermalBrightnessThrottlingDataString);
 
         mSkinThermalStatusObserver.dump(pw);
     }
 
-    private String getBrightnessThrottlingDataString() {
+    private String getThermalBrightnessThrottlingDataString() {
         return mDeviceConfig.getString(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
                 DisplayManager.DeviceConfig.KEY_BRIGHTNESS_THROTTLING_DATA,
                 /* defaultValue= */ null);
     }
 
-    private boolean parseAndSaveData(@NonNull String strArray,
-            @NonNull HashMap<String, BrightnessThrottlingData> tempBrightnessThrottlingData) {
+    // The brightness throttling data id may or may not be specified in the string that is passed
+    // in, if there is none specified, we assume it is for the default case. Each string passed in
+    // here must be for one display and one throttling id.
+    // 123,1,critical,0.8
+    // 456,2,moderate,0.9,critical,0.7
+    // 456,2,moderate,0.9,critical,0.7,default
+    // 456,2,moderate,0.9,critical,0.7,id_2
+    // displayId, number, <state, val> * number
+    // displayId, <number, <state, val> * number>, throttlingId
+    private boolean parseAndAddData(@NonNull String strArray,
+            @NonNull HashMap<String, HashMap<String, ThermalBrightnessThrottlingData>>
+                    displayIdToThrottlingIdToBtd) {
         boolean validConfig = true;
         String[] items = strArray.split(",");
         int i = 0;
@@ -254,61 +281,110 @@
             for (int j = 0; j < noOfThrottlingPoints; j++) {
                 String severity = items[i++];
                 int status = parseThermalStatus(severity);
-
                 float brightnessPoint = parseBrightness(items[i++]);
-
                 throttlingLevels.add(new ThrottlingLevel(status, brightnessPoint));
             }
-            BrightnessThrottlingData toSave =
-                    DisplayDeviceConfig.BrightnessThrottlingData.create(throttlingLevels);
-            tempBrightnessThrottlingData.put(uniqueDisplayId, toSave);
+
+            String throttlingDataId = (i < items.length) ? items[i++] : DEFAULT_ID;
+            ThermalBrightnessThrottlingData throttlingLevelsData =
+                    DisplayDeviceConfig.ThermalBrightnessThrottlingData.create(throttlingLevels);
+
+            // Add throttlingLevelsData to inner map where necessary.
+            HashMap<String, ThermalBrightnessThrottlingData> throttlingMapForDisplay =
+                    displayIdToThrottlingIdToBtd.get(uniqueDisplayId);
+            if (throttlingMapForDisplay == null) {
+                throttlingMapForDisplay = new HashMap<>();
+                throttlingMapForDisplay.put(throttlingDataId, throttlingLevelsData);
+                displayIdToThrottlingIdToBtd.put(uniqueDisplayId, throttlingMapForDisplay);
+            } else if (throttlingMapForDisplay.containsKey(throttlingDataId)) {
+                Slog.e(TAG, "Throttling data for display " + uniqueDisplayId
+                        + "contains duplicate throttling ids: '" + throttlingDataId + "'");
+                return false;
+            } else {
+                throttlingMapForDisplay.put(throttlingDataId, throttlingLevelsData);
+            }
         } catch (NumberFormatException | IndexOutOfBoundsException
                 | UnknownThermalStatusException e) {
-            validConfig = false;
             Slog.e(TAG, "Throttling data is invalid array: '" + strArray + "'", e);
+            validConfig = false;
         }
 
         if (i != items.length) {
             validConfig = false;
         }
-
         return validConfig;
     }
 
-    public void reloadBrightnessThrottlingDataOverride() {
-        HashMap<String, BrightnessThrottlingData> tempBrightnessThrottlingData =
+    private void loadThermalBrightnessThrottlingDataFromDeviceConfig() {
+        HashMap<String, HashMap<String, ThermalBrightnessThrottlingData>> tempThrottlingData =
                 new HashMap<>(1);
-        mBrightnessThrottlingDataString = getBrightnessThrottlingDataString();
+        mThermalBrightnessThrottlingDataString = getThermalBrightnessThrottlingDataString();
         boolean validConfig = true;
-        mBrightnessThrottlingDataOverride.clear();
-        if (mBrightnessThrottlingDataString != null) {
-            String[] throttlingDataSplits = mBrightnessThrottlingDataString.split(";");
+        mThermalBrightnessThrottlingDataOverride.clear();
+        if (mThermalBrightnessThrottlingDataString != null) {
+            String[] throttlingDataSplits = mThermalBrightnessThrottlingDataString.split(";");
             for (String s : throttlingDataSplits) {
-                if (!parseAndSaveData(s, tempBrightnessThrottlingData)) {
+                if (!parseAndAddData(s, tempThrottlingData)) {
                     validConfig = false;
                     break;
                 }
             }
 
             if (validConfig) {
-                mBrightnessThrottlingDataOverride.putAll(tempBrightnessThrottlingData);
-                tempBrightnessThrottlingData.clear();
+                mThermalBrightnessThrottlingDataOverride.putAll(tempThrottlingData);
+                tempThrottlingData.clear();
             }
 
         } else {
-            Slog.w(TAG, "DeviceConfig BrightnessThrottlingData is null");
+            Slog.w(TAG, "DeviceConfig ThermalBrightnessThrottlingData is null");
         }
     }
 
+    private void resetThermalThrottlingData() {
+        stop();
+
+        mDeviceConfigListener.startListening();
+
+        // Get throttling data for this id, if it exists
+        mThermalThrottlingData = getConfigFromId(mThermalBrightnessThrottlingDataId);
+
+        // Fallback to default id otherwise.
+        if (!DEFAULT_ID.equals(mThermalBrightnessThrottlingDataId)
+                && mThermalThrottlingData == null) {
+            mThermalThrottlingData = getConfigFromId(DEFAULT_ID);
+            Slog.d(TAG, "Falling back to default throttling Id");
+        }
+
+        if (deviceSupportsThrottling()) {
+            mSkinThermalStatusObserver.startObserving();
+        }
+    }
+
+    private ThermalBrightnessThrottlingData getConfigFromId(String id) {
+        ThermalBrightnessThrottlingData returnValue;
+
+        // Fallback pattern for fetching correct throttling data for this display and id.
+        // 1) throttling data from device config for this throttling data id
+        returnValue =  mThermalBrightnessThrottlingDataOverride.get(mUniqueDisplayId) == null
+                ? null
+                : mThermalBrightnessThrottlingDataOverride.get(mUniqueDisplayId).get(id);
+        // 2) throttling data from ddc for this throttling data id
+        returnValue = returnValue == null
+                ? mDdcThermalThrottlingDataMap.get(id)
+                : returnValue;
+
+        return returnValue;
+    }
+
     /**
      * Listens to config data change and updates the brightness throttling data using
      * DisplayManager#KEY_BRIGHTNESS_THROTTLING_DATA.
      * The format should be a string similar to: "local:4619827677550801152,2,moderate,0.5,severe,
      * 0.379518072;local:4619827677550801151,1,moderate,0.75"
      * In this order:
-     * <displayId>,<no of throttling levels>,[<severity as string>,<brightness cap>]
-     * Where the latter part is repeated for each throttling level, and the entirety is repeated
-     * for each display, separated by a semicolon.
+     * <displayId>,<no of throttling levels>,[<severity as string>,<brightness cap>][,throttlingId]?
+     * Where [<severity as string>,<brightness cap>] is repeated for each throttling level, and the
+     * entirety is repeated for each display & throttling data id, separated by a semicolon.
      */
     public class DeviceConfigListener implements DeviceConfig.OnPropertiesChangedListener {
         public Executor mExecutor = new HandlerExecutor(mDeviceConfigHandler);
@@ -320,8 +396,8 @@
 
         @Override
         public void onPropertiesChanged(DeviceConfig.Properties properties) {
-            reloadBrightnessThrottlingDataOverride();
-            resetThrottlingData();
+            loadThermalBrightnessThrottlingDataFromDeviceConfig();
+            resetThermalThrottlingData();
         }
     }
 
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index f4b3f1a..a021174 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -143,17 +143,17 @@
  *            <brightness>0.01</brightness>
  *          </brightnessThrottlingPoint>
  *        </brightnessThrottlingMap>
- *        <concurrentDisplaysBrightnessThrottlingMap>
- *          <brightnessThrottlingPoint>
- *            <thermalStatus>severe</thermalStatus>
- *            <brightness>0.07</brightness>
- *          </brightnessThrottlingPoint>
- *          <brightnessThrottlingPoint>
- *            <thermalStatus>critical</thermalStatus>
- *            <brightness>0.005</brightness>
- *          </brightnessThrottlingPoint>
- *        </concurrentDisplaysBrightnessThrottlingMap>
- *        <refreshRateThrottlingMap>
+ *        <brightnessThrottlingMap id="id_2"> // optional attribute, leave blank for default
+ *             <brightnessThrottlingPoint>
+ *                 <thermalStatus>moderate</thermalStatus>
+ *                 <brightness>0.2</brightness>
+ *             </brightnessThrottlingPoint>
+ *             <brightnessThrottlingPoint>
+ *                 <thermalStatus>severe</thermalStatus>
+ *                 <brightness>0.1</brightness>
+ *            </brightnessThrottlingPoint>
+ *        </brightnessThrottlingMap>
+         <refreshRateThrottlingMap>
  *            <refreshRateThrottlingPoint>
  *                <thermalStatus>critical</thermalStatus>
  *                <refreshRateRange>
@@ -687,8 +687,8 @@
     private int[] mHighDisplayBrightnessThresholds = DEFAULT_BRIGHTNESS_THRESHOLDS;
     private int[] mHighAmbientBrightnessThresholds = DEFAULT_BRIGHTNESS_THRESHOLDS;
 
-    private final Map<String, BrightnessThrottlingData> mBrightnessThrottlingDataMap =
-            new HashMap<>();
+    private final HashMap<String, ThermalBrightnessThrottlingData>
+            mThermalBrightnessThrottlingDataMapByThrottlingId = new HashMap<>();
 
     private final Map<String, SparseArray<SurfaceControl.RefreshRateRange>>
             mRefreshRateThrottlingMap = new HashMap<>();
@@ -1346,11 +1346,11 @@
     }
 
     /**
-     * @param id The ID of the throttling data
-     * @return brightness throttling configuration data for the display.
+     * @return brightness throttling configuration data for this display, for each throttling id.
      */
-    public BrightnessThrottlingData getBrightnessThrottlingData(String id) {
-        return BrightnessThrottlingData.create(mBrightnessThrottlingDataMap.get(id));
+    public HashMap<String, ThermalBrightnessThrottlingData>
+            getThermalBrightnessThrottlingDataMapByThrottlingId() {
+        return mThermalBrightnessThrottlingDataMapByThrottlingId;
     }
 
     /**
@@ -1358,7 +1358,7 @@
      * @return refresh rate throttling configuration
      */
     @Nullable
-    public SparseArray<SurfaceControl.RefreshRateRange> getRefreshRateThrottlingData(
+    public SparseArray<SurfaceControl.RefreshRateRange> getThermalRefreshRateThrottlingData(
             @Nullable String id) {
         String key = id == null ? DEFAULT_ID : id;
         return mRefreshRateThrottlingMap.get(key);
@@ -1525,7 +1525,8 @@
                 + ", isHbmEnabled=" + mIsHighBrightnessModeEnabled
                 + ", mHbmData=" + mHbmData
                 + ", mSdrToHdrRatioSpline=" + mSdrToHdrRatioSpline
-                + ", mBrightnessThrottlingData=" + mBrightnessThrottlingDataMap
+                + ", mThermalBrightnessThrottlingDataMapByThrottlingId="
+                + mThermalBrightnessThrottlingDataMapByThrottlingId
                 + "\n"
                 + ", mBrightnessRampFastDecrease=" + mBrightnessRampFastDecrease
                 + ", mBrightnessRampFastIncrease=" + mBrightnessRampFastIncrease
@@ -1886,11 +1887,11 @@
             Slog.i(TAG, "No thermal throttling config found");
             return;
         }
-        loadBrightnessThrottlingMaps(throttlingConfig);
-        loadRefreshRateThermalThrottlingMap(throttlingConfig);
+        loadThermalBrightnessThrottlingMaps(throttlingConfig);
+        loadThermalRefreshRateThrottlingMap(throttlingConfig);
     }
 
-    private void loadBrightnessThrottlingMaps(ThermalThrottling throttlingConfig) {
+    private void loadThermalBrightnessThrottlingMaps(ThermalThrottling throttlingConfig) {
         final List<BrightnessThrottlingMap> maps = throttlingConfig.getBrightnessThrottlingMap();
         if (maps == null || maps.isEmpty()) {
             Slog.i(TAG, "No brightness throttling map found");
@@ -1900,7 +1901,7 @@
         for (BrightnessThrottlingMap map : maps) {
             final List<BrightnessThrottlingPoint> points = map.getBrightnessThrottlingPoint();
             // At least 1 point is guaranteed by the display device config schema
-            List<BrightnessThrottlingData.ThrottlingLevel> throttlingLevels =
+            List<ThermalBrightnessThrottlingData.ThrottlingLevel> throttlingLevels =
                     new ArrayList<>(points.size());
 
             boolean badConfig = false;
@@ -1911,24 +1912,24 @@
                     break;
                 }
 
-                throttlingLevels.add(new BrightnessThrottlingData.ThrottlingLevel(
+                throttlingLevels.add(new ThermalBrightnessThrottlingData.ThrottlingLevel(
                         convertThermalStatus(status), point.getBrightness().floatValue()));
             }
 
             if (!badConfig) {
                 String id = map.getId() == null ? DEFAULT_ID
                         : map.getId();
-                if (mBrightnessThrottlingDataMap.containsKey(id)) {
+                if (mThermalBrightnessThrottlingDataMapByThrottlingId.containsKey(id)) {
                     throw new RuntimeException("Brightness throttling data with ID " + id
                             + " already exists");
                 }
-                mBrightnessThrottlingDataMap.put(id,
-                        BrightnessThrottlingData.create(throttlingLevels));
+                mThermalBrightnessThrottlingDataMapByThrottlingId.put(id,
+                        ThermalBrightnessThrottlingData.create(throttlingLevels));
             }
         }
     }
 
-    private void loadRefreshRateThermalThrottlingMap(ThermalThrottling throttlingConfig) {
+    private void loadThermalRefreshRateThrottlingMap(ThermalThrottling throttlingConfig) {
         List<RefreshRateThrottlingMap> maps = throttlingConfig.getRefreshRateThrottlingMap();
         if (maps == null || maps.isEmpty()) {
             Slog.w(TAG, "RefreshRateThrottling: map not found");
@@ -1971,8 +1972,8 @@
                 ));
             }
             if (refreshRates.size() == 0) {
-                Slog.w(TAG, "RefreshRateThrottling: no valid throttling points fond for map, mapId="
-                        + id);
+                Slog.w(TAG, "RefreshRateThrottling: no valid throttling points found for map, "
+                        + "mapId=" + id);
                 continue;
             }
             mRefreshRateThrottlingMap.put(id, refreshRates);
@@ -3038,7 +3039,7 @@
     /**
      * Container for brightness throttling data.
      */
-    public static class BrightnessThrottlingData {
+    public static class ThermalBrightnessThrottlingData {
         public List<ThrottlingLevel> throttlingLevels;
 
         static class ThrottlingLevel {
@@ -3077,9 +3078,10 @@
 
 
         /**
-         * Creates multiple teperature based throttling levels of brightness
+         * Creates multiple temperature based throttling levels of brightness
          */
-        public static BrightnessThrottlingData create(List<ThrottlingLevel> throttlingLevels) {
+        public static ThermalBrightnessThrottlingData create(
+                List<ThrottlingLevel> throttlingLevels) {
             if (throttlingLevels == null || throttlingLevels.size() == 0) {
                 Slog.e(TAG, "BrightnessThrottlingData received null or empty throttling levels");
                 return null;
@@ -3117,21 +3119,12 @@
                 }
             }
 
-            return new BrightnessThrottlingData(throttlingLevels);
+            return new ThermalBrightnessThrottlingData(throttlingLevels);
         }
 
-        static public BrightnessThrottlingData create(BrightnessThrottlingData other) {
-            if (other == null) {
-                return null;
-            }
-
-            return BrightnessThrottlingData.create(other.throttlingLevels);
-        }
-
-
         @Override
         public String toString() {
-            return "BrightnessThrottlingData{"
+            return "ThermalBrightnessThrottlingData{"
                     + "throttlingLevels:" + throttlingLevels
                     + "} ";
         }
@@ -3142,12 +3135,12 @@
                 return true;
             }
 
-            if (!(obj instanceof BrightnessThrottlingData)) {
+            if (!(obj instanceof ThermalBrightnessThrottlingData)) {
                 return false;
             }
 
-            BrightnessThrottlingData otherBrightnessThrottlingData = (BrightnessThrottlingData) obj;
-            return throttlingLevels.equals(otherBrightnessThrottlingData.throttlingLevels);
+            ThermalBrightnessThrottlingData otherData = (ThermalBrightnessThrottlingData) obj;
+            return throttlingLevels.equals(otherData.throttlingLevels);
         }
 
         @Override
@@ -3156,7 +3149,7 @@
         }
 
         @VisibleForTesting
-        BrightnessThrottlingData(List<ThrottlingLevel> inLevels) {
+        ThermalBrightnessThrottlingData(List<ThrottlingLevel> inLevels) {
             throttlingLevels = new ArrayList<>(inLevels.size());
             for (ThrottlingLevel level : inLevels) {
                 throttlingLevels.add(new ThrottlingLevel(level.thermalStatus, level.brightness));
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 745e404..85b4034 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1418,16 +1418,32 @@
             flags |= VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP;
         }
 
-        if (projection != null) {
-            try {
+        // Check if the host app is attempting to reuse the token or capture again on the same
+        // MediaProjection instance. Don't start recording if so; MediaProjectionManagerService
+        // decides how to respond based on the target SDK.
+        boolean waitForPermissionConsent = false;
+        final long firstToken = Binder.clearCallingIdentity();
+        try {
+            if (projection != null) {
                 if (!getProjectionService().isCurrentProjection(projection)) {
                     throw new SecurityException("Cannot create VirtualDisplay with "
                             + "non-current MediaProjection");
                 }
+                if (!projection.isValid()) {
+                    // Just log; MediaProjectionManagerService throws an exception.
+                    Slog.w(TAG, "Reusing token: create virtual display for app reusing token");
+                    // If the exception wasn't thrown, we continue and re-show the permission dialog
+                    getProjectionService().requestConsentForInvalidProjection(projection);
+                    // Declare that mirroring shouldn't begin until user reviews the permission
+                    // dialog.
+                    waitForPermissionConsent = true;
+                }
                 flags = projection.applyVirtualDisplayFlags(flags);
-            } catch (RemoteException e) {
-                throw new SecurityException("unable to validate media projection or flags");
             }
+        } catch (RemoteException e) {
+            throw new SecurityException("Unable to validate media projection or flags", e);
+        } finally {
+            Binder.restoreCallingIdentity(firstToken);
         }
 
         if (callingUid != Process.SYSTEM_UID
@@ -1494,7 +1510,7 @@
             throw new SecurityException("Requires INTERNAL_SYSTEM_WINDOW permission");
         }
 
-        final long token = Binder.clearCallingIdentity();
+        final long secondToken = Binder.clearCallingIdentity();
         try {
             final int displayId;
             synchronized (mSyncRoot) {
@@ -1545,28 +1561,34 @@
                 // Only attempt to set content recording session if there are details to set and a
                 // VirtualDisplay has been successfully constructed.
                 session.setVirtualDisplayId(displayId);
+                // Don't start mirroring until user re-grants consent.
+                session.setWaitingToRecord(waitForPermissionConsent);
 
                 // We set the content recording session here on the server side instead of using
                 // a second AIDL call in MediaProjection. By ensuring that a virtual display has
                 // been constructed before calling setContentRecordingSession, we avoid a race
                 // condition between the DisplayManagerService & WindowManagerService which could
                 // lead to the MediaProjection being pre-emptively torn down.
-                if (!mWindowManagerInternal.setContentRecordingSession(session)) {
-                    // Unable to start mirroring, so tear down projection & release VirtualDisplay.
-                    try {
-                        getProjectionService().stopActiveProjection();
-                    } catch (RemoteException e) {
-                        Slog.e(TAG, "Unable to tell MediaProjectionManagerService to stop the "
-                                + "active projection", e);
+                try {
+                    if (!getProjectionService().setContentRecordingSession(session, projection)) {
+                        // Unable to start mirroring, so release VirtualDisplay. Projection service
+                        // handles stopping the projection.
+                        releaseVirtualDisplayInternal(callback.asBinder());
+                        return Display.INVALID_DISPLAY;
+                    } else if (projection != null) {
+                        // Indicate that this projection has been used to record, and can't be used
+                        // again.
+                        projection.notifyVirtualDisplayCreated(displayId);
                     }
-                    releaseVirtualDisplayInternal(callback.asBinder());
-                    return Display.INVALID_DISPLAY;
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Unable to tell MediaProjectionManagerService to set the "
+                            + "content recording session", e);
                 }
             }
 
             return displayId;
         } finally {
-            Binder.restoreCallingIdentity(token);
+            Binder.restoreCallingIdentity(secondToken);
         }
     }
 
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index f5859ee..5e3990a 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -505,7 +505,7 @@
 
     private DisplayDeviceConfig mDisplayDeviceConfig;
 
-    // Identifiers for suspend blocker acuisition requests
+    // Identifiers for suspend blocker acquisition requests
     private final String mSuspendBlockerIdUnfinishedBusiness;
     private final String mSuspendBlockerIdOnStateChanged;
     private final String mSuspendBlockerIdProxPositive;
@@ -515,7 +515,8 @@
     private boolean mIsEnabled;
     private boolean mIsInTransition;
 
-    private String mBrightnessThrottlingDataId;
+    // The id of the thermal brightness throttling policy that should be used.
+    private String mThermalBrightnessThrottlingDataId;
 
     // DPCs following the brightness of this DPC. This is used in concurrent displays mode - there
     // is one lead display, the additional displays follow the brightness value of the lead display.
@@ -555,7 +556,8 @@
         mHandler = new DisplayControllerHandler(handler.getLooper());
         mLastBrightnessEvent = new BrightnessEvent(mDisplayId);
         mTempBrightnessEvent = new BrightnessEvent(mDisplayId);
-        mBrightnessThrottlingDataId = logicalDisplay.getBrightnessThrottlingDataIdLocked();
+        mThermalBrightnessThrottlingDataId =
+            logicalDisplay.getThermalBrightnessThrottlingDataIdLocked();
 
         if (mDisplayId == Display.DEFAULT_DISPLAY) {
             mBatteryStats = BatteryStatsService.getService();
@@ -890,8 +892,8 @@
         final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
         final boolean isEnabled = mLogicalDisplay.isEnabledLocked();
         final boolean isInTransition = mLogicalDisplay.isInTransitionLocked();
-        final String brightnessThrottlingDataId =
-                mLogicalDisplay.getBrightnessThrottlingDataIdLocked();
+        final String thermalBrightnessThrottlingDataId =
+                mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked();
         mHandler.postAtTime(() -> {
             boolean changed = false;
             if (mDisplayDevice != device) {
@@ -900,19 +902,21 @@
                 mUniqueDisplayId = uniqueId;
                 mDisplayStatsId = mUniqueDisplayId.hashCode();
                 mDisplayDeviceConfig = config;
-                mBrightnessThrottlingDataId = brightnessThrottlingDataId;
+                mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId;
                 loadFromDisplayDeviceConfig(token, info, hbmMetadata);
                 loadNitBasedBrightnessSetting();
 
                 /// Since the underlying display-device changed, we really don't know the
-                // last command that was sent to change it's state. Lets assume it is unknown so
+                // last command that was sent to change it's state. Let's assume it is unknown so
                 // that we trigger a change immediately.
                 mPowerState.resetScreenState();
-            } else if (!mBrightnessThrottlingDataId.equals(brightnessThrottlingDataId)) {
+            } else if (
+                    !mThermalBrightnessThrottlingDataId.equals(thermalBrightnessThrottlingDataId)) {
                 changed = true;
-                mBrightnessThrottlingDataId = brightnessThrottlingDataId;
-                mBrightnessThrottler.resetThrottlingData(
-                        config.getBrightnessThrottlingData(mBrightnessThrottlingDataId),
+                mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId;
+                mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig(
+                        config.getThermalBrightnessThrottlingDataMapByThrottlingId(),
+                        mThermalBrightnessThrottlingDataId,
                         mUniqueDisplayId);
             }
             if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) {
@@ -981,9 +985,9 @@
                                 sdrBrightness, maxDesiredHdrSdrRatio);
                     }
                 });
-        mBrightnessThrottler.resetThrottlingData(
-                mDisplayDeviceConfig.getBrightnessThrottlingData(mBrightnessThrottlingDataId),
-                mUniqueDisplayId);
+        mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig(
+                mDisplayDeviceConfig.getThermalBrightnessThrottlingDataMapByThrottlingId(),
+                mThermalBrightnessThrottlingDataId, mUniqueDisplayId);
     }
 
     private void sendUpdatePowerState() {
@@ -2116,11 +2120,11 @@
         final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
         final DisplayDeviceConfig ddConfig = device.getDisplayDeviceConfig();
         return new BrightnessThrottler(mHandler,
-                ddConfig.getBrightnessThrottlingData(mBrightnessThrottlingDataId),
                 () -> {
                     sendUpdatePowerState();
                     postBrightnessChangeRunnable();
-                }, mUniqueDisplayId);
+                }, mUniqueDisplayId, mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(),
+                ddConfig.getThermalBrightnessThrottlingDataMapByThrottlingId());
     }
 
     private void blockScreenOn() {
diff --git a/services/core/java/com/android/server/display/DisplayPowerController2.java b/services/core/java/com/android/server/display/DisplayPowerController2.java
index 5306ac0..23e606c 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController2.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController2.java
@@ -400,7 +400,8 @@
     private boolean mIsEnabled;
     private boolean mIsInTransition;
 
-    private String mBrightnessThrottlingDataId;
+    // The id of the thermal brightness throttling policy that should be used.
+    private String mThermalBrightnessThrottlingDataId;
 
     // DPCs following the brightness of this DPC. This is used in concurrent displays mode - there
     // is one lead display, the additional displays follow the brightness value of the lead display.
@@ -438,7 +439,8 @@
         mDisplayStateController = new DisplayStateController(mDisplayPowerProximityStateController);
         mAutomaticBrightnessStrategy = new AutomaticBrightnessStrategy(context, mDisplayId);
         mTag = "DisplayPowerController2[" + mDisplayId + "]";
-        mBrightnessThrottlingDataId = logicalDisplay.getBrightnessThrottlingDataIdLocked();
+        mThermalBrightnessThrottlingDataId =
+            logicalDisplay.getThermalBrightnessThrottlingDataIdLocked();
 
         mDisplayDevice = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
         mUniqueDisplayId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId();
@@ -706,8 +708,8 @@
         final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
         final boolean isEnabled = mLogicalDisplay.isEnabledLocked();
         final boolean isInTransition = mLogicalDisplay.isInTransitionLocked();
-        final String brightnessThrottlingDataId =
-                mLogicalDisplay.getBrightnessThrottlingDataIdLocked();
+        final String thermalBrightnessThrottlingDataId =
+                mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked();
 
         mHandler.postAtTime(() -> {
             boolean changed = false;
@@ -717,19 +719,21 @@
                 mUniqueDisplayId = uniqueId;
                 mDisplayStatsId = mUniqueDisplayId.hashCode();
                 mDisplayDeviceConfig = config;
-                mBrightnessThrottlingDataId = brightnessThrottlingDataId;
+                mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId;
                 loadFromDisplayDeviceConfig(token, info, hbmMetadata);
                 mDisplayPowerProximityStateController.notifyDisplayDeviceChanged(config);
 
                 // Since the underlying display-device changed, we really don't know the
-                // last command that was sent to change it's state. Lets assume it is unknown so
+                // last command that was sent to change it's state. Let's assume it is unknown so
                 // that we trigger a change immediately.
                 mPowerState.resetScreenState();
-            } else if (!mBrightnessThrottlingDataId.equals(brightnessThrottlingDataId)) {
+            } else if (
+                    !mThermalBrightnessThrottlingDataId.equals(thermalBrightnessThrottlingDataId)) {
                 changed = true;
-                mBrightnessThrottlingDataId = brightnessThrottlingDataId;
-                mBrightnessThrottler.resetThrottlingData(
-                        config.getBrightnessThrottlingData(mBrightnessThrottlingDataId),
+                mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId;
+                mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig(
+                        config.getThermalBrightnessThrottlingDataMapByThrottlingId(),
+                        mThermalBrightnessThrottlingDataId,
                         mUniqueDisplayId);
             }
             if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) {
@@ -795,9 +799,9 @@
                                 sdrBrightness, maxDesiredHdrSdrRatio);
                     }
                 });
-        mBrightnessThrottler.resetThrottlingData(
-                mDisplayDeviceConfig.getBrightnessThrottlingData(mBrightnessThrottlingDataId),
-                mUniqueDisplayId);
+        mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig(
+                mDisplayDeviceConfig.getThermalBrightnessThrottlingDataMapByThrottlingId(),
+                mThermalBrightnessThrottlingDataId, mUniqueDisplayId);
     }
 
     private void sendUpdatePowerState() {
@@ -1206,14 +1210,15 @@
         // actual state instead of the desired one.
         animateScreenStateChange(state, mDisplayStateController.shouldPerformScreenOffTransition());
         state = mPowerState.getScreenState();
+        final boolean userSetBrightnessChanged = mDisplayBrightnessController
+                .updateUserSetScreenBrightness();
 
         DisplayBrightnessState displayBrightnessState = mDisplayBrightnessController
                 .updateBrightness(mPowerRequest, state);
         float brightnessState = displayBrightnessState.getBrightness();
         float rawBrightnessState = displayBrightnessState.getBrightness();
         mBrightnessReasonTemp.set(displayBrightnessState.getBrightnessReason());
-        final boolean userSetBrightnessChanged = mDisplayBrightnessController
-                .updateUserSetScreenBrightness();
+
         // Take note if the short term model was already active before applying the current
         // request changes.
         final boolean wasShortTermModelActive =
@@ -1756,11 +1761,11 @@
         final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
         final DisplayDeviceConfig ddConfig = device.getDisplayDeviceConfig();
         return new BrightnessThrottler(mHandler,
-                ddConfig.getBrightnessThrottlingData(mBrightnessThrottlingDataId),
                 () -> {
                     sendUpdatePowerState();
                     postBrightnessChangeRunnable();
-                }, mUniqueDisplayId);
+                }, mUniqueDisplayId, mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(),
+                ddConfig.getThermalBrightnessThrottlingDataMapByThrottlingId());
     }
 
     private void blockScreenOn() {
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index dee4cde..dab00d8 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -175,11 +175,11 @@
     private boolean mDirty = false;
 
     /**
-     * The ID of the brightness throttling data that should be used. This can change e.g. in
-     * concurrent displays mode in which a stricter brightness throttling policy might need to be
-     * used.
+     * The ID of the thermal brightness throttling data that should be used. This can change e.g.
+     * in concurrent displays mode in which a stricter brightness throttling policy might need to
+     * be used.
      */
-    private String mBrightnessThrottlingDataId;
+    private String mThermalBrightnessThrottlingDataId;
 
     public LogicalDisplay(int displayId, int layerStack, DisplayDevice primaryDisplayDevice) {
         mDisplayId = displayId;
@@ -189,7 +189,7 @@
         mTempFrameRateOverride = new SparseArray<>();
         mIsEnabled = true;
         mIsInTransition = false;
-        mBrightnessThrottlingDataId = DisplayDeviceConfig.DEFAULT_ID;
+        mThermalBrightnessThrottlingDataId = DisplayDeviceConfig.DEFAULT_ID;
     }
 
     public void setDevicePositionLocked(int position) {
@@ -349,7 +349,7 @@
      *
      * @param refreshRanges new refreshRateThermalThrottling ranges limited by layout or default
      */
-    public void updateRefreshRateThermalThrottling(
+    public void updateThermalRefreshRateThrottling(
             @Nullable SparseArray<SurfaceControl.RefreshRateRange> refreshRanges) {
         if (refreshRanges == null) {
             refreshRanges = new SparseArray<>();
@@ -872,16 +872,16 @@
     /**
      * @return The ID of the brightness throttling data that this display should use.
      */
-    public String getBrightnessThrottlingDataIdLocked() {
-        return mBrightnessThrottlingDataId;
+    public String getThermalBrightnessThrottlingDataIdLocked() {
+        return mThermalBrightnessThrottlingDataId;
     }
 
     /**
      * @param brightnessThrottlingDataId The ID of the brightness throttling data that this
      *                                  display should use.
      */
-    public void setBrightnessThrottlingDataIdLocked(String brightnessThrottlingDataId) {
-        mBrightnessThrottlingDataId =
+    public void setThermalBrightnessThrottlingDataIdLocked(String brightnessThrottlingDataId) {
+        mThermalBrightnessThrottlingDataId =
                 brightnessThrottlingDataId;
     }
 
@@ -950,7 +950,7 @@
         pw.println("mFrameRateOverrides=" + Arrays.toString(mFrameRateOverrides));
         pw.println("mPendingFrameRateOverrideUids=" + mPendingFrameRateOverrideUids);
         pw.println("mDisplayGroupName=" + mDisplayGroupName);
-        pw.println("mBrightnessThrottlingDataId=" + mBrightnessThrottlingDataId);
+        pw.println("mThermalBrightnessThrottlingDataId=" + mThermalBrightnessThrottlingDataId);
         pw.println("mLeadDisplayId=" + mLeadDisplayId);
     }
 
diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
index 424eedc..254441c2 100644
--- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java
+++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
@@ -1022,17 +1022,17 @@
             newDisplay.updateLayoutLimitedRefreshRateLocked(
                     config.getRefreshRange(displayLayout.getRefreshRateZoneId())
             );
-            newDisplay.updateRefreshRateThermalThrottling(
-                    config.getRefreshRateThrottlingData(
+            newDisplay.updateThermalRefreshRateThrottling(
+                    config.getThermalRefreshRateThrottlingData(
                             displayLayout.getRefreshRateThermalThrottlingMapId()
                     )
             );
 
             setEnabledLocked(newDisplay, displayLayout.isEnabled());
-            newDisplay.setBrightnessThrottlingDataIdLocked(
-                    displayLayout.getBrightnessThrottlingMapId() == null
+            newDisplay.setThermalBrightnessThrottlingDataIdLocked(
+                    displayLayout.getThermalBrightnessThrottlingMapId() == null
                             ? DisplayDeviceConfig.DEFAULT_ID
-                            : displayLayout.getBrightnessThrottlingMapId());
+                            : displayLayout.getThermalBrightnessThrottlingMapId());
 
             newDisplay.setDisplayGroupNameLocked(displayLayout.getDisplayGroupName());
         }
diff --git a/services/core/java/com/android/server/display/WifiDisplayAdapter.java b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
index e832701..e3d38e7 100644
--- a/services/core/java/com/android/server/display/WifiDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
@@ -16,6 +16,7 @@
 
 package com.android.server.display;
 
+import android.app.BroadcastOptions;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -421,6 +422,7 @@
     // Runs on the handler.
     private void handleSendStatusChangeBroadcast() {
         final Intent intent;
+        final BroadcastOptions options;
         synchronized (getSyncRoot()) {
             if (!mPendingStatusChangeBroadcast) {
                 return;
@@ -431,10 +433,13 @@
             intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
             intent.putExtra(DisplayManager.EXTRA_WIFI_DISPLAY_STATUS,
                     getWifiDisplayStatusLocked());
+
+            options = BroadcastOptions.makeBasic();
+            options.setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT);
         }
 
         // Send protected broadcast about wifi display status to registered receivers.
-        getContext().sendBroadcastAsUser(intent, UserHandle.ALL);
+        getContext().sendBroadcastAsUser(intent, UserHandle.ALL, null, options.toBundle());
     }
 
     private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
diff --git a/services/core/java/com/android/server/display/layout/Layout.java b/services/core/java/com/android/server/display/layout/Layout.java
index f86ee24..b55d7d5 100644
--- a/services/core/java/com/android/server/display/layout/Layout.java
+++ b/services/core/java/com/android/server/display/layout/Layout.java
@@ -234,11 +234,11 @@
         // {@link DeviceStateToLayoutMap.POSITION_UNKNOWN} is unspecified.
         private final int mPosition;
 
-        // The ID of the brightness throttling map that should be used. This can change e.g. in
-        // concurrent displays mode in which a stricter brightness throttling policy might need to
-        // be used.
+        // The ID of the thermal brightness throttling map that should be used. This can change
+        // e.g. in concurrent displays mode in which a stricter brightness throttling policy might
+        // need to be used.
         @Nullable
-        private final String mBrightnessThrottlingMapId;
+        private final String mThermalBrightnessThrottlingMapId;
 
         // The ID of the lead display that this display will follow in a layout. -1 means no lead.
         private final int mLeadDisplayId;
@@ -248,7 +248,7 @@
         private final String mRefreshRateZoneId;
 
         @Nullable
-        private final String mRefreshRateThermalThrottlingMapId;
+        private final String mThermalRefreshRateThrottlingMapId;
 
         private Display(@NonNull DisplayAddress address, int logicalDisplayId, boolean isEnabled,
                 @NonNull String displayGroupName, String brightnessThrottlingMapId, int position,
@@ -259,9 +259,9 @@
             mIsEnabled = isEnabled;
             mDisplayGroupName = displayGroupName;
             mPosition = position;
-            mBrightnessThrottlingMapId = brightnessThrottlingMapId;
+            mThermalBrightnessThrottlingMapId = brightnessThrottlingMapId;
             mRefreshRateZoneId = refreshRateZoneId;
-            mRefreshRateThermalThrottlingMapId = refreshRateThermalThrottlingMapId;
+            mThermalRefreshRateThrottlingMapId = refreshRateThermalThrottlingMapId;
             mLeadDisplayId = leadDisplayId;
         }
 
@@ -273,10 +273,10 @@
                     + ", displayGroupName: " + mDisplayGroupName
                     + ", addr: " + mAddress
                     +  ((mPosition == POSITION_UNKNOWN) ? "" : ", position: " + mPosition)
-                    + ", brightnessThrottlingMapId: " + mBrightnessThrottlingMapId
+                    + ", mThermalBrightnessThrottlingMapId: " + mThermalBrightnessThrottlingMapId
                     + ", mRefreshRateZoneId: " + mRefreshRateZoneId
                     + ", mLeadDisplayId: " + mLeadDisplayId
-                    + ", mRefreshRateThermalThrottlingMapId: " + mRefreshRateThermalThrottlingMapId
+                    + ", mThermalRefreshRateThrottlingMapId: " + mThermalRefreshRateThrottlingMapId
                     + "}";
         }
 
@@ -293,12 +293,12 @@
                     && otherDisplay.mLogicalDisplayId == this.mLogicalDisplayId
                     && this.mDisplayGroupName.equals(otherDisplay.mDisplayGroupName)
                     && this.mAddress.equals(otherDisplay.mAddress)
-                    && Objects.equals(mBrightnessThrottlingMapId,
-                    otherDisplay.mBrightnessThrottlingMapId)
+                    && Objects.equals(mThermalBrightnessThrottlingMapId,
+                    otherDisplay.mThermalBrightnessThrottlingMapId)
                     && Objects.equals(otherDisplay.mRefreshRateZoneId, this.mRefreshRateZoneId)
                     && this.mLeadDisplayId == otherDisplay.mLeadDisplayId
-                    && Objects.equals(mRefreshRateThermalThrottlingMapId,
-                    otherDisplay.mRefreshRateThermalThrottlingMapId);
+                    && Objects.equals(mThermalRefreshRateThrottlingMapId,
+                    otherDisplay.mThermalRefreshRateThrottlingMapId);
         }
 
         @Override
@@ -309,10 +309,10 @@
             result = 31 * result + mLogicalDisplayId;
             result = 31 * result + mDisplayGroupName.hashCode();
             result = 31 * result + mAddress.hashCode();
-            result = 31 * result + mBrightnessThrottlingMapId.hashCode();
+            result = 31 * result + mThermalBrightnessThrottlingMapId.hashCode();
             result = 31 * result + Objects.hashCode(mRefreshRateZoneId);
             result = 31 * result + mLeadDisplayId;
-            result = 31 * result + Objects.hashCode(mRefreshRateThermalThrottlingMapId);
+            result = 31 * result + Objects.hashCode(mThermalRefreshRateThrottlingMapId);
             return result;
         }
 
@@ -338,10 +338,12 @@
         }
 
         /**
-         * @return The ID of the brightness throttling map that this display should use.
+         * Gets the id of the thermal brightness throttling map that should be used.
+         * @return The ID of the thermal brightness throttling map that this display should use,
+         *         null if unspecified, will fall back to default.
          */
-        public String getBrightnessThrottlingMapId() {
-            return mBrightnessThrottlingMapId;
+        public String getThermalBrightnessThrottlingMapId() {
+            return mThermalBrightnessThrottlingMapId;
         }
 
         /**
@@ -359,7 +361,7 @@
         }
 
         public String getRefreshRateThermalThrottlingMapId() {
-            return mRefreshRateThermalThrottlingMapId;
+            return mThermalRefreshRateThrottlingMapId;
         }
     }
 }
diff --git a/services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java b/services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java
index f93d9ee..c04735d 100644
--- a/services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java
+++ b/services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java
@@ -102,7 +102,7 @@
     //region DisplayManager.DisplayListener
     @Override
     public void onDisplayAdded(int displayId) {
-        updateRefreshRateThermalThrottling(displayId);
+        updateThermalRefreshRateThrottling(displayId);
         if (mLoggingEnabled) {
             Slog.d(TAG, "Display added:" + displayId);
         }
@@ -122,7 +122,7 @@
 
     @Override
     public void onDisplayChanged(int displayId) {
-        updateRefreshRateThermalThrottling(displayId);
+        updateThermalRefreshRateThrottling(displayId);
         if (mLoggingEnabled) {
             Slog.d(TAG, "Display changed:" + displayId);
         }
@@ -150,7 +150,7 @@
         }
     }
 
-    private void updateRefreshRateThermalThrottling(int displayId) {
+    private void updateThermalRefreshRateThrottling(int displayId) {
         DisplayInfo displayInfo = new DisplayInfo();
         mInjector.getDisplayInfo(displayId, displayInfo);
         SparseArray<SurfaceControl.RefreshRateRange> throttlingMap =
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index c0deb3f..805ff66 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -3774,11 +3774,12 @@
                 }
                 try {
                     record.mListener.onReceived(srcAddress, destAddress, params, hasVendorId);
+                    return true;
                 } catch (RemoteException e) {
                     Slog.e(TAG, "Failed to notify vendor command reception", e);
                 }
             }
-            return true;
+            return false;
         }
     }
 
diff --git a/services/core/java/com/android/server/input/KeyboardBacklightController.java b/services/core/java/com/android/server/input/KeyboardBacklightController.java
index 4033238..048308e 100644
--- a/services/core/java/com/android/server/input/KeyboardBacklightController.java
+++ b/services/core/java/com/android/server/input/KeyboardBacklightController.java
@@ -29,6 +29,8 @@
 import android.os.Message;
 import android.os.RemoteException;
 import android.os.SystemClock;
+import android.os.UEventObserver;
+import android.text.TextUtils;
 import android.util.IndentingPrintWriter;
 import android.util.Log;
 import android.util.Slog;
@@ -69,6 +71,8 @@
     private static final int MAX_BRIGHTNESS = 255;
     private static final int NUM_BRIGHTNESS_CHANGE_STEPS = 10;
 
+    private static final String UEVENT_KEYBOARD_BACKLIGHT_TAG = "kbd_backlight";
+
     @VisibleForTesting
     static final long USER_INACTIVITY_THRESHOLD_MILLIS = Duration.ofSeconds(30).toMillis();
 
@@ -120,6 +124,18 @@
         Message msg = Message.obtain(mHandler, MSG_UPDATE_EXISTING_DEVICES,
                 inputManager.getInputDeviceIds());
         mHandler.sendMessage(msg);
+
+        // Observe UEvents for "kbd_backlight" sysfs nodes.
+        // We want to observe creation of such LED nodes since they might be created after device
+        // FD created and InputDevice creation logic doesn't initialize LED nodes which leads to
+        // backlight not working.
+        UEventObserver observer = new UEventObserver() {
+            @Override
+            public void onUEvent(UEvent event) {
+                onKeyboardBacklightUEvent(event);
+            }
+        };
+        observer.startObserving(UEVENT_KEYBOARD_BACKLIGHT_TAG);
     }
 
     @Override
@@ -386,6 +402,34 @@
         }
     }
 
+    @VisibleForTesting
+    public void onKeyboardBacklightUEvent(UEventObserver.UEvent event) {
+        if ("ADD".equalsIgnoreCase(event.get("ACTION")) && "LEDS".equalsIgnoreCase(
+                event.get("SUBSYSTEM"))) {
+            final String devPath = event.get("DEVPATH");
+            if (isValidBacklightNodePath(devPath)) {
+                mNative.sysfsNodeChanged("/sys" + devPath);
+            }
+        }
+    }
+
+    private static boolean isValidBacklightNodePath(String devPath) {
+        if (TextUtils.isEmpty(devPath)) {
+            return false;
+        }
+        int index = devPath.lastIndexOf('/');
+        if (index < 0) {
+            return false;
+        }
+        String backlightNode = devPath.substring(index + 1);
+        devPath = devPath.substring(0, index);
+        if (!devPath.endsWith("leds") || !backlightNode.contains("kbd_backlight")) {
+            return false;
+        }
+        index = devPath.lastIndexOf('/');
+        return index >= 0;
+    }
+
     @Override
     public void dump(PrintWriter pw) {
         IndentingPrintWriter ipw = new IndentingPrintWriter(pw);
diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java
index a0918e4..aeb2477 100644
--- a/services/core/java/com/android/server/input/NativeInputManagerService.java
+++ b/services/core/java/com/android/server/input/NativeInputManagerService.java
@@ -237,6 +237,12 @@
     /** Set whether showing a pointer icon for styluses is enabled. */
     void setStylusPointerIconEnabled(boolean enabled);
 
+    /**
+     * Report sysfs node changes. This may result in recreation of the corresponding InputDevice.
+     * The recreated device may contain new associated peripheral devices like Light, Battery, etc.
+     */
+    void sysfsNodeChanged(String sysfsNodePath);
+
     /** The native implementation of InputManagerService methods. */
     class NativeImpl implements NativeInputManagerService {
         /** Pointer to native input manager service object, used by native code. */
@@ -484,5 +490,8 @@
 
         @Override
         public native void setStylusPointerIconEnabled(boolean enabled);
+
+        @Override
+        public native void sysfsNodeChanged(String sysfsNodePath);
     }
 }
diff --git a/services/core/java/com/android/server/inputmethod/HandwritingModeController.java b/services/core/java/com/android/server/inputmethod/HandwritingModeController.java
index d543547..effef47 100644
--- a/services/core/java/com/android/server/inputmethod/HandwritingModeController.java
+++ b/services/core/java/com/android/server/inputmethod/HandwritingModeController.java
@@ -24,8 +24,8 @@
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
 import android.annotation.UiThread;
-import android.os.Handler;
 import android.hardware.input.InputManagerGlobal;
+import android.os.Handler;
 import android.os.IBinder;
 import android.os.Looper;
 import android.text.TextUtils;
@@ -37,6 +37,7 @@
 import android.view.InputEvent;
 import android.view.InputEventReceiver;
 import android.view.MotionEvent;
+import android.view.PointerIcon;
 import android.view.SurfaceControl;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
@@ -165,7 +166,11 @@
             @NonNull String delegatePackageName, @NonNull String delegatorPackageName) {
         mDelegatePackageName = delegatePackageName;
         mDelegatorPackageName = delegatorPackageName;
-        mHandwritingBuffer.ensureCapacity(getHandwritingBufferSize());
+        if (mHandwritingBuffer == null) {
+            mHandwritingBuffer = new ArrayList<>(getHandwritingBufferSize());
+        } else {
+            mHandwritingBuffer.ensureCapacity(getHandwritingBufferSize());
+        }
         scheduleHandwritingDelegationTimeout();
     }
 
@@ -269,6 +274,9 @@
         }
         mHandwritingSurface.startIntercepting(imePid, imeUid);
 
+        // Unset the pointer icon for the stylus in case the app had set it.
+        InputManagerGlobal.getInstance().setPointerIconType(PointerIcon.TYPE_NOT_SPECIFIED);
+
         return new HandwritingSession(mCurrentRequestId, mHandwritingSurface.getInputChannel(),
                 mHandwritingBuffer);
     }
diff --git a/services/core/java/com/android/server/inputmethod/HardwareKeyboardShortcutController.java b/services/core/java/com/android/server/inputmethod/HardwareKeyboardShortcutController.java
new file mode 100644
index 0000000..f0e4b0f5
--- /dev/null
+++ b/services/core/java/com/android/server/inputmethod/HardwareKeyboardShortcutController.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.inputmethod;
+
+import android.annotation.AnyThread;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.inputmethod.InputMethodSubtypeHandle;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+final class HardwareKeyboardShortcutController {
+    @GuardedBy("ImfLock.class")
+    private final ArrayList<InputMethodSubtypeHandle> mSubtypeHandles = new ArrayList<>();
+
+    @GuardedBy("ImfLock.class")
+    void reset(@NonNull InputMethodUtils.InputMethodSettings settings) {
+        mSubtypeHandles.clear();
+        for (final InputMethodInfo imi : settings.getEnabledInputMethodListLocked()) {
+            if (!imi.shouldShowInInputMethodPicker()) {
+                continue;
+            }
+            final List<InputMethodSubtype> subtypes =
+                    settings.getEnabledInputMethodSubtypeListLocked(imi, true);
+            if (subtypes.isEmpty()) {
+                mSubtypeHandles.add(InputMethodSubtypeHandle.of(imi, null));
+            } else {
+                for (final InputMethodSubtype subtype : subtypes) {
+                    if (subtype.isSuitableForPhysicalKeyboardLayoutMapping()) {
+                        mSubtypeHandles.add(InputMethodSubtypeHandle.of(imi, subtype));
+                    }
+                }
+            }
+        }
+    }
+
+    @AnyThread
+    @Nullable
+    static <T> T getNeighborItem(@NonNull List<T> list, @NonNull T value, boolean next) {
+        final int size = list.size();
+        for (int i = 0; i < size; ++i) {
+            if (Objects.equals(value, list.get(i))) {
+                final int nextIndex = (i + (next ? 1 : -1) + size) % size;
+                return list.get(nextIndex);
+            }
+        }
+        return null;
+    }
+
+    @GuardedBy("ImfLock.class")
+    @Nullable
+    InputMethodSubtypeHandle onSubtypeSwitch(
+            @NonNull InputMethodSubtypeHandle currentImeAndSubtype, boolean forward) {
+        return getNeighborItem(mSubtypeHandles, currentImeAndSubtype, forward);
+    }
+}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index b440208..2433211 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -316,6 +316,8 @@
     final ArrayList<InputMethodInfo> mMethodList = new ArrayList<>();
     final ArrayMap<String, InputMethodInfo> mMethodMap = new ArrayMap<>();
     final InputMethodSubtypeSwitchingController mSwitchingController;
+    final HardwareKeyboardShortcutController mHardwareKeyboardShortcutController =
+            new HardwareKeyboardShortcutController();
 
     /**
      * Tracks how many times {@link #mMethodMap} was updated.
@@ -1731,6 +1733,7 @@
         AdditionalSubtypeUtils.load(mAdditionalSubtypeMap, userId);
         mSwitchingController =
                 InputMethodSubtypeSwitchingController.createInstanceLocked(mSettings, context);
+        mHardwareKeyboardShortcutController.reset(mSettings);
         mMenuController = new InputMethodMenuController(this);
         mBindingController =
                 bindingControllerForTesting != null
@@ -3268,6 +3271,7 @@
         // TODO: Make sure that mSwitchingController and mSettings are sharing the
         // the same enabled IMEs list.
         mSwitchingController.resetCircularListLocked(mContext);
+        mHardwareKeyboardShortcutController.reset(mSettings);
 
         sendOnNavButtonFlagsChangedLocked();
     }
@@ -5293,6 +5297,7 @@
         // TODO: Make sure that mSwitchingController and mSettings are sharing the
         // the same enabled IMEs list.
         mSwitchingController.resetCircularListLocked(mContext);
+        mHardwareKeyboardShortcutController.reset(mSettings);
 
         sendOnNavButtonFlagsChangedLocked();
 
@@ -5827,10 +5832,37 @@
         @Override
         public void switchKeyboardLayout(int direction) {
             synchronized (ImfLock.class) {
-                if (direction > 0) {
-                    switchToNextInputMethodLocked(null /* token */, true /* onlyCurrentIme */);
-                } else {
-                    // TODO(b/258853866): Support backwards switching.
+                final InputMethodInfo currentImi = mMethodMap.get(getSelectedMethodIdLocked());
+                if (currentImi == null) {
+                    return;
+                }
+                final InputMethodSubtypeHandle currentSubtypeHandle =
+                        InputMethodSubtypeHandle.of(currentImi, mCurrentSubtype);
+                final InputMethodSubtypeHandle nextSubtypeHandle =
+                        mHardwareKeyboardShortcutController.onSubtypeSwitch(currentSubtypeHandle,
+                                direction > 0);
+                if (nextSubtypeHandle == null) {
+                    return;
+                }
+                final InputMethodInfo nextImi = mMethodMap.get(nextSubtypeHandle.getImeId());
+                if (nextImi == null) {
+                    return;
+                }
+
+                final int subtypeCount = nextImi.getSubtypeCount();
+                if (subtypeCount == 0) {
+                    if (nextSubtypeHandle.equals(InputMethodSubtypeHandle.of(nextImi, null))) {
+                        setInputMethodLocked(nextImi.getId(), NOT_A_SUBTYPE_ID);
+                    }
+                    return;
+                }
+
+                for (int i = 0; i < subtypeCount; ++i) {
+                    if (nextSubtypeHandle.equals(
+                            InputMethodSubtypeHandle.of(nextImi, nextImi.getSubtypeAt(i)))) {
+                        setInputMethodLocked(nextImi.getId(), i);
+                        return;
+                    }
                 }
             }
         }
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
index c212e8e..44ae454 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
@@ -19,7 +19,6 @@
 import static com.android.server.inputmethod.InputMethodManagerService.DEBUG;
 import static com.android.server.inputmethod.InputMethodUtils.NOT_A_SUBTYPE_ID;
 
-import android.annotation.Nullable;
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -66,8 +65,8 @@
     private boolean mShowImeWithHardKeyboard;
 
     @GuardedBy("ImfLock.class")
-    @Nullable
-    private InputMethodDialogWindowContext mDialogWindowContext;
+    private final InputMethodDialogWindowContext mDialogWindowContext =
+            new InputMethodDialogWindowContext();
 
     InputMethodMenuController(InputMethodManagerService service) {
         mService = service;
@@ -125,13 +124,11 @@
                 }
             }
 
-            if (mDialogWindowContext == null) {
-                mDialogWindowContext = new InputMethodDialogWindowContext();
-            }
             final Context dialogWindowContext = mDialogWindowContext.get(displayId);
             mDialogBuilder = new AlertDialog.Builder(dialogWindowContext);
             mDialogBuilder.setOnCancelListener(dialog -> hideInputMethodMenu());
 
+            // TODO(b/277061090): refactor UI components should not be created while holding a lock.
             final Context dialogContext = mDialogBuilder.getContext();
             final TypedArray a = dialogContext.obtainStyledAttributes(null,
                     com.android.internal.R.styleable.DialogPreference,
@@ -199,10 +196,11 @@
             attrs.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
             attrs.setTitle("Select input method");
             w.setAttributes(attrs);
+            // TODO(b/277062834) decouple/remove dependency on IMMS
             mService.updateSystemUiLocked();
             mService.sendOnNavButtonFlagsChangedLocked();
-            mSwitchingDialog.show();
         }
+        mSwitchingDialog.show();
     }
 
     private boolean isScreenLocked() {
@@ -276,6 +274,7 @@
         private final int mTextViewResourceId;
         private final List<ImeSubtypeListItem> mItemsList;
         public int mCheckedItem;
+
         private ImeSubtypeListAdapter(Context context, int textViewResourceId,
                 List<ImeSubtypeListItem> itemsList, int checkedItem) {
             super(context, textViewResourceId, itemsList);
diff --git a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java
index e48412a..82b4da3 100644
--- a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java
@@ -103,6 +103,7 @@
 import android.text.TextUtils;
 import android.text.format.DateUtils;
 import android.util.Log;
+import android.util.Pair;
 import android.util.TimeUtils;
 
 import com.android.internal.annotations.GuardedBy;
@@ -1396,11 +1397,14 @@
             Log.v(TAG, "SV count: " + gnssStatus.getSatelliteCount());
         }
 
+        Set<Pair<Integer, Integer>> satellites = new HashSet<>();
         int usedInFixCount = 0;
         int maxCn0 = 0;
         int meanCn0 = 0;
         for (int i = 0; i < gnssStatus.getSatelliteCount(); i++) {
             if (gnssStatus.usedInFix(i)) {
+                satellites.add(
+                        new Pair<>(gnssStatus.getConstellationType(i), gnssStatus.getSvid(i)));
                 ++usedInFixCount;
                 if (gnssStatus.getCn0DbHz(i) > maxCn0) {
                     maxCn0 = (int) gnssStatus.getCn0DbHz(i);
@@ -1413,7 +1417,7 @@
             meanCn0 /= usedInFixCount;
         }
         // return number of sats used in fix instead of total reported
-        mLocationExtras.set(usedInFixCount, meanCn0, maxCn0);
+        mLocationExtras.set(satellites.size(), meanCn0, maxCn0);
 
         mGnssMetrics.logSvStatus(gnssStatus);
     }
diff --git a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
index b75b7d4..f0e8ede 100644
--- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
+++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
@@ -16,8 +16,10 @@
 
 package com.android.server.media.projection;
 
+import static android.Manifest.permission.MANAGE_MEDIA_PROJECTION;
 import static android.app.ActivityManagerInternal.MEDIA_PROJECTION_TOKEN_EVENT_CREATED;
 import static android.app.ActivityManagerInternal.MEDIA_PROJECTION_TOKEN_EVENT_DESTROYED;
+import static android.view.Display.INVALID_DISPLAY;
 
 import android.Manifest;
 import android.annotation.NonNull;
@@ -25,10 +27,14 @@
 import android.app.ActivityManagerInternal;
 import android.app.AppOpsManager;
 import android.app.IProcessObserver;
+import android.app.compat.CompatChanges;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledSince;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.ApplicationInfoFlags;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ServiceInfo;
 import android.hardware.display.DisplayManager;
@@ -45,11 +51,13 @@
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.RemoteException;
+import android.os.SystemClock;
 import android.os.UserHandle;
 import android.util.ArrayMap;
 import android.util.Slog;
 import android.view.ContentRecordingSession;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.DumpUtils;
 import com.android.server.LocalServices;
@@ -59,6 +67,7 @@
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
+import java.time.Duration;
 import java.util.Map;
 
 /**
@@ -74,14 +83,29 @@
     private static final boolean REQUIRE_FG_SERVICE_FOR_PROJECTION = true;
     private static final String TAG = "MediaProjectionManagerService";
 
+    /**
+     * Determines how to respond to an app re-using a consent token; either failing or allowing the
+     * user to re-grant consent.
+     *
+     * <p>Enabled after version 33 (Android T), so applies to target SDK of 34+ (Android U+).
+     * @hide
+     */
+    @VisibleForTesting
+    @ChangeId
+    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+    static final long MEDIA_PROJECTION_PREVENTS_REUSING_CONSENT = 266201607L; // buganizer id
+
     private final Object mLock = new Object(); // Protects the list of media projections
     private final Map<IBinder, IBinder.DeathRecipient> mDeathEaters;
     private final CallbackDelegate mCallbackDelegate;
 
     private final Context mContext;
+    private final Injector mInjector;
+    private final Clock mClock;
     private final AppOpsManager mAppOps;
     private final ActivityManagerInternal mActivityManagerInternal;
     private final PackageManager mPackageManager;
+    private final WindowManagerInternal mWmInternal;
 
     private final MediaRouter mMediaRouter;
     private final MediaRouterCallback mMediaRouterCallback;
@@ -91,18 +115,53 @@
     private MediaProjection mProjectionGrant;
 
     public MediaProjectionManagerService(Context context) {
+        this(context, new Injector());
+    }
+
+    @VisibleForTesting MediaProjectionManagerService(Context context, Injector injector) {
         super(context);
         mContext = context;
+        mInjector = injector;
+        mClock = injector.createClock();
         mDeathEaters = new ArrayMap<IBinder, IBinder.DeathRecipient>();
         mCallbackDelegate = new CallbackDelegate();
         mAppOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
         mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
         mPackageManager = mContext.getPackageManager();
+        mWmInternal = LocalServices.getService(WindowManagerInternal.class);
         mMediaRouter = (MediaRouter) mContext.getSystemService(Context.MEDIA_ROUTER_SERVICE);
         mMediaRouterCallback = new MediaRouterCallback();
         Watchdog.getInstance().addMonitor(this);
     }
 
+    /** Functional interface for providing time. */
+    @VisibleForTesting
+    interface Clock {
+        /**
+         * Returns current time in milliseconds since boot, not counting time spent in deep sleep.
+         */
+        long uptimeMillis();
+    }
+
+    @VisibleForTesting
+    static class Injector {
+
+        /**
+         * Returns whether we should prevent the calling app from re-using the user's consent, or
+         * allow the user to re-grant access to the same consent token.
+         */
+        boolean shouldMediaProjectionPreventReusingConsent(MediaProjection projection) {
+            // TODO(b/269273190): query feature flag directly instead of injecting.
+            return CompatChanges.isChangeEnabled(MEDIA_PROJECTION_PREVENTS_REUSING_CONSENT,
+                    projection.packageName, UserHandle.getUserHandleForUid(projection.uid));
+        }
+
+        Clock createClock() {
+            return SystemClock::uptimeMillis;
+        }
+    }
+
+
     @Override
     public void onStart() {
         publishBinderService(Context.MEDIA_PROJECTION_SERVICE, new BinderService(),
@@ -231,7 +290,31 @@
         mCallbackDelegate.dispatchStop(projection);
     }
 
-    private boolean isCurrentProjection(IBinder token) {
+    /**
+     * Returns {@code true} when updating the current mirroring session on WM succeeded, and
+     * {@code false} otherwise.
+     */
+    @VisibleForTesting
+    boolean setContentRecordingSession(@Nullable ContentRecordingSession incomingSession) {
+        synchronized (mLock) {
+            if (!mWmInternal.setContentRecordingSession(
+                    incomingSession)) {
+                // Unable to start mirroring, so tear down this projection.
+                if (mProjectionGrant != null) {
+                    mProjectionGrant.stop();
+                }
+                return false;
+            }
+            return true;
+        }
+    }
+
+    /**
+     * Returns {@code true} when the given token matches the token of the current projection
+     * instance. Returns {@code false} otherwise.
+     */
+    @VisibleForTesting
+    boolean isCurrentProjection(IBinder token) {
         synchronized (mLock) {
             if (mProjectionToken != null) {
                 return mProjectionToken.equals(token);
@@ -240,7 +323,52 @@
         }
     }
 
-    private MediaProjectionInfo getActiveProjectionInfo() {
+
+    /**
+     * Reshows the permisison dialog for the user to review consent they've already granted in
+     * the given projection instance.
+     *
+     * <p>Preconditions:
+     * <ul>
+     *   <li>{@link IMediaProjection#isValid} returned false, rather than throwing an exception</li>
+     *   <li>Given projection instance is the current projection instance.</li>
+     * <ul>
+     *
+     * <p>Returns immediately but waits to start recording until user has reviewed their consent.
+     */
+    @VisibleForTesting
+    void requestConsentForInvalidProjection(IMediaProjection projection) {
+        synchronized (mLock) {
+            Slog.v(TAG, "Reusing token: Reshow dialog for due to invalid projection.");
+            // TODO(b/274790702): Trigger the permission dialog again in SysUI.
+        }
+    }
+
+    // TODO(b/261563516): Remove internal method and test aidl directly, here and elsewhere.
+    @VisibleForTesting
+    MediaProjection createProjectionInternal(int uid, String packageName, int type,
+            boolean isPermanentGrant, UserHandle callingUser,
+            boolean packageAttemptedReusingGrantedConsent) {
+        MediaProjection projection;
+        ApplicationInfo ai;
+        try {
+            ai = mPackageManager.getApplicationInfoAsUser(packageName, ApplicationInfoFlags.of(0),
+                    callingUser);
+        } catch (NameNotFoundException e) {
+            throw new IllegalArgumentException("No package matching :" + packageName);
+        }
+
+        projection = new MediaProjection(type, uid, packageName, ai.targetSdkVersion,
+                ai.isPrivilegedApp());
+        if (isPermanentGrant) {
+            mAppOps.setMode(AppOpsManager.OP_PROJECT_MEDIA,
+                    projection.uid, projection.packageName, AppOpsManager.MODE_ALLOWED);
+        }
+        return projection;
+    }
+
+    @VisibleForTesting
+    MediaProjectionInfo getActiveProjectionInfo() {
         synchronized (mLock) {
             if (mProjectionGrant == null) {
                 return null;
@@ -282,7 +410,7 @@
         @Override // Binder call
         public IMediaProjection createProjection(int uid, String packageName, int type,
                 boolean isPermanentGrant) {
-            if (mContext.checkCallingPermission(Manifest.permission.MANAGE_MEDIA_PROJECTION)
+            if (mContext.checkCallingPermission(MANAGE_MEDIA_PROJECTION)
                         != PackageManager.PERMISSION_GRANTED) {
                 throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION in order to grant "
                         + "projection permission");
@@ -290,22 +418,12 @@
             if (packageName == null || packageName.isEmpty()) {
                 throw new IllegalArgumentException("package name must not be empty");
             }
-            final ApplicationInfo ai;
-            try {
-                ai = mPackageManager.getApplicationInfo(packageName, 0);
-            } catch (NameNotFoundException e) {
-                throw new IllegalArgumentException("No package matching :" + packageName);
-            }
-
             MediaProjection projection;
+            final UserHandle callingUser = Binder.getCallingUserHandle();
             final long callingToken = Binder.clearCallingIdentity();
             try {
-                projection = new MediaProjection(type, uid, packageName, ai.targetSdkVersion,
-                        ai.isPrivilegedApp());
-                if (isPermanentGrant) {
-                    mAppOps.setMode(AppOpsManager.OP_PROJECT_MEDIA,
-                            projection.uid, projection.packageName, AppOpsManager.MODE_ALLOWED);
-                }
+                projection = createProjectionInternal(uid, packageName, type, isPermanentGrant,
+                        callingUser, false);
             } finally {
                 Binder.restoreCallingIdentity(callingToken);
             }
@@ -314,16 +432,21 @@
 
         @Override // Binder call
         public boolean isCurrentProjection(IMediaProjection projection) {
+            if (mContext.checkCallingOrSelfPermission(MANAGE_MEDIA_PROJECTION)
+                    != PackageManager.PERMISSION_GRANTED) {
+                throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION in order to check "
+                        + "if the given projection is current.");
+            }
             return MediaProjectionManagerService.this.isCurrentProjection(
                     projection == null ? null : projection.asBinder());
         }
 
         @Override // Binder call
         public MediaProjectionInfo getActiveProjectionInfo() {
-            if (mContext.checkCallingPermission(Manifest.permission.MANAGE_MEDIA_PROJECTION)
+            if (mContext.checkCallingPermission(MANAGE_MEDIA_PROJECTION)
                         != PackageManager.PERMISSION_GRANTED) {
-                throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION in order to add "
-                        + "projection callbacks");
+                throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION in order to get "
+                        + "active projection info");
             }
             final long token = Binder.clearCallingIdentity();
             try {
@@ -335,10 +458,10 @@
 
         @Override // Binder call
         public void stopActiveProjection() {
-            if (mContext.checkCallingOrSelfPermission(Manifest.permission.MANAGE_MEDIA_PROJECTION)
+            if (mContext.checkCallingOrSelfPermission(MANAGE_MEDIA_PROJECTION)
                     != PackageManager.PERMISSION_GRANTED) {
-                throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION in order to add "
-                        + "projection callbacks");
+                throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION in order to stop "
+                        + "the active projection");
             }
             final long token = Binder.clearCallingIdentity();
             try {
@@ -352,7 +475,7 @@
 
         @Override // Binder call
         public void notifyActiveProjectionCapturedContentResized(int width, int height) {
-            if (mContext.checkCallingOrSelfPermission(Manifest.permission.MANAGE_MEDIA_PROJECTION)
+            if (mContext.checkCallingOrSelfPermission(MANAGE_MEDIA_PROJECTION)
                     != PackageManager.PERMISSION_GRANTED) {
                 throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION in order to notify "
                         + "on captured content resize");
@@ -372,10 +495,10 @@
 
         @Override
         public void notifyActiveProjectionCapturedContentVisibilityChanged(boolean isVisible) {
-            if (mContext.checkCallingOrSelfPermission(Manifest.permission.MANAGE_MEDIA_PROJECTION)
+            if (mContext.checkCallingOrSelfPermission(MANAGE_MEDIA_PROJECTION)
                     != PackageManager.PERMISSION_GRANTED) {
                 throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION in order to notify "
-                        + "on captured content resize");
+                        + "on captured content visibility changed");
             }
             if (!isCurrentProjection(mProjectionGrant)) {
                 return;
@@ -392,7 +515,7 @@
 
         @Override //Binder call
         public void addCallback(final IMediaProjectionWatcherCallback callback) {
-            if (mContext.checkCallingPermission(Manifest.permission.MANAGE_MEDIA_PROJECTION)
+            if (mContext.checkCallingPermission(MANAGE_MEDIA_PROJECTION)
                         != PackageManager.PERMISSION_GRANTED) {
                 throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION in order to add "
                         + "projection callbacks");
@@ -407,7 +530,7 @@
 
         @Override
         public void removeCallback(IMediaProjectionWatcherCallback callback) {
-            if (mContext.checkCallingPermission(Manifest.permission.MANAGE_MEDIA_PROJECTION)
+            if (mContext.checkCallingPermission(MANAGE_MEDIA_PROJECTION)
                         != PackageManager.PERMISSION_GRANTED) {
                 throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION in order to remove "
                         + "projection callbacks");
@@ -420,33 +543,49 @@
             }
         }
 
-        /**
-         * Updates the current content mirroring session.
-         */
         @Override
-        public void setContentRecordingSession(@Nullable ContentRecordingSession incomingSession,
+        public boolean setContentRecordingSession(@Nullable ContentRecordingSession incomingSession,
                 @NonNull IMediaProjection projection) {
+            if (mContext.checkCallingOrSelfPermission(Manifest.permission.MANAGE_MEDIA_PROJECTION)
+                    != PackageManager.PERMISSION_GRANTED) {
+                throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION to set session "
+                        + "details.");
+            }
+            if (!isCurrentProjection(projection)) {
+                throw new SecurityException("Unable to set ContentRecordingSession on "
+                        + "non-current MediaProjection");
+            }
             final long origId = Binder.clearCallingIdentity();
             try {
-                synchronized (mLock) {
-                    if (!isCurrentProjection(projection)) {
-                        throw new SecurityException("Unable to set ContentRecordingSession on "
-                                + "non-current MediaProjection");
-                    }
-                    if (!LocalServices.getService(
-                            WindowManagerInternal.class).setContentRecordingSession(
-                            incomingSession)) {
-                        // Unable to start mirroring, so tear down this projection.
-                        if (mProjectionGrant != null) {
-                            mProjectionGrant.stop();
-                        }
-                    }
-                }
+                return MediaProjectionManagerService.this.setContentRecordingSession(
+                        incomingSession);
             } finally {
                 Binder.restoreCallingIdentity(origId);
             }
         }
 
+        @Override
+        public void requestConsentForInvalidProjection(IMediaProjection projection) {
+            if (mContext.checkCallingOrSelfPermission(Manifest.permission.MANAGE_MEDIA_PROJECTION)
+                    != PackageManager.PERMISSION_GRANTED) {
+                throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION to check if the given"
+                        + "projection is valid.");
+            }
+            if (!isCurrentProjection(projection)) {
+                Slog.v(TAG, "Reusing token: Won't request consent again for a token that "
+                        + "isn't current");
+                return;
+            }
+
+            // Remove calling app identity before performing any privileged operations.
+            final long token = Binder.clearCallingIdentity();
+            try {
+                MediaProjectionManagerService.this.requestConsentForInvalidProjection(projection);
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+
         @Override // Binder call
         public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) {
             if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
@@ -465,7 +604,14 @@
         }
     }
 
-    private final class MediaProjection extends IMediaProjection.Stub {
+    @VisibleForTesting
+    final class MediaProjection extends IMediaProjection.Stub {
+        // Host app has 5 minutes to begin using the token before it is invalid.
+        // Some apps show a dialog for the user to interact with (selecting recording resolution)
+        // before starting capture, but after requesting consent.
+        final long mDefaultTimeoutMs = Duration.ofMinutes(5).toMillis();
+        // The creation timestamp in milliseconds, measured by {@link SystemClock#uptimeMillis}.
+        private final long mCreateTimeMs;
         public final int uid;
         public final String packageName;
         public final UserHandle userHandle;
@@ -479,6 +625,15 @@
         private boolean mRestoreSystemAlertWindow;
         private IBinder mLaunchCookie = null;
 
+        // Values for tracking token validity.
+        // Timeout value to compare creation time against.
+        private long mTimeoutMs = mDefaultTimeoutMs;
+        // Count of number of times IMediaProjection#start is invoked.
+        private int mCountStarts = 0;
+        // Set if MediaProjection#createVirtualDisplay has been invoked previously (it
+        // should only be called once).
+        private int mVirtualDisplayId = INVALID_DISPLAY;
+
         MediaProjection(int type, int uid, String packageName, int targetSdkVersion,
                 boolean isPrivileged) {
             mType = type;
@@ -487,6 +642,7 @@
             userHandle = new UserHandle(UserHandle.getUserId(uid));
             mTargetSdkVersion = targetSdkVersion;
             mIsPrivileged = isPrivileged;
+            mCreateTimeMs = mClock.uptimeMillis();
             // TODO(b/267740338): Add unit test.
             mActivityManagerInternal.notifyMediaProjectionEvent(uid, asBinder(),
                     MEDIA_PROJECTION_TOKEN_EVENT_CREATED);
@@ -512,6 +668,11 @@
 
         @Override // Binder call
         public int applyVirtualDisplayFlags(int flags) {
+            if (mContext.checkCallingOrSelfPermission(MANAGE_MEDIA_PROJECTION)
+                    != PackageManager.PERMISSION_GRANTED) {
+                throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION to apply virtual "
+                        + "display flags.");
+            }
             if (mType == MediaProjectionManager.TYPE_SCREEN_CAPTURE) {
                 flags &= ~DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY;
                 flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR
@@ -543,6 +704,9 @@
                 if (isCurrentProjection(asBinder())) {
                     Slog.w(TAG, "UID " + Binder.getCallingUid()
                             + " attempted to start already started MediaProjection");
+                    // It is possible the app didn't explicitly invoke stop before trying to start
+                    // again; ensure this start is counted in case they are re-using this token.
+                    mCountStarts++;
                     return;
                 }
 
@@ -601,6 +765,8 @@
                     }
                 }
                 startProjectionLocked(this);
+                // Mark this token as used when the app gets the MediaProjection instance.
+                mCountStarts++;
             }
         }
 
@@ -660,14 +826,69 @@
 
         @Override // Binder call
         public void setLaunchCookie(IBinder launchCookie) {
+            if (mContext.checkCallingOrSelfPermission(MANAGE_MEDIA_PROJECTION)
+                    != PackageManager.PERMISSION_GRANTED) {
+                throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION to set launch "
+                        + "cookie.");
+            }
             mLaunchCookie = launchCookie;
         }
 
         @Override // Binder call
         public IBinder getLaunchCookie() {
+            if (mContext.checkCallingOrSelfPermission(MANAGE_MEDIA_PROJECTION)
+                    != PackageManager.PERMISSION_GRANTED) {
+                throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION to get launch "
+                        + "cookie.");
+            }
             return mLaunchCookie;
         }
 
+        @Override
+        public boolean isValid() {
+            if (mContext.checkCallingOrSelfPermission(Manifest.permission.MANAGE_MEDIA_PROJECTION)
+                    != PackageManager.PERMISSION_GRANTED) {
+                throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION to check if this"
+                        + "projection is valid.");
+            }
+            synchronized (mLock) {
+                final long curMs = mClock.uptimeMillis();
+                final boolean hasTimedOut = curMs - mCreateTimeMs > mTimeoutMs;
+                final boolean virtualDisplayCreated = mVirtualDisplayId != INVALID_DISPLAY;
+                final boolean isValid =
+                        !hasTimedOut && (mCountStarts <= 1) && !virtualDisplayCreated;
+                if (isValid) {
+                    return true;
+                }
+
+                // Can safely use mProjectionGrant since we know this is the current projection.
+                if (mInjector.shouldMediaProjectionPreventReusingConsent(mProjectionGrant)) {
+                    Slog.v(TAG, "Reusing token: Throw exception due to invalid projection.");
+                    // Tear down projection here; necessary to ensure (among other reasons) that
+                    // stop is dispatched to client and cast icon disappears from status bar.
+                    mProjectionGrant.stop();
+                    throw new IllegalStateException("Don't re-use the resultData to retrieve "
+                            + "the same projection instance, and don't use a token that has "
+                            + "timed out. Don't take multiple captures by invoking "
+                            + "MediaProjection#createVirtualDisplay multiple times on the "
+                            + "same instance.");
+                }
+                return false;
+            }
+        }
+
+        @Override
+        public void notifyVirtualDisplayCreated(int displayId) {
+            if (mContext.checkCallingOrSelfPermission(Manifest.permission.MANAGE_MEDIA_PROJECTION)
+                    != PackageManager.PERMISSION_GRANTED) {
+                throw new SecurityException("Requires MANAGE_MEDIA_PROJECTION to notify virtual "
+                        + "display created.");
+            }
+            synchronized (mLock) {
+                mVirtualDisplayId = displayId;
+            }
+        }
+
         public MediaProjectionInfo getProjectionInfo() {
             return new MediaProjectionInfo(packageName, userHandle);
         }
@@ -783,7 +1004,7 @@
                 return;
             }
             synchronized (mLock) {
-                // TODO(b/249827847) Currently the service assumes there is only one projection
+                // TODO(b/249827847): Currently the service assumes there is only one projection
                 //  at once - need to find the callback for the given projection, when there are
                 //  multiple sessions.
                 for (IMediaProjectionCallback callback : mClientCallbacks.values()) {
@@ -811,7 +1032,7 @@
                 return;
             }
             synchronized (mLock) {
-                // TODO(b/249827847) Currently the service assumes there is only one projection
+                // TODO(b/249827847): Currently the service assumes there is only one projection
                 //  at once - need to find the callback for the given projection, when there are
                 //  multiple sessions.
                 for (IMediaProjectionCallback callback : mClientCallbacks.values()) {
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 92be094..a3d89e7 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -153,6 +153,7 @@
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
+import android.app.UidObserver;
 import android.app.usage.NetworkStats;
 import android.app.usage.NetworkStatsManager;
 import android.app.usage.UsageStatsManagerInternal;
@@ -1117,7 +1118,7 @@
         }
     }
 
-    final private IUidObserver mUidObserver = new IUidObserver.Stub() {
+    final private IUidObserver mUidObserver = new UidObserver() {
         @Override public void onUidStateChanged(int uid, int procState, long procStateSeq,
                 @ProcessCapability int capability) {
             synchronized (mUidStateCallbackInfos) {
@@ -1139,18 +1140,6 @@
         @Override public void onUidGone(int uid, boolean disabled) {
             mUidEventHandler.obtainMessage(UID_MSG_GONE, uid, 0).sendToTarget();
         }
-
-        @Override public void onUidActive(int uid) {
-        }
-
-        @Override public void onUidIdle(int uid, boolean disabled) {
-        }
-
-        @Override public void onUidCachedChanged(int uid, boolean cached) {
-        }
-
-        @Override public void onUidProcAdjChanged(int uid) {
-        }
     };
 
     private static final class UidStateCallbackInfo {
@@ -5550,7 +5539,8 @@
             // Do this without the lock held. handleUidChanged() and handleUidGone() are
             // called from the handler, so there's no multi-threading issue.
             if (updated) {
-                updateNetworkStats(uid, isProcStateAllowedWhileOnRestrictBackground(procState));
+                updateNetworkStats(uid,
+                        isProcStateAllowedWhileOnRestrictBackground(procState, capability));
             }
         } finally {
             Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
diff --git a/services/core/java/com/android/server/notification/BubbleExtractor.java b/services/core/java/com/android/server/notification/BubbleExtractor.java
index a561390..b8900d7 100644
--- a/services/core/java/com/android/server/notification/BubbleExtractor.java
+++ b/services/core/java/com/android/server/notification/BubbleExtractor.java
@@ -16,7 +16,6 @@
 package com.android.server.notification;
 
 import static android.app.Notification.FLAG_BUBBLE;
-import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
 import static android.app.NotificationChannel.ALLOW_BUBBLE_OFF;
 import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
 import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE;
@@ -81,7 +80,7 @@
                 && !mActivityManager.isLowRamDevice()
                 && record.isConversation()
                 && record.getShortcutInfo() != null
-                && (record.getNotification().flags & FLAG_FOREGROUND_SERVICE) == 0;
+                && !record.getNotification().isFgsOrUij();
 
         boolean userEnabledBubbles = mConfig.bubblesEnabled(record.getUser());
         int appPreference =
@@ -182,7 +181,7 @@
 
     /**
      * Whether an intent is properly configured to display in an {@link
-     * com.android.wm.shell.TaskView} for bubbling.
+     * TaskView} for bubbling.
      *
      * @param context       the context to use.
      * @param pendingIntent the pending intent of the bubble.
diff --git a/services/core/java/com/android/server/notification/NotificationComparator.java b/services/core/java/com/android/server/notification/NotificationComparator.java
index 6f0903c..446c4f7 100644
--- a/services/core/java/com/android/server/notification/NotificationComparator.java
+++ b/services/core/java/com/android/server/notification/NotificationComparator.java
@@ -165,7 +165,7 @@
         if (isCallStyle(record)) {
             return true;
         }
-        if (!isOngoing(record)) {
+        if (!record.getNotification().isFgsOrUij()) {
             return false;
         }
         return isCallCategory(record) || isMediaNotification(record);
@@ -199,11 +199,6 @@
         return false;
     }
 
-    private boolean isOngoing(NotificationRecord record) {
-        final int ongoingFlags = Notification.FLAG_FOREGROUND_SERVICE;
-        return (record.getNotification().flags & ongoingFlags) != 0;
-    }
-
     private boolean isMediaNotification(NotificationRecord record) {
         return record.getNotification().isMediaNotification();
     }
diff --git a/services/core/java/com/android/server/notification/NotificationManagerInternal.java b/services/core/java/com/android/server/notification/NotificationManagerInternal.java
index bc38856..919fc71 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerInternal.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerInternal.java
@@ -35,6 +35,8 @@
 
     void removeForegroundServiceFlagFromNotification(String pkg, int notificationId, int userId);
 
+    void removeUserInitiatedJobFlagFromNotification(String pkg, int notificationId, int userId);
+
     void onConversationRemoved(String pkg, int uid, Set<String> shortcuts);
 
     /** Get the number of notification channels for a given package */
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 65dcec7..6d27fe0 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -21,6 +21,7 @@
 import static android.app.AppOpsManager.MODE_ALLOWED;
 import static android.app.Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION;
 import static android.app.Notification.FLAG_AUTOGROUP_SUMMARY;
+import static android.app.Notification.FLAG_AUTO_CANCEL;
 import static android.app.Notification.FLAG_BUBBLE;
 import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
 import static android.app.Notification.FLAG_FSI_REQUESTED_BUT_DENIED;
@@ -29,6 +30,7 @@
 import static android.app.Notification.FLAG_NO_DISMISS;
 import static android.app.Notification.FLAG_ONGOING_EVENT;
 import static android.app.Notification.FLAG_ONLY_ALERT_ONCE;
+import static android.app.Notification.FLAG_USER_INITIATED_JOB;
 import static android.app.NotificationChannel.CONVERSATION_CHANNEL_ID_FORMAT;
 import static android.app.NotificationManager.ACTION_APP_BLOCK_STATE_CHANGED;
 import static android.app.NotificationManager.ACTION_AUTOMATIC_ZEN_RULE_STATUS_CHANGED;
@@ -163,6 +165,7 @@
 import android.app.NotificationManager.Policy;
 import android.app.PendingIntent;
 import android.app.RemoteServiceException.BadForegroundServiceNotificationException;
+import android.app.RemoteServiceException.BadUserInitiatedJobNotificationException;
 import android.app.StatsManager;
 import android.app.StatusBarManager;
 import android.app.UriGrantsManager;
@@ -304,6 +307,7 @@
 import com.android.server.LocalServices;
 import com.android.server.SystemService;
 import com.android.server.UiThread;
+import com.android.server.job.JobSchedulerInternal;
 import com.android.server.lights.LightsManager;
 import com.android.server.lights.LogicalLight;
 import com.android.server.notification.ManagedServices.ManagedServiceInfo;
@@ -656,7 +660,6 @@
     private ConditionProviders mConditionProviders;
     private NotificationUsageStats mUsageStats;
     private boolean mLockScreenAllowSecureNotifications = true;
-    boolean mAllowFgsDismissal = false;
     boolean mSystemExemptFromDismissal = false;
 
     private static final int MY_UID = Process.myUid();
@@ -1157,8 +1160,8 @@
                 StatusBarNotification sbn = r.getSbn();
                 cancelNotification(callingUid, callingPid, sbn.getPackageName(), sbn.getTag(),
                         sbn.getId(), Notification.FLAG_AUTO_CANCEL,
-                        FLAG_FOREGROUND_SERVICE | FLAG_BUBBLE, false, r.getUserId(),
-                        REASON_CLICK, nv.rank, nv.count, null);
+                        FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB | FLAG_BUBBLE,
+                        false, r.getUserId(), REASON_CLICK, nv.rank, nv.count, null);
                 nv.recycle();
                 reportUserInteraction(r);
                 mAssistants.notifyAssistantNotificationClicked(r);
@@ -1266,21 +1269,26 @@
         public void onNotificationError(int callingUid, int callingPid, String pkg, String tag,
                 int id, int uid, int initialPid, String message, int userId) {
             final boolean fgService;
+            final boolean uiJob;
             synchronized (mNotificationLock) {
                 NotificationRecord r = findNotificationLocked(pkg, tag, id, userId);
                 fgService = r != null && (r.getNotification().flags & FLAG_FOREGROUND_SERVICE) != 0;
+                uiJob = r != null && (r.getNotification().flags & FLAG_USER_INITIATED_JOB) != 0;
             }
             cancelNotification(callingUid, callingPid, pkg, tag, id, 0, 0, false, userId,
                     REASON_ERROR, null);
-            if (fgService) {
-                // Still crash for foreground services, preventing the not-crash behaviour abused
-                // by apps to give us a garbage notification and silently start a fg service.
+            if (fgService || uiJob) {
+                // Still crash for foreground services or user-initiated jobs, preventing the
+                // not-crash behaviour abused by apps to give us a garbage notification and
+                // silently start a fg service or user-initiated job.
+                final int exceptionTypeId = fgService
+                        ? BadForegroundServiceNotificationException.TYPE_ID
+                        : BadUserInitiatedJobNotificationException.TYPE_ID;
                 Binder.withCleanCallingIdentity(
                         () -> mAm.crashApplicationWithType(uid, initialPid, pkg, -1,
                             "Bad notification(tag=" + tag + ", id=" + id + ") posted from package "
                                 + pkg + ", crashing app(uid=" + uid + ", pid=" + initialPid + "): "
-                                + message, true /* force */,
-                                BadForegroundServiceNotificationException.TYPE_ID));
+                                + message, true /* force */, exceptionTypeId));
             }
         }
 
@@ -1690,8 +1698,8 @@
                     cancelNotification(record.getSbn().getUid(), record.getSbn().getInitialPid(),
                             record.getSbn().getPackageName(), record.getSbn().getTag(),
                             record.getSbn().getId(), 0,
-                            FLAG_FOREGROUND_SERVICE, true, record.getUserId(),
-                            REASON_TIMEOUT, null);
+                            FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB,
+                            true, record.getUserId(), REASON_TIMEOUT, null);
                 }
             }
         }
@@ -2581,19 +2589,9 @@
             for (String name : properties.getKeyset()) {
                 if (SystemUiDeviceConfigFlags.NAS_DEFAULT_SERVICE.equals(name)) {
                     mAssistants.resetDefaultAssistantsIfNecessary();
-                } else if (SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED.equals(name)) {
-                    String value = properties.getString(name, null);
-                    if ("true".equals(value)) {
-                        mAllowFgsDismissal = true;
-                    } else if ("false".equals(value)) {
-                        mAllowFgsDismissal = false;
-                    }
                 }
             }
         };
-        mAllowFgsDismissal = DeviceConfig.getBoolean(
-                DeviceConfig.NAMESPACE_SYSTEMUI,
-                SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED, true);
         mSystemExemptFromDismissal = DeviceConfig.getBoolean(
                 DeviceConfig.NAMESPACE_DEVICE_POLICY_MANAGER,
                 /* name= */ "application_exemptions",
@@ -3307,8 +3305,8 @@
                 @Nullable ITransientNotification callback, int duration, boolean isUiContext,
                 int displayId, @Nullable ITransientNotificationCallback textCallback) {
             if (DBG) {
-                Slog.i(TAG, "enqueueToast pkg=" + pkg + " token=" + token
-                        + " duration=" + duration + " displayId=" + displayId);
+                Slog.i(TAG, "enqueueToast pkg=" + pkg + " token=" + token + " duration=" + duration
+                        + " isUiContext=" + isUiContext + " displayId=" + displayId);
             }
 
             if (pkg == null || (text == null && callback == null)
@@ -3319,15 +3317,6 @@
             }
 
             final int callingUid = Binder.getCallingUid();
-            checkCallerIsSameApp(pkg);
-            final boolean isSystemToast = isCallerSystemOrPhone()
-                    || PackageManagerService.PLATFORM_PACKAGE_NAME.equals(pkg);
-            boolean isAppRenderedToast = (callback != null);
-            if (!checkCanEnqueueToast(pkg, callingUid, displayId, isAppRenderedToast,
-                    isSystemToast)) {
-                return;
-            }
-
             if (!isUiContext && displayId == Display.DEFAULT_DISPLAY
                     && mUm.isVisibleBackgroundUsersSupported()) {
                 // When the caller is a visible background user using a non-UI context (like the
@@ -3344,6 +3333,15 @@
                 }
             }
 
+            checkCallerIsSameApp(pkg);
+            final boolean isSystemToast = isCallerSystemOrPhone()
+                    || PackageManagerService.PLATFORM_PACKAGE_NAME.equals(pkg);
+            boolean isAppRenderedToast = (callback != null);
+            if (!checkCanEnqueueToast(pkg, callingUid, displayId, isAppRenderedToast,
+                    isSystemToast)) {
+                return;
+            }
+
             synchronized (mToastQueue) {
                 int callingPid = Binder.getCallingPid();
                 final long callingId = Binder.clearCallingIdentity();
@@ -3530,10 +3528,10 @@
             userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
                     Binder.getCallingUid(), userId, true, false, "cancelAllNotifications", pkg);
 
-            // Don't allow the app to cancel active FGS notifications
+            // Don't allow the app to cancel active FGS or UIJ notifications
             cancelAllNotificationsInt(Binder.getCallingUid(), Binder.getCallingPid(),
-                    pkg, null, 0, FLAG_FOREGROUND_SERVICE, true, userId,
-                    REASON_APP_CANCEL_ALL, null);
+                    pkg, null, 0, FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB,
+                    true, userId, REASON_APP_CANCEL_ALL, null);
         }
 
         @Override
@@ -3975,6 +3973,21 @@
             }
         }
 
+        // Throws a security exception if the given channel has a notification associated
+        // with an active user-initiated job.
+        private void enforceDeletingChannelHasNoUserInitiatedJob(String pkg, int userId,
+                String channelId) {
+            final JobSchedulerInternal js = LocalServices.getService(JobSchedulerInternal.class);
+            if (js != null && js.isNotificationChannelAssociatedWithAnyUserInitiatedJobs(
+                    channelId, userId, pkg)) {
+                Slog.w(TAG, "Package u" + userId + "/" + pkg
+                        + " may not delete notification channel '"
+                        + channelId + "' with user-initiated job");
+                throw new SecurityException("Not allowed to delete channel " + channelId
+                        + " with a user-initiated job");
+            }
+        }
+
         @Override
         public void deleteNotificationChannel(String pkg, String channelId) {
             checkCallerIsSystemOrSameApp(pkg);
@@ -3984,6 +3997,7 @@
                 throw new IllegalArgumentException("Cannot delete default channel");
             }
             enforceDeletingChannelHasNoFgService(pkg, callingUser, channelId);
+            enforceDeletingChannelHasNoUserInitiatedJob(pkg, callingUser, channelId);
             cancelAllNotificationsInt(MY_UID, MY_PID, pkg, channelId, 0, 0, true,
                     callingUser, REASON_CHANNEL_REMOVED, null);
             boolean previouslyExisted = mPreferencesHelper.deleteNotificationChannel(
@@ -4028,8 +4042,9 @@
                 final int userId = UserHandle.getUserId(callingUid);
                 List<NotificationChannel> groupChannels = groupToDelete.getChannels();
                 for (int i = 0; i < groupChannels.size(); i++) {
-                    enforceDeletingChannelHasNoFgService(pkg, userId,
-                            groupChannels.get(i).getId());
+                    final String channelId = groupChannels.get(i).getId();
+                    enforceDeletingChannelHasNoFgService(pkg, userId, channelId);
+                    enforceDeletingChannelHasNoUserInitiatedJob(pkg, userId, channelId);
                 }
                 List<NotificationChannel> deletedChannels =
                         mPreferencesHelper.deleteNotificationChannelGroup(pkg, callingUid, groupId);
@@ -6371,61 +6386,73 @@
             checkCallerIsSystem();
             mHandler.post(() -> {
                 synchronized (mNotificationLock) {
-                    int count = getNotificationCount(pkg, userId);
-                    boolean removeFgsNotification = false;
-                    if (count > MAX_PACKAGE_NOTIFICATIONS) {
-                        mUsageStats.registerOverCountQuota(pkg);
-                        removeFgsNotification = true;
-                    }
-                    if (removeFgsNotification) {
-                        NotificationRecord r = findNotificationLocked(pkg, null, notificationId,
-                                userId);
-                        if (r != null) {
-                            if (DBG) {
-                                Slog.d(TAG, "Remove FGS flag not allow. Cancel FGS notification");
-                            }
-                            removeFromNotificationListsLocked(r);
-                            cancelNotificationLocked(r, false, REASON_APP_CANCEL, true,
-                                    null, SystemClock.elapsedRealtime());
-                        }
-                    } else {
-                        // strip flag from all enqueued notifications. listeners will be informed
-                        // in post runnable.
-                        List<NotificationRecord> enqueued = findNotificationsByListLocked(
-                                mEnqueuedNotifications, pkg, null, notificationId, userId);
-                        for (int i = 0; i < enqueued.size(); i++) {
-                            removeForegroundServiceFlagLocked(enqueued.get(i));
-                        }
-
-                        // if posted notification exists, strip its flag and tell listeners
-                        NotificationRecord r = findNotificationByListLocked(
-                                mNotificationList, pkg, null, notificationId, userId);
-                        if (r != null) {
-                            removeForegroundServiceFlagLocked(r);
-                            mRankingHelper.sort(mNotificationList);
-                            mListeners.notifyPostedLocked(r, r);
-                        }
-                    }
+                    removeFlagFromNotificationLocked(pkg, notificationId, userId,
+                            FLAG_FOREGROUND_SERVICE);
                 }
             });
         }
 
         @Override
-        public void onConversationRemoved(String pkg, int uid, Set<String> shortcuts) {
-            onConversationRemovedInternal(pkg, uid, shortcuts);
+        public void removeUserInitiatedJobFlagFromNotification(String pkg, int notificationId,
+                int userId) {
+            checkCallerIsSystem();
+            mHandler.post(() -> {
+                synchronized (mNotificationLock) {
+                    removeFlagFromNotificationLocked(pkg, notificationId, userId,
+                            FLAG_USER_INITIATED_JOB);
+                }
+            });
         }
 
         @GuardedBy("mNotificationLock")
-        private void removeForegroundServiceFlagLocked(NotificationRecord r) {
-            if (r == null) {
-                return;
+        private void removeFlagFromNotificationLocked(String pkg, int notificationId, int userId,
+                int flag) {
+            int count = getNotificationCount(pkg, userId);
+            boolean removeFlagFromNotification = false;
+            if (count > MAX_PACKAGE_NOTIFICATIONS) {
+                mUsageStats.registerOverCountQuota(pkg);
+                removeFlagFromNotification = true;
             }
-            StatusBarNotification sbn = r.getSbn();
-            // NoMan adds flags FLAG_ONGOING_EVENT when it sees
-            // FLAG_FOREGROUND_SERVICE. Hence it's not enough to remove
-            // FLAG_FOREGROUND_SERVICE, we have to revert to the flags we received
-            // initially *and* force remove FLAG_FOREGROUND_SERVICE.
-            sbn.getNotification().flags = (r.mOriginalFlags & ~FLAG_FOREGROUND_SERVICE);
+            if (removeFlagFromNotification) {
+                NotificationRecord r = findNotificationLocked(pkg, null, notificationId, userId);
+                if (r != null) {
+                    if (DBG) {
+                        final String type = (flag ==  FLAG_FOREGROUND_SERVICE) ? "FGS" : "UIJ";
+                        Slog.d(TAG, "Remove " + type + " flag not allow. "
+                                + "Cancel " + type + " notification");
+                    }
+                    removeFromNotificationListsLocked(r);
+                    cancelNotificationLocked(r, false, REASON_APP_CANCEL, true,
+                            null, SystemClock.elapsedRealtime());
+                }
+            } else {
+                List<NotificationRecord> enqueued = findNotificationsByListLocked(
+                        mEnqueuedNotifications, pkg, null, notificationId, userId);
+                for (int i = 0; i < enqueued.size(); i++) {
+                    final NotificationRecord r = enqueued.get(i);
+                    if (r != null) {
+                        // strip flag from all enqueued notifications. listeners will be informed
+                        // in post runnable.
+                        StatusBarNotification sbn = r.getSbn();
+                        sbn.getNotification().flags = (r.mOriginalFlags & ~flag);
+                    }
+                }
+
+                NotificationRecord r = findNotificationByListLocked(
+                        mNotificationList, pkg, null, notificationId, userId);
+                if (r != null) {
+                    // if posted notification exists, strip its flag and tell listeners
+                    StatusBarNotification sbn = r.getSbn();
+                    sbn.getNotification().flags = (r.mOriginalFlags & ~flag);
+                    mRankingHelper.sort(mNotificationList);
+                    mListeners.notifyPostedLocked(r, r);
+                }
+            }
+        }
+
+        @Override
+        public void onConversationRemoved(String pkg, int uid, Set<String> shortcuts) {
+            onConversationRemovedInternal(pkg, uid, shortcuts);
         }
 
         @Override
@@ -6501,10 +6528,10 @@
             }
         }
 
-        // Don't allow client applications to cancel foreground service notifs or autobundled
-        // summaries.
+        // Don't allow client applications to cancel foreground service notifs, user-initiated job
+        // notifs or autobundled summaries.
         final int mustNotHaveFlags = isCallingUidSystem() ? 0 :
-                (FLAG_FOREGROUND_SERVICE | FLAG_AUTOGROUP_SUMMARY);
+                (FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB | FLAG_AUTOGROUP_SUMMARY);
         cancelNotification(uid, callingPid, pkg, tag, id, 0,
                 mustNotHaveFlags, false, userId, REASON_APP_CANCEL, null);
     }
@@ -6558,9 +6585,16 @@
         final ServiceNotificationPolicy policy = mAmi.applyForegroundServiceNotification(
                 notification, tag, id, pkg, userId);
 
+        boolean stripUijFlag = true;
+        final JobSchedulerInternal js = LocalServices.getService(JobSchedulerInternal.class);
+        if (js != null) {
+            stripUijFlag = !js.isNotificationAssociatedWithAnyUserInitiatedJobs(id, userId, pkg);
+        }
+
         // Fix the notification as best we can.
         try {
-            fixNotification(notification, pkg, tag, id, userId, notificationUid, policy);
+            fixNotification(notification, pkg, tag, id, userId, notificationUid,
+                    policy, stripUijFlag);
         } catch (Exception e) {
             if (notification.isForegroundService()) {
                 throw new SecurityException("Invalid FGS notification", e);
@@ -6569,7 +6603,6 @@
             return;
         }
 
-
         if (policy == ServiceNotificationPolicy.UPDATE_ONLY) {
             // Proceed if the notification is already showing/known, otherwise ignore
             // because the service lifecycle logic has retained responsibility for its
@@ -6628,31 +6661,25 @@
         boolean isImportanceFixed = mPermissionHelper.isPermissionFixed(pkg, userId);
         r.setImportanceFixed(isImportanceFixed);
 
-        if ((notification.flags & Notification.FLAG_FOREGROUND_SERVICE) != 0) {
-            final boolean fgServiceShown = channel.isFgServiceShown();
+        if (notification.isFgsOrUij()) {
             if (((channel.getUserLockedFields() & NotificationChannel.USER_LOCKED_IMPORTANCE) == 0
-                        || !fgServiceShown)
+                        || !channel.isUserVisibleTaskShown())
                     && (r.getImportance() == IMPORTANCE_MIN
                             || r.getImportance() == IMPORTANCE_NONE)) {
-                // Increase the importance of foreground service notifications unless the user had
-                // an opinion otherwise (and the channel hasn't yet shown a fg service).
-                if (TextUtils.isEmpty(channelId)
-                        || NotificationChannel.DEFAULT_CHANNEL_ID.equals(channelId)) {
-                    r.setSystemImportance(IMPORTANCE_LOW);
-                } else {
-                    channel.setImportance(IMPORTANCE_LOW);
-                    r.setSystemImportance(IMPORTANCE_LOW);
-                    if (!fgServiceShown) {
-                        channel.unlockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
-                        channel.setFgServiceShown(true);
-                    }
-                    mPreferencesHelper.updateNotificationChannel(
-                            pkg, notificationUid, channel, false);
-                    r.updateNotificationChannel(channel);
+                // Increase the importance of fgs/uij notifications unless the user had
+                // an opinion otherwise (and the channel hasn't yet shown a fgs/uij).
+                channel.setImportance(IMPORTANCE_LOW);
+                r.setSystemImportance(IMPORTANCE_LOW);
+                if (!channel.isUserVisibleTaskShown()) {
+                    channel.unlockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
+                    channel.setUserVisibleTaskShown(true);
                 }
-            } else if (!fgServiceShown && !TextUtils.isEmpty(channelId)
+                mPreferencesHelper.updateNotificationChannel(
+                        pkg, notificationUid, channel, false);
+                r.updateNotificationChannel(channel);
+            } else if (!channel.isUserVisibleTaskShown() && !TextUtils.isEmpty(channelId)
                     && !NotificationChannel.DEFAULT_CHANNEL_ID.equals(channelId)) {
-                channel.setFgServiceShown(true);
+                channel.setUserVisibleTaskShown(true);
                 r.updateNotificationChannel(channel);
             }
         }
@@ -6730,8 +6757,11 @@
         handleSavePolicyFile();
     }
 
-    private void makeStickyHun(Notification notification) {
-        notification.flags |= FLAG_FSI_REQUESTED_BUT_DENIED;
+    private void makeStickyHun(Notification notification, String pkg, @UserIdInt int userId) {
+        if (mPermissionHelper.hasRequestedPermission(
+                Manifest.permission.USE_FULL_SCREEN_INTENT, pkg, userId)) {
+            notification.flags |= FLAG_FSI_REQUESTED_BUT_DENIED;
+        }
         if (notification.contentIntent == null) {
             // On notification click, if contentIntent is null, SystemUI launches the
             // fullScreenIntent instead.
@@ -6742,7 +6772,8 @@
 
     @VisibleForTesting
     protected void fixNotification(Notification notification, String pkg, String tag, int id,
-            @UserIdInt int userId, int notificationUid, ServiceNotificationPolicy fgsPolicy)
+            @UserIdInt int userId, int notificationUid,
+            ServiceNotificationPolicy fgsPolicy, boolean stripUijFlag)
             throws NameNotFoundException, RemoteException {
         final ApplicationInfo ai = mPackageManagerClient.getApplicationInfoAsUser(
                 pkg, PackageManager.MATCH_DEBUG_TRIAGED_MISSING,
@@ -6752,6 +6783,14 @@
         if (notification.isForegroundService() && fgsPolicy == NOT_FOREGROUND_SERVICE) {
             notification.flags &= ~FLAG_FOREGROUND_SERVICE;
         }
+        if (notification.isUserInitiatedJob() && stripUijFlag) {
+            notification.flags &= ~FLAG_USER_INITIATED_JOB;
+        }
+
+        // Remove FLAG_AUTO_CANCEL from notifications that are associated with a FGS or UIJ.
+        if (notification.isFgsOrUij()) {
+            notification.flags &= ~FLAG_AUTO_CANCEL;
+        }
 
         // Only notifications that can be non-dismissible can have the flag FLAG_NO_DISMISS
         if (mFlagResolver.isEnabled(ALLOW_DISMISS_ONGOING)) {
@@ -6795,10 +6834,9 @@
                     SystemUiSystemPropertiesFlags.NotificationFlags.SHOW_STICKY_HUN_FOR_DENIED_FSI);
 
             if (forceDemoteFsiToStickyHun) {
-                makeStickyHun(notification);
+                makeStickyHun(notification, pkg, userId);
 
             } else if (showStickyHunIfDenied) {
-
                 final AttributionSource source = new AttributionSource.Builder(notificationUid)
                         .setPackageName(pkg)
                         .build();
@@ -6807,7 +6845,7 @@
                         Manifest.permission.USE_FULL_SCREEN_INTENT, source, /* message= */ null);
 
                 if (permissionResult != PermissionManager.PERMISSION_GRANTED) {
-                    makeStickyHun(notification);
+                    makeStickyHun(notification, pkg, userId);
                 }
 
             } else {
@@ -7097,8 +7135,8 @@
                 }
             }
 
-            // limit the number of non-fgs outstanding notificationrecords an app can have
-            if (!n.isForegroundService()) {
+            // limit the number of non-fgs/uij outstanding notificationrecords an app can have
+            if (!n.isFgsOrUij()) {
                 int count = getNotificationCount(pkg, userId, id, tag);
                 if (count >= MAX_PACKAGE_NOTIFICATIONS) {
                     mUsageStats.registerOverCountQuota(pkg);
@@ -7458,7 +7496,8 @@
                                     return false;
                                 }
                             } else if (mReason == REASON_APP_CANCEL) {
-                                if ((flags & FLAG_FOREGROUND_SERVICE) != 0) {
+                                if ((flags & FLAG_FOREGROUND_SERVICE) != 0
+                                        || (flags & FLAG_USER_INITIATED_JOB) != 0) {
                                     return false;
                                 }
                             }
@@ -7736,9 +7775,6 @@
                     // flags are set.
                     if ((notification.flags & FLAG_FOREGROUND_SERVICE) != 0) {
                         notification.flags |= FLAG_NO_CLEAR;
-                        if (!mAllowFgsDismissal) {
-                            notification.flags |= FLAG_ONGOING_EVENT;
-                        }
                     }
 
                     mRankingHelper.extractSignals(r);
@@ -8014,7 +8050,7 @@
         }
 
         FlagChecker childrenFlagChecker = (flags) -> {
-            if ((flags & FLAG_FOREGROUND_SERVICE) != 0) {
+            if ((flags & FLAG_FOREGROUND_SERVICE) != 0 || (flags & FLAG_USER_INITIATED_JOB) != 0) {
                 return false;
             }
             return true;
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 1cfcb4e..c9a6c63 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -545,6 +545,7 @@
         pw.println(prefix + "mAdjustments=" + mAdjustments);
         pw.println(prefix + "shortcut=" + notification.getShortcutId()
                 + " found valid? " + (mShortcutInfo != null));
+        pw.println(prefix + "mUserVisOverride=" + getPackageVisibilityOverride());
     }
 
     private void dumpNotification(PrintWriter pw, String prefix, Notification notification,
@@ -574,6 +575,7 @@
         } else {
             pw.println("null");
         }
+        pw.println(prefix + "vis=" + notification.visibility);
         pw.println(prefix + "contentView=" + formatRemoteViews(notification.contentView));
         pw.println(prefix + "bigContentView=" + formatRemoteViews(notification.bigContentView));
         pw.println(prefix + "headsUpContentView="
diff --git a/services/core/java/com/android/server/notification/NotificationUsageStats.java b/services/core/java/com/android/server/notification/NotificationUsageStats.java
index 9e91875..ffe33a8 100644
--- a/services/core/java/com/android/server/notification/NotificationUsageStats.java
+++ b/services/core/java/com/android/server/notification/NotificationUsageStats.java
@@ -383,6 +383,7 @@
         public int numWithBigText;
         public int numWithBigPicture;
         public int numForegroundService;
+        public int numUserInitiatedJob;
         public int numOngoing;
         public int numAutoCancel;
         public int numWithLargeIcon;
@@ -433,6 +434,10 @@
                 numForegroundService++;
             }
 
+            if ((n.flags & Notification.FLAG_USER_INITIATED_JOB) != 0) {
+                numUserInitiatedJob++;
+            }
+
             if ((n.flags & Notification.FLAG_ONGOING_EVENT) != 0) {
                 numOngoing++;
             }
@@ -516,6 +521,7 @@
             maybeCount("note_big_text", (numWithBigText - previous.numWithBigText));
             maybeCount("note_big_pic", (numWithBigPicture - previous.numWithBigPicture));
             maybeCount("note_fg", (numForegroundService - previous.numForegroundService));
+            maybeCount("note_uij", (numUserInitiatedJob - previous.numUserInitiatedJob));
             maybeCount("note_ongoing", (numOngoing - previous.numOngoing));
             maybeCount("note_auto", (numAutoCancel - previous.numAutoCancel));
             maybeCount("note_large_icon", (numWithLargeIcon - previous.numWithLargeIcon));
@@ -550,6 +556,7 @@
             previous.numWithBigText = numWithBigText;
             previous.numWithBigPicture = numWithBigPicture;
             previous.numForegroundService = numForegroundService;
+            previous.numUserInitiatedJob = numUserInitiatedJob;
             previous.numOngoing = numOngoing;
             previous.numAutoCancel = numAutoCancel;
             previous.numWithLargeIcon = numWithLargeIcon;
@@ -645,6 +652,8 @@
             output.append(indentPlusTwo);
             output.append("numForegroundService=").append(numForegroundService).append("\n");
             output.append(indentPlusTwo);
+            output.append("numUserInitiatedJob=").append(numUserInitiatedJob).append("\n");
+            output.append(indentPlusTwo);
             output.append("numOngoing=").append(numOngoing).append("\n");
             output.append(indentPlusTwo);
             output.append("numAutoCancel=").append(numAutoCancel).append("\n");
@@ -701,6 +710,7 @@
             maybePut(dump, "numWithBigText", numWithBigText);
             maybePut(dump, "numWithBigPicture", numWithBigPicture);
             maybePut(dump, "numForegroundService", numForegroundService);
+            maybePut(dump, "numUserInitiatedJob", numUserInitiatedJob);
             maybePut(dump, "numOngoing", numOngoing);
             maybePut(dump, "numAutoCancel", numAutoCancel);
             maybePut(dump, "numWithLargeIcon", numWithLargeIcon);
diff --git a/services/core/java/com/android/server/notification/PermissionHelper.java b/services/core/java/com/android/server/notification/PermissionHelper.java
index e6fd7ec..b6fd822 100644
--- a/services/core/java/com/android/server/notification/PermissionHelper.java
+++ b/services/core/java/com/android/server/notification/PermissionHelper.java
@@ -78,6 +78,30 @@
     }
 
     /**
+     * Returns whether the given app requested the given permission. Must not be called
+     * with a lock held.
+     */
+    public boolean hasRequestedPermission(String permission, String pkg, @UserIdInt int userId) {
+        final long callingId = Binder.clearCallingIdentity();
+        try {
+            PackageInfo pi = mPackageManager.getPackageInfo(pkg, GET_PERMISSIONS, userId);
+            if (pi == null || pi.requestedPermissions == null) {
+                return false;
+            }
+            for (String perm : pi.requestedPermissions) {
+                if (permission.equals(perm)) {
+                    return true;
+                }
+            }
+        } catch (RemoteException e) {
+            Slog.d(TAG, "Could not reach system server", e);
+        } finally {
+            Binder.restoreCallingIdentity(callingId);
+        }
+        return false;
+    }
+
+    /**
      * Returns all of the apps that have requested the notification permission in a given user.
      * Must not be called with a lock held. Format: uid, packageName
      */
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index 84bee50..402fb30 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -16,6 +16,7 @@
 
 package com.android.server.pm;
 
+import static android.Manifest.permission.READ_FRAME_BUFFER;
 import static android.app.ActivityOptions.KEY_SPLASH_SCREEN_THEME;
 import static android.app.ComponentOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED;
 import static android.app.ComponentOptions.MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED;
@@ -25,6 +26,8 @@
 import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
 import static android.content.Intent.FLAG_ACTIVITY_NO_USER_ACTION;
+import static android.content.PermissionChecker.PERMISSION_GRANTED;
+import static android.content.PermissionChecker.checkCallingOrSelfPermissionForPreflight;
 import static android.content.pm.LauncherApps.FLAG_CACHE_BUBBLE_SHORTCUTS;
 import static android.content.pm.LauncherApps.FLAG_CACHE_NOTIFICATION_SHORTCUTS;
 import static android.content.pm.LauncherApps.FLAG_CACHE_PEOPLE_TILE_SHORTCUTS;
@@ -32,6 +35,7 @@
 import android.annotation.AppIdInt;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
 import android.annotation.UserIdInt;
 import android.app.ActivityManager;
 import android.app.ActivityManagerInternal;
@@ -90,6 +94,7 @@
 import android.util.Log;
 import android.util.Pair;
 import android.util.Slog;
+import android.window.IDumpCallback;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
@@ -104,6 +109,15 @@
 import com.android.server.pm.pkg.AndroidPackage;
 import com.android.server.wm.ActivityTaskManagerInternal;
 
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.attribute.PosixFilePermission;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -111,6 +125,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 
 /**
@@ -118,6 +133,15 @@
  * managed profiles.
  */
 public class LauncherAppsService extends SystemService {
+    private static final String WM_TRACE_DIR = "/data/misc/wmtrace/";
+    private static final String VC_FILE_SUFFIX = ".vc";
+
+    private static final Set<PosixFilePermission> WM_TRACE_FILE_PERMISSIONS = Set.of(
+            PosixFilePermission.OWNER_WRITE,
+            PosixFilePermission.GROUP_READ,
+            PosixFilePermission.OTHERS_READ,
+            PosixFilePermission.OWNER_READ
+    );
 
     private final LauncherAppsImpl mLauncherAppsImpl;
 
@@ -191,6 +215,8 @@
 
         final LauncherAppsServiceInternal mInternal;
 
+        private RemoteCallbackList<IDumpCallback> mDumpCallbacks = new RemoteCallbackList<>();
+
         public LauncherAppsImpl(Context context) {
             mContext = context;
             mIPM = AppGlobals.getPackageManager();
@@ -1431,6 +1457,66 @@
                     getActivityOptionsForLauncher(opts), user.getIdentifier());
         }
 
+
+        /**
+         * Using a pipe, outputs view capture data to the wmtrace dir
+         */
+        protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+            super.dump(fd, pw, args);
+
+            // Before the wmtrace directory is picked up by dumpstate service, some processes need
+            // to write their data to that location. They can do that via these dumpCallbacks.
+            int i = mDumpCallbacks.beginBroadcast();
+            while (i > 0) {
+                i--;
+                dumpDataToWmTrace((String) mDumpCallbacks.getBroadcastCookie(i) + "_" + i,
+                        mDumpCallbacks.getBroadcastItem(i));
+            }
+            mDumpCallbacks.finishBroadcast();
+        }
+
+        private void dumpDataToWmTrace(String name, IDumpCallback cb) {
+            ParcelFileDescriptor[] pipe;
+            try {
+                pipe = ParcelFileDescriptor.createPipe();
+                cb.onDump(pipe[1]);
+            } catch (IOException | RemoteException e) {
+                Log.d(TAG, "failed to pipe view capture data", e);
+                return;
+            }
+
+            Path path = Paths.get(WM_TRACE_DIR + Paths.get(name + VC_FILE_SUFFIX).getFileName());
+            try (InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(pipe[0])) {
+                Files.copy(is, path, StandardCopyOption.REPLACE_EXISTING);
+                Files.setPosixFilePermissions(path, WM_TRACE_FILE_PERMISSIONS);
+            } catch (IOException e) {
+                Log.d(TAG, "failed to write data to file in wmtrace dir", e);
+            }
+        }
+
+        @RequiresPermission(READ_FRAME_BUFFER)
+        @Override
+        public void registerDumpCallback(IDumpCallback cb) {
+            int status = checkCallingOrSelfPermissionForPreflight(mContext, READ_FRAME_BUFFER);
+            if (PERMISSION_GRANTED == status) {
+                String name = mContext.getPackageManager().getNameForUid(Binder.getCallingUid());
+                mDumpCallbacks.register(cb, name);
+            } else {
+                Log.w(TAG, "caller lacks permissions to registerDumpCallback");
+            }
+        }
+
+        @RequiresPermission(READ_FRAME_BUFFER)
+        @Override
+        public void unRegisterDumpCallback(IDumpCallback cb) {
+            int status = checkCallingOrSelfPermissionForPreflight(mContext, READ_FRAME_BUFFER);
+            if (PERMISSION_GRANTED == status) {
+                mDumpCallbacks.unregister(cb);
+            } else {
+                Log.w(TAG, "caller lacks permissions to unRegisterDumpCallback");
+            }
+        }
+
         /** Checks if user is a profile of or same as listeningUser.
          * and the user is enabled. */
         private boolean isEnabledProfileOf(UserHandle listeningUser, UserHandle user,
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 69e92e0..f358ce7 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -677,7 +677,8 @@
                 ? params.installerPackageName : installerPackageName;
 
         if (PackageManagerServiceUtils.isRootOrShell(callingUid)
-                || PackageInstallerSession.isSystemDataLoaderInstallation(params)) {
+                || PackageInstallerSession.isSystemDataLoaderInstallation(params)
+                || PackageManagerServiceUtils.isAdoptedShell(callingUid, mContext)) {
             params.installFlags |= PackageManager.INSTALL_FROM_ADB;
             // adb installs can override the installingPackageName, but not the
             // initiatingPackageName
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index ea6383e..006d7c8 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -745,6 +745,9 @@
     @GuardedBy("mLock")
     private int mValidatedTargetSdk = INVALID_TARGET_SDK_VERSION;
 
+    @GuardedBy("mLock")
+    private boolean mAllowsUpdateOwnership = true;
+
     private static final FileFilter sAddedApkFilter = new FileFilter() {
         @Override
         public boolean accept(File file) {
@@ -866,13 +869,11 @@
 
     private static final int USER_ACTION_NOT_NEEDED = 0;
     private static final int USER_ACTION_REQUIRED = 1;
-    private static final int USER_ACTION_PENDING_APK_PARSING = 2;
     private static final int USER_ACTION_REQUIRED_UPDATE_OWNER_REMINDER = 3;
 
     @IntDef({
             USER_ACTION_NOT_NEEDED,
             USER_ACTION_REQUIRED,
-            USER_ACTION_PENDING_APK_PARSING,
             USER_ACTION_REQUIRED_UPDATE_OWNER_REMINDER,
     })
     @interface UserActionRequirement {}
@@ -963,11 +964,11 @@
                 && !isApexSession()
                 && !isUpdateOwner
                 && !isInstallerShell
+                && mAllowsUpdateOwnership
                 // We don't enforce the update ownership for the managed user and profile.
                 && !isFromManagedUserOrProfile) {
             return USER_ACTION_REQUIRED_UPDATE_OWNER_REMINDER;
         }
-
         if (isPermissionGranted) {
             return USER_ACTION_NOT_NEEDED;
         }
@@ -982,7 +983,20 @@
                 && isUpdateWithoutUserActionPermissionGranted
                 && ((isUpdateOwnershipEnforcementEnabled ? isUpdateOwner
                 : isInstallerOfRecord) || isSelfUpdate)) {
-            return USER_ACTION_PENDING_APK_PARSING;
+            if (!isApexSession()) {
+                if (!isTargetSdkConditionSatisfied(this)) {
+                    return USER_ACTION_REQUIRED;
+                }
+
+                if (!mSilentUpdatePolicy.isSilentUpdateAllowed(
+                        getInstallerPackageName(), getPackageName())) {
+                    // Fall back to the non-silent update if a repeated installation is invoked
+                    // within the throttle time.
+                    return USER_ACTION_REQUIRED;
+                }
+                mSilentUpdatePolicy.track(getInstallerPackageName(), getPackageName());
+                return USER_ACTION_NOT_NEEDED;
+            }
         }
 
         return USER_ACTION_REQUIRED;
@@ -1442,7 +1456,10 @@
             @NonNull IOnChecksumsReadyListener onChecksumsReadyListener) {
         assertCallerIsOwnerRootOrVerifier();
         final File file = new File(stageDir, name);
-        final String installerPackageName = getInstallSource().mInitiatingPackageName;
+        final String installerPackageName = PackageManagerServiceUtils.isInstalledByAdb(
+                getInstallSource().mInitiatingPackageName)
+                ? getInstallSource().mInstallerPackageName
+                : getInstallSource().mInitiatingPackageName;
         try {
             mPm.requestFileChecksums(file, installerPackageName, optional, required,
                     trustedInstallers, onChecksumsReadyListener);
@@ -2363,26 +2380,6 @@
             session.sendPendingUserActionIntent(target);
             return true;
         }
-
-        if (!session.isApexSession() && userActionRequirement == USER_ACTION_PENDING_APK_PARSING) {
-            if (!isTargetSdkConditionSatisfied(session)) {
-                session.sendPendingUserActionIntent(target);
-                return true;
-            }
-
-            if (session.params.requireUserAction == SessionParams.USER_ACTION_NOT_REQUIRED) {
-                if (!session.mSilentUpdatePolicy.isSilentUpdateAllowed(
-                        session.getInstallerPackageName(), session.getPackageName())) {
-                    // Fall back to the non-silent update if a repeated installation is invoked
-                    // within the throttle time.
-                    session.sendPendingUserActionIntent(target);
-                    return true;
-                }
-                session.mSilentUpdatePolicy.track(session.getInstallerPackageName(),
-                        session.getPackageName());
-            }
-        }
-
         return false;
     }
 
@@ -3393,6 +3390,8 @@
         // {@link PackageLite#getTargetSdk()}
         mValidatedTargetSdk = packageLite.getTargetSdk();
 
+        mAllowsUpdateOwnership = packageLite.isAllowUpdateOwnership();
+
         return packageLite;
     }
 
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 2038e79..e4e3a9d 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -7208,6 +7208,7 @@
      * TODO: In the meantime, can this be moved to a schedule call?
      * TODO(b/182523293): This should be removed once we finish migration of permission storage.
      */
+    @SuppressWarnings("GuardedBy")
     void writeSettingsLPrTEMP(boolean sync) {
         snapshotComputer(false);
         mPermissionManager.writeLegacyPermissionsTEMP(mSettings.mPermissions);
@@ -7257,6 +7258,10 @@
     static boolean isPreapprovalRequestAvailable() {
         final long token = Binder.clearCallingIdentity();
         try {
+            if (!Resources.getSystem().getBoolean(
+                    com.android.internal.R.bool.config_isPreApprovalRequestAvailable)) {
+                return false;
+            }
             return DeviceConfig.getBoolean(NAMESPACE_PACKAGE_MANAGER_SERVICE,
                     PROPERTY_IS_PRE_APPROVAL_REQUEST_AVAILABLE, true /* defaultValue */);
         } finally {
@@ -7268,7 +7273,7 @@
         final long token = Binder.clearCallingIdentity();
         try {
             return DeviceConfig.getBoolean(NAMESPACE_PACKAGE_MANAGER_SERVICE,
-                    PROPERTY_IS_UPDATE_OWNERSHIP_ENFORCEMENT_AVAILABLE, false /* defaultValue */);
+                    PROPERTY_IS_UPDATE_OWNERSHIP_ENFORCEMENT_AVAILABLE, true /* defaultValue */);
         } finally {
             Binder.restoreCallingIdentity(token);
         }
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index 77e4688..db997d8 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -36,13 +36,14 @@
 import static com.android.server.pm.PackageManagerService.STUB_SUFFIX;
 import static com.android.server.pm.PackageManagerService.TAG;
 
+import android.Manifest;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UserIdInt;
 import android.app.ActivityManager;
 import android.compat.annotation.ChangeId;
-import android.compat.annotation.EnabledSince;
+import android.compat.annotation.Disabled;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -189,7 +190,7 @@
      * allow 3P apps to trigger internal-only functionality.
      */
     @ChangeId
-    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
+    @Disabled  /* Revert enforcement: b/274147456 */
     private static final long ENFORCE_INTENTS_TO_MATCH_INTENT_FILTERS = 161252188;
 
     /**
@@ -1389,6 +1390,14 @@
     }
 
     /**
+     * Check if a UID is non-system UID adopted shell permission.
+     */
+    public static boolean isAdoptedShell(int uid, Context context) {
+        return uid != Process.SYSTEM_UID && context.checkCallingOrSelfPermission(
+                Manifest.permission.USE_SYSTEM_DATA_LOADERS) == PackageManager.PERMISSION_GRANTED;
+    }
+
+    /**
      * Check if a UID is system UID or shell's UID.
      */
     public static boolean isRootOrShell(int uid) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index cc60802..89f46fe 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -692,7 +692,7 @@
                         null /* usesSplitNames */, null /* configForSplit */,
                         null /* splitApkPaths */, null /* splitRevisionCodes */,
                         apkLite.getTargetSdkVersion(), null /* requiredSplitTypes */,
-                        null /* splitTypes */);
+                        null /* splitTypes */, apkLite.isAllowUpdateOwnership());
                 sessionSize += InstallLocationUtils.calculateInstalledSize(pkgLite,
                         params.sessionParams.abiOverride, fd.getFileDescriptor());
             } catch (IOException e) {
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 02d13bc..417ba07 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -2217,10 +2217,10 @@
                         }
                         if (ustate.getEnabledState() != COMPONENT_ENABLED_STATE_DEFAULT) {
                             serializer.attributeInt(null, ATTR_ENABLED, ustate.getEnabledState());
-                            if (ustate.getLastDisableAppCaller() != null) {
-                                serializer.attribute(null, ATTR_ENABLED_CALLER,
-                                        ustate.getLastDisableAppCaller());
-                            }
+                        }
+                        if (ustate.getLastDisableAppCaller() != null) {
+                            serializer.attribute(null, ATTR_ENABLED_CALLER,
+                                    ustate.getLastDisableAppCaller());
                         }
                         if (ustate.getInstallReason() != PackageManager.INSTALL_REASON_UNKNOWN) {
                             serializer.attributeInt(null, ATTR_INSTALL_REASON,
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 50f88d3..b669ba2 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -27,6 +27,7 @@
 import android.app.AppGlobals;
 import android.app.IUidObserver;
 import android.app.IUriGrantsManager;
+import android.app.UidObserver;
 import android.app.UriGrantsManager;
 import android.app.role.OnRoleHoldersChangedListener;
 import android.app.role.RoleManager;
@@ -590,7 +591,7 @@
         }
     }
 
-    final private IUidObserver mUidObserver = new IUidObserver.Stub() {
+    final private IUidObserver mUidObserver = new UidObserver() {
         @Override
         public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
             injectPostToHandler(() -> handleOnUidStateChanged(uid, procState));
@@ -601,20 +602,6 @@
             injectPostToHandler(() ->
                     handleOnUidStateChanged(uid, ActivityManager.PROCESS_STATE_NONEXISTENT));
         }
-
-        @Override
-        public void onUidActive(int uid) {
-        }
-
-        @Override
-        public void onUidIdle(int uid, boolean disabled) {
-        }
-
-        @Override public void onUidCachedChanged(int uid, boolean cached) {
-        }
-
-        @Override public void onUidProcAdjChanged(int uid) {
-        }
     };
 
     void handleOnUidStateChanged(int uid, int procState) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 927a722..ab9d1cf 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -278,6 +278,7 @@
     private static final long EPOCH_PLUS_30_YEARS = 30L * 365 * 24 * 60 * 60 * 1000L; // ms
 
     static final int WRITE_USER_MSG = 1;
+    static final int WRITE_USER_LIST_MSG = 2;
     static final int WRITE_USER_DELAY = 2*1000;  // 2 seconds
 
     private static final long BOOT_USER_SET_TIMEOUT_MS = 300_000;
@@ -321,7 +322,6 @@
     private final Handler mHandler;
 
     private final File mUsersDir;
-    @GuardedBy("mPackagesLock")
     private final File mUserListFile;
 
     private final IBinder mUserRestrictionToken = new Binder();
@@ -3623,77 +3623,95 @@
         mUpdatingSystemUserMode = true;
     }
 
+
+    private ResilientAtomicFile getUserListFile() {
+        File tempBackup = new File(mUserListFile.getParent(), mUserListFile.getName() + ".backup");
+        File reserveCopy = new File(mUserListFile.getParent(),
+                mUserListFile.getName() + ".reservecopy");
+        int fileMode = FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IXOTH;
+        return new ResilientAtomicFile(mUserListFile, tempBackup, reserveCopy, fileMode,
+                "user list", (priority, msg) -> {
+            Slog.e(LOG_TAG, msg);
+            // Something went wrong, schedule full rewrite.
+            scheduleWriteUserList();
+        });
+    }
+
     @GuardedBy({"mPackagesLock"})
     private void readUserListLP() {
-        if (!mUserListFile.exists()) {
-            fallbackToSingleUserLP();
-            return;
-        }
-        FileInputStream fis = null;
-        AtomicFile userListFile = new AtomicFile(mUserListFile);
-        try {
-            fis = userListFile.openRead();
-            final TypedXmlPullParser parser = Xml.resolvePullParser(fis);
-            int type;
-            while ((type = parser.next()) != XmlPullParser.START_TAG
-                    && type != XmlPullParser.END_DOCUMENT) {
-                // Skip
-            }
+        try (ResilientAtomicFile file = getUserListFile()) {
+            FileInputStream fin = null;
+            try {
+                fin = file.openRead();
+                if (fin == null) {
+                    Slog.e(LOG_TAG, "userlist.xml not found, fallback to single user");
+                    fallbackToSingleUserLP();
+                    return;
+                }
 
-            if (type != XmlPullParser.START_TAG) {
-                Slog.e(LOG_TAG, "Unable to read user list");
-                fallbackToSingleUserLP();
-                return;
-            }
+                final TypedXmlPullParser parser = Xml.resolvePullParser(fin);
+                int type;
+                while ((type = parser.next()) != XmlPullParser.START_TAG
+                        && type != XmlPullParser.END_DOCUMENT) {
+                    // Skip
+                }
 
-            mNextSerialNumber = -1;
-            if (parser.getName().equals(TAG_USERS)) {
-                mNextSerialNumber =
-                        parser.getAttributeInt(null, ATTR_NEXT_SERIAL_NO, mNextSerialNumber);
-                mUserVersion =
-                        parser.getAttributeInt(null, ATTR_USER_VERSION, mUserVersion);
-                mUserTypeVersion =
-                        parser.getAttributeInt(null, ATTR_USER_TYPE_VERSION, mUserTypeVersion);
-            }
+                if (type != XmlPullParser.START_TAG) {
+                    Slog.e(LOG_TAG, "Unable to read user list");
+                    fallbackToSingleUserLP();
+                    return;
+                }
 
-            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
-                if (type == XmlPullParser.START_TAG) {
-                    final String name = parser.getName();
-                    if (name.equals(TAG_USER)) {
-                        UserData userData = readUserLP(parser.getAttributeInt(null, ATTR_ID));
+                mNextSerialNumber = -1;
+                if (parser.getName().equals(TAG_USERS)) {
+                    mNextSerialNumber =
+                            parser.getAttributeInt(null, ATTR_NEXT_SERIAL_NO, mNextSerialNumber);
+                    mUserVersion =
+                            parser.getAttributeInt(null, ATTR_USER_VERSION, mUserVersion);
+                    mUserTypeVersion =
+                            parser.getAttributeInt(null, ATTR_USER_TYPE_VERSION, mUserTypeVersion);
+                }
 
-                        if (userData != null) {
-                            synchronized (mUsersLock) {
-                                mUsers.put(userData.info.id, userData);
-                                if (mNextSerialNumber < 0
-                                        || mNextSerialNumber <= userData.info.id) {
-                                    mNextSerialNumber = userData.info.id + 1;
-                                }
-                            }
-                        }
-                    } else if (name.equals(TAG_GUEST_RESTRICTIONS)) {
-                        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
-                                && type != XmlPullParser.END_TAG) {
-                            if (type == XmlPullParser.START_TAG) {
-                                if (parser.getName().equals(TAG_RESTRICTIONS)) {
-                                    synchronized (mGuestRestrictions) {
-                                        UserRestrictionsUtils
-                                                .readRestrictions(parser, mGuestRestrictions);
+                while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
+                    if (type == XmlPullParser.START_TAG) {
+                        final String name = parser.getName();
+                        if (name.equals(TAG_USER)) {
+                            UserData userData = readUserLP(parser.getAttributeInt(null, ATTR_ID));
+
+                            if (userData != null) {
+                                synchronized (mUsersLock) {
+                                    mUsers.put(userData.info.id, userData);
+                                    if (mNextSerialNumber < 0
+                                            || mNextSerialNumber <= userData.info.id) {
+                                        mNextSerialNumber = userData.info.id + 1;
                                     }
                                 }
-                                break;
+                            }
+                        } else if (name.equals(TAG_GUEST_RESTRICTIONS)) {
+                            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                                    && type != XmlPullParser.END_TAG) {
+                                if (type == XmlPullParser.START_TAG) {
+                                    if (parser.getName().equals(TAG_RESTRICTIONS)) {
+                                        synchronized (mGuestRestrictions) {
+                                            UserRestrictionsUtils
+                                                    .readRestrictions(parser, mGuestRestrictions);
+                                        }
+                                    }
+                                    break;
+                                }
                             }
                         }
                     }
                 }
-            }
 
-            updateUserIds();
-            upgradeIfNecessaryLP();
-        } catch (IOException | XmlPullParserException e) {
-            fallbackToSingleUserLP();
-        } finally {
-            IoUtils.closeQuietly(fis);
+                updateUserIds();
+                upgradeIfNecessaryLP();
+            } catch (Exception e) {
+                // Remove corrupted file and retry.
+                file.failRead(fin, e);
+                readUserListLP();
+                return;
+            }
         }
 
         synchronized (mUsersLock) {
@@ -4099,6 +4117,18 @@
         }
     }
 
+    private void scheduleWriteUserList() {
+        if (DBG) {
+            debug("scheduleWriteUserList");
+        }
+        // No need to wrap it within a lock -- worst case, we'll just post the same message
+        // twice.
+        if (!mHandler.hasMessages(WRITE_USER_LIST_MSG)) {
+            Message msg = mHandler.obtainMessage(WRITE_USER_LIST_MSG);
+            mHandler.sendMessageDelayed(msg, WRITE_USER_DELAY);
+        }
+    }
+
     private void scheduleWriteUser(UserData userData) {
         if (DBG) {
             debug("scheduleWriteUser");
@@ -4111,20 +4141,37 @@
         }
     }
 
+    private ResilientAtomicFile getUserFile(int userId) {
+        File file = new File(mUsersDir, userId + XML_SUFFIX);
+        File tempBackup = new File(mUsersDir, userId + XML_SUFFIX + ".backup");
+        File reserveCopy = new File(mUsersDir, userId + XML_SUFFIX + ".reservecopy");
+        int fileMode = FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IXOTH;
+        return new ResilientAtomicFile(file, tempBackup, reserveCopy, fileMode,
+                "user info", (priority, msg) -> {
+            Slog.e(LOG_TAG, msg);
+            // Something went wrong, schedule full rewrite.
+            UserData userData = getUserDataNoChecks(userId);
+            if (userData != null) {
+                scheduleWriteUser(userData);
+            }
+        });
+    }
+
     @GuardedBy({"mPackagesLock"})
     private void writeUserLP(UserData userData) {
         if (DBG) {
             debug("writeUserLP " + userData);
         }
-        FileOutputStream fos = null;
-        AtomicFile userFile = new AtomicFile(new File(mUsersDir, userData.info.id + XML_SUFFIX));
-        try {
-            fos = userFile.startWrite();
-            writeUserLP(userData, fos);
-            userFile.finishWrite(fos);
-        } catch (Exception ioe) {
-            Slog.e(LOG_TAG, "Error writing user info " + userData.info.id, ioe);
-            userFile.failWrite(fos);
+        try (ResilientAtomicFile userFile = getUserFile(userData.info.id)) {
+            FileOutputStream fos = null;
+            try {
+                fos = userFile.startWrite();
+                writeUserLP(userData, fos);
+                userFile.finishWrite(fos);
+            } catch (Exception ioe) {
+                Slog.e(LOG_TAG, "Error writing user info " + userData.info.id, ioe);
+                userFile.failWrite(fos);
+            }
         }
     }
 
@@ -4253,65 +4300,71 @@
         if (DBG) {
             debug("writeUserList");
         }
-        FileOutputStream fos = null;
-        AtomicFile userListFile = new AtomicFile(mUserListFile);
-        try {
-            fos = userListFile.startWrite();
-            final TypedXmlSerializer serializer = Xml.resolveSerializer(fos);
-            serializer.startDocument(null, true);
-            serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
 
-            serializer.startTag(null, TAG_USERS);
-            serializer.attributeInt(null, ATTR_NEXT_SERIAL_NO, mNextSerialNumber);
-            serializer.attributeInt(null, ATTR_USER_VERSION, mUserVersion);
-            serializer.attributeInt(null, ATTR_USER_TYPE_VERSION, mUserTypeVersion);
+        try (ResilientAtomicFile file = getUserListFile()) {
+            FileOutputStream fos = null;
+            try {
+                fos = file.startWrite();
 
-            serializer.startTag(null, TAG_GUEST_RESTRICTIONS);
-            synchronized (mGuestRestrictions) {
-                UserRestrictionsUtils
-                        .writeRestrictions(serializer, mGuestRestrictions, TAG_RESTRICTIONS);
-            }
-            serializer.endTag(null, TAG_GUEST_RESTRICTIONS);
-            int[] userIdsToWrite;
-            synchronized (mUsersLock) {
-                userIdsToWrite = new int[mUsers.size()];
-                for (int i = 0; i < userIdsToWrite.length; i++) {
-                    UserInfo user = mUsers.valueAt(i).info;
-                    userIdsToWrite[i] = user.id;
+                final TypedXmlSerializer serializer = Xml.resolveSerializer(fos);
+                serializer.startDocument(null, true);
+                serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output",
+                        true);
+
+                serializer.startTag(null, TAG_USERS);
+                serializer.attributeInt(null, ATTR_NEXT_SERIAL_NO, mNextSerialNumber);
+                serializer.attributeInt(null, ATTR_USER_VERSION, mUserVersion);
+                serializer.attributeInt(null, ATTR_USER_TYPE_VERSION, mUserTypeVersion);
+
+                serializer.startTag(null, TAG_GUEST_RESTRICTIONS);
+                synchronized (mGuestRestrictions) {
+                    UserRestrictionsUtils
+                            .writeRestrictions(serializer, mGuestRestrictions, TAG_RESTRICTIONS);
                 }
-            }
-            for (int id : userIdsToWrite) {
-                serializer.startTag(null, TAG_USER);
-                serializer.attributeInt(null, ATTR_ID, id);
-                serializer.endTag(null, TAG_USER);
-            }
+                serializer.endTag(null, TAG_GUEST_RESTRICTIONS);
+                int[] userIdsToWrite;
+                synchronized (mUsersLock) {
+                    userIdsToWrite = new int[mUsers.size()];
+                    for (int i = 0; i < userIdsToWrite.length; i++) {
+                        UserInfo user = mUsers.valueAt(i).info;
+                        userIdsToWrite[i] = user.id;
+                    }
+                }
+                for (int id : userIdsToWrite) {
+                    serializer.startTag(null, TAG_USER);
+                    serializer.attributeInt(null, ATTR_ID, id);
+                    serializer.endTag(null, TAG_USER);
+                }
 
-            serializer.endTag(null, TAG_USERS);
+                serializer.endTag(null, TAG_USERS);
 
-            serializer.endDocument();
-            userListFile.finishWrite(fos);
-        } catch (Exception e) {
-            userListFile.failWrite(fos);
-            Slog.e(LOG_TAG, "Error writing user list");
+                serializer.endDocument();
+                file.finishWrite(fos);
+            } catch (Exception e) {
+                Slog.e(LOG_TAG, "Error writing user list", e);
+                file.failWrite(fos);
+            }
         }
     }
 
     @GuardedBy({"mPackagesLock"})
     private UserData readUserLP(int id) {
-        FileInputStream fis = null;
-        try {
-            AtomicFile userFile =
-                    new AtomicFile(new File(mUsersDir, Integer.toString(id) + XML_SUFFIX));
-            fis = userFile.openRead();
-            return readUserLP(id, fis);
-        } catch (IOException ioe) {
-            Slog.e(LOG_TAG, "Error reading user list");
-        } catch (XmlPullParserException pe) {
-            Slog.e(LOG_TAG, "Error reading user list");
-        } finally {
-            IoUtils.closeQuietly(fis);
+        try (ResilientAtomicFile file = getUserFile(id)) {
+            FileInputStream fis = null;
+            try {
+                fis = file.openRead();
+                if (fis == null) {
+                    Slog.e(LOG_TAG, "User info not found, returning null, user id: " + id);
+                    return null;
+                }
+                return readUserLP(id, fis);
+            } catch (Exception e) {
+                // Remove corrupted file and retry.
+                Slog.e(LOG_TAG, "Error reading user info, user id: " + id);
+                file.failRead(fis, e);
+                return readUserLP(id);
+            }
         }
-        return null;
     }
 
     @GuardedBy({"mPackagesLock"})
@@ -5805,9 +5858,8 @@
         synchronized (mPackagesLock) {
             writeUserListLP();
         }
-        // Remove user file
-        AtomicFile userFile = new AtomicFile(new File(mUsersDir, userId + XML_SUFFIX));
-        userFile.delete();
+        // Remove user file(s)
+        getUserFile(userId).delete();
         updateUserIds();
         if (RELEASE_DELETED_USER_ID) {
             synchronized (mUsersLock) {
@@ -6770,6 +6822,13 @@
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
+                case WRITE_USER_LIST_MSG: {
+                    removeMessages(WRITE_USER_LIST_MSG);
+                    synchronized (mPackagesLock) {
+                        writeUserListLP();
+                    }
+                    break;
+                }
                 case WRITE_USER_MSG:
                     removeMessages(WRITE_USER_MSG, msg.obj);
                     synchronized (mPackagesLock) {
@@ -6782,6 +6841,7 @@
                                     + ", it was probably removed before handler could handle it");
                         }
                     }
+                    break;
             }
         }
     }
diff --git a/services/core/java/com/android/server/pm/UserTypeFactory.java b/services/core/java/com/android/server/pm/UserTypeFactory.java
index b7a2b86..a814ca4 100644
--- a/services/core/java/com/android/server/pm/UserTypeFactory.java
+++ b/services/core/java/com/android/server/pm/UserTypeFactory.java
@@ -136,6 +136,7 @@
                         com.android.internal.R.color.system_neutral2_900)
                 .setDefaultRestrictions(null)
                 .setDefaultCrossProfileIntentFilters(getDefaultCloneCrossProfileIntentFilter())
+                .setDefaultSecureSettings(getDefaultNonManagedProfileSecureSettings())
                 .setDefaultUserProperties(new UserProperties.Builder()
                         .setStartWithParent(true)
                         .setShowInLauncher(UserProperties.SHOW_IN_LAUNCHER_WITH_PARENT)
@@ -216,7 +217,8 @@
                         com.android.internal.R.color.profile_badge_1_dark,
                         com.android.internal.R.color.profile_badge_2_dark,
                         com.android.internal.R.color.profile_badge_3_dark)
-                .setDefaultRestrictions(restrictions);
+                .setDefaultRestrictions(restrictions)
+                .setDefaultSecureSettings(getDefaultNonManagedProfileSecureSettings());
     }
 
     /**
@@ -337,6 +339,15 @@
         return DefaultCrossProfileIntentFiltersUtils.getDefaultCloneProfileFilters();
     }
 
+    /** Gets a default bundle, keyed by Settings.Secure String names, for non-managed profiles. */
+    private static Bundle getDefaultNonManagedProfileSecureSettings() {
+        final Bundle settings = new Bundle();
+        // Non-managed profiles go through neither SetupWizard nor DPC flows, so we automatically
+        // mark them as setup.
+        settings.putString(android.provider.Settings.Secure.USER_SETUP_COMPLETE, "1");
+        return settings;
+    }
+
     /**
      * Reads the given xml parser to obtain device user-type customization, and updates the given
      * map of {@link UserTypeDetails.Builder}s accordingly.
diff --git a/services/core/java/com/android/server/pm/VerifyingSession.java b/services/core/java/com/android/server/pm/VerifyingSession.java
index f340f93..c9ebeae 100644
--- a/services/core/java/com/android/server/pm/VerifyingSession.java
+++ b/services/core/java/com/android/server/pm/VerifyingSession.java
@@ -652,20 +652,33 @@
 
     private boolean isAdbVerificationEnabled(PackageInfoLite pkgInfoLite, int userId,
             boolean requestedDisableVerification) {
+        boolean verifierIncludeAdb = android.provider.Settings.Global.getInt(
+                mPm.mContext.getContentResolver(),
+                android.provider.Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, 1) != 0;
+
         if (mPm.isUserRestricted(userId, UserManager.ENSURE_VERIFY_APPS)) {
+            if (!verifierIncludeAdb) {
+                Slog.w(TAG, "Force verification of ADB install because of user restriction.");
+            }
             return true;
         }
-        // Check if the developer wants to skip verification for ADB installs
+
+        // Check if the verification disabled globally, first.
+        if (!verifierIncludeAdb) {
+            return false;
+        }
+
+        // Check if the developer wants to skip verification for ADB installs.
         if (requestedDisableVerification) {
             if (!packageExists(pkgInfoLite.packageName)) {
-                // Always verify fresh install
+                // Always verify fresh install.
                 return true;
             }
-            // Only skip when apk is debuggable
+            // Only skip when apk is debuggable.
             return !pkgInfoLite.debuggable;
         }
-        return android.provider.Settings.Global.getInt(mPm.mContext.getContentResolver(),
-                android.provider.Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, 1) != 0;
+
+        return true;
     }
 
     /**
diff --git a/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java b/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java
index 8641b41..3296c1f 100644
--- a/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java
+++ b/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java
@@ -22,6 +22,7 @@
 import android.app.AlarmManager;
 import android.app.IActivityManager;
 import android.app.IUidObserver;
+import android.app.UidObserver;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -168,7 +169,7 @@
 
         private final Object mInnerLock = new Object();
         private final Object mToken = new Object();
-        private final IUidObserver.Stub mObserver = new IUidObserver.Stub() {
+        private final IUidObserver mObserver = new UidObserver() {
             @Override
             public void onUidGone(int uid, boolean disabled) {
                 if (uid == mUid) {
@@ -188,15 +189,6 @@
                     }
                 }
             }
-
-            public void onUidActive(int uid) {
-            }
-            public void onUidIdle(int uid, boolean disabled) {
-            }
-            public void onUidProcAdjChanged(int uid) {
-            }
-            public void onUidCachedChanged(int uid, boolean cached) {
-            }
         };
 
         private PackageInactivityListener(int uid, @NonNull String packageName, long timeout,
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index b56e5c9..c5f939a 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -64,6 +64,7 @@
 import android.permission.PermissionCheckerManager;
 import android.permission.PermissionManager;
 import android.permission.PermissionManagerInternal;
+import android.service.voice.VoiceInteractionManagerInternal;
 import android.util.ArrayMap;
 import android.util.Slog;
 import android.util.SparseArray;
@@ -969,12 +970,13 @@
             // the private data in your process; or by you explicitly calling to another
             // app passing the source, in which case you must trust the other side;
 
-            final int callingUid = Binder.getCallingUid();
-            if (source.getUid() != callingUid && mContext.checkPermission(
+            final int callingUid = resolveUid(Binder.getCallingUid());
+            final int sourceUid = resolveUid(source.getUid());
+            if (sourceUid != callingUid && mContext.checkPermission(
                     Manifest.permission.UPDATE_APP_OPS_STATS, /*pid*/ -1, callingUid)
                     != PackageManager.PERMISSION_GRANTED) {
                 throw new SecurityException("Cannot register attribution source for uid:"
-                        + source.getUid() + " from uid:" + callingUid);
+                        + sourceUid + " from uid:" + callingUid);
             }
 
             final PackageManagerInternal packageManagerInternal = LocalServices.getService(
@@ -983,10 +985,10 @@
             // TODO(b/234653108): Clean up this UID/package & cross-user check.
             // If calling from the system process, allow registering attribution for package from
             // any user
-            int userId = UserHandle.getUserId((callingUid == Process.SYSTEM_UID ? source.getUid()
+            int userId = UserHandle.getUserId((callingUid == Process.SYSTEM_UID ? sourceUid
                     : callingUid));
             if (packageManagerInternal.getPackageUid(source.getPackageName(), 0, userId)
-                    != source.getUid()) {
+                    != sourceUid) {
                 throw new SecurityException("Cannot register attribution source for package:"
                         + source.getPackageName() + " from uid:" + callingUid);
             }
@@ -1012,6 +1014,21 @@
                 return false;
             }
         }
+
+        private int resolveUid(int uid) {
+            final VoiceInteractionManagerInternal vimi = LocalServices
+                    .getService(VoiceInteractionManagerInternal.class);
+            if (vimi == null) {
+                return uid;
+            }
+            final VoiceInteractionManagerInternal.HotwordDetectionServiceIdentity
+                    hotwordDetectionServiceIdentity = vimi.getHotwordDetectionServiceIdentity();
+            if (hotwordDetectionServiceIdentity != null
+                    && uid == hotwordDetectionServiceIdentity.getIsolatedUid()) {
+                return hotwordDetectionServiceIdentity.getOwnerUid();
+            }
+            return uid;
+        }
     }
 
     /**
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index ee2e458..8165958 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -590,7 +590,7 @@
     private int mDoubleTapOnHomeBehavior;
 
     // Whether to lock the device after the next app transition has finished.
-    private boolean mLockAfterAppTransitionFinished;
+    boolean mLockAfterAppTransitionFinished;
 
     // Allowed theater mode wake actions
     private boolean mAllowTheaterModeWakeFromKey;
@@ -729,7 +729,7 @@
                     mAutofillManagerInternal.onBackKeyPressed();
                     break;
                 case MSG_SYSTEM_KEY_PRESS:
-                    sendSystemKeyToStatusBar(msg.arg1);
+                    sendSystemKeyToStatusBar((KeyEvent) msg.obj);
                     break;
                 case MSG_HANDLE_ALL_APPS:
                     launchAllAppsAction();
@@ -949,7 +949,7 @@
         final boolean handledByPowerManager = mPowerManagerInternal.interceptPowerKeyDown(event);
 
         // Inform the StatusBar; but do not allow it to consume the event.
-        sendSystemKeyToStatusBarAsync(event.getKeyCode());
+        sendSystemKeyToStatusBarAsync(event);
 
         // If the power key has still not yet been handled, then detect short
         // press, long press, or multi press and decide what to do.
@@ -3001,7 +3001,11 @@
                 break;
             case KeyEvent.KEYCODE_N:
                 if (down && event.isMetaPressed()) {
-                    toggleNotificationPanel();
+                    if (event.isCtrlPressed()) {
+                        sendSystemKeyToStatusBarAsync(event);
+                    } else {
+                        toggleNotificationPanel();
+                    }
                     return key_consumed;
                 }
                 break;
@@ -3569,14 +3573,16 @@
 
     @Override
     public int applyKeyguardOcclusionChange() {
-        if (mKeyguardOccludedChanged) {
-            if (DEBUG_KEYGUARD) Slog.d(TAG, "transition/occluded changed occluded="
-                    + mPendingKeyguardOccluded);
-            if (setKeyguardOccludedLw(mPendingKeyguardOccluded)) {
-                return FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_WALLPAPER;
-            }
+        if (DEBUG_KEYGUARD) Slog.d(TAG, "transition/occluded commit occluded="
+                + mPendingKeyguardOccluded);
+
+        // TODO(b/276433230): Explicitly save before/after for occlude state in each
+        // Transition so we don't need to update SysUI every time.
+        if (setKeyguardOccludedLw(mPendingKeyguardOccluded)) {
+            return FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_WALLPAPER;
+        } else {
+            return 0;
         }
-        return 0;
     }
 
     /**
@@ -3854,6 +3860,7 @@
     private boolean setKeyguardOccludedLw(boolean isOccluded) {
         if (DEBUG_KEYGUARD) Slog.d(TAG, "setKeyguardOccluded occluded=" + isOccluded);
         mKeyguardOccludedChanged = false;
+        mPendingKeyguardOccluded = isOccluded;
         mKeyguardDelegate.setOccluded(isOccluded, true /* notify */);
         return mKeyguardDelegate.isShowing();
     }
@@ -4119,7 +4126,7 @@
             case KeyEvent.KEYCODE_VOLUME_UP:
             case KeyEvent.KEYCODE_VOLUME_MUTE: {
                 if (down) {
-                    sendSystemKeyToStatusBarAsync(event.getKeyCode());
+                    sendSystemKeyToStatusBarAsync(event);
 
                     NotificationManager nm = getNotificationService();
                     if (nm != null && !mHandleVolumeKeysInWM) {
@@ -4397,7 +4404,7 @@
             case KeyEvent.KEYCODE_STYLUS_BUTTON_TERTIARY:
             case KeyEvent.KEYCODE_STYLUS_BUTTON_TAIL: {
                 if (down && mStylusButtonsEnabled) {
-                    sendSystemKeyToStatusBarAsync(keyCode);
+                    sendSystemKeyToStatusBarAsync(event);
                 }
                 result &= ~ACTION_PASS_TO_USER;
                 break;
@@ -4494,7 +4501,7 @@
             if (!mAccessibilityManager.isEnabled()
                     || !mAccessibilityManager.sendFingerprintGesture(event.getKeyCode())) {
                 if (mSystemNavigationKeysEnabled) {
-                    sendSystemKeyToStatusBarAsync(event.getKeyCode());
+                    sendSystemKeyToStatusBarAsync(event);
                 }
             }
         }
@@ -4503,11 +4510,11 @@
     /**
      * Notify the StatusBar that a system key was pressed.
      */
-    private void sendSystemKeyToStatusBar(int keyCode) {
+    private void sendSystemKeyToStatusBar(KeyEvent key) {
         IStatusBarService statusBar = getStatusBarService();
         if (statusBar != null) {
             try {
-                statusBar.handleSystemKey(keyCode);
+                statusBar.handleSystemKey(key);
             } catch (RemoteException e) {
                 // Oh well.
             }
@@ -4517,8 +4524,8 @@
     /**
      * Notify the StatusBar that a system key was pressed without blocking the current thread.
      */
-    private void sendSystemKeyToStatusBarAsync(int keyCode) {
-        Message message = mHandler.obtainMessage(MSG_SYSTEM_KEY_PRESS, keyCode, 0);
+    private void sendSystemKeyToStatusBarAsync(KeyEvent keyEvent) {
+        Message message = mHandler.obtainMessage(MSG_SYSTEM_KEY_PRESS, keyEvent);
         message.setAsynchronous(true);
         mHandler.sendMessage(message);
     }
diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java
index a9a1d5e..1a91d25 100644
--- a/services/core/java/com/android/server/power/hint/HintManagerService.java
+++ b/services/core/java/com/android/server/power/hint/HintManagerService.java
@@ -19,8 +19,8 @@
 import android.annotation.NonNull;
 import android.app.ActivityManager;
 import android.app.ActivityManagerInternal;
-import android.app.IUidObserver;
 import android.app.StatsManager;
+import android.app.UidObserver;
 import android.content.Context;
 import android.os.Binder;
 import android.os.IBinder;
@@ -48,7 +48,6 @@
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
@@ -70,7 +69,7 @@
     /** Lock to protect HAL handles and listen list. */
     private final Object mLock = new Object();
 
-    @VisibleForTesting final UidObserver mUidObserver;
+    @VisibleForTesting final MyUidObserver mUidObserver;
 
     private final NativeWrapper mNativeWrapper;
 
@@ -95,7 +94,7 @@
         mNativeWrapper = injector.createNativeWrapper();
         mNativeWrapper.halInit();
         mHintSessionPreferredRate = mNativeWrapper.halGetHintSessionPreferredRate();
-        mUidObserver = new UidObserver();
+        mUidObserver = new MyUidObserver();
         mAmInternal = Objects.requireNonNull(
                 LocalServices.getService(ActivityManagerInternal.class));
     }
@@ -247,7 +246,7 @@
     }
 
     @VisibleForTesting
-    final class UidObserver extends IUidObserver.Stub {
+    final class MyUidObserver extends UidObserver {
         private final SparseArray<Integer> mProcStatesCache = new SparseArray<>();
 
         public boolean isUidForeground(int uid) {
@@ -277,14 +276,6 @@
             });
         }
 
-        @Override
-        public void onUidActive(int uid) {
-        }
-
-        @Override
-        public void onUidIdle(int uid, boolean disabled) {
-        }
-
         /**
          * The IUidObserver callback is called from the system_server, so it'll be a direct function
          * call from ActivityManagerService. Do not do heavy logic here.
@@ -306,14 +297,6 @@
                 }
             });
         }
-
-        @Override
-        public void onUidCachedChanged(int uid, boolean cached) {
-        }
-
-        @Override
-        public void onUidProcAdjChanged(int uid) {
-        }
     }
 
     @VisibleForTesting
@@ -324,16 +307,7 @@
     private boolean checkTidValid(int uid, int tgid, int [] tids) {
         // Make sure all tids belongs to the same UID (including isolated UID),
         // tids can belong to different application processes.
-        List<Integer> eligiblePids = null;
-        // To avoid deadlock, do not call into AMS if the call is from system.
-        if (uid != Process.SYSTEM_UID) {
-            eligiblePids = mAmInternal.getIsolatedProcesses(uid);
-        }
-        if (eligiblePids == null) {
-            eligiblePids = new ArrayList<>();
-        }
-        eligiblePids.add(tgid);
-
+        List<Integer> isolatedPids = null;
         for (int threadId : tids) {
             final String[] procStatusKeys = new String[] {
                     "Uid:",
@@ -345,7 +319,21 @@
             int pidOfThreadId = (int) output[1];
 
             // use PID check for isolated processes, use UID check for non-isolated processes.
-            if (eligiblePids.contains(pidOfThreadId) || uidOfThreadId == uid) {
+            if (pidOfThreadId == tgid || uidOfThreadId == uid) {
+                continue;
+            }
+            // Only call into AM if the tid is either isolated or invalid
+            if (isolatedPids == null) {
+                // To avoid deadlock, do not call into AMS if the call is from system.
+                if (uid == Process.SYSTEM_UID) {
+                    return false;
+                }
+                isolatedPids = mAmInternal.getIsolatedProcesses(uid);
+                if (isolatedPids == null) {
+                    return false;
+                }
+            }
+            if (isolatedPids.contains(pidOfThreadId)) {
                 continue;
             }
             return false;
diff --git a/services/core/java/com/android/server/power/stats/CpuWakeupStats.java b/services/core/java/com/android/server/power/stats/CpuWakeupStats.java
index d55fbc2..231ffc6 100644
--- a/services/core/java/com/android/server/power/stats/CpuWakeupStats.java
+++ b/services/core/java/com/android/server/power/stats/CpuWakeupStats.java
@@ -20,6 +20,7 @@
 import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_UNKNOWN;
 import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_WIFI;
 
+import android.app.ActivityManager;
 import android.content.Context;
 import android.os.Handler;
 import android.os.HandlerExecutor;
@@ -27,11 +28,10 @@
 import android.os.UserHandle;
 import android.provider.DeviceConfig;
 import android.util.IndentingPrintWriter;
-import android.util.IntArray;
-import android.util.LongSparseArray;
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
+import android.util.SparseIntArray;
 import android.util.SparseLongArray;
 import android.util.TimeSparseArray;
 import android.util.TimeUtils;
@@ -59,7 +59,7 @@
     private static final String TRACE_TRACK_WAKEUP_ATTRIBUTION = "wakeup_attribution";
     @VisibleForTesting
     static final long WAKEUP_REASON_HALF_WINDOW_MS = 500;
-    private static final long WAKEUP_WRITE_DELAY_MS = TimeUnit.MINUTES.toMillis(2);
+    private static final long WAKEUP_WRITE_DELAY_MS = TimeUnit.SECONDS.toMillis(30);
 
     private final Handler mHandler;
     private final IrqDeviceMap mIrqDeviceMap;
@@ -69,10 +69,15 @@
 
     @VisibleForTesting
     final TimeSparseArray<Wakeup> mWakeupEvents = new TimeSparseArray<>();
+
+    /* Maps timestamp -> {subsystem  -> {uid -> procState}} */
     @VisibleForTesting
-    final TimeSparseArray<SparseArray<SparseBooleanArray>> mWakeupAttribution =
+    final TimeSparseArray<SparseArray<SparseIntArray>> mWakeupAttribution =
             new TimeSparseArray<>();
 
+    final SparseIntArray mUidProcStates = new SparseIntArray();
+    private final SparseIntArray mReusableUidProcStates = new SparseIntArray(4);
+
     public CpuWakeupStats(Context context, int mapRes, Handler handler) {
         mIrqDeviceMap = IrqDeviceMap.getInstance(context, mapRes);
         mHandler = handler;
@@ -102,13 +107,14 @@
                     FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED__TYPE__TYPE_UNKNOWN,
                     FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED__REASON__UNKNOWN,
                     null,
-                    wakeupToLog.mElapsedMillis);
+                    wakeupToLog.mElapsedMillis,
+                    null);
             Trace.instantForTrack(Trace.TRACE_TAG_POWER, TRACE_TRACK_WAKEUP_ATTRIBUTION,
                     wakeupToLog.mElapsedMillis + " --");
             return;
         }
 
-        final SparseArray<SparseBooleanArray> wakeupAttribution = mWakeupAttribution.get(
+        final SparseArray<SparseIntArray> wakeupAttribution = mWakeupAttribution.get(
                 wakeupToLog.mElapsedMillis);
         if (wakeupAttribution == null) {
             // This is not expected but can theoretically happen in extreme situations, e.g. if we
@@ -121,24 +127,28 @@
 
         for (int i = 0; i < wakeupAttribution.size(); i++) {
             final int subsystem = wakeupAttribution.keyAt(i);
-            final SparseBooleanArray uidMap = wakeupAttribution.valueAt(i);
+            final SparseIntArray uidProcStates = wakeupAttribution.valueAt(i);
             final int[] uids;
-            if (uidMap == null || uidMap.size() == 0) {
-                uids = new int[0];
+            final int[] procStatesProto;
+
+            if (uidProcStates == null || uidProcStates.size() == 0) {
+                uids = procStatesProto = new int[0];
             } else {
-                final IntArray tmp = new IntArray(uidMap.size());
-                for (int j = 0; j < uidMap.size(); j++) {
-                    if (uidMap.valueAt(j)) {
-                        tmp.add(uidMap.keyAt(j));
-                    }
+                final int numUids = uidProcStates.size();
+                uids = new int[numUids];
+                procStatesProto = new int[numUids];
+                for (int j = 0; j < numUids; j++) {
+                    uids[j] = uidProcStates.keyAt(j);
+                    procStatesProto[j] = ActivityManager.processStateAmToProto(
+                            uidProcStates.valueAt(j));
                 }
-                uids = tmp.toArray();
             }
             FrameworkStatsLog.write(FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED,
                     FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED__TYPE__TYPE_IRQ,
                     subsystemToStatsReason(subsystem),
                     uids,
-                    wakeupToLog.mElapsedMillis);
+                    wakeupToLog.mElapsedMillis,
+                    procStatesProto);
 
             if (Trace.isTagEnabled(Trace.TRACE_TAG_POWER)) {
                 if (i == 0) {
@@ -154,6 +164,20 @@
                 traceEventBuilder.toString().trim());
     }
 
+    /**
+     * Clean up data for a uid that is being removed.
+     */
+    public synchronized void onUidRemoved(int uid) {
+        mUidProcStates.delete(uid);
+    }
+
+    /**
+     * Notes a procstate change for the given uid to maintain the mapping internally.
+     */
+    public synchronized void noteUidProcessState(int uid, int state) {
+        mUidProcStates.put(uid, state);
+    }
+
     /** Notes a wakeup reason as reported by SuspendControlService to battery stats. */
     public synchronized void noteWakeupTimeAndReason(long elapsedRealtime, long uptime,
             String rawReason) {
@@ -184,8 +208,17 @@
 
     /** Notes a waking activity that could have potentially woken up the CPU. */
     public synchronized void noteWakingActivity(int subsystem, long elapsedRealtime, int... uids) {
-        if (!attemptAttributionWith(subsystem, elapsedRealtime, uids)) {
-            mRecentWakingActivity.recordActivity(subsystem, elapsedRealtime, uids);
+        if (uids == null) {
+            return;
+        }
+        mReusableUidProcStates.clear();
+        for (int i = 0; i < uids.length; i++) {
+            mReusableUidProcStates.put(uids[i],
+                    mUidProcStates.get(uids[i], ActivityManager.PROCESS_STATE_UNKNOWN));
+        }
+        if (!attemptAttributionWith(subsystem, elapsedRealtime, mReusableUidProcStates)) {
+            mRecentWakingActivity.recordActivity(subsystem, elapsedRealtime,
+                    mReusableUidProcStates);
         }
     }
 
@@ -196,7 +229,7 @@
             return;
         }
 
-        SparseArray<SparseBooleanArray> attribution = mWakeupAttribution.get(wakeup.mElapsedMillis);
+        SparseArray<SparseIntArray> attribution = mWakeupAttribution.get(wakeup.mElapsedMillis);
         if (attribution == null) {
             attribution = new SparseArray<>();
             mWakeupAttribution.put(wakeup.mElapsedMillis, attribution);
@@ -210,14 +243,14 @@
             final long startTime = wakeup.mElapsedMillis - WAKEUP_REASON_HALF_WINDOW_MS;
             final long endTime = wakeup.mElapsedMillis + WAKEUP_REASON_HALF_WINDOW_MS;
 
-            final SparseBooleanArray uidsToBlame = mRecentWakingActivity.removeBetween(subsystem,
+            final SparseIntArray uidsToBlame = mRecentWakingActivity.removeBetween(subsystem,
                     startTime, endTime);
             attribution.put(subsystem, uidsToBlame);
         }
     }
 
     private synchronized boolean attemptAttributionWith(int subsystem, long activityElapsed,
-            int... uids) {
+            SparseIntArray uidProcStates) {
         final int startIdx = mWakeupEvents.closestIndexOnOrAfter(
                 activityElapsed - WAKEUP_REASON_HALF_WINDOW_MS);
         final int endIdx = mWakeupEvents.closestIndexOnOrBefore(
@@ -233,19 +266,19 @@
             if (subsystems.get(subsystem)) {
                 // We don't expect more than one wakeup to be found within such a short window, so
                 // just attribute this one and exit
-                SparseArray<SparseBooleanArray> attribution = mWakeupAttribution.get(
+                SparseArray<SparseIntArray> attribution = mWakeupAttribution.get(
                         wakeup.mElapsedMillis);
                 if (attribution == null) {
                     attribution = new SparseArray<>();
                     mWakeupAttribution.put(wakeup.mElapsedMillis, attribution);
                 }
-                SparseBooleanArray uidsToBlame = attribution.get(subsystem);
+                SparseIntArray uidsToBlame = attribution.get(subsystem);
                 if (uidsToBlame == null) {
-                    uidsToBlame = new SparseBooleanArray(uids.length);
-                    attribution.put(subsystem, uidsToBlame);
-                }
-                for (final int uid : uids) {
-                    uidsToBlame.put(uid, true);
+                    attribution.put(subsystem, uidProcStates.clone());
+                } else {
+                    for (int i = 0; i < uidProcStates.size(); i++) {
+                        uidsToBlame.put(uidProcStates.keyAt(i), uidProcStates.valueAt(i));
+                    }
                 }
                 return true;
             }
@@ -267,6 +300,19 @@
         mRecentWakingActivity.dump(pw, nowElapsed);
         pw.println();
 
+        pw.println("Current proc-state map (" + mUidProcStates.size() + "):");
+        pw.increaseIndent();
+        for (int i = 0; i < mUidProcStates.size(); i++) {
+            if (i > 0) {
+                pw.print(", ");
+            }
+            UserHandle.formatUid(pw, mUidProcStates.keyAt(i));
+            pw.print(":" + ActivityManager.procStateToString(mUidProcStates.valueAt(i)));
+        }
+        pw.println();
+        pw.decreaseIndent();
+        pw.println();
+
         final SparseLongArray attributionStats = new SparseLongArray();
         pw.println("Wakeup events:");
         pw.increaseIndent();
@@ -278,7 +324,7 @@
             final Wakeup wakeup = mWakeupEvents.valueAt(i);
             pw.println(wakeup);
             pw.print("Attribution: ");
-            final SparseArray<SparseBooleanArray> attribution = mWakeupAttribution.get(
+            final SparseArray<SparseIntArray> attribution = mWakeupAttribution.get(
                     wakeup.mElapsedMillis);
             if (attribution == null) {
                 pw.println("N/A");
@@ -292,15 +338,17 @@
                     int attributed = IntPair.first(counters);
                     final int total = IntPair.second(counters) + 1;
 
-                    pw.print("subsystem: " + subsystemToString(attribution.keyAt(subsystemIdx)));
-                    pw.print(", uids: [");
-                    final SparseBooleanArray uids = attribution.valueAt(subsystemIdx);
-                    if (uids != null) {
-                        for (int uidIdx = 0; uidIdx < uids.size(); uidIdx++) {
+                    pw.print(subsystemToString(attribution.keyAt(subsystemIdx)));
+                    pw.print(" [");
+                    final SparseIntArray uidProcStates = attribution.valueAt(subsystemIdx);
+                    if (uidProcStates != null) {
+                        for (int uidIdx = 0; uidIdx < uidProcStates.size(); uidIdx++) {
                             if (uidIdx > 0) {
                                 pw.print(", ");
                             }
-                            UserHandle.formatUid(pw, uids.keyAt(uidIdx));
+                            UserHandle.formatUid(pw, uidProcStates.keyAt(uidIdx));
+                            pw.print(" " + ActivityManager.procStateToString(
+                                    uidProcStates.valueAt(uidIdx)));
                         }
                         attributed++;
                     }
@@ -330,29 +378,39 @@
         pw.println();
     }
 
+    /**
+     * This class stores recent unattributed activity history per subsystem.
+     * The activity is stored as a mapping of subsystem to timestamp to uid to procstate.
+     */
     private static final class WakingActivityHistory {
         private static final long WAKING_ACTIVITY_RETENTION_MS = TimeUnit.MINUTES.toMillis(10);
 
-        private SparseArray<TimeSparseArray<SparseBooleanArray>> mWakingActivity =
+        private SparseArray<TimeSparseArray<SparseIntArray>> mWakingActivity =
                 new SparseArray<>();
 
-        void recordActivity(int subsystem, long elapsedRealtime, int... uids) {
-            if (uids == null) {
+        void recordActivity(int subsystem, long elapsedRealtime, SparseIntArray uidProcStates) {
+            if (uidProcStates == null) {
                 return;
             }
-            TimeSparseArray<SparseBooleanArray> wakingActivity = mWakingActivity.get(subsystem);
+            TimeSparseArray<SparseIntArray> wakingActivity = mWakingActivity.get(subsystem);
             if (wakingActivity == null) {
                 wakingActivity = new TimeSparseArray<>();
                 mWakingActivity.put(subsystem, wakingActivity);
             }
-            SparseBooleanArray uidsToBlame = wakingActivity.get(elapsedRealtime);
+            final SparseIntArray uidsToBlame = wakingActivity.get(elapsedRealtime);
             if (uidsToBlame == null) {
-                uidsToBlame = new SparseBooleanArray(uids.length);
+                wakingActivity.put(elapsedRealtime, uidProcStates.clone());
+            } else {
+                for (int i = 0; i < uidProcStates.size(); i++) {
+                    final int uid = uidProcStates.keyAt(i);
+                    // Just in case there are duplicate uids reported with the same timestamp,
+                    // keep the processState which was reported first.
+                    if (uidsToBlame.indexOfKey(uid) < 0) {
+                        uidsToBlame.put(uid, uidProcStates.valueAt(i));
+                    }
+                }
                 wakingActivity.put(elapsedRealtime, uidsToBlame);
             }
-            for (int i = 0; i < uids.length; i++) {
-                uidsToBlame.put(uids[i], true);
-            }
             // Limit activity history per subsystem to the last WAKING_ACTIVITY_RETENTION_MS.
             // Note that the last activity is always present, even if it occurred before
             // WAKING_ACTIVITY_RETENTION_MS.
@@ -365,7 +423,7 @@
 
         void clearAllBefore(long elapsedRealtime) {
             for (int subsystemIdx = mWakingActivity.size() - 1; subsystemIdx >= 0; subsystemIdx--) {
-                final TimeSparseArray<SparseBooleanArray> activityPerSubsystem =
+                final TimeSparseArray<SparseIntArray> activityPerSubsystem =
                         mWakingActivity.valueAt(subsystemIdx);
                 final int endIdx = activityPerSubsystem.closestIndexOnOrBefore(elapsedRealtime);
                 for (int removeIdx = endIdx; removeIdx >= 0; removeIdx--) {
@@ -377,20 +435,20 @@
             }
         }
 
-        SparseBooleanArray removeBetween(int subsystem, long startElapsed, long endElapsed) {
-            final SparseBooleanArray uidsToReturn = new SparseBooleanArray();
+        SparseIntArray removeBetween(int subsystem, long startElapsed, long endElapsed) {
+            final SparseIntArray uidsToReturn = new SparseIntArray();
 
-            final TimeSparseArray<SparseBooleanArray> activityForSubsystem =
+            final TimeSparseArray<SparseIntArray> activityForSubsystem =
                     mWakingActivity.get(subsystem);
             if (activityForSubsystem != null) {
                 final int startIdx = activityForSubsystem.closestIndexOnOrAfter(startElapsed);
                 final int endIdx = activityForSubsystem.closestIndexOnOrBefore(endElapsed);
                 for (int i = endIdx; i >= startIdx; i--) {
-                    final SparseBooleanArray uidsForTime = activityForSubsystem.valueAt(i);
+                    final SparseIntArray uidsForTime = activityForSubsystem.valueAt(i);
                     for (int j = 0; j < uidsForTime.size(); j++) {
-                        if (uidsForTime.valueAt(j)) {
-                            uidsToReturn.put(uidsForTime.keyAt(j), true);
-                        }
+                        // In case the same uid appears in different uidsForTime maps, there is no
+                        // good way to choose one processState, so just arbitrarily pick any.
+                        uidsToReturn.put(uidsForTime.keyAt(j), uidsForTime.valueAt(j));
                     }
                 }
                 // More efficient to remove in a separate loop as it avoids repeatedly calling gc().
@@ -409,25 +467,23 @@
             pw.increaseIndent();
             for (int i = 0; i < mWakingActivity.size(); i++) {
                 pw.println("Subsystem " + subsystemToString(mWakingActivity.keyAt(i)) + ":");
-                final LongSparseArray<SparseBooleanArray> wakingActivity =
-                        mWakingActivity.valueAt(i);
+                final TimeSparseArray<SparseIntArray> wakingActivity = mWakingActivity.valueAt(i);
                 if (wakingActivity == null) {
                     continue;
                 }
                 pw.increaseIndent();
                 for (int j = wakingActivity.size() - 1; j >= 0; j--) {
                     TimeUtils.formatDuration(wakingActivity.keyAt(j), nowElapsed, pw);
-                    final SparseBooleanArray uidsToBlame = wakingActivity.valueAt(j);
+                    final SparseIntArray uidsToBlame = wakingActivity.valueAt(j);
                     if (uidsToBlame == null) {
                         pw.println();
                         continue;
                     }
                     pw.print(": ");
                     for (int k = 0; k < uidsToBlame.size(); k++) {
-                        if (uidsToBlame.valueAt(k)) {
-                            UserHandle.formatUid(pw, uidsToBlame.keyAt(k));
-                            pw.print(", ");
-                        }
+                        UserHandle.formatUid(pw, uidsToBlame.keyAt(k));
+                        pw.print(" [" + ActivityManager.procStateToString(uidsToBlame.valueAt(k)));
+                        pw.print("], ");
                     }
                     pw.println();
                 }
diff --git a/services/core/java/com/android/server/powerstats/PowerStatsService.java b/services/core/java/com/android/server/powerstats/PowerStatsService.java
index 1358417..2638f34 100644
--- a/services/core/java/com/android/server/powerstats/PowerStatsService.java
+++ b/services/core/java/com/android/server/powerstats/PowerStatsService.java
@@ -360,7 +360,7 @@
                     sb.append("ALL");
                 }
                 sb.append("[");
-                for (int i = 0; i < expectedLength; i++) {
+                for (int i = 0; i < energyConsumerIds.length; i++) {
                     final int id = energyConsumerIds[i];
                     sb.append(id);
                     sb.append("(type:");
diff --git a/services/core/java/com/android/server/security/rkp/RemoteProvisioningRegistration.java b/services/core/java/com/android/server/security/rkp/RemoteProvisioningRegistration.java
index 2d3ede0..f586126 100644
--- a/services/core/java/com/android/server/security/rkp/RemoteProvisioningRegistration.java
+++ b/services/core/java/com/android/server/security/rkp/RemoteProvisioningRegistration.java
@@ -70,12 +70,14 @@
                 Log.i(TAG, "Operation cancelled for client " + mCallback.hashCode());
                 wrapCallback(mCallback::onCancel);
             } else if (e instanceof RkpProxyException) {
-                Log.e(TAG, "RKP error fetching key for client " + mCallback.hashCode(), e);
+                Log.e(TAG, "RKP error fetching key for client " + mCallback.hashCode() + ": "
+                        + e.getMessage());
                 RkpProxyException rkpException = (RkpProxyException) e;
                 wrapCallback(() -> mCallback.onError(toGetKeyError(rkpException),
                         e.getMessage()));
             } else {
-                Log.e(TAG, "Error fetching key for client " + mCallback.hashCode(), e);
+                Log.e(TAG, "Unknown error fetching key for client " + mCallback.hashCode() + ": "
+                        + e.getMessage());
                 wrapCallback(() -> mCallback.onError(IGetKeyCallback.ErrorCode.ERROR_UNKNOWN,
                         e.getMessage()));
             }
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 b2f48d9..433d807 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -154,7 +154,6 @@
 import android.security.metrics.KeystoreAtom;
 import android.security.metrics.KeystoreAtomPayload;
 import android.security.metrics.RkpErrorStats;
-import android.security.metrics.RkpPoolStats;
 import android.security.metrics.StorageStats;
 import android.stats.storage.StorageEnums;
 import android.telephony.ModemActivityInfo;
@@ -730,7 +729,6 @@
                             return pullInstalledIncrementalPackagesLocked(atomTag, data);
                         }
                     case FrameworkStatsLog.KEYSTORE2_STORAGE_STATS:
-                    case FrameworkStatsLog.RKP_POOL_STATS:
                     case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO:
                     case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO:
                     case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO:
@@ -938,7 +936,6 @@
         registerSettingsStats();
         registerInstalledIncrementalPackages();
         registerKeystoreStorageStats();
-        registerRkpPoolStats();
         registerKeystoreKeyCreationWithGeneralInfo();
         registerKeystoreKeyCreationWithAuthInfo();
         registerKeystoreKeyCreationWithPurposeModesInfo();
@@ -4258,14 +4255,6 @@
                 mStatsCallbackImpl);
     }
 
-    private void registerRkpPoolStats() {
-        mStatsManager.setPullAtomCallback(
-                FrameworkStatsLog.RKP_POOL_STATS,
-                null, // use default PullAtomMetadata values,
-                DIRECT_EXECUTOR,
-                mStatsCallbackImpl);
-    }
-
     private void registerKeystoreKeyCreationWithGeneralInfo() {
         mStatsManager.setPullAtomCallback(
                 FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO,
@@ -4373,19 +4362,6 @@
         return StatsManager.PULL_SUCCESS;
     }
 
-    int parseRkpPoolStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
-        for (KeystoreAtom atomWrapper : atoms) {
-            if (atomWrapper.payload.getTag() != KeystoreAtomPayload.rkpPoolStats) {
-                return StatsManager.PULL_SKIP;
-            }
-            RkpPoolStats atom = atomWrapper.payload.getRkpPoolStats();
-            pulledData.add(FrameworkStatsLog.buildStatsEvent(
-                    FrameworkStatsLog.RKP_POOL_STATS, atom.security_level, atom.expiring,
-                    atom.unassigned, atom.attested, atom.total));
-        }
-        return StatsManager.PULL_SUCCESS;
-    }
-
     int parseKeystoreKeyCreationWithGeneralInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
         for (KeystoreAtom atomWrapper : atoms) {
             if (atomWrapper.payload.getTag()
@@ -4518,8 +4494,6 @@
             switch (atomTag) {
                 case FrameworkStatsLog.KEYSTORE2_STORAGE_STATS:
                     return parseKeystoreStorageStats(atoms, pulledData);
-                case FrameworkStatsLog.RKP_POOL_STATS:
-                    return parseRkpPoolStats(atoms, pulledData);
                 case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO:
                     return parseKeystoreKeyCreationWithGeneralInfo(atoms, pulledData);
                 case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO:
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 35e88c1..363d2fd 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -84,6 +84,7 @@
 import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.view.KeyEvent;
 import android.view.WindowInsets;
 import android.view.WindowInsets.Type.InsetsType;
 import android.view.WindowInsetsController.Appearance;
@@ -902,12 +903,12 @@
     }
 
     @Override
-    public void handleSystemKey(int key) throws RemoteException {
+    public void handleSystemKey(KeyEvent key) throws RemoteException {
         if (!checkCanCollapseStatusBar("handleSystemKey")) {
             return;
         }
 
-        mLastSystemKey = key;
+        mLastSystemKey = key.getKeyCode();
 
         if (mBar != null) {
             try {
diff --git a/services/core/java/com/android/server/vcn/routeselection/NetworkPriorityClassifier.java b/services/core/java/com/android/server/vcn/routeselection/NetworkPriorityClassifier.java
index 2141eba..7f129ea 100644
--- a/services/core/java/com/android/server/vcn/routeselection/NetworkPriorityClassifier.java
+++ b/services/core/java/com/android/server/vcn/routeselection/NetworkPriorityClassifier.java
@@ -171,6 +171,18 @@
             return false;
         }
 
+        for (Map.Entry<Integer, Integer> entry :
+                networkPriority.getCapabilitiesMatchCriteria().entrySet()) {
+            final int cap = entry.getKey();
+            final int matchCriteria = entry.getValue();
+
+            if (matchCriteria == MATCH_REQUIRED && !caps.hasCapability(cap)) {
+                return false;
+            } else if (matchCriteria == MATCH_FORBIDDEN && caps.hasCapability(cap)) {
+                return false;
+            }
+        }
+
         if (vcnContext.isInTestMode() && caps.hasTransport(TRANSPORT_TEST)) {
             return true;
         }
@@ -319,18 +331,6 @@
             return false;
         }
 
-        for (Map.Entry<Integer, Integer> entry :
-                networkPriority.getCapabilitiesMatchCriteria().entrySet()) {
-            final int cap = entry.getKey();
-            final int matchCriteria = entry.getValue();
-
-            if (matchCriteria == MATCH_REQUIRED && !caps.hasCapability(cap)) {
-                return false;
-            } else if (matchCriteria == MATCH_FORBIDDEN && caps.hasCapability(cap)) {
-                return false;
-            }
-        }
-
         return true;
     }
 
diff --git a/services/core/java/com/android/server/vibrator/VibrationSettings.java b/services/core/java/com/android/server/vibrator/VibrationSettings.java
index 8a7d607c..1ab7f362 100644
--- a/services/core/java/com/android/server/vibrator/VibrationSettings.java
+++ b/services/core/java/com/android/server/vibrator/VibrationSettings.java
@@ -30,7 +30,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
-import android.app.IUidObserver;
+import android.app.UidObserver;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -157,7 +157,7 @@
     @VisibleForTesting
     final SettingsContentObserver mSettingObserver;
     @VisibleForTesting
-    final UidObserver mUidObserver;
+    final MyUidObserver mUidObserver;
     @VisibleForTesting
     final SettingsBroadcastReceiver mSettingChangeReceiver;
     final VirtualDeviceListener mVirtualDeviceListener;
@@ -195,7 +195,7 @@
         mContext = context;
         mVibrationConfig = config;
         mSettingObserver = new SettingsContentObserver(handler);
-        mUidObserver = new UidObserver();
+        mUidObserver = new MyUidObserver();
         mSettingChangeReceiver = new SettingsBroadcastReceiver();
         mVirtualDeviceListener = new VirtualDeviceListener();
 
@@ -726,7 +726,7 @@
 
     /** Implementation of {@link ContentObserver} to be registered to a setting {@link Uri}. */
     @VisibleForTesting
-    final class UidObserver extends IUidObserver.Stub {
+    final class MyUidObserver extends UidObserver {
         private final SparseArray<Integer> mProcStatesCache = new SparseArray<>();
 
         public boolean isUidForeground(int uid) {
@@ -740,25 +740,9 @@
         }
 
         @Override
-        public void onUidActive(int uid) {
-        }
-
-        @Override
-        public void onUidIdle(int uid, boolean disabled) {
-        }
-
-        @Override
         public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
             mProcStatesCache.put(uid, procState);
         }
-
-        @Override
-        public void onUidCachedChanged(int uid, boolean cached) {
-        }
-
-        @Override
-        public void onUidProcAdjChanged(int uid) {
-        }
     }
 
     /**
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java b/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java
index 799d1494..53861c8 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java
@@ -29,6 +29,7 @@
 
 import android.annotation.Nullable;
 import android.app.WallpaperColors;
+import android.app.WallpaperManager;
 import android.app.WallpaperManager.SetWallpaperFlags;
 import android.app.backup.WallpaperBackupHelper;
 import android.content.ComponentName;
@@ -75,17 +76,17 @@
     private final WallpaperCropper mWallpaperCropper;
     private final Context mContext;
 
-    // Temporary feature flag. TODO(b/197814683) remove
-    private final boolean mEnableSeparateLockScreenEngine;
+    private final boolean mIsLockscreenLiveWallpaperEnabled;
 
     WallpaperDataParser(Context context, WallpaperDisplayHelper wallpaperDisplayHelper,
-            WallpaperCropper wallpaperCropper, boolean enableSeparateLockScreenEngine) {
+            WallpaperCropper wallpaperCropper) {
         mContext = context;
         mWallpaperDisplayHelper = wallpaperDisplayHelper;
         mWallpaperCropper = wallpaperCropper;
         mImageWallpaper = ComponentName.unflattenFromString(
                 context.getResources().getString(R.string.image_wallpaper_component));
-        mEnableSeparateLockScreenEngine = enableSeparateLockScreenEngine;
+        mIsLockscreenLiveWallpaperEnabled = context.getSystemService(WallpaperManager.class)
+                .isLockscreenLiveWallpaperEnabled();
     }
 
     private JournaledFile makeJournaledFile(int userId) {
@@ -135,8 +136,9 @@
      *                      If null, a new object will be created.
      * @param lockWallpaper the lock wallpaper object to reuse to do the modifications.
      *                      If null, a new object will be created.
-     * @param which The wallpaper(s) to load. If {@link #mEnableSeparateLockScreenEngine} is false,
-     *                      this flag has no effect and both wallpapers will always be loaded.
+     * @param which The wallpaper(s) to load. Only has effect if
+     *                      {@link WallpaperManager#isLockscreenLiveWallpaperEnabled} is true,
+     *                      otherwise both wallpaper will always be loaded.
      * @return a {@link WallpaperLoadingResult} object containing the wallpaper data.
      *                      This object will contain the {@code wallpaper} and
      *                      {@code lockWallpaper} provided as parameters, if they are not null.
@@ -148,11 +150,13 @@
         File file = journal.chooseForRead();
 
         boolean migrateFromOld = wallpaper == null;
-        boolean loadSystem = !mEnableSeparateLockScreenEngine || (which & FLAG_SYSTEM) != 0;
-        boolean loadLock = !mEnableSeparateLockScreenEngine || (which & FLAG_LOCK) != 0;
+
+        boolean separateLockscreenEngine = mIsLockscreenLiveWallpaperEnabled;
+        boolean loadSystem = !separateLockscreenEngine || (which & FLAG_SYSTEM) != 0;
+        boolean loadLock = !separateLockscreenEngine || (which & FLAG_LOCK) != 0;
 
         // don't reuse the wallpaper objects in the new version
-        if (mEnableSeparateLockScreenEngine) {
+        if (separateLockscreenEngine) {
             wallpaper = null;
             lockWallpaper = null;
         }
@@ -184,7 +188,8 @@
                 if (type == XmlPullParser.START_TAG) {
                     String tag = parser.getName();
                     if (("wp".equals(tag) && loadSystem)
-                            || ("kwp".equals(tag) && mEnableSeparateLockScreenEngine && loadLock)) {
+                            || ("kwp".equals(tag) && mIsLockscreenLiveWallpaperEnabled
+                                && loadLock)) {
 
                         if ("kwp".equals(tag) && lockWallpaper == null) {
                             lockWallpaper = new WallpaperData(userId, FLAG_LOCK);
@@ -213,7 +218,7 @@
                             Slog.v(TAG, "mNextWallpaperComponent:"
                                     + wallpaper.nextWallpaperComponent);
                         }
-                    } else if ("kwp".equals(tag) && !mEnableSeparateLockScreenEngine) {
+                    } else if ("kwp".equals(tag) && !mIsLockscreenLiveWallpaperEnabled) {
                         // keyguard-specific wallpaper for this user (legacy code)
                         if (lockWallpaper == null) {
                             lockWallpaper = new WallpaperData(userId, FLAG_LOCK);
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 93f039d..b1b0c55 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -88,6 +88,7 @@
 import android.os.SELinux;
 import android.os.ShellCallback;
 import android.os.SystemClock;
+import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.storage.StorageManager;
@@ -179,8 +180,7 @@
 
     private final Object mLock = new Object();
     /** True to enable a second engine for lock screen wallpaper when different from system wp. */
-    @VisibleForTesting
-    final boolean mEnableSeparateLockScreenEngine;
+    private final boolean mIsLockscreenLiveWallpaperEnabled;
     /** Tracks wallpaper being migrated from system+lock to lock when setting static wp. */
     WallpaperDestinationChangeHandler mPendingMigrationViaStatic;
 
@@ -230,7 +230,7 @@
         }
 
         // Handles static wallpaper changes generated by WallpaperObserver events when
-        // mEnableSeparateLockScreenEngine is true.
+        // enableSeparateLockScreenEngine() is true.
         private void updateWallpapers(int event, String path) {
             // System and system+lock changes happen on the system wallpaper input file;
             // lock-only changes happen on the dedicated lock wallpaper input file
@@ -381,7 +381,7 @@
         }
 
         // Handles static wallpaper changes generated by WallpaperObserver events when
-        // mEnableSeparateLockScreenEngine is false.
+        // enableSeparateLockScreenEngine() is false.
         // TODO(b/266818039) Remove this method
         private void updateWallpapersLegacy(int event, String path) {
             final boolean moved = (event == MOVED_TO);
@@ -498,7 +498,7 @@
                 return;
             }
 
-            if (mEnableSeparateLockScreenEngine) {
+            if (mIsLockscreenLiveWallpaperEnabled) {
                 updateWallpapers(event, path);
             } else {
                 updateWallpapersLegacy(event, path);
@@ -1600,15 +1600,11 @@
         mActivityManager = mContext.getSystemService(ActivityManager.class);
         mMonitor = new MyPackageMonitor();
         mColorsChangedListeners = new SparseArray<>();
-
-        mEnableSeparateLockScreenEngine = mContext.getResources().getBoolean(
-                R.bool.config_independentLockscreenLiveWallpaper);
         mWallpaperDataParser = new WallpaperDataParser(mContext, mWallpaperDisplayHelper,
-                mWallpaperCropper, mEnableSeparateLockScreenEngine);
-        if (DEBUG) {
-            Slog.v(TAG, "Separate lock screen engine enabled: " + mEnableSeparateLockScreenEngine);
-        }
+                mWallpaperCropper);
 
+        mIsLockscreenLiveWallpaperEnabled =
+                SystemProperties.getBoolean("persist.wm.debug.lockscreen_live_wallpaper", false);
         LocalServices.addService(WallpaperManagerInternal.class, new LocalService());
     }
 
@@ -2794,7 +2790,7 @@
             Os.rename(sysWP.wallpaperFile.getAbsolutePath(), lockWP.wallpaperFile.getAbsolutePath());
             Os.rename(sysWP.cropFile.getAbsolutePath(), lockWP.cropFile.getAbsolutePath());
             mLockWallpaperMap.put(userId, lockWP);
-            if (mEnableSeparateLockScreenEngine) {
+            if (mIsLockscreenLiveWallpaperEnabled) {
                 SELinux.restorecon(lockWP.wallpaperFile);
                 mLastLockWallpaper = lockWP;
             }
@@ -2858,7 +2854,7 @@
 
     @VisibleForTesting
     void setWallpaperComponent(ComponentName name, @SetWallpaperFlags int which, int userId) {
-        if (mEnableSeparateLockScreenEngine) {
+        if (mIsLockscreenLiveWallpaperEnabled) {
             setWallpaperComponentInternal(name, which, userId);
         } else {
             setWallpaperComponentInternalLegacy(name, which, userId);
@@ -3192,7 +3188,7 @@
                 Slog.w(TAG, msg);
                 return false;
             }
-            if (mEnableSeparateLockScreenEngine) {
+            if (mIsLockscreenLiveWallpaperEnabled) {
                 maybeDetachLastWallpapers(wallpaper);
             } else if (wallpaper.userId == mCurrentUserId && mLastWallpaper != null
                     && !wallpaper.equals(mFallbackWallpaper)) {
@@ -3201,7 +3197,7 @@
             wallpaper.wallpaperComponent = componentName;
             wallpaper.connection = newConn;
             newConn.mReply = reply;
-            if (mEnableSeparateLockScreenEngine) {
+            if (mIsLockscreenLiveWallpaperEnabled) {
                 updateCurrentWallpapers(wallpaper);
             } else if (wallpaper.userId == mCurrentUserId && !wallpaper.equals(
                     mFallbackWallpaper)) {
@@ -3221,8 +3217,8 @@
         return true;
     }
 
-    // Updates tracking of the currently bound wallpapers. Assumes mEnableSeparateLockScreenEngine
-    // is true.
+    // Updates tracking of the currently bound wallpapers.
+    // Assumes isLockscreenLiveWallpaperEnabled is true.
     private void updateCurrentWallpapers(WallpaperData newWallpaper) {
         if (newWallpaper.userId != mCurrentUserId || newWallpaper.equals(mFallbackWallpaper)) {
             return;
@@ -3237,7 +3233,7 @@
     }
 
     // Detaches previously bound wallpapers if no longer in use. Assumes
-    // mEnableSeparateLockScreenEngine is true.
+    // isLockscreenLiveWallpaperEnabled is true.
     private void maybeDetachLastWallpapers(WallpaperData newWallpaper) {
         if (newWallpaper.userId != mCurrentUserId || newWallpaper.equals(mFallbackWallpaper)) {
             return;
@@ -3389,6 +3385,11 @@
         return (wallpaper != null) ? wallpaper.allowBackup : false;
     }
 
+    @Override
+    public boolean isLockscreenLiveWallpaperEnabled() {
+        return mIsLockscreenLiveWallpaperEnabled;
+    }
+
     private void onDisplayReadyInternal(int displayId) {
         synchronized (mLock) {
             if (mLastWallpaper == null) {
@@ -3476,8 +3477,8 @@
         WallpaperDataParser.WallpaperLoadingResult result = mWallpaperDataParser.loadSettingsLocked(
                 userId, keepDimensionHints, wallpaperData, lockWallpaperData, which);
 
-        boolean updateSystem = !mEnableSeparateLockScreenEngine || (which & FLAG_SYSTEM) != 0;
-        boolean updateLock = !mEnableSeparateLockScreenEngine || (which & FLAG_LOCK) != 0;
+        boolean updateSystem = !mIsLockscreenLiveWallpaperEnabled || (which & FLAG_SYSTEM) != 0;
+        boolean updateLock = !mIsLockscreenLiveWallpaperEnabled || (which & FLAG_LOCK) != 0;
 
         if (updateSystem) mWallpaperMap.put(userId, result.getSystemWallpaperData());
         if (updateLock) {
diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java
index f14a432..ff1c28a 100644
--- a/services/core/java/com/android/server/wm/ActivityClientController.java
+++ b/services/core/java/com/android/server/wm/ActivityClientController.java
@@ -778,13 +778,12 @@
                         && r.mTransitionController.inPlayingTransition(r)
                         && !r.mTransitionController.isCollecting()
                         ? r.mTransitionController.createTransition(TRANSIT_TO_BACK) : null;
-                if (transition != null) {
-                    r.mTransitionController.requestStartTransition(transition, null /*startTask */,
-                            null /* remoteTransition */, null /* displayChange */);
-                }
                 final boolean changed = r != null && r.setOccludesParent(true);
                 if (transition != null) {
                     if (changed) {
+                        r.mTransitionController.requestStartTransition(transition,
+                                null /*startTask */, null /* remoteTransition */,
+                                null /* displayChange */);
                         r.mTransitionController.setReady(r.getDisplayContent());
                     } else {
                         transition.abort();
@@ -818,13 +817,12 @@
                 final Transition transition = r.mTransitionController.inPlayingTransition(r)
                         && !r.mTransitionController.isCollecting()
                         ? r.mTransitionController.createTransition(TRANSIT_TO_FRONT) : null;
-                if (transition != null) {
-                    r.mTransitionController.requestStartTransition(transition, null /*startTask */,
-                            null /* remoteTransition */, null /* displayChange */);
-                }
                 final boolean changed = r.setOccludesParent(false);
                 if (transition != null) {
                     if (changed) {
+                        r.mTransitionController.requestStartTransition(transition,
+                                null /*startTask */, null /* remoteTransition */,
+                                null /* displayChange */);
                         r.mTransitionController.setReady(r.getDisplayContent());
                     } else {
                         transition.abort();
diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
index 80d1e16..a757d90 100644
--- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
@@ -1155,6 +1155,8 @@
         sb.setLength(0);
         sb.append("Displayed ");
         sb.append(info.launchedActivityShortComponentName);
+        sb.append(" for user ");
+        sb.append(info.userId);
         sb.append(": ");
         TimeUtils.formatDuration(info.windowsDrawnDelayMs, sb);
         Log.i(TAG, sb.toString());
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 6944b29..8346e7c 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -179,6 +179,10 @@
 import static com.android.server.wm.ActivityRecordProto.PROVIDES_MAX_BOUNDS;
 import static com.android.server.wm.ActivityRecordProto.REPORTED_DRAWN;
 import static com.android.server.wm.ActivityRecordProto.REPORTED_VISIBLE;
+import static com.android.server.wm.ActivityRecordProto.SHOULD_FORCE_ROTATE_FOR_CAMERA_COMPAT;
+import static com.android.server.wm.ActivityRecordProto.SHOULD_REFRESH_ACTIVITY_FOR_CAMERA_COMPAT;
+import static com.android.server.wm.ActivityRecordProto.SHOULD_REFRESH_ACTIVITY_VIA_PAUSE_FOR_CAMERA_COMPAT;
+import static com.android.server.wm.ActivityRecordProto.SHOULD_SEND_COMPAT_FAKE_FOCUS;
 import static com.android.server.wm.ActivityRecordProto.STARTING_DISPLAYED;
 import static com.android.server.wm.ActivityRecordProto.STARTING_MOVED;
 import static com.android.server.wm.ActivityRecordProto.STARTING_WINDOW;
@@ -4064,7 +4068,7 @@
     }
 
     void finishRelaunching() {
-        mLetterboxUiController.setRelauchingAfterRequestedOrientationChanged(false);
+        mLetterboxUiController.setRelaunchingAfterRequestedOrientationChanged(false);
         mTaskSupervisor.getActivityMetricsLogger().notifyActivityRelaunched(this);
 
         if (mPendingRelaunchCount > 0) {
@@ -6045,6 +6049,8 @@
             // An activity must be in the {@link PAUSING} state for the system to validate
             // the move to {@link PAUSED}.
             setState(PAUSING, "makeActiveIfNeeded");
+            EventLogTags.writeWmPauseActivity(mUserId, System.identityHashCode(this),
+                    shortComponentName, "userLeaving=false", "make-active");
             try {
                 mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), token,
                         PauseActivityItem.obtain(finishing, false /* userLeaving */,
@@ -9494,7 +9500,7 @@
                 mRelaunchReason = RELAUNCH_REASON_NONE;
             }
             if (isRequestedOrientationChanged) {
-                mLetterboxUiController.setRelauchingAfterRequestedOrientationChanged(true);
+                mLetterboxUiController.setRelaunchingAfterRequestedOrientationChanged(true);
             }
             if (mState == PAUSING) {
                 // A little annoying: we are waiting for this activity to finish pausing. Let's not
@@ -10224,6 +10230,13 @@
         proto.write(ENABLE_RECENTS_SCREENSHOT, mEnableRecentsScreenshot);
         proto.write(LAST_DROP_INPUT_MODE, mLastDropInputMode);
         proto.write(OVERRIDE_ORIENTATION, getOverrideOrientation());
+        proto.write(SHOULD_SEND_COMPAT_FAKE_FOCUS, shouldSendCompatFakeFocus());
+        proto.write(SHOULD_FORCE_ROTATE_FOR_CAMERA_COMPAT,
+                mLetterboxUiController.shouldForceRotateForCameraCompat());
+        proto.write(SHOULD_REFRESH_ACTIVITY_FOR_CAMERA_COMPAT,
+                mLetterboxUiController.shouldRefreshActivityForCameraCompat());
+        proto.write(SHOULD_REFRESH_ACTIVITY_VIA_PAUSE_FOR_CAMERA_COMPAT,
+                mLetterboxUiController.shouldRefreshActivityViaPauseForCameraCompat());
     }
 
     @Override
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index bbdaa24..12fe6a0 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -100,6 +100,7 @@
 import static com.android.server.wm.ActivityInterceptorCallback.SYSTEM_FIRST_ORDERED_ID;
 import static com.android.server.wm.ActivityInterceptorCallback.SYSTEM_LAST_ORDERED_ID;
 import static com.android.server.wm.ActivityRecord.State.PAUSING;
+import static com.android.server.wm.ActivityRecord.State.RESUMED;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ALL;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_ROOT_TASK;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_SWITCH;
@@ -2011,7 +2012,7 @@
             return;
         }
 
-        if (r == mRootWindowContainer.getTopResumedActivity()) {
+        if (r.isState(RESUMED) && r == mRootWindowContainer.getTopResumedActivity()) {
             setLastResumedActivityUncheckLocked(r, "setFocusedTask-alreadyTop");
             return;
         }
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
index 841d28b..597c8bf 100644
--- a/services/core/java/com/android/server/wm/AppTransitionController.java
+++ b/services/core/java/com/android/server/wm/AppTransitionController.java
@@ -258,7 +258,7 @@
             tmpCloseApps = new ArraySet<>(mDisplayContent.mClosingApps);
             if (mDisplayContent.mAtmService.mBackNavigationController
                     .removeIfContainsBackAnimationTargets(tmpOpenApps, tmpCloseApps)) {
-                mDisplayContent.mAtmService.mBackNavigationController.clearBackAnimations(null);
+                mDisplayContent.mAtmService.mBackNavigationController.clearBackAnimations();
             }
         }
 
@@ -929,7 +929,7 @@
 
     /**
      * Returns {@code true} if a given {@link WindowContainer} is an embedded Task in
-     * {@link com.android.wm.shell.TaskView}.
+     * {@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}.
diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java
index 0d1f2ce..be80b01 100644
--- a/services/core/java/com/android/server/wm/BackNavigationController.java
+++ b/services/core/java/com/android/server/wm/BackNavigationController.java
@@ -62,13 +62,12 @@
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Objects;
-import java.util.function.Consumer;
 
 /**
  * Controller to handle actions related to the back gesture on the server side.
  */
 class BackNavigationController {
-    private static final String TAG = "BackNavigationController";
+    private static final String TAG = "CoreBackPreview";
     private WindowManagerService mWindowManagerService;
     private boolean mBackAnimationInProgress;
     private @BackNavigationInfo.BackTargetType int mLastBackType;
@@ -76,7 +75,13 @@
     private Runnable mPendingAnimation;
     private final NavigationMonitor mNavigationMonitor = new NavigationMonitor();
 
-    AnimationHandler mAnimationHandler;
+    private AnimationHandler mAnimationHandler;
+
+    /**
+     * The transition who match the back navigation targets,
+     * release animation after this transition finish.
+     */
+    private Transition mWaitTransitionFinish;
     private final ArrayList<WindowContainer> mTmpOpenApps = new ArrayList<>();
     private final ArrayList<WindowContainer> mTmpCloseApps = new ArrayList<>();
 
@@ -140,6 +145,11 @@
 
         BackNavigationInfo.Builder infoBuilder = new BackNavigationInfo.Builder();
         synchronized (wmService.mGlobalLock) {
+            if (isMonitoringTransition()) {
+                Slog.w(TAG, "Previous animation hasn't finish, status: " + mAnimationHandler);
+                // Don't start any animation for it.
+                return null;
+            }
             WindowManagerInternal windowManagerInternal =
                     LocalServices.getService(WindowManagerInternal.class);
             IBinder focusedWindowToken = windowManagerInternal.getFocusedWindowToken();
@@ -374,7 +384,7 @@
     }
 
     boolean isMonitoringTransition() {
-        return isWaitBackTransition() || mNavigationMonitor.isMonitoring();
+        return mAnimationHandler.mComposed || mNavigationMonitor.isMonitorForRemote();
     }
 
     private void scheduleAnimation(@NonNull AnimationHandler.ScheduleAnimationBuilder builder) {
@@ -477,7 +487,7 @@
         return false;
     }
 
-    private static class NavigationMonitor {
+    private class NavigationMonitor {
         // The window which triggering the back navigation.
         private WindowState mNavigatingWindow;
         private RemoteCallback mObserver;
@@ -487,15 +497,23 @@
             mObserver = observer;
         }
 
-        void stopMonitor() {
-            mNavigatingWindow = null;
+        void stopMonitorForRemote() {
             mObserver = null;
         }
 
-        boolean isMonitoring() {
+        void stopMonitorTransition() {
+            mNavigatingWindow = null;
+        }
+
+        boolean isMonitorForRemote() {
             return mNavigatingWindow != null && mObserver != null;
         }
 
+        boolean isMonitorAnimationOrTransition() {
+            return mNavigatingWindow != null
+                    && (mAnimationHandler.mComposed || mAnimationHandler.mWaitTransition);
+        }
+
         /**
          * Notify focus window changed during back navigation. This will cancel the gesture for
          * scenarios like: a system window popup, or when an activity add a new window.
@@ -506,7 +524,8 @@
          * a short time, but we should not cancel the navigation.
          */
         private void onFocusWindowChanged(WindowState newFocus) {
-            if (!isMonitoring() || !atSameDisplay(newFocus)) {
+            if (!atSameDisplay(newFocus)
+                    || !(isMonitorForRemote() || isMonitorAnimationOrTransition())) {
                 return;
             }
             // Keep navigating if either new focus == navigating window or null.
@@ -514,7 +533,13 @@
                     && (newFocus.mActivityRecord == null
                     || (newFocus.mActivityRecord == mNavigatingWindow.mActivityRecord))) {
                 EventLogTags.writeWmBackNaviCanceled("focusWindowChanged");
-                mObserver.sendResult(null /* result */);
+                if (isMonitorForRemote()) {
+                    mObserver.sendResult(null /* result */);
+                }
+                if (isMonitorAnimationOrTransition()) {
+                    // transition won't happen, cancel internal status
+                    clearBackAnimations();
+                }
             }
         }
 
@@ -523,7 +548,7 @@
          */
         private void onTransitionReadyWhileNavigate(ArrayList<WindowContainer> opening,
                 ArrayList<WindowContainer> closing) {
-            if (!isMonitoring()) {
+            if (!isMonitorForRemote() && !isMonitorAnimationOrTransition()) {
                 return;
             }
             final ArrayList<WindowContainer> all = new ArrayList<>(opening);
@@ -531,7 +556,12 @@
             for (WindowContainer app : all) {
                 if (app.hasChild(mNavigatingWindow)) {
                     EventLogTags.writeWmBackNaviCanceled("transitionHappens");
-                    mObserver.sendResult(null /* result */);
+                    if (isMonitorForRemote()) {
+                        mObserver.sendResult(null /* result */);
+                    }
+                    if (isMonitorAnimationOrTransition()) {
+                        clearBackAnimations();
+                    }
                     break;
                 }
             }
@@ -539,6 +569,9 @@
         }
 
         private boolean atSameDisplay(WindowState newFocus) {
+            if (mNavigatingWindow == null) {
+                return false;
+            }
             final int navigatingDisplayId = mNavigatingWindow.getDisplayId();
             return newFocus == null || newFocus.getDisplayId() == navigatingDisplayId;
         }
@@ -546,22 +579,20 @@
 
     // For shell transition
     /**
-     *  Check whether the transition targets was animated by back gesture animation.
-     *  Because the opening target could request to do other stuff at onResume, so it could become
-     *  close target for a transition. So the condition here is
-     *  The closing target should only exist in close list, but the opening target can be either in
-     *  open or close list.
-     *  @return {@code true} if the participants of this transition was animated by back gesture
-     *  animations, and shouldn't join next transition.
+     * Check whether the transition targets was animated by back gesture animation.
+     * Because the opening target could request to do other stuff at onResume, so it could become
+     * close target for a transition. So the condition here is
+     * The closing target should only exist in close list, but the opening target can be either in
+     * open or close list.
      */
-    boolean containsBackAnimationTargets(Transition transition) {
+    void onTransactionReady(Transition transition, ArrayList<Transition.ChangeInfo> targets) {
         if (!isMonitoringTransition()) {
-            return false;
+            return;
         }
-        final ArraySet<WindowContainer> targets = transition.mParticipants;
         for (int i = targets.size() - 1; i >= 0; --i) {
-            final WindowContainer wc = targets.valueAt(i);
-            if (wc.asActivityRecord() == null && wc.asTask() == null) {
+            final WindowContainer wc = targets.get(i).mContainer;
+            if (wc.asActivityRecord() == null && wc.asTask() == null
+                    && wc.asTaskFragment() == null) {
                 continue;
             }
             // WC can be visible due to setLaunchBehind
@@ -574,35 +605,49 @@
         final boolean matchAnimationTargets = isWaitBackTransition()
                 && (transition.mType == TRANSIT_CLOSE || transition.mType == TRANSIT_TO_BACK)
                 && mAnimationHandler.containsBackAnimationTargets(mTmpOpenApps, mTmpCloseApps);
+        ProtoLog.d(WM_DEBUG_BACK_PREVIEW,
+                "onTransactionReady, opening: %s, closing: %s, animating: %s, match: %b",
+                mTmpOpenApps, mTmpCloseApps, mAnimationHandler, matchAnimationTargets);
         if (!matchAnimationTargets) {
             mNavigationMonitor.onTransitionReadyWhileNavigate(mTmpOpenApps, mTmpCloseApps);
+        } else {
+            if (mWaitTransitionFinish != null) {
+                Slog.e(TAG, "Gesture animation is applied on another transition?");
+            }
+            mWaitTransitionFinish = transition;
         }
         mTmpOpenApps.clear();
         mTmpCloseApps.clear();
-        return matchAnimationTargets;
     }
 
     boolean isMonitorTransitionTarget(WindowContainer wc) {
-        if (!isWaitBackTransition()) {
+        if (!isWaitBackTransition() || mWaitTransitionFinish == null) {
             return false;
         }
         return mAnimationHandler.isTarget(wc, wc.isVisibleRequested() /* open */);
     }
 
     /**
-     * Cleanup animation, this can either happen when transition ready or finish.
-     * @param cleanupTransaction The transaction which the caller want to apply the internal
-     *                           cleanup together.
+     * Cleanup animation, this can either happen when legacy transition ready, or when the Shell
+     * transition finish.
      */
-    void clearBackAnimations(SurfaceControl.Transaction cleanupTransaction) {
-        mAnimationHandler.clearBackAnimateTarget(cleanupTransaction);
+    void clearBackAnimations() {
+        mAnimationHandler.clearBackAnimateTarget();
+        mNavigationMonitor.stopMonitorTransition();
+        mWaitTransitionFinish = null;
     }
 
-     /**
+    /**
+     * Called when a transition finished.
      * Handle the pending animation when the running transition finished.
      * @param targets The final animation targets derived in transition.
-     */
-    boolean handleDeferredBackAnimation(@NonNull ArrayList<Transition.ChangeInfo> targets) {
+     * @param finishedTransition The finished transition target.
+    */
+    boolean onTransitionFinish(ArrayList<Transition.ChangeInfo> targets,
+            @NonNull Transition finishedTransition) {
+        if (finishedTransition == mWaitTransitionFinish) {
+            clearBackAnimations();
+        }
         if (!mBackAnimationInProgress || mPendingAnimationBuilder == null) {
             return false;
         }
@@ -660,7 +705,7 @@
         private boolean mComposed;
         private boolean mWaitTransition;
         private int mSwitchType = UNKNOWN;
-        private SurfaceControl.Transaction mFinishedTransaction;
+
         // This will be set before transition happen, to know whether the real opening target
         // exactly match animating target. When target match, reparent the starting surface to
         // the opening target like starting window do.
@@ -669,6 +714,7 @@
         // request one during animating.
         private int mRequestedStartingSurfaceTaskId;
         private SurfaceControl mStartingSurface;
+        private ActivityRecord mOpenActivity;
 
         AnimationHandler(WindowManagerService wms) {
             mWindowManagerService = wms;
@@ -697,7 +743,8 @@
             return true;
         }
 
-        private void initiate(WindowContainer close, WindowContainer open)  {
+        private void initiate(WindowContainer close, WindowContainer open,
+                ActivityRecord openActivity)  {
             WindowContainer closeTarget;
             if (isActivitySwitch(close, open)) {
                 mSwitchType = ACTIVITY_SWITCH;
@@ -712,22 +759,26 @@
 
             mCloseAdaptor = createAdaptor(closeTarget, false /* isOpen */);
             mOpenAdaptor = createAdaptor(open, true /* isOpen */);
-
+            mOpenActivity = openActivity;
             if (mCloseAdaptor.mAnimationTarget == null || mOpenAdaptor.mAnimationTarget == null) {
                 Slog.w(TAG, "composeNewAnimations fail, skip");
-                clearBackAnimateTarget(null /* cleanupTransaction */);
+                clearBackAnimateTarget();
             }
         }
 
-        private boolean composeAnimations(@NonNull WindowContainer close,
-                @NonNull WindowContainer open) {
-            clearBackAnimateTarget(null /* cleanupTransaction */);
-            if (close == null || open == null) {
+        boolean composeAnimations(@NonNull WindowContainer close, @NonNull WindowContainer open,
+                ActivityRecord openActivity) {
+            if (mComposed || mWaitTransition) {
+                Slog.e(TAG, "Previous animation is running " + this);
+                return false;
+            }
+            clearBackAnimateTarget();
+            if (close == null || open == null || openActivity == null) {
                 Slog.e(TAG, "reset animation with null target close: "
                         + close + " open: " + open);
                 return false;
             }
-            initiate(close, open);
+            initiate(close, open, openActivity);
             if (mSwitchType == UNKNOWN) {
                 return false;
             }
@@ -781,34 +832,26 @@
             if (!mComposed) {
                 return false;
             }
+
+            // WC must be ActivityRecord in legacy transition, but it also can be Task or
+            // TaskFragment when using Shell transition.
+            // Open target: Can be Task or ActivityRecord or TaskFragment
+            // Close target: Limit to the top activity for now, to reduce the chance of misjudgment.
             final WindowContainer target = open ? mOpenAdaptor.mTarget : mCloseAdaptor.mTarget;
             if (mSwitchType == TASK_SWITCH) {
                 return  wc == target
-                        || (wc.asTask() != null && wc.hasChild(target));
+                        || (wc.asTask() != null && wc.hasChild(target))
+                        || (wc.asActivityRecord() != null && target.hasChild(wc));
             } else if (mSwitchType == ACTIVITY_SWITCH) {
                 return wc == target || (wc.asTaskFragment() != null && wc.hasChild(target));
             }
             return false;
         }
 
-        boolean setFinishTransaction(SurfaceControl.Transaction finishTransaction) {
-            if (!mComposed) {
-                return false;
-            }
-            mFinishedTransaction = finishTransaction;
-            return true;
-        }
-
-        void finishPresentAnimations(SurfaceControl.Transaction t) {
+        void finishPresentAnimations() {
             if (!mComposed) {
                 return;
             }
-            final SurfaceControl.Transaction pt = t != null ? t
-                    : mOpenAdaptor.mTarget.getPendingTransaction();
-            if (mFinishedTransaction != null) {
-                pt.merge(mFinishedTransaction);
-                mFinishedTransaction = null;
-            }
             cleanUpWindowlessSurface();
 
             if (mCloseAdaptor != null) {
@@ -819,6 +862,9 @@
                 mOpenAdaptor.mTarget.cancelAnimation();
                 mOpenAdaptor = null;
             }
+            if (mOpenActivity != null && mOpenActivity.mLaunchTaskBehind) {
+                restoreLaunchBehind(mOpenActivity);
+            }
         }
 
         private void cleanUpWindowlessSurface() {
@@ -845,22 +891,14 @@
             }
         }
 
-        void clearBackAnimateTarget(SurfaceControl.Transaction cleanupTransaction) {
-            finishPresentAnimations(cleanupTransaction);
+        void clearBackAnimateTarget() {
+            finishPresentAnimations();
             mComposed = false;
             mWaitTransition = false;
             mOpenTransitionTargetMatch = false;
             mRequestedStartingSurfaceTaskId = 0;
             mSwitchType = UNKNOWN;
-            if (mFinishedTransaction != null) {
-                Slog.w(TAG, "Clear back animation, found un-processed finished transaction");
-                if (cleanupTransaction != null) {
-                    cleanupTransaction.merge(mFinishedTransaction);
-                } else {
-                    mFinishedTransaction.apply();
-                }
-                mFinishedTransaction = null;
-            }
+            mOpenActivity = null;
         }
 
         // The close target must in close list
@@ -876,9 +914,9 @@
         public String toString() {
             return "AnimationTargets{"
                     + " openTarget= "
-                    + mOpenAdaptor.mTarget
+                    + (mOpenAdaptor != null ? mOpenAdaptor.mTarget : "null")
                     + " closeTarget= "
-                    + mCloseAdaptor.mTarget
+                    + (mCloseAdaptor != null ? mCloseAdaptor.mTarget : "null")
                     + " mSwitchType= "
                     + mSwitchType
                     + " mComposed= "
@@ -1048,14 +1086,13 @@
              * @return If the preview strategy is launch behind, returns the Activity that has
              *         launchBehind set, or null otherwise.
              */
-            private ActivityRecord applyPreviewStrategy(WindowContainer open,
+            private void applyPreviewStrategy(WindowContainer open,
                     ActivityRecord visibleOpenActivity) {
                 if (isSupportWindowlessSurface() && mShowWindowlessSurface && !mIsLaunchBehind) {
                     createStartingSurface(getSnapshot(open));
-                    return null;
+                    return;
                 }
                 setLaunchBehind(visibleOpenActivity);
-                return visibleOpenActivity;
             }
 
             Runnable build() {
@@ -1071,19 +1108,12 @@
                     return null;
                 }
 
-                if (!composeAnimations(mCloseTarget, mOpenTarget)) {
+                if (!composeAnimations(mCloseTarget, mOpenTarget, openActivity)) {
                     return null;
                 }
-                final ActivityRecord launchBehindActivity =
-                        applyPreviewStrategy(mOpenTarget, openActivity);
+                applyPreviewStrategy(mOpenTarget, openActivity);
 
-                final IBackAnimationFinishedCallback callback = makeAnimationFinishedCallback(
-                        launchBehindActivity != null ? triggerBack -> {
-                            if (!triggerBack) {
-                                restoreLaunchBehind(launchBehindActivity);
-                            }
-                        } : null,
-                        mCloseTarget);
+                final IBackAnimationFinishedCallback callback = makeAnimationFinishedCallback();
                 final RemoteAnimationTarget[] targets = getAnimationTargets();
 
                 return () -> {
@@ -1096,31 +1126,17 @@
                 };
             }
 
-            private IBackAnimationFinishedCallback makeAnimationFinishedCallback(
-                    Consumer<Boolean> b, WindowContainer closeTarget) {
+            private IBackAnimationFinishedCallback makeAnimationFinishedCallback() {
                 return new IBackAnimationFinishedCallback.Stub() {
                     @Override
                     public void onAnimationFinished(boolean triggerBack) {
-                        final SurfaceControl.Transaction finishedTransaction =
-                                new SurfaceControl.Transaction();
                         synchronized (mWindowManagerService.mGlobalLock) {
-                            if (b != null) {
-                                b.accept(triggerBack);
-                            }
-                            if (triggerBack) {
-                                final SurfaceControl surfaceControl =
-                                        closeTarget.getSurfaceControl();
-                                if (surfaceControl != null && surfaceControl.isValid()) {
-                                    // Hide the close target surface when transition start.
-                                    finishedTransaction.hide(surfaceControl);
-                                }
-                            }
-                            if (!setFinishTransaction(finishedTransaction)) {
-                                finishedTransaction.apply();
+                            if (!mComposed) {
+                                // animation was canceled
+                                return;
                             }
                             if (!triggerBack) {
-                                clearBackAnimateTarget(
-                                        null /* cleanupTransaction */);
+                                clearBackAnimateTarget();
                             } else {
                                 mWaitTransition = true;
                             }
@@ -1180,6 +1196,14 @@
     }
 
     void startAnimation() {
+        if (!mBackAnimationInProgress) {
+            // gesture is already finished, do not start animation
+            if (mPendingAnimation != null) {
+                clearBackAnimations();
+                mPendingAnimation = null;
+            }
+            return;
+        }
         if (mPendingAnimation != null) {
             mPendingAnimation.run();
             mPendingAnimation = null;
@@ -1192,7 +1216,7 @@
         ProtoLog.d(WM_DEBUG_BACK_PREVIEW, "onBackNavigationDone backType=%s, "
                 + "triggerBack=%b", backType, triggerBack);
 
-        mNavigationMonitor.stopMonitor();
+        mNavigationMonitor.stopMonitorForRemote();
         mBackAnimationInProgress = false;
         mShowWallpaper = false;
         mPendingAnimationBuilder = null;
diff --git a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
index 6773bcd..e447049 100644
--- a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
+++ b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
@@ -487,7 +487,7 @@
                 // The verdict changed from allow (resultIfPiSenderAllowsBal) to block, PI sender
                 // default change is on (otherwise we would have fallen into if above) and we'd
                 // allow if it were off
-                Slog.wtf(TAG, "Without BAL hardening this activity start would NOT be allowed!"
+                Slog.wtf(TAG, "Without BAL hardening this activity start would be allowed!"
                         + stateDumpLog);
             }
         }
diff --git a/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java b/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java
index 002c32e..e88cfbf 100644
--- a/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java
+++ b/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java
@@ -254,11 +254,12 @@
      *
      * If {@code entity} is already added, this method will update its {@code originatingToken}.
      */
-    void addOrUpdateAllowBackgroundStartPrivileges(
-            Binder entity, BackgroundStartPrivileges backgroundStartPrivileges) {
+    void addOrUpdateAllowBackgroundStartPrivileges(@NonNull Binder entity,
+            @NonNull BackgroundStartPrivileges backgroundStartPrivileges) {
         requireNonNull(entity, "entity");
         requireNonNull(backgroundStartPrivileges, "backgroundStartPrivileges");
-        checkArgument(backgroundStartPrivileges.allowsAny());
+        checkArgument(backgroundStartPrivileges.allowsAny(),
+                "backgroundStartPrivileges does not allow anything");
         synchronized (this) {
             if (mBackgroundStartPrivileges == null) {
                 mBackgroundStartPrivileges = new ArrayMap<>();
@@ -271,7 +272,7 @@
      * Removes token {@code entity} that allowed background activity starts added via {@link
      * #addOrUpdateAllowBackgroundStartPrivileges(Binder, BackgroundStartPrivileges)}.
      */
-    void removeAllowBackgroundStartPrivileges(Binder entity) {
+    void removeAllowBackgroundStartPrivileges(@NonNull Binder entity) {
         requireNonNull(entity, "entity");
         synchronized (this) {
             if (mBackgroundStartPrivileges != null) {
diff --git a/services/core/java/com/android/server/wm/ContentRecorder.java b/services/core/java/com/android/server/wm/ContentRecorder.java
index f1c5f911..b808a55 100644
--- a/services/core/java/com/android/server/wm/ContentRecorder.java
+++ b/services/core/java/com/android/server/wm/ContentRecorder.java
@@ -296,6 +296,9 @@
                         + "state %d",
                 mDisplayContent.getDisplayId(), mDisplayContent.getDisplayInfo().state);
 
+        // TODO(b/274790702): Do not start recording if waiting for consent - for now,
+        //  go ahead.
+
         // Create a mirrored hierarchy for the SurfaceControl of the DisplayArea to capture.
         mRecordedSurface = SurfaceControl.mirrorSurface(
                 mRecordedWindowContainer.getSurfaceControl());
diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java
index 13a1cb6..c6db8a7 100644
--- a/services/core/java/com/android/server/wm/Dimmer.java
+++ b/services/core/java/com/android/server/wm/Dimmer.java
@@ -126,6 +126,9 @@
         boolean isVisible;
         SurfaceAnimator mSurfaceAnimator;
 
+        // TODO(b/64816140): Remove after confirming dimmer layer always matches its container.
+        final Rect mDimBounds = new Rect();
+
         /**
          * Determines whether the dim layer should animate before destroying.
          */
@@ -260,11 +263,16 @@
      * {@link WindowContainer#prepareSurfaces}. After calling this, the container should
      * chain {@link WindowContainer#prepareSurfaces} down to it's children to give them
      * a chance to request dims to continue.
+     * @return Non-null dim bounds if the dimmer is showing.
      */
-    void resetDimStates() {
-        if (mDimState != null && !mDimState.mDontReset) {
+    Rect resetDimStates() {
+        if (mDimState == null) {
+            return null;
+        }
+        if (!mDimState.mDontReset) {
             mDimState.mDimming = false;
         }
+        return mDimState.mDimBounds;
     }
 
     void dontAnimateExit() {
@@ -275,13 +283,13 @@
 
     /**
      * Call after invoking {@link WindowContainer#prepareSurfaces} on children as
-     * described in {@link #resetDimStates}.
+     * described in {@link #resetDimStates}. The dim bounds returned by {@link #resetDimStates}
+     * should be set before calling this method.
      *
      * @param t      A transaction in which to update the dims.
-     * @param bounds The bounds at which to dim.
      * @return true if any Dims were updated.
      */
-    boolean updateDims(SurfaceControl.Transaction t, Rect bounds) {
+    boolean updateDims(SurfaceControl.Transaction t) {
         if (mDimState == null) {
             return false;
         }
@@ -297,6 +305,7 @@
             mDimState = null;
             return false;
         } else {
+            final Rect bounds = mDimState.mDimBounds;
             // TODO: Once we use geometry from hierarchy this falls away.
             t.setPosition(mDimState.mDimLayer, bounds.left, bounds.top);
             t.setWindowCrop(mDimState.mDimLayer, bounds.width(), bounds.height());
diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java
index c2ddb41..26f56a2 100644
--- a/services/core/java/com/android/server/wm/DisplayArea.java
+++ b/services/core/java/com/android/server/wm/DisplayArea.java
@@ -148,7 +148,7 @@
     @ScreenOrientation
     int getOrientation(int candidate) {
         final int orientation = super.getOrientation(candidate);
-        if (getIgnoreOrientationRequest(orientation)) {
+        if (shouldIgnoreOrientationRequest(orientation)) {
             // In all the other case, mLastOrientationSource will be reassigned to a new value
             mLastOrientationSource = null;
             return SCREEN_ORIENTATION_UNSET;
@@ -158,7 +158,7 @@
 
     @Override
     boolean handlesOrientationChangeFromDescendant(@ScreenOrientation int orientation) {
-        return !getIgnoreOrientationRequest(orientation)
+        return !shouldIgnoreOrientationRequest(orientation)
                 && super.handlesOrientationChangeFromDescendant(orientation);
     }
 
@@ -169,7 +169,7 @@
         final int orientation = requestingContainer != null
                 ? requestingContainer.getOverrideOrientation()
                 : SCREEN_ORIENTATION_UNSET;
-        return !getIgnoreOrientationRequest(orientation)
+        return !shouldIgnoreOrientationRequest(orientation)
                 && super.onDescendantOrientationChanged(requestingContainer);
     }
 
@@ -236,8 +236,7 @@
     /**
      * @return {@value true} if we need to ignore the orientation in input.
      */
-    // TODO(b/262366204): Rename getIgnoreOrientationRequest to shouldIgnoreOrientationRequest
-    boolean getIgnoreOrientationRequest(@ScreenOrientation int orientation) {
+    boolean shouldIgnoreOrientationRequest(@ScreenOrientation int orientation) {
         // We always respect orientation request for ActivityInfo.SCREEN_ORIENTATION_LOCKED
         // ActivityInfo.SCREEN_ORIENTATION_NOSENSOR.
         // Main use case why this is important is Camera apps that rely on those
@@ -768,7 +767,6 @@
      */
     static class Dimmable extends DisplayArea<DisplayArea> {
         private final Dimmer mDimmer = new Dimmer(this);
-        private final Rect mTmpDimBoundsRect = new Rect();
 
         Dimmable(WindowManagerService wms, Type type, String name, int featureId) {
             super(wms, type, name, featureId);
@@ -781,11 +779,13 @@
 
         @Override
         void prepareSurfaces() {
-            mDimmer.resetDimStates();
+            final Rect dimBounds = mDimmer.resetDimStates();
             super.prepareSurfaces();
-            // Bounds need to be relative, as the dim layer is a child.
-            getBounds(mTmpDimBoundsRect);
-            mTmpDimBoundsRect.offsetTo(0 /* newLeft */, 0 /* newTop */);
+            if (dimBounds != null) {
+                // Bounds need to be relative, as the dim layer is a child.
+                getBounds(dimBounds);
+                dimBounds.offsetTo(0 /* newLeft */, 0 /* newTop */);
+            }
 
             // If SystemUI is dragging for recents, we want to reset the dim state so any dim layer
             // on the display level fades out.
@@ -793,8 +793,10 @@
                 mDimmer.resetDimStates();
             }
 
-            if (mDimmer.updateDims(getSyncTransaction(), mTmpDimBoundsRect)) {
-                scheduleAnimation();
+            if (dimBounds != null) {
+                if (mDimmer.updateDims(getSyncTransaction())) {
+                    scheduleAnimation();
+                }
             }
         }
     }
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index a44f25c..bec58b8 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1648,7 +1648,7 @@
 
     @Override
     boolean handlesOrientationChangeFromDescendant(@ScreenOrientation int orientation) {
-        return !getIgnoreOrientationRequest(orientation)
+        return !shouldIgnoreOrientationRequest(orientation)
                 && !getDisplayRotation().isFixedToUserRotation();
     }
 
@@ -1752,7 +1752,7 @@
         }
         final int activityOrientation = r.getOverrideOrientation();
         if (!WindowManagerService.ENABLE_FIXED_ROTATION_TRANSFORM
-                || getIgnoreOrientationRequest(activityOrientation)) {
+                || shouldIgnoreOrientationRequest(activityOrientation)) {
             return ROTATION_UNDEFINED;
         }
         if (activityOrientation == ActivityInfo.SCREEN_ORIENTATION_BEHIND) {
@@ -2921,6 +2921,7 @@
                         /* includeRotationSettings */ false);
                 mDisplaySwitchTransitionLauncher.requestDisplaySwitchTransitionIfNeeded(mDisplayId,
                         mInitialDisplayWidth, mInitialDisplayHeight, newWidth, newHeight);
+                mDisplayRotation.physicalDisplayChanged();
             }
 
             // If there is an override set for base values - use it, otherwise use new values.
@@ -3291,7 +3292,6 @@
             mTransitionController.unregisterLegacyListener(mFixedRotationTransitionListener);
             handleAnimatingStoppedAndTransition();
             mWmService.stopFreezingDisplayLocked();
-            mDisplayRotation.removeDefaultDisplayRotationChangedCallback();
             mDeviceStateController.unregisterDeviceStateCallback(mDeviceStateConsumer);
             super.removeImmediately();
             if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Removing display=" + this);
@@ -3305,6 +3305,7 @@
             mWindowingLayer.release();
             mInputMonitor.onDisplayRemoved();
             mWmService.mDisplayNotificationController.dispatchDisplayRemoved(this);
+            mDisplayRotation.onDisplayRemoved();
             mWmService.mAccessibilityController.onDisplayRemoved(mDisplayId);
             mRootWindowContainer.mTaskSupervisor
                     .getKeyguardController().onDisplayRemoved(mDisplayId);
@@ -5148,17 +5149,17 @@
         @ScreenOrientation
         int getOrientation(@ScreenOrientation int candidate) {
             // IME does not participate in orientation.
-            return getIgnoreOrientationRequest(candidate) ? SCREEN_ORIENTATION_UNSET : candidate;
+            return shouldIgnoreOrientationRequest(candidate) ? SCREEN_ORIENTATION_UNSET : candidate;
         }
 
         @Override
         void updateAboveInsetsState(InsetsState aboveInsetsState,
-                SparseArray<InsetsSourceProvider> localInsetsSourceProvidersFromParent,
+                SparseArray<InsetsSource> localInsetsSourcesFromParent,
                 ArraySet<WindowState> insetsChangedWindows) {
             if (skipImeWindowsDuringTraversal(mDisplayContent)) {
                 return;
             }
-            super.updateAboveInsetsState(aboveInsetsState, localInsetsSourceProvidersFromParent,
+            super.updateAboveInsetsState(aboveInsetsState, localInsetsSourcesFromParent,
                     insetsChangedWindows);
         }
 
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 22dd0e5..6ed2025 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -1122,7 +1122,6 @@
                     inOutFrame.set(windowContainer.getBounds());
                     break;
                 case SOURCE_FRAME:
-                    inOutFrame.inset(win.mGivenContentInsets);
                     extendByCutout =
                             (lp.privateFlags & PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT) != 0;
                     break;
@@ -1981,6 +1980,14 @@
             return;
         }
 
+        if (controlTarget != null) {
+            final WindowState win = controlTarget.getWindow();
+
+            if (win != null && win.isActivityTypeDream()) {
+                return;
+            }
+        }
+
         final @InsetsType int restorePositionTypes = (Type.statusBars() | Type.navigationBars())
                 & controlTarget.getRequestedVisibleTypes();
 
diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java
index 72263ff..628f4d3 100644
--- a/services/core/java/com/android/server/wm/DisplayRotation.java
+++ b/services/core/java/com/android/server/wm/DisplayRotation.java
@@ -51,8 +51,13 @@
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.database.ContentObserver;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
 import android.hardware.power.Boost;
 import android.os.Handler;
+import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.Settings;
@@ -87,8 +92,6 @@
  */
 public class DisplayRotation {
     private static final String TAG = TAG_WITH_CLASS_NAME ? "DisplayRotation" : TAG_WM;
-    // Delay to avoid race between fold update and orientation update.
-    private static final int ORIENTATION_UPDATE_DELAY_MS = 800;
 
     // Delay in milliseconds when updating config due to folding events. This prevents
     // config changes and unexpected jumps while folding the device to closed state.
@@ -1087,6 +1090,10 @@
             return false;
         }
 
+        if (mFoldController != null && mFoldController.shouldDisableRotationSensor()) {
+            return false;
+        }
+
         if (mSupportAutoRotation) {
             if (mCurrentAppOrientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR
                     || mCurrentAppOrientation == ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
@@ -1185,6 +1192,9 @@
         int sensorRotation = mOrientationListener != null
                 ? mOrientationListener.getProposedRotation() // may be -1
                 : -1;
+        if (mFoldController != null && mFoldController.shouldIgnoreSensorRotation()) {
+            sensorRotation = -1;
+        }
         if (mDeviceStateController.shouldReverseRotationDirectionAroundZAxis()) {
             sensorRotation = RotationUtils.reverseRotationDirectionAroundZAxis(sensorRotation);
         }
@@ -1427,6 +1437,11 @@
             return false;
         }
 
+        // Do not show rotation choice when fold controller blocks rotation sensor
+        if (mFoldController != null && mFoldController.shouldIgnoreSensorRotation()) {
+            return false;
+        }
+
         // Don't show rotation choice if we are in tabletop or book modes.
         if (isTabletopAutoRotateOverrideEnabled()) return false;
 
@@ -1529,6 +1544,13 @@
         }
     }
 
+    void onDisplayRemoved() {
+        removeDefaultDisplayRotationChangedCallback();
+        if (mFoldController != null) {
+            mFoldController.onDisplayRemoved();
+        }
+    }
+
     /** Return whether the rotation settings has changed. */
     private boolean updateSettings() {
         final ContentResolver resolver = mContext.getContentResolver();
@@ -1624,6 +1646,22 @@
         pw.println(prefix + "  mLidOpenRotation=" + Surface.rotationToString(mLidOpenRotation));
         pw.println(prefix + "  mFixedToUserRotation=" + isFixedToUserRotation());
 
+        if (mFoldController != null) {
+            pw.println(prefix + "FoldController");
+            pw.println(prefix + "  mPauseAutorotationDuringUnfolding="
+                    + mFoldController.mPauseAutorotationDuringUnfolding);
+            pw.println(prefix + "  mShouldDisableRotationSensor="
+                    + mFoldController.mShouldDisableRotationSensor);
+            pw.println(prefix + "  mShouldIgnoreSensorRotation="
+                    + mFoldController.mShouldIgnoreSensorRotation);
+            pw.println(prefix + "  mLastDisplaySwitchTime="
+                    + mFoldController.mLastDisplaySwitchTime);
+            pw.println(prefix + "  mLastHingeAngleEventTime="
+                    + mFoldController.mLastHingeAngleEventTime);
+            pw.println(prefix + "  mDeviceState="
+                    + mFoldController.mDeviceState);
+        }
+
         if (!mRotationHistory.mRecords.isEmpty()) {
             pw.println();
             pw.println(prefix + "  RotationHistory");
@@ -1665,13 +1703,37 @@
         }
     }
 
-    private class FoldController {
+    /**
+     * Called by the DisplayContent when the physical display changes
+     */
+    void physicalDisplayChanged() {
+        if (mFoldController != null) {
+            mFoldController.onPhysicalDisplayChanged();
+        }
+    }
+
+    @VisibleForTesting
+    long uptimeMillis() {
+        return SystemClock.uptimeMillis();
+    }
+
+    class FoldController {
+        private final boolean mPauseAutorotationDuringUnfolding;
         @Surface.Rotation
         private int mHalfFoldSavedRotation = -1; // No saved rotation
         private DeviceStateController.DeviceState mDeviceState =
                 DeviceStateController.DeviceState.UNKNOWN;
+        private long mLastHingeAngleEventTime = 0;
+        private long mLastDisplaySwitchTime = 0;
+        private boolean mShouldIgnoreSensorRotation;
+        private boolean mShouldDisableRotationSensor;
         private boolean mInHalfFoldTransition = false;
+        private int mDisplaySwitchRotationBlockTimeMs;
+        private int mHingeAngleRotationBlockTimeMs;
+        private int mMaxHingeAngle;
         private final boolean mIsDisplayAlwaysSeparatingHinge;
+        private SensorManager mSensorManager;
+        private SensorEventListener mHingeAngleSensorEventListener;
         private final Set<Integer> mTabletopRotations;
         private final Runnable mActivityBoundsUpdateCallback;
 
@@ -1728,6 +1790,48 @@
                     }
                 }
             };
+
+            mPauseAutorotationDuringUnfolding = mContext.getResources().getBoolean(
+                    R.bool.config_windowManagerPauseRotationWhenUnfolding);
+
+            if (mPauseAutorotationDuringUnfolding) {
+                mDisplaySwitchRotationBlockTimeMs = mContext.getResources().getInteger(
+                        R.integer.config_pauseRotationWhenUnfolding_displaySwitchTimeout);
+                mHingeAngleRotationBlockTimeMs = mContext.getResources().getInteger(
+                        R.integer.config_pauseRotationWhenUnfolding_hingeEventTimeout);
+                mMaxHingeAngle = mContext.getResources().getInteger(
+                        R.integer.config_pauseRotationWhenUnfolding_maxHingeAngle);
+                registerSensorManager();
+            }
+        }
+
+        private void registerSensorManager() {
+            mSensorManager = mContext.getSystemService(SensorManager.class);
+            if (mSensorManager != null) {
+                final Sensor hingeAngleSensor = mSensorManager
+                        .getDefaultSensor(Sensor.TYPE_HINGE_ANGLE);
+
+                if (hingeAngleSensor != null) {
+                    mHingeAngleSensorEventListener = new SensorEventListener() {
+                        @Override
+                        public void onSensorChanged(SensorEvent event) {
+                            onHingeAngleChanged(event.values[0]);
+                        }
+
+                        @Override
+                        public void onAccuracyChanged(Sensor sensor, int accuracy) {
+                        }
+                    };
+                    mSensorManager.registerListener(mHingeAngleSensorEventListener,
+                            hingeAngleSensor, SensorManager.SENSOR_DELAY_FASTEST, getHandler());
+                }
+            }
+        }
+
+        void onDisplayRemoved() {
+            if (mSensorManager != null && mHingeAngleSensorEventListener != null) {
+                mSensorManager.unregisterListener(mHingeAngleSensorEventListener);
+            }
         }
 
         boolean isDeviceInPosture(DeviceStateController.DeviceState state, boolean isTabletop) {
@@ -1757,6 +1861,7 @@
         boolean shouldRevertOverriddenRotation() {
             // When transitioning to open.
             return mDeviceState == DeviceStateController.DeviceState.OPEN
+                    && !mShouldIgnoreSensorRotation // Ignore if the hinge angle still moving
                     && mInHalfFoldTransition
                     && mHalfFoldSavedRotation != -1 // Ignore if we've already reverted.
                     && mUserRotationMode
@@ -1789,20 +1894,94 @@
                 mDeviceState = newState;
                 // Now mFoldState is set to HALF_FOLDED, the overrideFrozenRotation function will
                 // return true, so rotation is unlocked.
+                mService.updateRotation(false /* alwaysSendConfiguration */,
+                        false /* forceRelayout */);
             } else {
                 mInHalfFoldTransition = true;
                 mDeviceState = newState;
+                // Tell the device to update its orientation.
+                mService.updateRotation(false /* alwaysSendConfiguration */,
+                        false /* forceRelayout */);
             }
-            UiThread.getHandler().postDelayed(
-                    () -> {
-                        mService.updateRotation(false /* alwaysSendConfiguration */,
-                                false /* forceRelayout */);
-                    }, ORIENTATION_UPDATE_DELAY_MS);
             // Alert the activity of possible new bounds.
             UiThread.getHandler().removeCallbacks(mActivityBoundsUpdateCallback);
             UiThread.getHandler().postDelayed(mActivityBoundsUpdateCallback,
                     FOLDING_RECOMPUTE_CONFIG_DELAY_MS);
         }
+
+        boolean shouldIgnoreSensorRotation() {
+            return mShouldIgnoreSensorRotation;
+        }
+
+        boolean shouldDisableRotationSensor() {
+            return mShouldDisableRotationSensor;
+        }
+
+        private void updateSensorRotationBlockIfNeeded() {
+            final long currentTime = uptimeMillis();
+            final boolean newShouldIgnoreRotation =
+                    currentTime - mLastDisplaySwitchTime < mDisplaySwitchRotationBlockTimeMs
+                    || currentTime - mLastHingeAngleEventTime < mHingeAngleRotationBlockTimeMs;
+
+            if (newShouldIgnoreRotation != mShouldIgnoreSensorRotation) {
+                mShouldIgnoreSensorRotation = newShouldIgnoreRotation;
+
+                // Resuming the autorotation
+                if (!mShouldIgnoreSensorRotation) {
+                    if (mShouldDisableRotationSensor) {
+                        // Sensor was disabled, let's re-enable it
+                        mShouldDisableRotationSensor = false;
+                        updateOrientationListenerLw();
+                    } else {
+                        // Sensor was not disabled, let's update the rotation in case if we received
+                        // some rotation sensor updates when autorotate was disabled
+                        updateRotationAndSendNewConfigIfChanged();
+                    }
+                }
+            }
+        }
+
+        void onPhysicalDisplayChanged() {
+            if (!mPauseAutorotationDuringUnfolding) return;
+
+            mLastDisplaySwitchTime = uptimeMillis();
+
+            final boolean isUnfolding =
+                    mDeviceState == DeviceStateController.DeviceState.OPEN
+                    || mDeviceState == DeviceStateController.DeviceState.HALF_FOLDED;
+
+            if (isUnfolding) {
+                // Temporary disable rotation sensor updates when unfolding
+                mShouldDisableRotationSensor = true;
+                updateOrientationListenerLw();
+            }
+
+            updateSensorRotationBlockIfNeeded();
+            getHandler().postDelayed(() -> {
+                synchronized (mLock) {
+                    updateSensorRotationBlockIfNeeded();
+                };
+            }, mDisplaySwitchRotationBlockTimeMs);
+        }
+
+        void onHingeAngleChanged(float hingeAngle) {
+            if (hingeAngle < mMaxHingeAngle) {
+                mLastHingeAngleEventTime = uptimeMillis();
+
+                updateSensorRotationBlockIfNeeded();
+
+                getHandler().postDelayed(() -> {
+                    synchronized (mLock) {
+                        updateSensorRotationBlockIfNeeded();
+                    };
+                }, mHingeAngleRotationBlockTimeMs);
+            }
+        }
+    }
+
+    @VisibleForTesting
+    Handler getHandler() {
+        return mService.mH;
     }
 
     private class OrientationListener extends WindowOrientationListener implements Runnable {
diff --git a/services/core/java/com/android/server/wm/EmbeddedWindowController.java b/services/core/java/com/android/server/wm/EmbeddedWindowController.java
index c3c727a..44d6768 100644
--- a/services/core/java/com/android/server/wm/EmbeddedWindowController.java
+++ b/services/core/java/com/android/server/wm/EmbeddedWindowController.java
@@ -99,23 +99,6 @@
         }
     }
 
-    WindowState getHostWindow(IBinder inputToken) {
-        EmbeddedWindow embeddedWindow = mWindows.get(inputToken);
-        return embeddedWindow != null ? embeddedWindow.mHostWindowState : null;
-    }
-
-    boolean isOverlay(IBinder inputToken) {
-        EmbeddedWindow embeddedWindow = mWindows.get(inputToken);
-        return embeddedWindow != null ? embeddedWindow.getIsOverlay() : false;
-    }
-
-    void setIsOverlay(IBinder focusGrantToken) {
-        EmbeddedWindow embeddedWindow = mWindowsByFocusToken.get(focusGrantToken);
-        if (embeddedWindow != null) {
-            embeddedWindow.setIsOverlay();
-        }
-    }
-
     void remove(IWindow client) {
         for (int i = mWindows.size() - 1; i >= 0; i--) {
             EmbeddedWindow ew = mWindows.valueAt(i);
@@ -176,14 +159,15 @@
         public Session mSession;
         InputChannel mInputChannel;
         final int mWindowType;
-        // Track whether the EmbeddedWindow is a system hosted overlay via
-        // {@link OverlayHost}. In the case of client hosted overlays, the client
-        // view hierarchy will take care of invoking requestEmbeddedWindowFocus
-        // but for system hosted overlays we have to do this via tapOutsideDetection
-        // and this variable is mostly used for tracking that.
-        boolean mIsOverlay = false;
 
-        private IBinder mFocusGrantToken;
+        /**
+         * A unique token associated with the embedded window that can be used by the host window
+         * to request focus transfer to the embedded. This is not the input token since we don't
+         * want to give clients access to each others input token.
+         */
+        private final IBinder mFocusGrantToken;
+
+        private boolean mIsFocusable;
 
         /**
          * @param session  calling session to check ownership of the window
@@ -199,7 +183,8 @@
          */
         EmbeddedWindow(Session session, WindowManagerService service, IWindow clientToken,
                        WindowState hostWindowState, int ownerUid, int ownerPid, int windowType,
-                       int displayId, IBinder focusGrantToken, String inputHandleName) {
+                       int displayId, IBinder focusGrantToken, String inputHandleName,
+                       boolean isFocusable) {
             mSession = session;
             mWmService = service;
             mClient = clientToken;
@@ -214,6 +199,7 @@
             final String hostWindowName =
                     (mHostWindowState != null) ? "-" + mHostWindowState.getWindowTag().toString()
                             : "";
+            mIsFocusable = isFocusable;
             mName = "Embedded{" + inputHandleName + hostWindowName + "}";
         }
 
@@ -279,13 +265,6 @@
             return mOwnerUid;
         }
 
-        void setIsOverlay() {
-            mIsOverlay = true;
-        }
-        boolean getIsOverlay() {
-            return mIsOverlay;
-        }
-
         IBinder getFocusGrantToken() {
             return mFocusGrantToken;
         }
@@ -297,20 +276,35 @@
             return null;
         }
 
+        void setIsFocusable(boolean isFocusable) {
+            mIsFocusable = isFocusable;
+        }
+
         /**
-         * System hosted overlays need the WM to invoke grantEmbeddedWindowFocus and
-         * so we need to participate inside handlePointerDownOutsideFocus logic
-         * however client hosted overlays will rely on the hosting view hierarchy
-         * to grant and revoke focus, and so the server side logic is not needed.
+         * When an embedded window is touched when it's not currently focus, we need to switch
+         * focus to that embedded window unless the embedded window was marked as not focusable.
          */
         @Override
         public boolean receiveFocusFromTapOutside() {
-            return mIsOverlay;
+            return mIsFocusable;
         }
 
         private void handleTap(boolean grantFocus) {
             if (mInputChannel != null) {
-                mWmService.grantEmbeddedWindowFocus(mSession, mFocusGrantToken, grantFocus);
+                if (mHostWindowState != null) {
+                    // Use null session since this is being granted by system server and doesn't
+                    // require the host session to be passed in
+                    mWmService.grantEmbeddedWindowFocus(null, mHostWindowState.mClient,
+                            mFocusGrantToken, grantFocus);
+                    if (grantFocus) {
+                        // If granting focus to the embedded when tapped, we need to ensure the host
+                        // gains focus as well or the transfer won't take effect since it requires
+                        // the host to transfer the focus to the embedded.
+                        mHostWindowState.handleTapOutsideFocusInsideSelf();
+                    }
+                } else {
+                    mWmService.grantEmbeddedWindowFocus(mSession, mFocusGrantToken, grantFocus);
+                }
             }
         }
 
@@ -326,7 +320,7 @@
 
         @Override
         public boolean shouldControlIme() {
-            return false;
+            return mHostWindowState != null;
         }
 
         @Override
@@ -336,6 +330,9 @@
 
         @Override
         public InsetsControlTarget getImeControlTarget() {
+            if (mHostWindowState != null) {
+                return mHostWindowState.getImeControlTarget();
+            }
             return mWmService.getDefaultDisplayContentLocked().mRemoteInsetsControlTarget;
         }
 
@@ -346,7 +343,7 @@
 
         @Override
         public ActivityRecord getActivityRecord() {
-            return null;
+            return mHostActivityRecord;
         }
 
         @Override
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index 4be98a3..b4dffdc 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -48,7 +48,7 @@
  * Controller for IME inset source on the server. It's called provider as it provides the
  * {@link InsetsSource} to the client that uses it in {@link InsetsSourceConsumer}.
  */
-final class ImeInsetsSourceProvider extends WindowContainerInsetsSourceProvider {
+final class ImeInsetsSourceProvider extends InsetsSourceProvider {
 
     /** The token tracking the current IME request or {@code null} otherwise. */
     @Nullable
diff --git a/services/core/java/com/android/server/wm/InputWindowHandleWrapper.java b/services/core/java/com/android/server/wm/InputWindowHandleWrapper.java
index 301c184..3d4e0eb 100644
--- a/services/core/java/com/android/server/wm/InputWindowHandleWrapper.java
+++ b/services/core/java/com/android/server/wm/InputWindowHandleWrapper.java
@@ -289,6 +289,14 @@
         mChanged = true;
     }
 
+    void setFocusTransferTarget(IBinder toToken) {
+        if (mHandle.focusTransferTarget == toToken) {
+            return;
+        }
+        mHandle.focusTransferTarget = toToken;
+        mChanged = true;
+    }
+
     @Override
     public String toString() {
         return mHandle + ", changed=" + mChanged;
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index a8c9cd3..fe13b87 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -223,10 +223,10 @@
 
         startAnimation(false /* show */, () -> {
             synchronized (mDisplayContent.mWmService.mGlobalLock) {
-                final SparseArray<WindowContainerInsetsSourceProvider> providers =
+                final SparseArray<InsetsSourceProvider> providers =
                         mStateController.getSourceProviders();
                 for (int i = providers.size() - 1; i >= 0; i--) {
-                    final WindowContainerInsetsSourceProvider provider = providers.valueAt(i);
+                    final InsetsSourceProvider provider = providers.valueAt(i);
                     if (!isTransient(provider.getSource().getType())) {
                         continue;
                     }
@@ -341,11 +341,10 @@
             }
         }
 
-        final SparseArray<WindowContainerInsetsSourceProvider> providers =
-                mStateController.getSourceProviders();
+        final SparseArray<InsetsSourceProvider> providers = mStateController.getSourceProviders();
         final int windowType = attrs.type;
         for (int i = providers.size() - 1; i >= 0; i--) {
-            final WindowContainerInsetsSourceProvider otherProvider = providers.valueAt(i);
+            final InsetsSourceProvider otherProvider = providers.valueAt(i);
             if (otherProvider.overridesFrame(windowType)) {
                 if (state == originalState) {
                     state = new InsetsState(state);
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index 0953604..3e03b99 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -58,7 +58,7 @@
  * Controller for a specific inset source on the server. It's called provider as it provides the
  * {@link InsetsSource} to the client that uses it in {@link android.view.InsetsSourceConsumer}.
  */
-abstract class InsetsSourceProvider {
+class InsetsSourceProvider {
 
     protected final DisplayContent mDisplayContent;
     protected final @NonNull InsetsSource mSource;
@@ -218,8 +218,6 @@
         if (mFrameProvider != null) {
             mFrameProvider.accept(mWindowContainer.getDisplayContent().mDisplayFrames,
                     mWindowContainer, mSourceFrame);
-        } else {
-            mSourceFrame.inset(win.mGivenContentInsets);
         }
         updateSourceFrameForServerVisibility();
 
diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java
index e4ffb8d..249ead0 100644
--- a/services/core/java/com/android/server/wm/InsetsStateController.java
+++ b/services/core/java/com/android/server/wm/InsetsStateController.java
@@ -56,7 +56,7 @@
     private final InsetsState mState = new InsetsState();
     private final DisplayContent mDisplayContent;
 
-    private final SparseArray<WindowContainerInsetsSourceProvider> mProviders = new SparseArray<>();
+    private final SparseArray<InsetsSourceProvider> mProviders = new SparseArray<>();
     private final ArrayMap<InsetsControlTarget, ArrayList<InsetsSourceProvider>>
             mControlTargetProvidersMap = new ArrayMap<>();
     private final SparseArray<InsetsControlTarget> mIdControlTargetMap = new SparseArray<>();
@@ -106,22 +106,22 @@
         return result;
     }
 
-    SparseArray<WindowContainerInsetsSourceProvider> getSourceProviders() {
+    SparseArray<InsetsSourceProvider> getSourceProviders() {
         return mProviders;
     }
 
     /**
      * @return The provider of a specific source ID.
      */
-    WindowContainerInsetsSourceProvider getOrCreateSourceProvider(int id, @InsetsType int type) {
-        WindowContainerInsetsSourceProvider provider = mProviders.get(id);
+    InsetsSourceProvider getOrCreateSourceProvider(int id, @InsetsType int type) {
+        InsetsSourceProvider provider = mProviders.get(id);
         if (provider != null) {
             return provider;
         }
         final InsetsSource source = mState.getOrCreateSource(id, type);
         provider = id == ID_IME
                 ? new ImeInsetsSourceProvider(source, this, mDisplayContent)
-                : new WindowContainerInsetsSourceProvider(source, this, mDisplayContent);
+                : new InsetsSourceProvider(source, this, mDisplayContent);
         mProviders.put(id, provider);
         return provider;
     }
@@ -161,14 +161,15 @@
         final InsetsState aboveInsetsState = new InsetsState();
         aboveInsetsState.set(mState,
                 displayCutout() | systemGestures() | mandatorySystemGestures());
+        final SparseArray<InsetsSource> localInsetsSourcesFromParent = new SparseArray<>();
         final ArraySet<WindowState> insetsChangedWindows = new ArraySet<>();
-        final SparseArray<InsetsSourceProvider>
-                localInsetsSourceProvidersFromParent = new SparseArray<>();
+
         // This method will iterate on the entire hierarchy in top to bottom z-order manner. The
         // aboveInsetsState will be modified as per the insets provided by the WindowState being
         // visited.
-        mDisplayContent.updateAboveInsetsState(aboveInsetsState,
-                localInsetsSourceProvidersFromParent, insetsChangedWindows);
+        mDisplayContent.updateAboveInsetsState(aboveInsetsState, localInsetsSourcesFromParent,
+                insetsChangedWindows);
+
         if (notifyInsetsChange) {
             for (int i = insetsChangedWindows.size() - 1; i >= 0; i--) {
                 mDispatchInsetsChanged.accept(insetsChangedWindows.valueAt(i));
@@ -333,7 +334,7 @@
         }
         mDisplayContent.mWmService.mAnimator.addAfterPrepareSurfacesRunnable(() -> {
             for (int i = mProviders.size() - 1; i >= 0; i--) {
-                final WindowContainerInsetsSourceProvider provider = mProviders.valueAt(i);
+                final InsetsSourceProvider provider = mProviders.valueAt(i);
                 provider.onSurfaceTransactionApplied();
             }
             final ArraySet<InsetsControlTarget> newControlTargets = new ArraySet<>();
diff --git a/services/core/java/com/android/server/wm/LaunchParamsPersister.java b/services/core/java/com/android/server/wm/LaunchParamsPersister.java
index bb50372..bf511adf0 100644
--- a/services/core/java/com/android/server/wm/LaunchParamsPersister.java
+++ b/services/core/java/com/android/server/wm/LaunchParamsPersister.java
@@ -263,8 +263,8 @@
         boolean changed = !Objects.equals(params.mDisplayUniqueId, info.uniqueId);
         params.mDisplayUniqueId = info.uniqueId;
 
-        changed |= params.mWindowingMode != task.getTaskDisplayArea().getWindowingMode();
-        params.mWindowingMode = task.getTaskDisplayArea().getWindowingMode();
+        changed |= params.mWindowingMode != task.getWindowingMode();
+        params.mWindowingMode = task.getWindowingMode();
 
         if (task.mLastNonFullscreenBounds != null) {
             changed |= !Objects.equals(params.mBounds, task.mLastNonFullscreenBounds);
diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java
index a1e6cd7..93233dd 100644
--- a/services/core/java/com/android/server/wm/LetterboxUiController.java
+++ b/services/core/java/com/android/server/wm/LetterboxUiController.java
@@ -50,6 +50,7 @@
 import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE;
 import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE;
 import static android.view.WindowManager.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS;
+import static android.view.WindowManager.PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED;
 import static android.view.WindowManager.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION;
 
 import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__BOTTOM;
@@ -126,7 +127,8 @@
 final class LetterboxUiController {
 
     private static final Predicate<ActivityRecord> FIRST_OPAQUE_NOT_FINISHING_ACTIVITY_PREDICATE =
-            activityRecord -> activityRecord.fillsParent() && !activityRecord.isFinishing();
+            activityRecord -> activityRecord.fillsParent() && !activityRecord.isFinishing()
+                    && activityRecord.nowVisible;
 
     private static final String TAG = TAG_WITH_CLASS_NAME ? "LetterboxUiController" : TAG_ATM;
 
@@ -234,9 +236,14 @@
     private final Boolean mBooleanPropertyIgnoreRequestedOrientation;
 
     @Nullable
+    private final Boolean mBooleanPropertyIgnoreOrientationRequestWhenLoopDetected;
+
+    @Nullable
     private final Boolean mBooleanPropertyFakeFocus;
 
-    private boolean mIsRelauchingAfterRequestedOrientationChanged;
+    private boolean mIsRelaunchingAfterRequestedOrientationChanged;
+
+    private boolean mLastShouldShowLetterboxUi;
 
     private boolean mDoubleTapEvent;
 
@@ -252,6 +259,10 @@
                 readComponentProperty(packageManager, mActivityRecord.packageName,
                         mLetterboxConfiguration::isPolicyForIgnoringRequestedOrientationEnabled,
                         PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION);
+        mBooleanPropertyIgnoreOrientationRequestWhenLoopDetected =
+                readComponentProperty(packageManager, mActivityRecord.packageName,
+                        mLetterboxConfiguration::isPolicyForIgnoringRequestedOrientationEnabled,
+                        PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED);
         mBooleanPropertyFakeFocus =
                 readComponentProperty(packageManager, mActivityRecord.packageName,
                         mLetterboxConfiguration::isCompatFakeFocusEnabled,
@@ -386,7 +397,7 @@
                         ::isPolicyForIgnoringRequestedOrientationEnabled,
                 mIsOverrideEnableCompatIgnoreRequestedOrientationEnabled,
                 mBooleanPropertyIgnoreRequestedOrientation)) {
-            if (mIsRelauchingAfterRequestedOrientationChanged) {
+            if (mIsRelaunchingAfterRequestedOrientationChanged) {
                 Slog.w(TAG, "Ignoring orientation update to "
                         + screenOrientationToString(requestedOrientation)
                         + " due to relaunching after setRequestedOrientation for "
@@ -421,6 +432,8 @@
      *
      * <p>This treatment is enabled when the following conditions are met:
      * <ul>
+     *     <li>Flag gating the treatment is enabled
+     *     <li>Opt-out component property isn't enabled
      *     <li>Per-app override is enabled
      *     <li>App has requested orientation more than 2 times within 1-second
      *     timer and activity is not letterboxed for fixed orientation
@@ -428,7 +441,11 @@
      */
     @VisibleForTesting
     boolean shouldIgnoreOrientationRequestLoop() {
-        if (!mIsOverrideEnableCompatIgnoreOrientationRequestWhenLoopDetectedEnabled) {
+        if (!shouldEnableWithOptInOverrideAndOptOutProperty(
+                /* gatingCondition */ mLetterboxConfiguration
+                    ::isPolicyForIgnoringRequestedOrientationEnabled,
+                mIsOverrideEnableCompatIgnoreOrientationRequestWhenLoopDetectedEnabled,
+                mBooleanPropertyIgnoreOrientationRequestWhenLoopDetected)) {
             return false;
         }
 
@@ -475,8 +492,8 @@
      * Sets whether an activity is relaunching after the app has called {@link
      * android.app.Activity#setRequestedOrientation}.
      */
-    void setRelauchingAfterRequestedOrientationChanged(boolean isRelaunching) {
-        mIsRelauchingAfterRequestedOrientationChanged = isRelaunching;
+    void setRelaunchingAfterRequestedOrientationChanged(boolean isRelaunching) {
+        mIsRelaunchingAfterRequestedOrientationChanged = isRelaunching;
     }
 
     /**
@@ -1153,12 +1170,28 @@
 
     @VisibleForTesting
     boolean shouldShowLetterboxUi(WindowState mainWindow) {
-        return (mActivityRecord.isInLetterboxAnimation() || isSurfaceVisible(mainWindow))
+        if (mIsRelaunchingAfterRequestedOrientationChanged || !isSurfaceReadyToShow(mainWindow)) {
+            return mLastShouldShowLetterboxUi;
+        }
+
+        final boolean shouldShowLetterboxUi =
+                (mActivityRecord.isInLetterboxAnimation() || isSurfaceVisible(mainWindow))
                 && mainWindow.areAppWindowBoundsLetterboxed()
                 // Check for FLAG_SHOW_WALLPAPER explicitly instead of using
                 // WindowContainer#showWallpaper because the later will return true when this
                 // activity is using blurred wallpaper for letterbox background.
                 && (mainWindow.getAttrs().flags & FLAG_SHOW_WALLPAPER) == 0;
+
+        mLastShouldShowLetterboxUi = shouldShowLetterboxUi;
+
+        return shouldShowLetterboxUi;
+    }
+
+    @VisibleForTesting
+    boolean isSurfaceReadyToShow(WindowState mainWindow) {
+        return mainWindow.isDrawn() // Regular case
+                // Waiting for relayoutWindow to call preserveSurface
+                || mainWindow.isDragResizeChanged();
     }
 
     @VisibleForTesting
@@ -1296,6 +1329,10 @@
         return null;
     }
 
+    boolean getIsRelaunchingAfterRequestedOrientationChanged() {
+        return mIsRelaunchingAfterRequestedOrientationChanged;
+    }
+
     private void adjustBoundsForTaskbar(final WindowState mainWindow, final Rect bounds) {
         // Rounded corners should be displayed above the taskbar. When taskbar is hidden,
         // an insets frame is equal to a navigation bar which shouldn't affect position of
diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java
index dda0d6c..f8f0211 100644
--- a/services/core/java/com/android/server/wm/RecentTasks.java
+++ b/services/core/java/com/android/server/wm/RecentTasks.java
@@ -338,7 +338,8 @@
         synchronized (mService.mGlobalLock) {
             final Task focusedStack = mService.getTopDisplayFocusedRootTask();
             final Task topTask = focusedStack != null ? focusedStack.getTopMostTask() : null;
-            resetFreezeTaskListReordering(topTask);
+            final Task reorderToEndTask = topTask != null && topTask.hasChild() ? topTask : null;
+            resetFreezeTaskListReordering(reorderToEndTask);
         }
     }
 
@@ -976,9 +977,10 @@
 
             if (!task.mUserSetupComplete) {
                 // Don't include task launched while user is not done setting-up.
-                if (DEBUG_RECENTS) {
-                    Slog.d(TAG_RECENTS, "Skipping, user setup not complete: " + task);
-                }
+
+                // NOTE: not guarding with DEBUG_RECENTS as it's not frequent enough to spam logcat,
+                // but is useful when running CTS.
+                Slog.d(TAG_RECENTS, "Skipping, user setup not complete: " + task);
                 continue;
             }
 
diff --git a/services/core/java/com/android/server/wm/RectInsetsSourceProvider.java b/services/core/java/com/android/server/wm/RectInsetsSourceProvider.java
deleted file mode 100644
index 6e8beee..0000000
--- a/services/core/java/com/android/server/wm/RectInsetsSourceProvider.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-
-import android.graphics.Rect;
-import android.util.Slog;
-import android.view.InsetsSource;
-
-/**
- * An {@link InsetsSourceProvider} which doesn't have a backing window or a window container.
- */
-public class RectInsetsSourceProvider extends InsetsSourceProvider {
-    private static final String TAG = TAG_WITH_CLASS_NAME
-            ? RectInsetsSourceProvider.class.getSimpleName()
-            : TAG_WM;
-
-    RectInsetsSourceProvider(InsetsSource source,
-            InsetsStateController stateController, DisplayContent displayContent) {
-        super(source, stateController, displayContent);
-    }
-
-    /**
-     * Sets the given {@code rect} as the frame of the underlying {@link InsetsSource}.
-     */
-    void setRect(Rect rect) {
-        mSource.setFrame(rect);
-        mSource.setVisible(true);
-    }
-
-    @Override
-    void onPostLayout() {
-        if (WindowManagerDebugConfig.DEBUG) {
-            Slog.d(TAG, "onPostLayout(), not calling super.onPostLayout().");
-        }
-    }
-}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 5a4615a..0857898 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -481,8 +481,6 @@
     // to layout without loading all the task snapshots
     final PersistedTaskSnapshotData mLastTaskSnapshotData;
 
-    private final Rect mTmpDimBoundsRect = new Rect();
-
     /** @see #setCanAffectSystemUiFlags */
     private boolean mCanAffectSystemUiFlags = true;
 
@@ -3254,22 +3252,24 @@
 
     @Override
     void prepareSurfaces() {
-        mDimmer.resetDimStates();
+        final Rect dimBounds = mDimmer.resetDimStates();
         super.prepareSurfaces();
-        getDimBounds(mTmpDimBoundsRect);
 
-        // Bounds need to be relative, as the dim layer is a child.
-        if (inFreeformWindowingMode()) {
-            getBounds(mTmpRect);
-            mTmpDimBoundsRect.offsetTo(mTmpDimBoundsRect.left - mTmpRect.left,
-                    mTmpDimBoundsRect.top - mTmpRect.top);
-        } else {
-            mTmpDimBoundsRect.offsetTo(0, 0);
+        if (dimBounds != null) {
+            getDimBounds(dimBounds);
+
+            // Bounds need to be relative, as the dim layer is a child.
+            if (inFreeformWindowingMode()) {
+                getBounds(mTmpRect);
+                dimBounds.offsetTo(dimBounds.left - mTmpRect.left, dimBounds.top - mTmpRect.top);
+            } else {
+                dimBounds.offsetTo(0, 0);
+            }
         }
 
         final SurfaceControl.Transaction t = getSyncTransaction();
 
-        if (mDimmer.updateDims(t, mTmpDimBoundsRect)) {
+        if (dimBounds != null && mDimmer.updateDims(t)) {
             scheduleAnimation();
         }
 
@@ -4687,6 +4687,7 @@
         if (!isAttached()) {
             return;
         }
+        mTransitionController.collect(this);
 
         final TaskDisplayArea taskDisplayArea = getDisplayArea();
 
@@ -5636,8 +5637,6 @@
                 mWmService.mSyncEngine.queueSyncSet(
                         () -> mTransitionController.moveToCollecting(transition),
                         () -> {
-                            mTransitionController.requestStartTransition(transition, tr,
-                                    null /* remoteTransition */, null /* displayChange */);
                             // Need to check again since this happens later and the system might
                             // be in a different state.
                             if (!canMoveTaskToBack(tr)) {
@@ -5646,6 +5645,8 @@
                                 transition.abort();
                                 return;
                             }
+                            mTransitionController.requestStartTransition(transition, tr,
+                                    null /* remoteTransition */, null /* displayChange */);
                             moveTaskToBackInner(tr);
                         });
             } else {
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 76759ba..b0a879e 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -1883,7 +1883,7 @@
         // Only allow to specify orientation if this TDA is the last focused one on this logical
         // display that can request orientation request.
         return mDisplayContent.getOrientationRequestingTaskDisplayArea() == this
-                && !getIgnoreOrientationRequest(orientation);
+                && !shouldIgnoreOrientationRequest(orientation);
     }
 
     void clearPreferredTopFocusableRootTask() {
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index 612fc4b..1d232fe 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -2923,14 +2923,15 @@
             return;
         }
 
-        mDimmer.resetDimStates();
+        final Rect dimBounds = mDimmer.resetDimStates();
         super.prepareSurfaces();
 
-        // Bounds need to be relative, as the dim layer is a child.
-        final Rect dimBounds = getBounds();
-        dimBounds.offsetTo(0 /* newLeft */, 0 /* newTop */);
-        if (mDimmer.updateDims(getSyncTransaction(), dimBounds)) {
-            scheduleAnimation();
+        if (dimBounds != null) {
+            // Bounds need to be relative, as the dim layer is a child.
+            dimBounds.offsetTo(0 /* newLeft */, 0 /* newTop */);
+            if (mDimmer.updateDims(getSyncTransaction())) {
+                scheduleAnimation();
+            }
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 951a71d..3cc1548 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -33,8 +33,6 @@
 import static android.view.WindowManager.TRANSIT_CLOSE;
 import static android.view.WindowManager.TRANSIT_FLAG_IS_RECENTS;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_LOCKED;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
 import static android.view.WindowManager.TRANSIT_OPEN;
 import static android.view.WindowManager.TRANSIT_TO_BACK;
 import static android.view.WindowManager.TRANSIT_TO_FRONT;
@@ -50,6 +48,7 @@
 import static android.window.TransitionInfo.FLAG_IS_INPUT_METHOD;
 import static android.window.TransitionInfo.FLAG_IS_VOICE_INTERACTION;
 import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
+import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP;
 import static android.window.TransitionInfo.FLAG_NO_ANIMATION;
 import static android.window.TransitionInfo.FLAG_OCCLUDES_KEYGUARD;
 import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER;
@@ -166,6 +165,9 @@
     private SurfaceControl.Transaction mStartTransaction = null;
     private SurfaceControl.Transaction mFinishTransaction = null;
 
+    /** Used for failsafe clean-up to prevent leaks due to misbehaving player impls. */
+    private SurfaceControl.Transaction mCleanupTransaction = null;
+
     /**
      * Contains change infos for both participants and all remote-animatable ancestors. The
      * ancestors can be the promotion candidates so their start-states need to be captured.
@@ -183,6 +185,12 @@
     private final ArrayList<DisplayContent> mTargetDisplays = new ArrayList<>();
 
     /**
+     * The (non alwaysOnTop) tasks which were on-top of their display before the transition. If
+     * tasks are nested, all the tasks that are parents of the on-top task are also included.
+     */
+    private final ArrayList<Task> mOnTopTasksStart = new ArrayList<>();
+
+    /**
      * Set of participating windowtokens (activity/wallpaper) which are visible at the end of
      * the transition animation.
      */
@@ -515,6 +523,7 @@
         mParticipants.add(wc);
         if (wc.getDisplayContent() != null && !mTargetDisplays.contains(wc.getDisplayContent())) {
             mTargetDisplays.add(wc.getDisplayContent());
+            addOnTopTasks(wc.getDisplayContent(), mOnTopTasksStart);
         }
         if (info.mShowWallpaper) {
             // Collect the wallpaper token (for isWallpaper(wc)) so it is part of the sync set.
@@ -526,6 +535,27 @@
         }
     }
 
+    /** Adds the top non-alwaysOnTop tasks within `task` to `out`. */
+    private static void addOnTopTasks(Task task, ArrayList<Task> out) {
+        for (int i = task.getChildCount() - 1; i >= 0; --i) {
+            final Task child = task.getChildAt(i).asTask();
+            if (child == null) return;
+            if (child.getWindowConfiguration().isAlwaysOnTop()) continue;
+            out.add(child);
+            addOnTopTasks(child, out);
+            break;
+        }
+    }
+
+    /** Get the top non-alwaysOnTop leaf task on the display `dc`. */
+    private static void addOnTopTasks(DisplayContent dc, ArrayList<Task> out) {
+        final Task topNotAlwaysOnTop = dc.getRootTask(
+                t -> !t.getWindowConfiguration().isAlwaysOnTop());
+        if (topNotAlwaysOnTop == null) return;
+        out.add(topNotAlwaysOnTop);
+        addOnTopTasks(topNotAlwaysOnTop, out);
+    }
+
     /**
      * Records wc as changing its state of existence during this transition. For example, a new
      * task is considered an existence change while moving a task to front is not. wc is added
@@ -758,6 +788,24 @@
     }
 
     /**
+     * Build a transaction that cleans-up transition-only surfaces (transition root and snapshots).
+     * This will ALWAYS be applied on transition finish just in-case
+     */
+    private static void buildCleanupTransaction(SurfaceControl.Transaction t, TransitionInfo info) {
+        for (int i = info.getChanges().size() - 1; i >= 0; --i) {
+            final TransitionInfo.Change c = info.getChanges().get(i);
+            if (c.getSnapshot() != null) {
+                t.reparent(c.getSnapshot(), null);
+            }
+        }
+        for (int i = info.getRootCount() - 1; i >= 0; --i) {
+            final SurfaceControl leash = info.getRoot(i).getLeash();
+            if (leash == null) continue;
+            t.reparent(leash, null);
+        }
+    }
+
+    /**
      * Set whether this transition can start a pip-enter transition when finished. This is usually
      * true, but gets set to false when recents decides that it wants to finish its animation but
      * not actually finish its animation (yeah...).
@@ -783,7 +831,9 @@
      *         a chance we won't thus legacy-entry (via pause+userLeaving) will return false.
      */
     private boolean checkEnterPipOnFinish(@NonNull ActivityRecord ar) {
-        if (!mCanPipOnFinish || !ar.isVisible() || ar.getTask() == null) return false;
+        if (!mCanPipOnFinish || !ar.isVisible() || ar.getTask() == null || !ar.isState(RESUMED)) {
+            return false;
+        }
 
         if (ar.pictureInPictureArgs != null && ar.pictureInPictureArgs.isAutoEnterEnabled()) {
             if (didCommitTransientLaunch()) {
@@ -796,18 +846,14 @@
         }
 
         // Legacy pip-entry (not via isAutoEnterEnabled).
-        boolean canPip = ar.getDeferHidingClient();
-        if (!canPip && didCommitTransientLaunch()) {
+        if (didCommitTransientLaunch() && ar.supportsPictureInPicture()) {
             // force enable pip-on-task-switch now that we've committed to actually launching to the
             // transient activity, and then recalculate whether we can attempt pip.
             ar.supportsEnterPipOnTaskSwitch = true;
-            canPip = ar.checkEnterPictureInPictureState(
-                    "finishTransition", true /* beforeStopping */)
-                    && ar.isState(RESUMED);
         }
-        if (!canPip) return false;
+
         try {
-            // Legacy PIP-enter requires pause event with user-leaving.
+            // If not going auto-pip, the activity should be paused with user-leaving.
             mController.mAtm.mTaskSupervisor.mUserLeaving = true;
             ar.getTaskFragment().startPausing(false /* uiSleeping */,
                     null /* resuming */, "finishTransition");
@@ -836,6 +882,10 @@
         if (mStartTransaction != null) mStartTransaction.close();
         if (mFinishTransaction != null) mFinishTransaction.close();
         mStartTransaction = mFinishTransaction = null;
+        if (mCleanupTransaction != null) {
+            mCleanupTransaction.apply();
+            mCleanupTransaction = null;
+        }
         if (mState < STATE_PLAYING) {
             throw new IllegalStateException("Can't finish a non-playing transition " + mSyncId);
         }
@@ -851,6 +901,7 @@
 
         boolean hasParticipatedDisplay = false;
         boolean hasVisibleTransientLaunch = false;
+        boolean enterAutoPip = false;
         // Commit all going-invisible containers
         for (int i = 0; i < mParticipants.size(); ++i) {
             final WindowContainer<?> participant = mParticipants.valueAt(i);
@@ -886,6 +937,8 @@
                         }
                         ar.commitVisibility(false /* visible */, false /* performLayout */,
                                 true /* fromTransition */);
+                    } else {
+                        enterAutoPip = true;
                     }
                 }
                 if (mChanges.get(ar).mVisible != visibleAtTransitionEnd) {
@@ -940,8 +993,10 @@
         }
 
         if (hasVisibleTransientLaunch) {
-            // Notify the change about the transient-below task that becomes invisible.
-            mController.mAtm.getTaskChangeNotificationController().notifyTaskStackChanged();
+            // Notify the change about the transient-below task if entering auto-pip.
+            if (enterAutoPip) {
+                mController.mAtm.getTaskChangeNotificationController().notifyTaskStackChanged();
+            }
             // Prevent spurious background app switches.
             mController.mAtm.stopAppSwitches();
             // The end of transient launch may not reorder task, so make sure to compute the latest
@@ -997,11 +1052,13 @@
                 InsetsControlTarget prevImeTarget = dc.getImeTarget(
                         DisplayContent.IME_TARGET_CONTROL);
                 InsetsControlTarget newImeTarget = null;
+                TaskDisplayArea transientTDA = null;
                 // Transient-launch activities cannot be IME target (WindowState#canBeImeTarget),
                 // so re-compute in case the IME target is changed after transition.
                 for (int t = 0; t < mTransientLaunches.size(); ++t) {
                     if (mTransientLaunches.keyAt(t).getDisplayContent() == dc) {
                         newImeTarget = dc.computeImeTarget(true /* updateImeTarget */);
+                        transientTDA = mTransientLaunches.keyAt(i).getTaskDisplayArea();
                         break;
                     }
                 }
@@ -1012,10 +1069,17 @@
                     InputMethodManagerInternal.get().updateImeWindowStatus(
                             false /* disableImeIcon */);
                 }
+                // An uncommitted transient launch can leave incomplete lifecycles if visibilities
+                // didn't change (eg. re-ordering with translucent tasks will leave launcher
+                // in RESUMED state), so force an update here.
+                if (!hasVisibleTransientLaunch && transientTDA != null) {
+                    transientTDA.pauseBackTasks(null /* resuming */);
+                }
             }
             dc.removeImeSurfaceImmediately();
             dc.handleCompleteDeferredRemoval();
         }
+        validateKeyguardOcclusion();
         validateVisibility();
 
         mState = STATE_FINISHED;
@@ -1031,7 +1095,7 @@
         mTmpTransaction.apply();
 
         // Handle back animation if it's already started.
-        mController.mAtm.mBackNavigationController.handleDeferredBackAnimation(mTargets);
+        mController.mAtm.mBackNavigationController.onTransitionFinish(mTargets, this);
         mController.mFinishingTransition = null;
     }
 
@@ -1135,12 +1199,14 @@
         if (primaryDisplay.isKeyguardLocked()) {
             mFlags |= TRANSIT_FLAG_KEYGUARD_LOCKED;
         }
-        // Check whether the participants were animated from back navigation.
-        final boolean markBackAnimated = mController.mAtm.mBackNavigationController
-                .containsBackAnimationTargets(this);
+        collectOrderChanges();
+
         // Resolve the animating targets from the participants.
         mTargets = calculateTargets(mParticipants, mChanges);
+        // Check whether the participants were animated from back navigation.
+        mController.mAtm.mBackNavigationController.onTransactionReady(this, mTargets);
         final TransitionInfo info = calculateTransitionInfo(mType, mFlags, mTargets, transaction);
+        info.setDebugId(mSyncId);
 
         // Repopulate the displays based on the resolved targets.
         mTargetDisplays.clear();
@@ -1150,9 +1216,6 @@
             mTargetDisplays.add(dc);
         }
 
-        if (markBackAnimated) {
-            mController.mAtm.mBackNavigationController.clearBackAnimations(mStartTransaction);
-        }
         if (mOverrideOptions != null) {
             info.setAnimationOptions(mOverrideOptions);
             if (mOverrideOptions.getType() == ANIM_OPEN_CROSS_PROFILE_APPS) {
@@ -1176,8 +1239,6 @@
             if (mRecentsDisplayId != INVALID_DISPLAY) break;
         }
 
-        handleNonAppWindowsInTransition(mType, mFlags);
-
         // The callback is only populated for custom activity-level client animations
         sendRemoteCallback(mClientAnimationStartCallback);
 
@@ -1247,6 +1308,8 @@
             }
         }
         buildFinishTransaction(mFinishTransaction, info);
+        mCleanupTransaction = mController.mAtm.mWindowManager.mTransactionFactory.get();
+        buildCleanupTransaction(mCleanupTransaction, info);
         if (mController.getTransitionPlayer() != null && mIsPlayerEnabled) {
             mController.dispatchLegacyAppTransitionStarting(info, mStatusBarTransitionDelay);
             try {
@@ -1292,6 +1355,27 @@
         info.releaseAnimSurfaces();
     }
 
+    /** Collect tasks which moved-to-top but didn't change otherwise. */
+    @VisibleForTesting
+    void collectOrderChanges() {
+        if (mOnTopTasksStart.isEmpty()) return;
+        final ArrayList<Task> onTopTasksEnd = new ArrayList<>();
+        for (int i = 0; i < mTargetDisplays.size(); ++i) {
+            addOnTopTasks(mTargetDisplays.get(i), onTopTasksEnd);
+        }
+        for (int i = 0; i < onTopTasksEnd.size(); ++i) {
+            final Task task = onTopTasksEnd.get(i);
+            if (mOnTopTasksStart.contains(task)) continue;
+            mParticipants.add(task);
+            int changeIdx = mChanges.indexOfKey(task);
+            if (changeIdx < 0) {
+                mChanges.put(task, new ChangeInfo(task));
+                changeIdx = mChanges.indexOfKey(task);
+            }
+            mChanges.valueAt(changeIdx).mFlags |= ChangeInfo.FLAG_CHANGE_MOVED_TO_TOP;
+        }
+    }
+
     private void postCleanupOnFailure() {
         mController.mAtm.mH.post(() -> {
             synchronized (mController.mAtm.mGlobalLock) {
@@ -1325,6 +1409,10 @@
                 ci.mSnapshot.release();
             }
         }
+        if (mCleanupTransaction != null) {
+            mCleanupTransaction.apply();
+            mCleanupTransaction = null;
+        }
     }
 
     /** The transition is ready to play. Make the start transaction show the surfaces. */
@@ -1481,19 +1569,6 @@
         }
     }
 
-    private void handleNonAppWindowsInTransition(
-            @TransitionType int transit, @TransitionFlags int flags) {
-        if ((flags & TRANSIT_FLAG_KEYGUARD_LOCKED) != 0) {
-            // If the occlusion changed but the transition isn't an occlude/unocclude transition,
-            // then we have to notify KeyguardService directly. This can happen if there is
-            // another ongoing transition when the app changes occlusion OR if the app dies or
-            // is killed. Both of these are common during tests.
-            if (transit != TRANSIT_KEYGUARD_OCCLUDE && transit != TRANSIT_KEYGUARD_UNOCCLUDE) {
-                mController.mAtm.mWindowManager.mPolicy.applyKeyguardOcclusionChange();
-            }
-        }
-    }
-
     private void reportStartReasonsToLogger() {
         // Record transition start in metrics logger. We just assume everything is "DRAWN"
         // at this point since splash-screen is a presentation (shell) detail.
@@ -2186,6 +2261,13 @@
         return mainWin.getAttrs().rotationAnimation;
     }
 
+    private void validateKeyguardOcclusion() {
+        if ((mFlags & TRANSIT_FLAG_KEYGUARD_LOCKED) != 0) {
+            mController.mStateValidators.add(
+                mController.mAtm.mWindowManager.mPolicy::applyKeyguardOcclusionChange);
+        }
+    }
+
     private void validateVisibility() {
         for (int i = mTargets.size() - 1; i >= 0; --i) {
             if (reduceMode(mTargets.get(i).mReadyMode) != TRANSIT_CLOSE) {
@@ -2247,13 +2329,17 @@
          */
         private static final int FLAG_CHANGE_YES_ANIMATION = 0x10;
 
+        /** Whether this change's container moved to the top. */
+        private static final int FLAG_CHANGE_MOVED_TO_TOP = 0x20;
+
         @IntDef(prefix = { "FLAG_" }, value = {
                 FLAG_NONE,
                 FLAG_SEAMLESS_ROTATION,
                 FLAG_TRANSIENT_LAUNCH,
                 FLAG_ABOVE_TRANSIENT_LAUNCH,
                 FLAG_CHANGE_NO_ANIMATION,
-                FLAG_CHANGE_YES_ANIMATION
+                FLAG_CHANGE_YES_ANIMATION,
+                FLAG_CHANGE_MOVED_TO_TOP
         })
         @Retention(RetentionPolicy.SOURCE)
         @interface Flag {}
@@ -2284,7 +2370,7 @@
         int mDisplayId = -1;
         @ActivityInfo.Config int mKnownConfigChanges;
 
-        /** These are just extra info. They aren't used for change-detection. */
+        /** Extra information about this change. */
         @Flag int mFlags = FLAG_NONE;
 
         /** Snapshot surface and luma, if relevant. */
@@ -2336,7 +2422,8 @@
                     || (mWindowingMode != 0 && mContainer.getWindowingMode() != mWindowingMode)
                     || !mContainer.getBounds().equals(mAbsoluteBounds)
                     || mRotation != mContainer.getWindowConfiguration().getRotation()
-                    || mDisplayId != getDisplayId(mContainer);
+                    || mDisplayId != getDisplayId(mContainer)
+                    || (mFlags & ChangeInfo.FLAG_CHANGE_MOVED_TO_TOP) != 0;
         }
 
         @TransitionInfo.TransitionMode
@@ -2437,6 +2524,9 @@
                     && (mFlags & FLAG_CHANGE_YES_ANIMATION) == 0) {
                 flags |= FLAG_NO_ANIMATION;
             }
+            if ((mFlags & FLAG_CHANGE_MOVED_TO_TOP) != 0) {
+                flags |= FLAG_MOVED_TO_TOP;
+            }
             return flags;
         }
 
diff --git a/services/core/java/com/android/server/wm/TransitionTracer.java b/services/core/java/com/android/server/wm/TransitionTracer.java
index 57c0d65..a4c931c 100644
--- a/services/core/java/com/android/server/wm/TransitionTracer.java
+++ b/services/core/java/com/android/server/wm/TransitionTracer.java
@@ -365,6 +365,24 @@
         Trace.endSection();
     }
 
+    /**
+     * Being called while taking a bugreport so that tracing files can be included in the bugreport.
+     *
+     * @param pw Print writer
+     */
+    public void saveForBugreport(@Nullable PrintWriter pw) {
+        if (IS_USER) {
+            LogAndPrintln.e(pw, "Tracing is not supported on user builds.");
+            return;
+        }
+        Trace.beginSection("TransitionTracer#saveForBugreport");
+        synchronized (mEnabledLock) {
+            final File outputFile = new File(TRACE_FILE);
+            writeTraceToFileLocked(pw, outputFile);
+        }
+        Trace.endSection();
+    }
+
     boolean isActiveTracingEnabled() {
         return mActiveTracingEnabled;
     }
diff --git a/services/core/java/com/android/server/wm/TrustedOverlayHost.java b/services/core/java/com/android/server/wm/TrustedOverlayHost.java
index 88c410b..f8edc2b 100644
--- a/services/core/java/com/android/server/wm/TrustedOverlayHost.java
+++ b/services/core/java/com/android/server/wm/TrustedOverlayHost.java
@@ -90,8 +90,6 @@
         requireOverlaySurfaceControl();
         mOverlays.add(p);
 
-        mWmService.mEmbeddedWindowController.setIsOverlay(p.getInputToken());
-
         SurfaceControl.Transaction t = mWmService.mTransactionFactory.get();
         t.reparent(p.getSurfaceControl(), mSurfaceControl)
             .show(p.getSurfaceControl());
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index 0b9ceea..7ceac4f 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -46,6 +46,7 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.SystemClock;
+import android.os.SystemProperties;
 import android.util.ArraySet;
 import android.util.MathUtils;
 import android.util.Slog;
@@ -56,7 +57,6 @@
 import android.view.animation.Animation;
 import android.window.ScreenCapture;
 
-import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.protolog.ProtoLogImpl;
 import com.android.internal.protolog.common.ProtoLog;
@@ -122,7 +122,7 @@
 
     private boolean mShouldOffsetWallpaperCenter;
 
-    final boolean mEnableSeparateLockScreenEngine;
+    final boolean mIsLockscreenLiveWallpaperEnabled;
 
     private final ToBooleanFunction<WindowState> mFindWallpaperTargetFunction = w -> {
         if ((w.mAttrs.type == TYPE_WALLPAPER)) {
@@ -259,8 +259,8 @@
         mShouldOffsetWallpaperCenter =
                 resources.getBoolean(
                         com.android.internal.R.bool.config_offsetWallpaperToCenterOfLargestDisplay);
-        mEnableSeparateLockScreenEngine =
-                resources.getBoolean(R.bool.config_independentLockscreenLiveWallpaper);
+        mIsLockscreenLiveWallpaperEnabled =
+                SystemProperties.getBoolean("persist.wm.debug.lockscreen_live_wallpaper", false);
     }
 
     void resetLargestDisplay(Display display) {
diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
index 17ab551..6c38c6f 100644
--- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java
+++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
@@ -76,7 +76,7 @@
             return;
         }
         mShowWhenLocked = showWhenLocked;
-        if (mDisplayContent.mWallpaperController.mEnableSeparateLockScreenEngine) {
+        if (mDisplayContent.mWallpaperController.mIsLockscreenLiveWallpaperEnabled) {
             // Move the window token to the front (private) or back (showWhenLocked). This is
             // possible
             // because the DisplayArea underneath TaskDisplayArea only contains TYPE_WALLPAPER
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index bd0344f..4117641 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -157,15 +157,14 @@
     boolean mReparenting;
 
     /**
-     * Map of {@link InsetsState.InternalInsetsType} to the {@link InsetsSourceProvider} that
-     * provides local insets for all children of the current {@link WindowContainer}.
-     *
-     * Note that these InsetsSourceProviders are not part of the {@link InsetsStateController} and
-     * live here. These are supposed to provide insets only to the subtree of the current
+     * Map of the source ID to the {@link InsetsSource} for all children of the current
      * {@link WindowContainer}.
+     *
+     * Note that these sources are not part of the {@link InsetsStateController} and live here.
+     * These are supposed to provide insets only to the subtree of this {@link WindowContainer}.
      */
     @Nullable
-    SparseArray<InsetsSourceProvider> mLocalInsetsSourceProviders = null;
+    SparseArray<InsetsSource> mLocalInsetsSources = null;
 
     @Nullable
     protected InsetsSourceProvider mControllableInsetProvider;
@@ -374,49 +373,46 @@
      * {@link WindowState}s below it.
      *
      * {@link WindowState#mMergedLocalInsetsSources} is updated by considering
-     * {@link WindowContainer#mLocalInsetsSourceProviders} provided by all the parents of the
-     * window.
-     * A given insetsType can be provided as a LocalInsetsSourceProvider only once in a
-     * Parent-to-leaf path.
+     * {@link WindowContainer#mLocalInsetsSources} provided by all the parents of the window.
      *
      * Examples: Please take a look at
      * {@link WindowContainerTests#testAddLocalInsetsSourceProvider()}
-     * {@link
-     * WindowContainerTests#testAddLocalInsetsSourceProvider_windowSkippedIfProvidingOnParent()}
      * {@link WindowContainerTests#testRemoveLocalInsetsSourceProvider()}.
      *
-     * @param aboveInsetsState The InsetsState of all the Windows above the current container.
-     * @param localInsetsSourceProvidersFromParent The local InsetsSourceProviders provided by all
-     *                                             the parents in the hierarchy of the current
-     *                                             container.
-     * @param insetsChangedWindows The windows which the insets changed have changed for.
+     * @param aboveInsetsState             The InsetsState of all the Windows above the current
+     *                                     container.
+     * @param localInsetsSourcesFromParent The local InsetsSourceProviders provided by all
+     *                                     the parents in the hierarchy of the current
+     *                                     container.
+     * @param insetsChangedWindows         The windows which the insets changed have changed for.
      */
     void updateAboveInsetsState(InsetsState aboveInsetsState,
-            SparseArray<InsetsSourceProvider> localInsetsSourceProvidersFromParent,
+            SparseArray<InsetsSource> localInsetsSourcesFromParent,
             ArraySet<WindowState> insetsChangedWindows) {
-        SparseArray<InsetsSourceProvider> mergedLocalInsetsSourceProviders =
-                localInsetsSourceProvidersFromParent;
-        if (mLocalInsetsSourceProviders != null && mLocalInsetsSourceProviders.size() != 0) {
-            mergedLocalInsetsSourceProviders = createShallowCopy(mergedLocalInsetsSourceProviders);
-            for (int i = 0; i < mLocalInsetsSourceProviders.size(); i++) {
-                mergedLocalInsetsSourceProviders.put(
-                        mLocalInsetsSourceProviders.keyAt(i),
-                        mLocalInsetsSourceProviders.valueAt(i));
-            }
-        }
+        final SparseArray<InsetsSource> mergedLocalInsetsSources =
+                createMergedSparseArray(localInsetsSourcesFromParent, mLocalInsetsSources);
 
         for (int i = mChildren.size() - 1; i >= 0; --i) {
-            mChildren.get(i).updateAboveInsetsState(aboveInsetsState,
-                    mergedLocalInsetsSourceProviders, insetsChangedWindows);
+            mChildren.get(i).updateAboveInsetsState(aboveInsetsState, mergedLocalInsetsSources,
+                    insetsChangedWindows);
         }
     }
 
-    static <T> SparseArray<T> createShallowCopy(SparseArray<T> inputArray) {
-        SparseArray<T> copyOfInput = new SparseArray<>(inputArray.size());
-        for (int i = 0; i < inputArray.size(); i++) {
-            copyOfInput.append(inputArray.keyAt(i), inputArray.valueAt(i));
+    static <T> SparseArray<T> createMergedSparseArray(SparseArray<T> sa1, SparseArray<T> sa2) {
+        final int size1 = sa1 != null ? sa1.size() : 0;
+        final int size2 = sa2 != null ? sa2.size() : 0;
+        final SparseArray<T> mergedArray = new SparseArray<>(size1 + size2);
+        if (size1 > 0) {
+            for (int i = 0; i < size1; i++) {
+                mergedArray.append(sa1.keyAt(i), sa1.valueAt(i));
+            }
         }
-        return copyOfInput;
+        if (size2 > 0) {
+            for (int i = 0; i < size2; i++) {
+                mergedArray.put(sa2.keyAt(i), sa2.valueAt(i));
+            }
+        }
+        return mergedArray;
     }
 
     /**
@@ -433,25 +429,23 @@
             // This is possible this container is detached when WM shell is responding to a previous
             // request. WM shell will be updated when this container is attached again and the
             // insets need to be updated.
-            Slog.w(TAG, "Can't add local rect insets source provider when detached. " + this);
+            Slog.w(TAG, "Can't add insets frame provider when detached. " + this);
             return;
         }
-        if (mLocalInsetsSourceProviders == null) {
-            mLocalInsetsSourceProviders = new SparseArray<>();
+        if (mLocalInsetsSources == null) {
+            mLocalInsetsSources = new SparseArray<>();
         }
         final int id = InsetsSource.createId(
                 provider.getOwner(), provider.getIndex(), provider.getType());
-        if (mLocalInsetsSourceProviders.get(id) != null) {
+        if (mLocalInsetsSources.get(id) != null) {
             if (DEBUG) {
-                Slog.d(TAG, "The local insets provider for this " + provider
-                        + " already exists. Overwriting");
+                Slog.d(TAG, "The local insets source for this " + provider
+                        + " already exists. Overwriting.");
             }
         }
-        final RectInsetsSourceProvider insetsSourceProvider = new RectInsetsSourceProvider(
-                new InsetsSource(id, provider.getType()),
-                mDisplayContent.getInsetsStateController(), mDisplayContent);
-        mLocalInsetsSourceProviders.put(id, insetsSourceProvider);
-        insetsSourceProvider.setRect(provider.getArbitraryRectangle());
+        final InsetsSource source = new InsetsSource(id, provider.getType());
+        source.setFrame(provider.getArbitraryRectangle());
+        mLocalInsetsSources.put(id, source);
         mDisplayContent.getInsetsStateController().updateAboveInsetsState(true);
     }
 
@@ -459,20 +453,19 @@
         if (provider == null) {
             throw new IllegalArgumentException("Insets type not specified.");
         }
-        if (mLocalInsetsSourceProviders == null) {
+        if (mLocalInsetsSources == null) {
             return;
         }
 
         final int id = InsetsSource.createId(
                 provider.getOwner(), provider.getIndex(), provider.getType());
-        if (mLocalInsetsSourceProviders.get(id) == null) {
+        if (mLocalInsetsSources.get(id) == null) {
             if (DEBUG) {
-                Slog.d(TAG, "Given " + provider
-                        + " doesn't have a local insetsSourceProvider.");
+                Slog.d(TAG, "Given " + provider + " doesn't have a local insets source.");
             }
             return;
         }
-        mLocalInsetsSourceProviders.remove(id);
+        mLocalInsetsSources.remove(id);
 
         // Update insets if this window is attached.
         if (mDisplayContent != null) {
@@ -1014,8 +1007,8 @@
         if (dc != null && dc != this) {
             dc.getPendingTransaction().merge(mPendingTransaction);
         }
-        if (dc != this && mLocalInsetsSourceProviders != null) {
-            mLocalInsetsSourceProviders.clear();
+        if (dc != this && mLocalInsetsSources != null) {
+            mLocalInsetsSources.clear();
         }
         for (int i = mChildren.size() - 1; i >= 0; --i) {
             final WindowContainer child = mChildren.get(i);
@@ -3555,11 +3548,11 @@
             pw.println(prefix + "mLastOrientationSource=" + mLastOrientationSource);
             pw.println(prefix + "deepestLastOrientationSource=" + getLastOrientationSource());
         }
-        if (mLocalInsetsSourceProviders != null && mLocalInsetsSourceProviders.size() != 0) {
-            pw.println(prefix + mLocalInsetsSourceProviders.size() + " LocalInsetsSourceProviders");
+        if (mLocalInsetsSources != null && mLocalInsetsSources.size() != 0) {
+            pw.println(prefix + mLocalInsetsSources.size() + " LocalInsetsSources");
             final String childPrefix = prefix + "  ";
-            for (int i = 0; i < mLocalInsetsSourceProviders.size(); ++i) {
-                mLocalInsetsSourceProviders.valueAt(i).dump(pw, childPrefix);
+            for (int i = 0; i < mLocalInsetsSources.size(); ++i) {
+                mLocalInsetsSources.valueAt(i).dump(childPrefix, pw);
             }
         }
     }
@@ -4129,7 +4122,7 @@
         }
 
         private void hideInsetSourceViewOverflows() {
-            final SparseArray<WindowContainerInsetsSourceProvider> providers =
+            final SparseArray<InsetsSourceProvider> providers =
                     getDisplayContent().getInsetsStateController().getSourceProviders();
             for (int i = providers.size(); i >= 0; i--) {
                 final InsetsSourceProvider insetProvider = providers.valueAt(i);
diff --git a/services/core/java/com/android/server/wm/WindowContainerInsetsSourceProvider.java b/services/core/java/com/android/server/wm/WindowContainerInsetsSourceProvider.java
deleted file mode 100644
index aa2e8f5..0000000
--- a/services/core/java/com/android/server/wm/WindowContainerInsetsSourceProvider.java
+++ /dev/null
@@ -1,34 +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.view.InsetsSource;
-
-/**
- * Controller for a specific inset source on the server. It's called provider as it provides the
- * {@link InsetsSource} to the client that uses it in {@link android.view.InsetsSourceConsumer}.
- */
-class WindowContainerInsetsSourceProvider extends InsetsSourceProvider {
-    // TODO(b/218734524): Move the window container specific stuff from InsetsSourceProvider to
-    //  this class.
-
-    WindowContainerInsetsSourceProvider(InsetsSource source,
-            InsetsStateController stateController, DisplayContent displayContent) {
-        super(source, stateController, displayContent);
-    }
-}
-
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 14c826d..cd4d6e4 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -88,7 +88,6 @@
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
 import static android.view.WindowManager.REMOVE_CONTENT_MODE_UNDEFINED;
 import static android.view.WindowManager.TRANSIT_NONE;
-import static android.view.WindowManager.TRANSIT_TO_FRONT;
 import static android.view.WindowManager.fixScale;
 import static android.view.WindowManagerGlobal.ADD_OKAY;
 import static android.view.WindowManagerGlobal.RELAYOUT_RES_CANCEL_AND_REDRAW;
@@ -8537,13 +8536,7 @@
             }
         }
 
-        // focus-transfer can re-order windows and thus potentially causes visible changes:
-        final Transition transition = mAtmService.getTransitionController()
-                .requestTransitionIfNeeded(TRANSIT_TO_FRONT, task);
         mAtmService.setFocusedTask(task.mTaskId, touchedActivity);
-        if (transition != null) {
-            transition.setReady(task, true /* ready */);
-        }
     }
 
     /**
@@ -8631,7 +8624,8 @@
             EmbeddedWindowController.EmbeddedWindow win =
                     new EmbeddedWindowController.EmbeddedWindow(session, this, window,
                             mInputToWindowMap.get(hostInputToken), callingUid, callingPid,
-                            sanitizedType, displayId, focusGrantToken, inputHandleName);
+                            sanitizedType, displayId, focusGrantToken, inputHandleName,
+                            (flags & FLAG_NOT_FOCUSABLE) == 0);
             clientChannel = win.openInputChannel();
             mEmbeddedWindowController.add(clientChannel.getToken(), win);
             applicationHandle = win.getApplicationHandle();
@@ -8752,6 +8746,7 @@
             }
             name = win.toString();
             applicationHandle = win.getApplicationHandle();
+            win.setIsFocusable((flags & FLAG_NOT_FOCUSABLE) == 0);
         }
 
         updateInputChannel(channelToken, win.mOwnerUid, win.mOwnerPid, displayId, surface, name,
@@ -9029,24 +9024,23 @@
                 Slog.e(TAG, "Embedded window does not belong to the host");
                 return;
             }
-            SurfaceControl.Transaction t = mTransactionFactory.get();
             if (grantFocus) {
-                t.requestFocusTransfer(embeddedWindow.getInputChannelToken(), embeddedWindow.toString(),
-                        hostWindow.mInputChannel.getToken(),
-                        hostWindow.getName(),
-                        hostWindow.getDisplayId()).apply();
+                hostWindow.mInputWindowHandle.setFocusTransferTarget(
+                        embeddedWindow.getInputChannelToken());
                 EventLog.writeEvent(LOGTAG_INPUT_FOCUS,
                         "Transfer focus request " + embeddedWindow,
                         "reason=grantEmbeddedWindowFocus(true)");
             } else {
-                t.requestFocusTransfer(hostWindow.mInputChannel.getToken(), hostWindow.getName(),
-                        embeddedWindow.getInputChannelToken(),
-                        embeddedWindow.toString(),
-                        hostWindow.getDisplayId()).apply();
+                hostWindow.mInputWindowHandle.setFocusTransferTarget(null);
                 EventLog.writeEvent(LOGTAG_INPUT_FOCUS,
                         "Transfer focus request " + hostWindow,
                         "reason=grantEmbeddedWindowFocus(false)");
             }
+            DisplayContent dc = mRoot.getDisplayContent(hostWindow.getDisplayId());
+            if (dc != null) {
+                dc.getInputMonitor().updateInputWindowsLw(true);
+            }
+
             ProtoLog.v(WM_DEBUG_FOCUS, "grantEmbeddedWindowFocus win=%s grantFocus=%s",
                     embeddedWindow, grantFocus);
         }
@@ -9321,7 +9315,14 @@
             throw new SecurityException("Requires READ_FRAME_BUFFER permission");
         }
 
-        ScreenCapture.captureLayers(getCaptureArgs(displayId, captureArgs), listener);
+        ScreenCapture.LayerCaptureArgs layerCaptureArgs = getCaptureArgs(displayId, captureArgs);
+        ScreenCapture.captureLayers(layerCaptureArgs, listener);
+
+        if (Binder.getCallingUid() != SYSTEM_UID) {
+            // Release the SurfaceControl objects only if the caller is not in system server as no
+            // parcelling occurs in this case.
+            layerCaptureArgs.release();
+        }
     }
 
     @VisibleForTesting
diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
index 437af4b..a153708 100644
--- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
+++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
@@ -1301,6 +1301,9 @@
             case "stop":
                 mInternal.mTransitionTracer.stopTrace(pw);
                 break;
+            case "save-for-bugreport":
+                mInternal.mTransitionTracer.saveForBugreport(pw);
+                break;
             default:
                 getErrPrintWriter()
                         .println("Error: expected 'start' or 'stop', but got '" + arg + "'");
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index c34aa2b..85c601f 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -45,6 +45,8 @@
 import static com.android.server.wm.BackgroundActivityStartController.BAL_BLOCK;
 import static com.android.server.wm.WindowManagerService.MY_PID;
 
+import static java.util.Objects.requireNonNull;
+
 import android.Manifest;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -559,14 +561,19 @@
      * @see BackgroundLaunchProcessController#addOrUpdateAllowBackgroundStartPrivileges(Binder,
      * BackgroundStartPrivileges)
      */
-    public void addOrUpdateBackgroundStartPrivileges(Binder entity,
-            BackgroundStartPrivileges backgroundStartPrivileges) {
+    public void addOrUpdateBackgroundStartPrivileges(@NonNull Binder entity,
+            @NonNull BackgroundStartPrivileges backgroundStartPrivileges) {
+        requireNonNull(entity, "entity");
+        requireNonNull(backgroundStartPrivileges, "backgroundStartPrivileges");
+        checkArgument(backgroundStartPrivileges.allowsAny(),
+                "backgroundStartPrivileges does not allow anything");
         mBgLaunchController.addOrUpdateAllowBackgroundStartPrivileges(entity,
                 backgroundStartPrivileges);
     }
 
     /** @see BackgroundLaunchProcessController#removeAllowBackgroundStartPrivileges(Binder) */
-    public void removeBackgroundStartPrivileges(Binder entity) {
+    public void removeBackgroundStartPrivileges(@NonNull Binder entity) {
+        requireNonNull(entity, "entity");
         mBgLaunchController.removeAllowBackgroundStartPrivileges(entity);
     }
 
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 232b817..6e3924b 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -428,8 +428,9 @@
     boolean mGivenInsetsPending;
 
     /**
-     * These are the content insets that were given during layout for
-     * this window, to be applied to windows behind it.
+     * These are the content insets that were given during layout for this window, to be applied to
+     * windows behind it.
+     * This is only applied to IME windows when corresponding process in DisplayPolicy executed.
      */
     final Rect mGivenContentInsets = new Rect();
 
@@ -4495,20 +4496,10 @@
 
     @Override
     void updateAboveInsetsState(InsetsState aboveInsetsState,
-            SparseArray<InsetsSourceProvider> localInsetsSourceProvidersFromParent,
+            SparseArray<InsetsSource> localInsetsSourcesFromParent,
             ArraySet<WindowState> insetsChangedWindows) {
-        SparseArray<InsetsSourceProvider> mergedLocalInsetsSourceProviders =
-                localInsetsSourceProvidersFromParent;
-        if (mLocalInsetsSourceProviders != null && mLocalInsetsSourceProviders.size() != 0) {
-            mergedLocalInsetsSourceProviders = createShallowCopy(mergedLocalInsetsSourceProviders);
-            for (int i = 0; i < mLocalInsetsSourceProviders.size(); i++) {
-                mergedLocalInsetsSourceProviders.put(
-                        mLocalInsetsSourceProviders.keyAt(i),
-                        mLocalInsetsSourceProviders.valueAt(i));
-            }
-        }
-        final SparseArray<InsetsSource> mergedLocalInsetsSourcesFromParent =
-                toInsetsSources(mergedLocalInsetsSourceProviders);
+        final SparseArray<InsetsSource> mergedLocalInsetsSources =
+                createMergedSparseArray(localInsetsSourcesFromParent, mLocalInsetsSources);
 
         // Insets provided by the IME window can effect all the windows below it and hence it needs
         // to be visited in the correct order. Because of which updateAboveInsetsState() can't be
@@ -4519,9 +4510,8 @@
                 insetsChangedWindows.add(w);
             }
 
-            if (!mergedLocalInsetsSourcesFromParent.contentEquals(w.mMergedLocalInsetsSources)) {
-                w.mMergedLocalInsetsSources = createShallowCopy(
-                        mergedLocalInsetsSourcesFromParent);
+            if (!mergedLocalInsetsSources.contentEquals(w.mMergedLocalInsetsSources)) {
+                w.mMergedLocalInsetsSources = mergedLocalInsetsSources;
                 insetsChangedWindows.add(w);
             }
 
@@ -4534,17 +4524,6 @@
         }, true /* traverseTopToBottom */);
     }
 
-    private static SparseArray<InsetsSource> toInsetsSources(
-            SparseArray<InsetsSourceProvider> insetsSourceProviders) {
-        final SparseArray<InsetsSource> insetsSources = new SparseArray<>(
-                insetsSourceProviders.size());
-        for (int i = 0; i < insetsSourceProviders.size(); i++) {
-            insetsSources.append(insetsSourceProviders.keyAt(i),
-                    insetsSourceProviders.valueAt(i).getSource());
-        }
-        return insetsSources;
-    }
-
     private boolean forAllWindowTopToBottom(ToBooleanFunction<WindowState> callback) {
         // We want to consume the positive sublayer children first because they need to appear
         // above the parent, then this window (the parent), and then the negative sublayer children
@@ -5198,13 +5177,14 @@
     @Override
     void prepareSurfaces() {
         mIsDimming = false;
-        applyDims();
-        updateSurfacePositionNonOrganized();
-        // Send information to SurfaceFlinger about the priority of the current window.
-        updateFrameRateSelectionPriorityIfNeeded();
-        updateScaleIfNeeded();
-
-        mWinAnimator.prepareSurfaceLocked(getSyncTransaction());
+        if (mHasSurface) {
+            applyDims();
+            updateSurfacePositionNonOrganized();
+            // Send information to SurfaceFlinger about the priority of the current window.
+            updateFrameRateSelectionPriorityIfNeeded();
+            updateScaleIfNeeded();
+            mWinAnimator.prepareSurfaceLocked(getSyncTransaction());
+        }
         super.prepareSurfaces();
     }
 
@@ -5251,8 +5231,17 @@
             if (surfaceInsetsChanged) {
                 mLastSurfaceInsets.set(mAttrs.surfaceInsets);
             }
-            if (surfaceSizeChanged && mWinAnimator.getShown() && !canPlayMoveAnimation()
-                    && okToDisplay() && mSyncState == SYNC_STATE_NONE) {
+            final boolean surfaceResizedWithoutMoveAnimation = surfaceSizeChanged
+                    && mWinAnimator.getShown() && !canPlayMoveAnimation() && okToDisplay()
+                    && mSyncState == SYNC_STATE_NONE;
+            final ActivityRecord activityRecord = getActivityRecord();
+            // If this window belongs to an activity that is relaunching due to an orientation
+            // change then delay the position update until it has redrawn to avoid any flickers.
+            final boolean isLetterboxedAndRelaunching = activityRecord != null
+                    && activityRecord.areBoundsLetterboxed()
+                    && activityRecord.mLetterboxUiController
+                        .getIsRelaunchingAfterRequestedOrientationChanged();
+            if (surfaceResizedWithoutMoveAnimation || isLetterboxedAndRelaunching) {
                 applyWithNextDraw(mSetSurfacePositionConsumer);
             } else {
                 mSetSurfacePositionConsumer.accept(t);
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 075dcd5..d64b5a1 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -136,7 +136,6 @@
     jmethodID getContextForDisplay;
     jmethodID notifyDropWindow;
     jmethodID getParentSurfaceForPointers;
-    jmethodID isPerDisplayTouchModeEnabled;
 } gServiceClassInfo;
 
 static struct {
@@ -369,10 +368,6 @@
     virtual PointerIconStyle getCustomPointerIconId();
     virtual void onPointerDisplayIdChanged(int32_t displayId, const FloatPoint& position);
 
-    /* --- If touch mode is enabled per display or global --- */
-
-    virtual bool isPerDisplayTouchModeEnabled();
-
 private:
     sp<InputManagerInterface> mInputManager;
 
@@ -1645,16 +1640,6 @@
             InputReaderConfiguration::CHANGE_STYLUS_BUTTON_REPORTING);
 }
 
-bool NativeInputManager::isPerDisplayTouchModeEnabled() {
-    JNIEnv* env = jniEnv();
-    jboolean enabled =
-            env->CallBooleanMethod(mServiceObj, gServiceClassInfo.isPerDisplayTouchModeEnabled);
-    if (checkAndClearExceptionFromCallback(env, "isPerDisplayTouchModeEnabled")) {
-        return false;
-    }
-    return static_cast<bool>(enabled);
-}
-
 FloatPoint NativeInputManager::getMouseCursorPosition() {
     std::scoped_lock _l(mLock);
     const auto pc = mLocked.pointerController.lock();
@@ -2336,6 +2321,14 @@
             InputReaderConfiguration::CHANGE_DEVICE_ALIAS);
 }
 
+static void nativeSysfsNodeChanged(JNIEnv* env, jobject nativeImplObj, jstring path) {
+    ScopedUtfChars sysfsNodePathChars(env, path);
+    const std::string sysfsNodePath = sysfsNodePathChars.c_str();
+
+    NativeInputManager* im = getNativeInputManager(env, nativeImplObj);
+    im->getInputManager()->getReader().sysfsNodeChanged(sysfsNodePath);
+}
+
 static std::string dumpInputProperties() {
     std::string out = "Input properties:\n";
     const std::string strategy =
@@ -2651,6 +2644,7 @@
         {"getBatteryDevicePath", "(I)Ljava/lang/String;", (void*)nativeGetBatteryDevicePath},
         {"reloadKeyboardLayouts", "()V", (void*)nativeReloadKeyboardLayouts},
         {"reloadDeviceAliases", "()V", (void*)nativeReloadDeviceAliases},
+        {"sysfsNodeChanged", "(Ljava/lang/String;)V", (void*)nativeSysfsNodeChanged},
         {"dump", "()Ljava/lang/String;", (void*)nativeDump},
         {"monitor", "()V", (void*)nativeMonitor},
         {"isInputDeviceEnabled", "(I)Z", (void*)nativeIsInputDeviceEnabled},
@@ -2837,9 +2831,6 @@
     GET_METHOD_ID(gServiceClassInfo.getParentSurfaceForPointers, clazz,
                   "getParentSurfaceForPointers", "(I)J");
 
-    GET_METHOD_ID(gServiceClassInfo.isPerDisplayTouchModeEnabled, clazz,
-                  "isPerDisplayTouchModeEnabled", "()Z");
-
     // InputDevice
 
     FIND_CLASS(gInputDeviceClassInfo.clazz, "android/view/InputDevice");
diff --git a/services/core/jni/gnss/AGnssRil.cpp b/services/core/jni/gnss/AGnssRil.cpp
index c7a1af7..b21489a 100644
--- a/services/core/jni/gnss/AGnssRil.cpp
+++ b/services/core/jni/gnss/AGnssRil.cpp
@@ -89,6 +89,10 @@
 }
 
 jboolean AGnssRil::injectNiSuplMessageData(const jbyteArray& msgData, jint length, jint slotIndex) {
+    if (mIAGnssRil->getInterfaceVersion() <= 2) {
+        ALOGE("IAGnssRil does not support injectNiSuplMessageData().");
+        return JNI_FALSE;
+    }
     JNIEnv* env = getJniEnv();
     jbyte* bytes = reinterpret_cast<jbyte*>(env->GetPrimitiveArrayCritical(msgData, 0));
     auto status = mIAGnssRil->injectNiSuplMessageData(std::vector<uint8_t>((const uint8_t*)bytes,
diff --git a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java
index 6bfcd39..5c77aa22 100644
--- a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java
@@ -30,6 +30,7 @@
 import android.util.Log;
 
 import java.util.ArrayList;
+import java.util.Set;
 
 /**
  * Central session for a single clearCredentialState request. This class listens to the
@@ -40,12 +41,15 @@
         implements ProviderSession.ProviderInternalCallback<Void> {
     private static final String TAG = "GetRequestSession";
 
-    public ClearRequestSession(Context context, int userId, int callingUid,
+    public ClearRequestSession(Context context, RequestSession.SessionLifetime sessionCallback,
+            Object lock, int userId, int callingUid,
             IClearCredentialStateCallback callback, ClearCredentialStateRequest request,
-            CallingAppInfo callingAppInfo, CancellationSignal cancellationSignal,
+            CallingAppInfo callingAppInfo, Set<ComponentName> enabledProviders,
+            CancellationSignal cancellationSignal,
             long startedTimestamp) {
-        super(context, userId, callingUid, request, callback, RequestInfo.TYPE_UNDEFINED,
-                callingAppInfo, cancellationSignal, startedTimestamp);
+        super(context, sessionCallback, lock, userId, callingUid, request, callback,
+                RequestInfo.TYPE_UNDEFINED,
+                callingAppInfo, enabledProviders, cancellationSignal, startedTimestamp);
     }
 
     /**
@@ -72,7 +76,7 @@
 
     @Override // from provider session
     public void onProviderStatusChanged(ProviderSession.Status status,
-            ComponentName componentName) {
+            ComponentName componentName, ProviderSession.CredentialsSource source) {
         Log.i(TAG, "in onStatusChanged with status: " + status);
         if (ProviderSession.isTerminatingStatus(status)) {
             Log.i(TAG, "in onStatusChanged terminating status");
diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java
index dfd8cfa..02aaf867 100644
--- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java
@@ -38,6 +38,7 @@
 import com.android.server.credentials.metrics.ProviderStatusForMetrics;
 
 import java.util.ArrayList;
+import java.util.Set;
 
 /**
  * Central session for a single {@link CredentialManager#createCredential} request.
@@ -49,14 +50,17 @@
         implements ProviderSession.ProviderInternalCallback<CreateCredentialResponse> {
     private static final String TAG = "CreateRequestSession";
 
-    CreateRequestSession(@NonNull Context context, int userId, int callingUid,
+    CreateRequestSession(@NonNull Context context, RequestSession.SessionLifetime sessionCallback,
+            Object lock, int userId, int callingUid,
             CreateCredentialRequest request,
             ICreateCredentialCallback callback,
             CallingAppInfo callingAppInfo,
+            Set<ComponentName> enabledProviders,
             CancellationSignal cancellationSignal,
             long startedTimestamp) {
-        super(context, userId, callingUid, request, callback, RequestInfo.TYPE_CREATE,
-                callingAppInfo, cancellationSignal, startedTimestamp);
+        super(context, sessionCallback, lock, userId, callingUid, request, callback,
+                RequestInfo.TYPE_CREATE,
+                callingAppInfo, enabledProviders, cancellationSignal, startedTimestamp);
     }
 
     /**
@@ -83,6 +87,7 @@
     @Override
     protected void launchUiWithProviderData(ArrayList<ProviderData> providerDataList) {
         mRequestSessionMetric.collectUiCallStartTime(System.nanoTime());
+        mCredentialManagerUi.setStatus(CredentialManagerUi.UiStatus.USER_INTERACTION);
         try {
             mClientCallback.onPendingIntent(mCredentialManagerUi.createPendingIntent(
                     RequestInfo.newCreateRequestInfo(
@@ -93,6 +98,7 @@
                     providerDataList));
         } catch (RemoteException e) {
             mRequestSessionMetric.collectUiReturnedFinalPhase(/*uiReturned=*/ false);
+            mCredentialManagerUi.setStatus(CredentialManagerUi.UiStatus.TERMINATED);
             respondToClientWithErrorAndFinish(
                     CreateCredentialException.TYPE_UNKNOWN,
                     "Unable to invoke selector");
@@ -156,7 +162,7 @@
 
     @Override
     public void onProviderStatusChanged(ProviderSession.Status status,
-            ComponentName componentName) {
+            ComponentName componentName, ProviderSession.CredentialsSource source) {
         Log.i(TAG, "in onProviderStatusChanged with status: " + status);
         // If all provider responses have been received, we can either need the UI,
         // or we need to respond with error. The only other case is the entry being
diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java
index 531a6bd..9320dd2 100644
--- a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java
+++ b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java
@@ -33,7 +33,6 @@
 import android.credentials.ClearCredentialStateRequest;
 import android.credentials.CreateCredentialException;
 import android.credentials.CreateCredentialRequest;
-import android.credentials.CredentialManager;
 import android.credentials.CredentialOption;
 import android.credentials.CredentialProviderInfo;
 import android.credentials.GetCredentialException;
@@ -50,6 +49,7 @@
 import android.credentials.ui.IntentFactory;
 import android.os.Binder;
 import android.os.CancellationSignal;
+import android.os.IBinder;
 import android.os.ICancellationSignal;
 import android.os.RemoteException;
 import android.os.UserHandle;
@@ -70,9 +70,11 @@
 import com.android.server.infra.SecureSettingsServiceNameResolver;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
@@ -94,6 +96,8 @@
     private static final String PERMISSION_DENIED_ERROR = "permission_denied";
     private static final String PERMISSION_DENIED_WRITE_SECURE_SETTINGS_ERROR =
             "Caller is missing WRITE_SECURE_SETTINGS permission";
+    private static final String DEVICE_CONFIG_ENABLE_CREDENTIAL_MANAGER =
+            "enable_credential_manager";
 
     private final Context mContext;
 
@@ -102,6 +106,13 @@
     private final SparseArray<List<CredentialManagerServiceImpl>> mSystemServicesCacheList =
             new SparseArray<>();
 
+    /** Cache of all ongoing request sessions per user id. */
+    @GuardedBy("mLock")
+    private final SparseArray<Map<IBinder, RequestSession>> mRequestSessions =
+            new SparseArray<>();
+
+    private final SessionManager mSessionManager = new SessionManager();
+
     public CredentialManagerService(@NonNull Context context) {
         super(
                 context,
@@ -331,7 +342,7 @@
 
     @NonNull
     private Set<Pair<CredentialOption, CredentialDescriptionRegistry.FilterResult>>
-            getFilteredResultFromRegistry(List<CredentialOption> options) {
+    getFilteredResultFromRegistry(List<CredentialOption> options) {
         // Session for active/provisioned credential descriptions;
         CredentialDescriptionRegistry registry =
                 CredentialDescriptionRegistry.forUser(UserHandle.getCallingUserId());
@@ -389,14 +400,6 @@
         return providerSessions;
     }
 
-    private List<CredentialProviderInfo> getServicesForCredentialDescription(int userId) {
-        return CredentialProviderInfoFactory.getCredentialProviderServices(
-                mContext,
-                userId,
-                CredentialManager.PROVIDER_FILTER_ALL_PROVIDERS,
-                new HashSet<>());
-    }
-
     @Override
     @GuardedBy("CredentialDescriptionRegistry.sLock")
     public void onUserStopped(@NonNull TargetUser user) {
@@ -438,29 +441,46 @@
                     + callingPackage);
             ICancellationSignal cancelTransport = CancellationSignal.createTransport();
 
-            if (request.getOrigin() != null) {
-                // Check privileged permissions
-                mContext.enforceCallingPermission(CREDENTIAL_MANAGER_SET_ORIGIN, null);
-            }
-            enforcePermissionForAllowedProviders(request);
-
             final int userId = UserHandle.getCallingUserId();
             final int callingUid = Binder.getCallingUid();
             enforceCallingPackage(callingPackage, callingUid);
 
+            validateGetCredentialRequest(request);
+
             // New request session, scoped for this request only.
             final GetRequestSession session =
                     new GetRequestSession(
                             getContext(),
+                            mSessionManager,
+                            mLock,
                             userId,
                             callingUid,
                             callback,
                             request,
                             constructCallingAppInfo(callingPackage, userId, request.getOrigin()),
+                            getEnabledProviders(),
                             CancellationSignal.fromTransport(cancelTransport),
                             timestampBegan);
+            addSessionLocked(userId, session);
 
-            processGetCredential(request, callback, session);
+            List<ProviderSession> providerSessions =
+                    prepareProviderSessions(request, session);
+
+            if (providerSessions.isEmpty()) {
+                try {
+                    callback.onError(
+                            GetCredentialException.TYPE_NO_CREDENTIAL,
+                            "No credentials available on this device.");
+                } catch (RemoteException e) {
+                    Log.i(
+                            TAG,
+                            "Issue invoking onError on IGetCredentialCallback "
+                                    + "callback: "
+                                    + e.getMessage());
+                }
+            }
+
+            invokeProviderSessions(providerSessions);
             return cancelTransport;
         }
 
@@ -486,24 +506,44 @@
             final PrepareGetRequestSession session =
                     new PrepareGetRequestSession(
                             getContext(),
+                            mSessionManager,
+                            mLock,
                             userId,
                             callingUid,
-                            prepareGetCredentialCallback,
                             getCredentialCallback,
                             request,
                             constructCallingAppInfo(callingPackage, userId, request.getOrigin()),
+                            getEnabledProviders(),
                             CancellationSignal.fromTransport(cancelTransport),
-                            timestampBegan);
+                            timestampBegan,
+                            prepareGetCredentialCallback);
 
-            processGetCredential(request, prepareGetCredentialCallback, session);
+            List<ProviderSession> providerSessions = prepareProviderSessions(request, session);
+
+            if (providerSessions.isEmpty()) {
+                try {
+                    // TODO: fix
+                    prepareGetCredentialCallback.onResponse(
+                            new PrepareGetCredentialResponseInternal(
+                                    false, null,
+                                    false, false, null));
+                } catch (RemoteException e) {
+                    Log.i(
+                            TAG,
+                            "Issue invoking onError on IGetCredentialCallback "
+                                    + "callback: "
+                                    + e.getMessage());
+                }
+            }
+
+            invokeProviderSessions(providerSessions);
 
             return cancelTransport;
         }
 
-        private void processGetCredential(
+        private List<ProviderSession> prepareProviderSessions(
                 GetCredentialRequest request,
-                IPrepareGetCredentialCallback callback,
-                PrepareGetRequestSession session) {
+                GetRequestSession session) {
             List<ProviderSession> providerSessions;
 
             if (isCredentialDescriptionApiEnabled()) {
@@ -552,92 +592,12 @@
                                         .collect(Collectors.toList()));
             }
 
-            if (providerSessions.isEmpty()) {
-                try {
-                    // TODO: fix
-                    callback.onResponse(new PrepareGetCredentialResponseInternal(
-                            false, null, false, false, null));
-                } catch (RemoteException e) {
-                    Log.i(
-                            TAG,
-                            "Issue invoking onError on IGetCredentialCallback "
-                                    + "callback: "
-                                    + e.getMessage());
-                }
-            }
-
             finalizeAndEmitInitialPhaseMetric(session);
             // TODO(b/271135048) - May still be worth emitting in the empty cases above.
-            providerSessions.forEach(ProviderSession::invokeSession);
+            return providerSessions;
         }
 
-        private void processGetCredential(
-                GetCredentialRequest request,
-                IGetCredentialCallback callback,
-                GetRequestSession session) {
-            List<ProviderSession> providerSessions;
-
-            if (isCredentialDescriptionApiEnabled()) {
-                List<CredentialOption> optionsThatRequireActiveCredentials =
-                        request.getCredentialOptions().stream()
-                                .filter(credentialOption -> credentialOption
-                                                .getCredentialRetrievalData()
-                                                .getStringArrayList(
-                                                        CredentialOption
-                                                                .SUPPORTED_ELEMENT_KEYS) != null)
-                                .toList();
-
-                List<CredentialOption> optionsThatDoNotRequireActiveCredentials =
-                        request.getCredentialOptions().stream()
-                                .filter(credentialOption -> credentialOption
-                                        .getCredentialRetrievalData()
-                                        .getStringArrayList(
-                                                CredentialOption
-                                                        .SUPPORTED_ELEMENT_KEYS) == null)
-                                .toList();
-
-                List<ProviderSession> sessionsWithoutRemoteService =
-                        initiateProviderSessionsWithActiveContainers(
-                                session,
-                                getFilteredResultFromRegistry(optionsThatRequireActiveCredentials));
-
-                List<ProviderSession> sessionsWithRemoteService =
-                        initiateProviderSessions(
-                                session,
-                                optionsThatDoNotRequireActiveCredentials.stream()
-                                        .map(CredentialOption::getType)
-                                        .collect(Collectors.toList()));
-
-                Set<ProviderSession> all = new LinkedHashSet<>();
-                all.addAll(sessionsWithRemoteService);
-                all.addAll(sessionsWithoutRemoteService);
-
-                providerSessions = new ArrayList<>(all);
-            } else {
-                // Initiate all provider sessions
-                providerSessions =
-                        initiateProviderSessions(
-                                session,
-                                request.getCredentialOptions().stream()
-                                        .map(CredentialOption::getType)
-                                        .collect(Collectors.toList()));
-            }
-
-            if (providerSessions.isEmpty()) {
-                try {
-                    callback.onError(
-                            GetCredentialException.TYPE_NO_CREDENTIAL,
-                            "No credentials available on this device.");
-                } catch (RemoteException e) {
-                    Slog.e(
-                            TAG,
-                            "Issue invoking onError on IGetCredentialCallback "
-                                    + "callback: ", e);
-                }
-            }
-
-            finalizeAndEmitInitialPhaseMetric(session);
-            // TODO(b/271135048) - May still be worth emitting in the empty cases above.
+        private void invokeProviderSessions(List<ProviderSession> providerSessions) {
             providerSessions.forEach(ProviderSession::invokeSession);
         }
 
@@ -664,13 +624,17 @@
             final CreateRequestSession session =
                     new CreateRequestSession(
                             getContext(),
+                            mSessionManager,
+                            mLock,
                             userId,
                             callingUid,
                             request,
                             callback,
                             constructCallingAppInfo(callingPackage, userId, request.getOrigin()),
+                            getEnabledProviders(),
                             CancellationSignal.fromTransport(cancelTransport),
                             timestampBegan);
+            addSessionLocked(userId, session);
 
             processCreateCredential(request, callback, session);
             return cancelTransport;
@@ -825,6 +789,19 @@
                     mContext, userId, providerFilter, getEnabledProviders());
         }
 
+        @Override
+        public boolean isServiceEnabled() {
+            final long origId = Binder.clearCallingIdentity();
+            try {
+                return DeviceConfig.getBoolean(
+                        DeviceConfig.NAMESPACE_CREDENTIAL,
+                        DEVICE_CONFIG_ENABLE_CREDENTIAL_MANAGER,
+                        false);
+            } finally {
+                Binder.restoreCallingIdentity(origId);
+            }
+        }
+
         @SuppressWarnings("GuardedBy") // ErrorProne requires service.mLock which is the same
         // this.mLock
         private Set<ComponentName> getEnabledProviders() {
@@ -865,13 +842,17 @@
             final ClearRequestSession session =
                     new ClearRequestSession(
                             getContext(),
+                            mSessionManager,
+                            mLock,
                             userId,
                             callingUid,
                             callback,
                             request,
                             constructCallingAppInfo(callingPackage, userId, null),
+                            getEnabledProviders(),
                             CancellationSignal.fromTransport(cancelTransport),
                             timestampBegan);
+            addSessionLocked(userId, session);
 
             // Initiate all provider sessions
             // TODO: Determine if provider needs to have clear capability in their manifest
@@ -936,6 +917,14 @@
         }
     }
 
+    private void validateGetCredentialRequest(GetCredentialRequest request) {
+        if (request.getOrigin() != null) {
+            // Check privileged permissions
+            mContext.enforceCallingPermission(CREDENTIAL_MANAGER_SET_ORIGIN, null);
+        }
+        enforcePermissionForAllowedProviders(request);
+    }
+
     private void enforcePermissionForAllowedProviders(GetCredentialRequest request) {
         boolean containsAllowedProviders = request.getCredentialOptions()
                 .stream()
@@ -947,6 +936,13 @@
         }
     }
 
+    private void addSessionLocked(@UserIdInt int userId,
+            RequestSession requestSession) {
+        synchronized (mLock) {
+            mSessionManager.addSession(userId, requestSession.mRequestId, requestSession);
+        }
+    }
+
     private void enforceCallingPackage(String callingPackage, int callingUid) {
         int packageUid;
         PackageManager pm = mContext.createContextAsUser(
@@ -961,4 +957,23 @@
             throw new SecurityException(callingPackage + " does not belong to uid " + callingUid);
         }
     }
+
+    private class SessionManager implements RequestSession.SessionLifetime {
+        @Override
+        @GuardedBy("mLock")
+        public void onFinishRequestSession(@UserIdInt int userId, IBinder token) {
+            Log.i(TAG, "In onFinishRequestSession");
+            if (mRequestSessions.get(userId) != null) {
+                mRequestSessions.get(userId).remove(token);
+            }
+        }
+
+        @GuardedBy("mLock")
+        public void addSession(int userId, IBinder token, RequestSession requestSession) {
+            if (mRequestSessions.get(userId) == null) {
+                mRequestSessions.put(userId, new HashMap<>());
+            }
+            mRequestSessions.get(userId).put(token, requestSession);
+        }
+    }
 }
diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java
index 546c37f..8750906 100644
--- a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java
+++ b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java
@@ -20,7 +20,6 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.ServiceInfo;
 import android.credentials.CredentialManager;
 import android.credentials.CredentialProviderInfo;
 import android.credentials.ui.DisabledProviderData;
@@ -30,6 +29,7 @@
 import android.credentials.ui.UserSelectionDialogResult;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.IBinder;
 import android.os.Looper;
 import android.os.ResultReceiver;
 import android.service.credentials.CredentialProviderInfoFactory;
@@ -37,20 +37,32 @@
 import android.util.Slog;
 
 import java.util.ArrayList;
-import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.UUID;
-import java.util.stream.Collectors;
 
 /** Initiates the Credential Manager UI and receives results. */
 public class CredentialManagerUi {
     private static final String TAG = "CredentialManagerUi";
     @NonNull
     private final CredentialManagerUiCallback mCallbacks;
-    @NonNull private final Context mContext;
+    @NonNull
+    private final Context mContext;
     // TODO : Use for starting the activity for this user
     private final int mUserId;
-    @NonNull private final ResultReceiver mResultReceiver = new ResultReceiver(
+
+    private UiStatus mStatus;
+
+    private final Set<ComponentName> mEnabledProviders;
+
+    enum UiStatus {
+        IN_PROGRESS,
+        USER_INTERACTION,
+        NOT_STARTED, TERMINATED
+    }
+
+    @NonNull
+    private final ResultReceiver mResultReceiver = new ResultReceiver(
             new Handler(Looper.getMainLooper())) {
         @Override
         protected void onReceiveResult(int resultCode, Bundle resultData) {
@@ -61,6 +73,7 @@
     private void handleUiResult(int resultCode, Bundle resultData) {
         switch (resultCode) {
             case UserSelectionDialogResult.RESULT_CODE_DIALOG_COMPLETE_WITH_SELECTION:
+                mStatus = UiStatus.IN_PROGRESS;
                 UserSelectionDialogResult selection = UserSelectionDialogResult
                         .fromResultData(resultData);
                 if (selection != null) {
@@ -70,75 +83,90 @@
                 }
                 break;
             case UserSelectionDialogResult.RESULT_CODE_DIALOG_USER_CANCELED:
+                mStatus = UiStatus.TERMINATED;
                 mCallbacks.onUiCancellation(/* isUserCancellation= */ true);
                 break;
             case UserSelectionDialogResult.RESULT_CODE_CANCELED_AND_LAUNCHED_SETTINGS:
+                mStatus = UiStatus.TERMINATED;
                 mCallbacks.onUiCancellation(/* isUserCancellation= */ false);
                 break;
             case UserSelectionDialogResult.RESULT_CODE_DATA_PARSING_FAILURE:
+                mStatus = UiStatus.TERMINATED;
                 mCallbacks.onUiSelectorInvocationFailure();
                 break;
             default:
                 Slog.i(TAG, "Unknown error code returned from the UI");
+                mStatus = UiStatus.IN_PROGRESS;
                 mCallbacks.onUiSelectorInvocationFailure();
                 break;
         }
     }
 
+    /** Creates intent that is ot be invoked to cancel an in-progress UI session. */
+    public Intent createCancelIntent(IBinder requestId, String packageName) {
+        return IntentFactory.createCancelUiIntent(requestId, /*shouldShowCancellationUi=*/ true,
+                packageName);
+    }
+
     /**
      * Interface to be implemented by any class that wishes to get callbacks from the UI.
      */
     public interface CredentialManagerUiCallback {
         /** Called when the user makes a selection. */
         void onUiSelection(UserSelectionDialogResult selection);
+
         /** Called when the UI is canceled without a successful provider result. */
         void onUiCancellation(boolean isUserCancellation);
 
         /** Called when the selector UI fails to come up (mostly due to parsing issue today). */
         void onUiSelectorInvocationFailure();
     }
+
     public CredentialManagerUi(Context context, int userId,
-            CredentialManagerUiCallback callbacks) {
+            CredentialManagerUiCallback callbacks, Set<ComponentName> enabledProviders) {
         Log.i(TAG, "In CredentialManagerUi constructor");
         mContext = context;
         mUserId = userId;
         mCallbacks = callbacks;
+        mEnabledProviders = enabledProviders;
+        mStatus = UiStatus.IN_PROGRESS;
+    }
+
+    /** Set status for credential manager UI */
+    public void setStatus(UiStatus status) {
+        mStatus = status;
+    }
+
+    /** Returns status for credential manager UI */
+    public UiStatus getStatus() {
+        return mStatus;
     }
 
     /**
      * Creates a {@link PendingIntent} to be used to invoke the credential manager selector UI,
      * by the calling app process.
-     * @param requestInfo the information about the request
+     *
+     * @param requestInfo      the information about the request
      * @param providerDataList the list of provider data from remote providers
      */
     public PendingIntent createPendingIntent(
             RequestInfo requestInfo, ArrayList<ProviderData> providerDataList) {
         Log.i(TAG, "In createPendingIntent");
 
-        ArrayList<DisabledProviderData> disabledProviderDataList = new ArrayList<>();
-        Set<String> enabledProviders = providerDataList.stream()
-                .map(ProviderData::getProviderFlattenedComponentName)
-                .collect(Collectors.toUnmodifiableSet());
-        Set<String> allProviders =
+        List<CredentialProviderInfo> allProviders =
                 CredentialProviderInfoFactory.getCredentialProviderServices(
-                                mContext,
-                                mUserId,
-                                CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY,
-                                new HashSet<>())
-                        .stream()
-                        .map(CredentialProviderInfo::getServiceInfo)
-                        .map(ServiceInfo::getComponentName)
-                        .map(ComponentName::flattenToString)
-                        .collect(Collectors.toUnmodifiableSet());
+                        mContext,
+                        mUserId,
+                        CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY,
+                        mEnabledProviders);
 
-        for (String provider: allProviders) {
-            if (!enabledProviders.contains(provider)) {
-                disabledProviderDataList.add(new DisabledProviderData(provider));
-            }
-        }
+        List<DisabledProviderData> disabledProviderDataList = allProviders.stream()
+                .filter(provider -> !provider.isEnabled())
+                .map(disabledProvider -> new DisabledProviderData(
+                        disabledProvider.getComponentName().flattenToString())).toList();
 
         Intent intent = IntentFactory.createCredentialSelectorIntent(requestInfo, providerDataList,
-                        disabledProviderDataList, mResultReceiver)
+                        new ArrayList<>(disabledProviderDataList), mResultReceiver)
                 .setAction(UUID.randomUUID().toString());
         //TODO: Create unique pending intent using request code and cancel any pre-existing pending
         // intents
diff --git a/services/credentials/java/com/android/server/credentials/GetRequestSession.java b/services/credentials/java/com/android/server/credentials/GetRequestSession.java
index 93f543e..c44e665 100644
--- a/services/credentials/java/com/android/server/credentials/GetRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/GetRequestSession.java
@@ -35,6 +35,7 @@
 import com.android.server.credentials.metrics.ProviderStatusForMetrics;
 
 import java.util.ArrayList;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -45,21 +46,26 @@
         IGetCredentialCallback, GetCredentialResponse>
         implements ProviderSession.ProviderInternalCallback<GetCredentialResponse> {
     private static final String TAG = "GetRequestSession";
-    public GetRequestSession(Context context, int userId, int callingUid,
+
+    public GetRequestSession(Context context, RequestSession.SessionLifetime sessionCallback,
+            Object lock, int userId, int callingUid,
             IGetCredentialCallback callback, GetCredentialRequest request,
-            CallingAppInfo callingAppInfo, CancellationSignal cancellationSignal,
+            CallingAppInfo callingAppInfo, Set<ComponentName> enabledProviders,
+            CancellationSignal cancellationSignal,
             long startedTimestamp) {
-        super(context, userId, callingUid, request, callback, RequestInfo.TYPE_GET,
-                callingAppInfo, cancellationSignal, startedTimestamp);
+        super(context, sessionCallback, lock, userId, callingUid, request, callback,
+                RequestInfo.TYPE_GET, callingAppInfo, enabledProviders, cancellationSignal,
+                startedTimestamp);
         int numTypes = (request.getCredentialOptions().stream()
                 .map(CredentialOption::getType).collect(
-                Collectors.toSet())).size(); // Dedupe type strings
+                        Collectors.toSet())).size(); // Dedupe type strings
         mRequestSessionMetric.collectGetFlowInitialMetricInfo(numTypes);
     }
 
     /**
      * Creates a new provider session, and adds it list of providers that are contributing to
      * this session.
+     *
      * @return the provider session created within this request session, for the given provider
      * info.
      */
@@ -81,6 +87,7 @@
     @Override
     protected void launchUiWithProviderData(ArrayList<ProviderData> providerDataList) {
         mRequestSessionMetric.collectUiCallStartTime(System.nanoTime());
+        mCredentialManagerUi.setStatus(CredentialManagerUi.UiStatus.USER_INTERACTION);
         try {
             mClientCallback.onPendingIntent(mCredentialManagerUi.createPendingIntent(
                     RequestInfo.newGetRequestInfo(
@@ -88,6 +95,7 @@
                     providerDataList));
         } catch (RemoteException e) {
             mRequestSessionMetric.collectUiReturnedFinalPhase(/*uiReturned=*/ false);
+            mCredentialManagerUi.setStatus(CredentialManagerUi.UiStatus.TERMINATED);
             respondToClientWithErrorAndFinish(
                     GetCredentialException.TYPE_UNKNOWN, "Unable to instantiate selector");
         }
@@ -146,13 +154,14 @@
     @Override
     public void onUiSelectorInvocationFailure() {
         respondToClientWithErrorAndFinish(GetCredentialException.TYPE_NO_CREDENTIAL,
-                    "No credentials available.");
+                "No credentials available.");
     }
 
     @Override
     public void onProviderStatusChanged(ProviderSession.Status status,
-            ComponentName componentName) {
-        Log.i(TAG, "in onStatusChanged with status: " + status);
+            ComponentName componentName, ProviderSession.CredentialsSource source) {
+        Log.i(TAG, "in onStatusChanged with status: " + status + "and source: " + source);
+
         // Auth entry was selected, and it did not have any underlying credentials
         if (status == ProviderSession.Status.NO_CREDENTIALS_FROM_AUTH_ENTRY) {
             handleEmptyAuthenticationSelection(componentName);
@@ -173,7 +182,7 @@
         }
     }
 
-    private void handleEmptyAuthenticationSelection(ComponentName componentName) {
+    protected void handleEmptyAuthenticationSelection(ComponentName componentName) {
         // Update auth entry statuses across different provider sessions
         mProviders.keySet().forEach(key -> {
             ProviderGetSession session = (ProviderGetSession) mProviders.get(key);
diff --git a/services/credentials/java/com/android/server/credentials/MetricUtilities.java b/services/credentials/java/com/android/server/credentials/MetricUtilities.java
index c48654a..703ab7c 100644
--- a/services/credentials/java/com/android/server/credentials/MetricUtilities.java
+++ b/services/credentials/java/com/android/server/credentials/MetricUtilities.java
@@ -108,7 +108,7 @@
                 browsedProviderUid[index] = metric.getProviderUid();
                 index++;
             }
-            FrameworkStatsLog.write(FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE,
+            FrameworkStatsLog.write(FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED,
                     /* session_id */ finalPhaseMetric.getSessionId(),
                     /* sequence_num */ emitSequenceId,
                     /* ui_returned_final_start */ finalPhaseMetric.isUiReturned(),
@@ -204,7 +204,7 @@
                 candidateRemoteEntryCountList[index] = metric.getRemoteEntryCount();
                 index++;
             }
-            FrameworkStatsLog.write(FrameworkStatsLog.CREDENTIAL_MANAGER_CANDIDATE_PHASE,
+            FrameworkStatsLog.write(FrameworkStatsLog.CREDENTIAL_MANAGER_CANDIDATE_PHASE_REPORTED,
                     /* session_id */ sessionId,
                     /* sequence_num */ emitSequenceId,
                     /* query_returned */ queryReturned,
@@ -277,7 +277,7 @@
             if (!LOG_FLAG) {
                 return;
             }
-            FrameworkStatsLog.write(FrameworkStatsLog.CREDENTIAL_MANAGER_INIT_PHASE,
+            FrameworkStatsLog.write(FrameworkStatsLog.CREDENTIAL_MANAGER_INIT_PHASE_REPORTED,
                     /* api_name */ initialPhaseMetric.getApiName(),
                     /* caller_uid */ initialPhaseMetric.getCallerUid(),
                     /* session_id */ initialPhaseMetric.getSessionId(),
diff --git a/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java b/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java
index 5c93f6b..f274e65 100644
--- a/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2022 The Android Open Source Project
+ * 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.
@@ -22,10 +22,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.credentials.CredentialOption;
-import android.credentials.CredentialProviderInfo;
-import android.credentials.GetCredentialException;
 import android.credentials.GetCredentialRequest;
-import android.credentials.GetCredentialResponse;
 import android.credentials.IGetCredentialCallback;
 import android.credentials.IPrepareGetCredentialCallback;
 import android.credentials.PrepareGetCredentialResponseInternal;
@@ -37,32 +34,29 @@
 import android.service.credentials.CallingAppInfo;
 import android.service.credentials.PermissionUtils;
 import android.util.Log;
-
-import com.android.server.credentials.metrics.ProviderStatusForMetrics;
+import android.util.Slog;
 
 import java.util.ArrayList;
 import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
- * Central session for a single prepareGetCredentials request. This class listens to the
- * responses from providers, and the UX app, and updates the provider(S) state.
+ * Central session for a single pendingGetCredential request. This class listens to the
+ * responses from providers, and the UX app, and updates the provider(s) state.
  */
-public class PrepareGetRequestSession extends RequestSession<GetCredentialRequest,
-        IGetCredentialCallback, GetCredentialResponse>
-        implements ProviderSession.ProviderInternalCallback<GetCredentialResponse> {
-    private static final String TAG = "GetRequestSession";
+public class PrepareGetRequestSession extends GetRequestSession {
+    private static final String TAG = "PrepareGetRequestSession";
 
     private final IPrepareGetCredentialCallback mPrepareGetCredentialCallback;
-    private boolean mIsInitialQuery = true;
 
-    public PrepareGetRequestSession(Context context, int userId, int callingUid,
-            IPrepareGetCredentialCallback prepareGetCredentialCallback,
-            IGetCredentialCallback getCredCallback, GetCredentialRequest request,
-            CallingAppInfo callingAppInfo, CancellationSignal cancellationSignal,
-            long startedTimestamp) {
-        super(context, userId, callingUid, request, getCredCallback, RequestInfo.TYPE_GET,
-                callingAppInfo, cancellationSignal, startedTimestamp);
+    public PrepareGetRequestSession(Context context,
+            RequestSession.SessionLifetime sessionCallback, Object lock, int userId,
+            int callingUid, IGetCredentialCallback getCredCallback, GetCredentialRequest request,
+            CallingAppInfo callingAppInfo, Set<ComponentName> enabledProviders,
+            CancellationSignal cancellationSignal, long startedTimestamp,
+            IPrepareGetCredentialCallback prepareGetCredentialCallback) {
+        super(context, sessionCallback, lock, userId, callingUid, getCredCallback, request,
+                callingAppInfo, enabledProviders, cancellationSignal, startedTimestamp);
         int numTypes = (request.getCredentialOptions().stream()
                 .map(CredentialOption::getType).collect(
                         Collectors.toSet())).size(); // Dedupe type strings
@@ -70,146 +64,53 @@
         mPrepareGetCredentialCallback = prepareGetCredentialCallback;
     }
 
-    /**
-     * Creates a new provider session, and adds it list of providers that are contributing to
-     * this session.
-     *
-     * @return the provider session created within this request session, for the given provider
-     * info.
-     */
     @Override
-    @Nullable
-    public ProviderSession initiateProviderSession(CredentialProviderInfo providerInfo,
-            RemoteCredentialService remoteCredentialService) {
-        ProviderGetSession providerGetSession = ProviderGetSession
-                .createNewSession(mContext, mUserId, providerInfo,
-                        this, remoteCredentialService);
-        if (providerGetSession != null) {
-            Log.i(TAG, "In startProviderSession - provider session created and being added");
-            mProviders.put(providerGetSession.getComponentName().flattenToString(),
-                    providerGetSession);
-        }
-        return providerGetSession;
-    }
-
-    @Override
-    protected void launchUiWithProviderData(ArrayList<ProviderData> providerDataList) {
-        mRequestSessionMetric.collectUiCallStartTime(System.nanoTime());
-        try {
-            mClientCallback.onPendingIntent(mCredentialManagerUi.createPendingIntent(
-                    RequestInfo.newGetRequestInfo(
-                            mRequestId, mClientRequest, mClientAppInfo.getPackageName()),
-                    providerDataList));
-        } catch (RemoteException e) {
-            mRequestSessionMetric.collectUiReturnedFinalPhase(/*uiReturned=*/ false);
-            respondToClientWithErrorAndFinish(
-                    GetCredentialException.TYPE_UNKNOWN, "Unable to instantiate selector");
-        }
-    }
-
-    @Override
-    protected void invokeClientCallbackSuccess(GetCredentialResponse response)
-            throws RemoteException {
-        mClientCallback.onResponse(response);
-    }
-
-    @Override
-    protected void invokeClientCallbackError(String errorType, String errorMsg)
-            throws RemoteException {
-        mClientCallback.onError(errorType, errorMsg);
-    }
-
-    @Override
-    public void onFinalResponseReceived(ComponentName componentName,
-            @Nullable GetCredentialResponse response) {
-        Log.i(TAG, "onFinalCredentialReceived from: " + componentName.flattenToString());
-        mRequestSessionMetric.collectUiResponseData(/*uiReturned=*/ true, System.nanoTime());
-        mRequestSessionMetric.collectChosenMetricViaCandidateTransfer(mProviders.get(
-                componentName.flattenToString()).mProviderSessionMetric
-                .getCandidatePhasePerProviderMetric());
-        if (response != null) {
-            mRequestSessionMetric.collectChosenProviderStatus(
-                    ProviderStatusForMetrics.FINAL_SUCCESS.getMetricCode());
-            respondToClientWithResponseAndFinish(response);
-        } else {
-            mRequestSessionMetric.collectChosenProviderStatus(
-                    ProviderStatusForMetrics.FINAL_FAILURE.getMetricCode());
-            respondToClientWithErrorAndFinish(GetCredentialException.TYPE_NO_CREDENTIAL,
-                    "Invalid response from provider");
-        }
-    }
-
-    //TODO: Try moving the three error & response methods below to RequestSession to be shared
-    // between get & create.
-    @Override
-    public void onFinalErrorReceived(ComponentName componentName, String errorType,
-            String message) {
-        respondToClientWithErrorAndFinish(errorType, message);
-    }
-
-    @Override
-    public void onUiCancellation(boolean isUserCancellation) {
-        if (isUserCancellation) {
-            respondToClientWithErrorAndFinish(GetCredentialException.TYPE_USER_CANCELED,
-                    "User cancelled the selector");
-        } else {
-            respondToClientWithErrorAndFinish(GetCredentialException.TYPE_INTERRUPTED,
-                    "The UI was interrupted - please try again.");
-        }
-    }
-
-    @Override
-    public void onUiSelectorInvocationFailure() {
-        respondToClientWithErrorAndFinish(GetCredentialException.TYPE_NO_CREDENTIAL,
-                "No credentials available.");
-    }
-
-    @Override
-    public void onProviderStatusChanged(ProviderSession.Status status,
-            ComponentName componentName) {
-        Log.i(TAG, "in onStatusChanged with status: " + status);
-        // Auth entry was selected, and it did not have any underlying credentials
-        if (status == ProviderSession.Status.NO_CREDENTIALS_FROM_AUTH_ENTRY) {
-            handleEmptyAuthenticationSelection(componentName);
-            return;
-        }
-        // For any other status, we check if all providers are done and then invoke UI if needed
-        if (!isAnyProviderPending()) {
-            // If all provider responses have been received, we can either need the UI,
-            // or we need to respond with error. The only other case is the entry being
-            // selected after the UI has been invoked which has a separate code path.
-            if (mIsInitialQuery) {
-                // First time in this state. UI shouldn't be invoked because developer wants to
-                // punt it for later
+    public void onProviderStatusChanged(ProviderSession.Status status, ComponentName componentName,
+            ProviderSession.CredentialsSource source) {
+        switch (source) {
+            case REMOTE_PROVIDER:
+                // Remote provider's status changed. We should check if all providers are done, and
+                // if UI invocation is needed.
+                if (isAnyProviderPending()) {
+                    // Waiting for a remote provider response
+                    return;
+                }
                 boolean hasQueryCandidatePermission = PermissionUtils.hasPermission(
                         mContext,
                         mClientAppInfo.getPackageName(),
                         Manifest.permission.CREDENTIAL_MANAGER_QUERY_CANDIDATE_CREDENTIALS);
                 if (isUiInvocationNeeded()) {
+                    // To avoid extra computation, we only prepare the data at this point when we
+                    // know that UI invocation is needed
                     ArrayList<ProviderData> providerData = getProviderDataForUi();
                     if (!providerData.isEmpty()) {
                         constructPendingResponseAndInvokeCallback(hasQueryCandidatePermission,
                                 getCredentialResultTypes(hasQueryCandidatePermission),
-                                hasAuthenticationResults(providerData, hasQueryCandidatePermission),
+                                hasAuthenticationResults(providerData,
+                                        hasQueryCandidatePermission),
                                 hasRemoteResults(providerData, hasQueryCandidatePermission),
                                 getUiIntent());
-                    } else {
-                        constructEmptyPendingResponseAndInvokeCallback(hasQueryCandidatePermission);
+                        return;
                     }
-                } else {
-                    constructEmptyPendingResponseAndInvokeCallback(hasQueryCandidatePermission);
                 }
-                mIsInitialQuery = false;
-            } else {
-                // Not the first time. This could be a result of a user selection leading to a UI
-                // invocation again.
-                if (isUiInvocationNeeded()) {
+                // We reach here if Ui invocation is not needed, or provider data is empty
+                constructEmptyPendingResponseAndInvokeCallback(
+                        hasQueryCandidatePermission);
+                break;
+
+            case AUTH_ENTRY:
+                // Status updated through a selected authentication entry. We don't need to
+                // check on any other credential source and can process this result directly.
+                if (status == ProviderSession.Status.NO_CREDENTIALS_FROM_AUTH_ENTRY) {
+                    // Update entry subtitle and re-invoke UI
+                    super.handleEmptyAuthenticationSelection(componentName);
+                } else if (status == ProviderSession.Status.CREDENTIALS_RECEIVED) {
                     getProviderDataAndInitiateUi();
-                } else {
-                    respondToClientWithErrorAndFinish(GetCredentialException.TYPE_NO_CREDENTIAL,
-                            "No credentials available");
                 }
-            }
+                break;
+            default:
+                Slog.w(TAG, "Unexpected source");
+                break;
         }
     }
 
@@ -294,34 +195,4 @@
             return null;
         }
     }
-
-    private void handleEmptyAuthenticationSelection(ComponentName componentName) {
-        // Update auth entry statuses across different provider sessions
-        mProviders.keySet().forEach(key -> {
-            ProviderGetSession session = (ProviderGetSession) mProviders.get(key);
-            if (!session.mComponentName.equals(componentName)) {
-                session.updateAuthEntriesStatusFromAnotherSession();
-            }
-        });
-
-        // Invoke UI since it needs to show a snackbar if last auth entry, or a status on each
-        // auth entries along with other valid entries
-        getProviderDataAndInitiateUi();
-
-        // Respond to client if all auth entries are empty and nothing else to show on the UI
-        if (providerDataContainsEmptyAuthEntriesOnly()) {
-            respondToClientWithErrorAndFinish(GetCredentialException.TYPE_NO_CREDENTIAL,
-                    "No credentials available");
-        }
-    }
-
-    private boolean providerDataContainsEmptyAuthEntriesOnly() {
-        for (String key : mProviders.keySet()) {
-            ProviderGetSession session = (ProviderGetSession) mProviders.get(key);
-            if (!session.containsEmptyAuthEntriesOnly()) {
-                return false;
-            }
-        }
-        return true;
-    }
 }
diff --git a/services/credentials/java/com/android/server/credentials/ProviderClearSession.java b/services/credentials/java/com/android/server/credentials/ProviderClearSession.java
index 2e7aaa0..0c3d3f4 100644
--- a/services/credentials/java/com/android/server/credentials/ProviderClearSession.java
+++ b/services/credentials/java/com/android/server/credentials/ProviderClearSession.java
@@ -23,6 +23,7 @@
 import android.credentials.CredentialProviderInfo;
 import android.credentials.ui.ProviderData;
 import android.credentials.ui.ProviderPendingIntentResponse;
+import android.os.ICancellationSignal;
 import android.service.credentials.CallingAppInfo;
 import android.service.credentials.ClearCredentialStateRequest;
 import android.util.Log;
@@ -82,7 +83,8 @@
     public void onProviderResponseSuccess(@Nullable Void response) {
         Log.i(TAG, "in onProviderResponseSuccess");
         mProviderResponseSet = true;
-        updateStatusAndInvokeCallback(Status.COMPLETE);
+        updateStatusAndInvokeCallback(Status.COMPLETE,
+                /*source=*/ CredentialsSource.REMOTE_PROVIDER);
     }
 
     /** Called when the provider response resulted in a failure. */
@@ -92,20 +94,27 @@
             mProviderException = (ClearCredentialStateException) exception;
         }
         mProviderSessionMetric.collectCandidateExceptionStatus(/*hasException=*/true);
-        updateStatusAndInvokeCallback(toStatus(errorCode));
+        updateStatusAndInvokeCallback(toStatus(errorCode),
+                /*source=*/ CredentialsSource.REMOTE_PROVIDER);
     }
 
     /** Called when provider service dies. */
     @Override // Callback from the remote provider
     public void onProviderServiceDied(RemoteCredentialService service) {
         if (service.getComponentName().equals(mComponentName)) {
-            updateStatusAndInvokeCallback(Status.SERVICE_DEAD);
+            updateStatusAndInvokeCallback(Status.SERVICE_DEAD,
+                    /*source=*/ CredentialsSource.REMOTE_PROVIDER);
         } else {
             Slog.i(TAG, "Component names different in onProviderServiceDied - "
                     + "this should not happen");
         }
     }
 
+    @Override
+    public void onProviderCancellable(ICancellationSignal cancellation) {
+        mProviderCancellationSignal = cancellation;
+    }
+
     @Nullable
     @Override
     protected ProviderData prepareUiData() {
diff --git a/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java b/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java
index e05eb60..8b9255a 100644
--- a/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java
+++ b/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java
@@ -29,6 +29,7 @@
 import android.credentials.ui.Entry;
 import android.credentials.ui.ProviderPendingIntentResponse;
 import android.os.Bundle;
+import android.os.ICancellationSignal;
 import android.service.credentials.BeginCreateCredentialRequest;
 import android.service.credentials.BeginCreateCredentialResponse;
 import android.service.credentials.CallingAppInfo;
@@ -157,20 +158,27 @@
             mProviderException = (CreateCredentialException) exception;
         }
         mProviderSessionMetric.collectCandidateExceptionStatus(/*hasException=*/true);
-        updateStatusAndInvokeCallback(toStatus(errorCode));
+        updateStatusAndInvokeCallback(toStatus(errorCode),
+                /*source=*/ CredentialsSource.REMOTE_PROVIDER);
     }
 
     /** Called when provider service dies. */
     @Override
     public void onProviderServiceDied(RemoteCredentialService service) {
         if (service.getComponentName().equals(mComponentName)) {
-            updateStatusAndInvokeCallback(Status.SERVICE_DEAD);
+            updateStatusAndInvokeCallback(Status.SERVICE_DEAD,
+                    /*source=*/ CredentialsSource.REMOTE_PROVIDER);
         } else {
             Slog.i(TAG, "Component names different in onProviderServiceDied - "
                     + "this should not happen");
         }
     }
 
+    @Override
+    public void onProviderCancellable(ICancellationSignal cancellation) {
+        mProviderCancellationSignal = cancellation;
+    }
+
     private void onSetInitialRemoteResponse(BeginCreateCredentialResponse response) {
         Log.i(TAG, "onSetInitialRemoteResponse with save entries");
         mProviderResponse = response;
@@ -178,10 +186,12 @@
                 response.getRemoteCreateEntry());
         if (mProviderResponseDataHandler.isEmptyResponse(response)) {
             mProviderSessionMetric.collectCandidateEntryMetrics(response);
-            updateStatusAndInvokeCallback(Status.EMPTY_RESPONSE);
+            updateStatusAndInvokeCallback(Status.EMPTY_RESPONSE,
+                    /*source=*/ CredentialsSource.REMOTE_PROVIDER);
         } else {
             mProviderSessionMetric.collectCandidateEntryMetrics(response);
-            updateStatusAndInvokeCallback(Status.SAVE_ENTRIES_RECEIVED);
+            updateStatusAndInvokeCallback(Status.SAVE_ENTRIES_RECEIVED,
+                    /*source=*/ CredentialsSource.REMOTE_PROVIDER);
         }
     }
 
@@ -232,7 +242,7 @@
     protected void invokeSession() {
         if (mRemoteCredentialService != null) {
             startCandidateMetrics();
-            mRemoteCredentialService.onCreateCredential(mProviderRequest, this);
+            mRemoteCredentialService.onBeginCreateCredential(mProviderRequest, this);
         }
     }
 
diff --git a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java
index b5f9e53..8d3d064 100644
--- a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java
+++ b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java
@@ -30,6 +30,7 @@
 import android.credentials.ui.Entry;
 import android.credentials.ui.GetCredentialProviderData;
 import android.credentials.ui.ProviderPendingIntentResponse;
+import android.os.ICancellationSignal;
 import android.service.credentials.Action;
 import android.service.credentials.BeginGetCredentialOption;
 import android.service.credentials.BeginGetCredentialRequest;
@@ -118,41 +119,6 @@
         return null;
     }
 
-    /** Creates a new provider session to be used by the request session. */
-    @Nullable
-    public static ProviderGetSession createNewSession(
-            Context context,
-            @UserIdInt int userId,
-            CredentialProviderInfo providerInfo,
-            PrepareGetRequestSession getRequestSession,
-            RemoteCredentialService remoteCredentialService) {
-        android.credentials.GetCredentialRequest filteredRequest =
-                filterOptions(providerInfo.getCapabilities(),
-                        getRequestSession.mClientRequest,
-                        providerInfo);
-        if (filteredRequest != null) {
-            Map<String, CredentialOption> beginGetOptionToCredentialOptionMap =
-                    new HashMap<>();
-            return new ProviderGetSession(
-                    context,
-                    providerInfo,
-                    getRequestSession,
-                    userId,
-                    remoteCredentialService,
-                    constructQueryPhaseRequest(
-                            filteredRequest, getRequestSession.mClientAppInfo,
-                            getRequestSession.mClientRequest.alwaysSendAppInfoToProvider(),
-                            beginGetOptionToCredentialOptionMap),
-                    filteredRequest,
-                    getRequestSession.mClientAppInfo,
-                    beginGetOptionToCredentialOptionMap,
-                    getRequestSession.mHybridService
-            );
-        }
-        Log.i(TAG, "Unable to create provider session");
-        return null;
-    }
-
     private static BeginGetCredentialRequest constructQueryPhaseRequest(
             android.credentials.GetCredentialRequest filteredRequest,
             CallingAppInfo callingAppInfo,
@@ -254,20 +220,27 @@
             mProviderException = (GetCredentialException) exception;
         }
         mProviderSessionMetric.collectCandidateExceptionStatus(/*hasException=*/true);
-        updateStatusAndInvokeCallback(toStatus(errorCode));
+        updateStatusAndInvokeCallback(toStatus(errorCode),
+                /*source=*/ CredentialsSource.REMOTE_PROVIDER);
     }
 
     /** Called when provider service dies. */
     @Override // Callback from the remote provider
     public void onProviderServiceDied(RemoteCredentialService service) {
         if (service.getComponentName().equals(mComponentName)) {
-            updateStatusAndInvokeCallback(Status.SERVICE_DEAD);
+            updateStatusAndInvokeCallback(Status.SERVICE_DEAD,
+                    /*source=*/ CredentialsSource.REMOTE_PROVIDER);
         } else {
             Slog.i(TAG, "Component names different in onProviderServiceDied - "
                     + "this should not happen");
         }
     }
 
+    @Override
+    public void onProviderCancellable(ICancellationSignal cancellation) {
+        mProviderCancellationSignal = cancellation;
+    }
+
     @Override // Selection call from the request provider
     protected void onUiEntrySelected(String entryType, String entryKey,
             ProviderPendingIntentResponse providerPendingIntentResponse) {
@@ -306,13 +279,15 @@
                     Log.i(TAG, "Additional content received - removing authentication entry");
                     mProviderResponseDataHandler.removeAuthenticationAction(entryKey);
                     if (!mProviderResponseDataHandler.isEmptyResponse()) {
-                        updateStatusAndInvokeCallback(Status.CREDENTIALS_RECEIVED);
+                        updateStatusAndInvokeCallback(Status.CREDENTIALS_RECEIVED,
+                                /*source=*/ CredentialsSource.AUTH_ENTRY);
                     }
                 } else {
                     Log.i(TAG, "Additional content not received");
                     mProviderResponseDataHandler
                             .updateAuthEntryWithNoCredentialsReceived(entryKey);
-                    updateStatusAndInvokeCallback(Status.NO_CREDENTIALS_FROM_AUTH_ENTRY);
+                    updateStatusAndInvokeCallback(Status.NO_CREDENTIALS_FROM_AUTH_ENTRY,
+                            /*source=*/ CredentialsSource.AUTH_ENTRY);
                 }
                 break;
             case REMOTE_ENTRY_KEY:
@@ -500,11 +475,13 @@
         // Log the data.
         if (mProviderResponseDataHandler.isEmptyResponse(response)) {
             mProviderSessionMetric.collectCandidateEntryMetrics(response);
-            updateStatusAndInvokeCallback(Status.EMPTY_RESPONSE);
+            updateStatusAndInvokeCallback(Status.EMPTY_RESPONSE,
+                    /*source=*/ CredentialsSource.REMOTE_PROVIDER);
             return;
         }
         mProviderSessionMetric.collectCandidateEntryMetrics(response);
-        updateStatusAndInvokeCallback(Status.CREDENTIALS_RECEIVED);
+        updateStatusAndInvokeCallback(Status.CREDENTIALS_RECEIVED,
+                /*source=*/ CredentialsSource.REMOTE_PROVIDER);
     }
 
     /**
diff --git a/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java b/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java
index 8b14757b..24292ef2 100644
--- a/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java
+++ b/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java
@@ -29,6 +29,7 @@
 import android.credentials.ui.GetCredentialProviderData;
 import android.credentials.ui.ProviderData;
 import android.credentials.ui.ProviderPendingIntentResponse;
+import android.os.ICancellationSignal;
 import android.service.credentials.CallingAppInfo;
 import android.service.credentials.CredentialEntry;
 import android.service.credentials.CredentialProviderService;
@@ -115,7 +116,7 @@
             @NonNull String servicePackageName,
             @NonNull CredentialOption requestOption) {
         super(context, requestOption, session,
-                new ComponentName(servicePackageName, servicePackageName) ,
+                new ComponentName(servicePackageName, servicePackageName),
                 userId, null);
         mCredentialDescriptionRegistry = CredentialDescriptionRegistry.forUser(userId);
         mCallingAppInfo = callingAppInfo;
@@ -132,7 +133,7 @@
             @NonNull String servicePackageName,
             @NonNull CredentialOption requestOption) {
         super(context, requestOption, session,
-                new ComponentName(servicePackageName, servicePackageName) ,
+                new ComponentName(servicePackageName, servicePackageName),
                 userId, null);
         mCredentialDescriptionRegistry = CredentialDescriptionRegistry.forUser(userId);
         mCallingAppInfo = callingAppInfo;
@@ -255,16 +256,22 @@
     }
 
     @Override
+    public void onProviderCancellable(ICancellationSignal cancellation) {
+        // No need to do anything since this class does not rely on a remote service.
+    }
+
+    @Override
     protected void invokeSession() {
         mProviderResponse = mCredentialDescriptionRegistry
                 .getFilteredResultForProvider(mCredentialProviderPackageName,
                         mElementKeys);
         mCredentialEntries = mProviderResponse.stream().flatMap(
-                        (Function<CredentialDescriptionRegistry.FilterResult,
-                                Stream<CredentialEntry>>) filterResult
+                (Function<CredentialDescriptionRegistry.FilterResult,
+                        Stream<CredentialEntry>>) filterResult
                         -> filterResult.mCredentialEntries.stream())
                 .collect(Collectors.toList());
-        updateStatusAndInvokeCallback(Status.CREDENTIALS_RECEIVED);
+        updateStatusAndInvokeCallback(Status.CREDENTIALS_RECEIVED,
+                /*source=*/ CredentialsSource.REGISTRY);
         // TODO(use metric later)
     }
 
diff --git a/services/credentials/java/com/android/server/credentials/ProviderSession.java b/services/credentials/java/com/android/server/credentials/ProviderSession.java
index 090c076..d165756 100644
--- a/services/credentials/java/com/android/server/credentials/ProviderSession.java
+++ b/services/credentials/java/com/android/server/credentials/ProviderSession.java
@@ -30,6 +30,7 @@
 import android.os.ICancellationSignal;
 import android.os.RemoteException;
 import android.util.Log;
+import android.util.Slog;
 
 import com.android.server.credentials.metrics.ProviderSessionMetric;
 
@@ -75,6 +76,12 @@
     @NonNull
     private int mProviderSessionUid;
 
+    enum CredentialsSource {
+        REMOTE_PROVIDER,
+        REGISTRY,
+        AUTH_ENTRY
+    }
+
     /**
      * Returns true if the given status reflects that the provider state is ready to be shown
      * on the credMan UI.
@@ -118,7 +125,8 @@
      */
     public interface ProviderInternalCallback<V> {
         /** Called when status changes. */
-        void onProviderStatusChanged(Status status, ComponentName componentName);
+        void onProviderStatusChanged(Status status, ComponentName componentName,
+                CredentialsSource source);
 
         /** Called when the final credential is received through an entry selection. */
         void onFinalResponseReceived(ComponentName componentName, V response);
@@ -182,7 +190,7 @@
             }
             setStatus(Status.CANCELED);
         } catch (RemoteException e) {
-            Log.i(TAG, "Issue while cancelling provider session: " + e.getMessage());
+            Slog.e(TAG, "Issue while cancelling provider session: ", e);
         }
     }
 
@@ -206,11 +214,12 @@
     }
 
     /** Updates the status . */
-    protected void updateStatusAndInvokeCallback(@NonNull Status status) {
+    protected void updateStatusAndInvokeCallback(@NonNull Status status,
+            CredentialsSource source) {
         setStatus(status);
         mProviderSessionMetric.collectCandidateMetricUpdate(isTerminatingStatus(status),
                 isCompletionStatus(status), mProviderSessionUid);
-        mCallbacks.onProviderStatusChanged(status, mComponentName);
+        mCallbacks.onProviderStatusChanged(status, mComponentName, source);
     }
 
     /** Common method that transfers metrics from the init phase to candidates */
diff --git a/services/credentials/java/com/android/server/credentials/RemoteCredentialService.java b/services/credentials/java/com/android/server/credentials/RemoteCredentialService.java
index ff4e3b6..c1e9bc6 100644
--- a/services/credentials/java/com/android/server/credentials/RemoteCredentialService.java
+++ b/services/credentials/java/com/android/server/credentials/RemoteCredentialService.java
@@ -82,6 +82,9 @@
 
         /** Called when the remote provider service dies. */
         void onProviderServiceDied(RemoteCredentialService service);
+
+        /** Called to set the cancellation transport from the remote provider service. */
+        void onProviderCancellable(ICancellationSignal cancellation);
     }
 
     public RemoteCredentialService(@NonNull Context context,
@@ -117,43 +120,56 @@
      * @param callback the callback to be used to send back the provider response to the
      *                 {@link ProviderGetSession} class that maintains provider state
      */
-    public ICancellationSignal onBeginGetCredential(@NonNull BeginGetCredentialRequest request,
+    public void onBeginGetCredential(@NonNull BeginGetCredentialRequest request,
             ProviderCallbacks<BeginGetCredentialResponse> callback) {
         Log.i(TAG, "In onGetCredentials in RemoteCredentialService");
         AtomicReference<ICancellationSignal> cancellationSink = new AtomicReference<>();
+        AtomicReference<CompletableFuture<BeginGetCredentialResponse>> futureRef =
+                new AtomicReference<>();
+
 
         CompletableFuture<BeginGetCredentialResponse> connectThenExecute = postAsync(service -> {
             CompletableFuture<BeginGetCredentialResponse> getCredentials =
                     new CompletableFuture<>();
             final long originalCallingUidToken = Binder.clearCallingIdentity();
             try {
-                ICancellationSignal cancellationSignal =
-                        service.onBeginGetCredential(request,
-                                new IBeginGetCredentialCallback.Stub() {
-                                    @Override
-                                    public void onSuccess(BeginGetCredentialResponse response) {
-                                        getCredentials.complete(response);
-                                    }
+                service.onBeginGetCredential(request,
+                        new IBeginGetCredentialCallback.Stub() {
+                            @Override
+                            public void onSuccess(BeginGetCredentialResponse response) {
+                                getCredentials.complete(response);
+                            }
 
-                                    @Override
-                                    public void onFailure(String errorType, CharSequence message) {
-                                        Log.i(TAG, "In onFailure in RemoteCredentialService");
-                                        String errorMsg = message == null ? "" : String.valueOf(
-                                                message);
-                                        getCredentials.completeExceptionally(
-                                                new GetCredentialException(errorType, errorMsg));
-                                    }
-                                });
-                cancellationSink.set(cancellationSignal);
+                            @Override
+                            public void onFailure(String errorType, CharSequence message) {
+                                Log.i(TAG, "In onFailure in RemoteCredentialService");
+                                String errorMsg = message == null ? "" : String.valueOf(
+                                        message);
+                                getCredentials.completeExceptionally(
+                                        new GetCredentialException(errorType, errorMsg));
+                            }
+
+                            @Override
+                            public void onCancellable(ICancellationSignal cancellation) {
+                                CompletableFuture<BeginGetCredentialResponse> future =
+                                        futureRef.get();
+                                if (future != null && future.isCancelled()) {
+                                    dispatchCancellationSignal(cancellation);
+                                } else {
+                                    cancellationSink.set(cancellation);
+                                    callback.onProviderCancellable(cancellation);
+                                }
+                            }
+                        });
                 return getCredentials;
             } finally {
                 Binder.restoreCallingIdentity(originalCallingUidToken);
             }
         }).orTimeout(TIMEOUT_REQUEST_MILLIS, TimeUnit.MILLISECONDS);
+        futureRef.set(connectThenExecute);
 
         connectThenExecute.whenComplete((result, error) -> Handler.getMain().post(() ->
                 handleExecutionResponse(result, error, cancellationSink, callback)));
-        return cancellationSink.get();
     }
 
     /**
@@ -164,10 +180,12 @@
      * @param callback the callback to be used to send back the provider response to the
      *                 {@link ProviderCreateSession} class that maintains provider state
      */
-    public ICancellationSignal onCreateCredential(@NonNull BeginCreateCredentialRequest request,
+    public void onBeginCreateCredential(@NonNull BeginCreateCredentialRequest request,
             ProviderCallbacks<BeginCreateCredentialResponse> callback) {
         Log.i(TAG, "In onCreateCredential in RemoteCredentialService");
         AtomicReference<ICancellationSignal> cancellationSink = new AtomicReference<>();
+        AtomicReference<CompletableFuture<BeginCreateCredentialResponse>> futureRef =
+                new AtomicReference<>();
 
         CompletableFuture<BeginCreateCredentialResponse> connectThenExecute =
                 postAsync(service -> {
@@ -175,7 +193,7 @@
                             new CompletableFuture<>();
                     final long originalCallingUidToken = Binder.clearCallingIdentity();
                     try {
-                        ICancellationSignal cancellationSignal = service.onBeginCreateCredential(
+                        service.onBeginCreateCredential(
                                 request, new IBeginCreateCredentialCallback.Stub() {
                                     @Override
                                     public void onSuccess(BeginCreateCredentialResponse response) {
@@ -192,18 +210,28 @@
                                         createCredentialFuture.completeExceptionally(
                                                 new CreateCredentialException(errorType, errorMsg));
                                     }
+
+                                    @Override
+                                    public void onCancellable(ICancellationSignal cancellation) {
+                                        CompletableFuture<BeginCreateCredentialResponse> future =
+                                                futureRef.get();
+                                        if (future != null && future.isCancelled()) {
+                                            dispatchCancellationSignal(cancellation);
+                                        } else {
+                                            cancellationSink.set(cancellation);
+                                            callback.onProviderCancellable(cancellation);
+                                        }
+                                    }
                                 });
-                        cancellationSink.set(cancellationSignal);
                         return createCredentialFuture;
                     } finally {
                         Binder.restoreCallingIdentity(originalCallingUidToken);
                     }
                 }).orTimeout(TIMEOUT_REQUEST_MILLIS, TimeUnit.MILLISECONDS);
+        futureRef.set(connectThenExecute);
 
         connectThenExecute.whenComplete((result, error) -> Handler.getMain().post(() ->
                 handleExecutionResponse(result, error, cancellationSink, callback)));
-
-        return cancellationSink.get();
     }
 
     /**
@@ -214,10 +242,11 @@
      * @param callback the callback to be used to send back the provider response to the
      *                 {@link ProviderClearSession} class that maintains provider state
      */
-    public ICancellationSignal onClearCredentialState(@NonNull ClearCredentialStateRequest request,
+    public void onClearCredentialState(@NonNull ClearCredentialStateRequest request,
             ProviderCallbacks<Void> callback) {
         Log.i(TAG, "In onClearCredentialState in RemoteCredentialService");
         AtomicReference<ICancellationSignal> cancellationSink = new AtomicReference<>();
+        AtomicReference<CompletableFuture<Void>> futureRef = new AtomicReference<>();
 
         CompletableFuture<Void> connectThenExecute =
                 postAsync(service -> {
@@ -225,7 +254,7 @@
                             new CompletableFuture<>();
                     final long originalCallingUidToken = Binder.clearCallingIdentity();
                     try {
-                        ICancellationSignal cancellationSignal = service.onClearCredentialState(
+                        service.onClearCredentialState(
                                 request, new IClearCredentialStateCallback.Stub() {
                                     @Override
                                     public void onSuccess() {
@@ -243,18 +272,27 @@
                                                 new ClearCredentialStateException(errorType,
                                                         errorMsg));
                                     }
+
+                                    @Override
+                                    public void onCancellable(ICancellationSignal cancellation) {
+                                        CompletableFuture<Void> future = futureRef.get();
+                                        if (future != null && future.isCancelled()) {
+                                            dispatchCancellationSignal(cancellation);
+                                        } else {
+                                            cancellationSink.set(cancellation);
+                                            callback.onProviderCancellable(cancellation);
+                                        }
+                                    }
                                 });
-                        cancellationSink.set(cancellationSignal);
                         return clearCredentialFuture;
                     } finally {
                         Binder.restoreCallingIdentity(originalCallingUidToken);
                     }
                 }).orTimeout(TIMEOUT_REQUEST_MILLIS, TimeUnit.MILLISECONDS);
+        futureRef.set(connectThenExecute);
 
         connectThenExecute.whenComplete((result, error) -> Handler.getMain().post(() ->
                 handleExecutionResponse(result, error, cancellationSink, callback)));
-
-        return cancellationSink.get();
     }
 
     private <T> void handleExecutionResponse(T result,
diff --git a/services/credentials/java/com/android/server/credentials/RequestSession.java b/services/credentials/java/com/android/server/credentials/RequestSession.java
index cfb9ad4..e98c524 100644
--- a/services/credentials/java/com/android/server/credentials/RequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/RequestSession.java
@@ -20,6 +20,7 @@
 import android.annotation.UserIdInt;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
 import android.credentials.CredentialProviderInfo;
 import android.credentials.ui.ProviderData;
 import android.credentials.ui.UserSelectionDialogResult;
@@ -29,8 +30,10 @@
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.RemoteException;
+import android.os.UserHandle;
 import android.service.credentials.CallingAppInfo;
 import android.util.Log;
+import android.util.Slog;
 
 import com.android.internal.R;
 import com.android.server.credentials.metrics.ApiName;
@@ -39,8 +42,9 @@
 import com.android.server.credentials.metrics.RequestSessionMetric;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Base class of a request session, that listens to UI events. This class must be extended
@@ -49,6 +53,11 @@
 abstract class RequestSession<T, U, V> implements CredentialManagerUi.CredentialManagerUiCallback {
     private static final String TAG = "RequestSession";
 
+    public interface SessionLifetime {
+        /** Called when the user makes a selection. */
+        void onFinishRequestSession(@UserIdInt int userId, IBinder token);
+    }
+
     // TODO: Revise access levels of attributes
     @NonNull
     protected final T mClientRequest;
@@ -72,10 +81,16 @@
     @NonNull
     protected final CancellationSignal mCancellationSignal;
 
-    protected final Map<String, ProviderSession> mProviders = new HashMap<>();
+    protected final Map<String, ProviderSession> mProviders = new ConcurrentHashMap<>();
     protected final RequestSessionMetric mRequestSessionMetric = new RequestSessionMetric();
     protected final String mHybridService;
 
+    protected final Object mLock;
+
+    protected final SessionLifetime mSessionCallback;
+
+    private final Set<ComponentName> mEnabledProviders;
+
     @NonNull
     protected RequestSessionStatus mRequestSessionStatus =
             RequestSessionStatus.IN_PROGRESS;
@@ -91,26 +106,58 @@
     }
 
     protected RequestSession(@NonNull Context context,
-            @UserIdInt int userId, int callingUid, @NonNull T clientRequest, U clientCallback,
+            RequestSession.SessionLifetime sessionCallback,
+            Object lock, @UserIdInt int userId, int callingUid,
+            @NonNull T clientRequest, U clientCallback,
             @NonNull String requestType,
             CallingAppInfo callingAppInfo,
+            Set<ComponentName> enabledProviders,
             CancellationSignal cancellationSignal, long timestampStarted) {
         mContext = context;
+        mLock = lock;
+        mSessionCallback = sessionCallback;
         mUserId = userId;
         mCallingUid = callingUid;
         mClientRequest = clientRequest;
         mClientCallback = clientCallback;
         mRequestType = requestType;
         mClientAppInfo = callingAppInfo;
+        mEnabledProviders = enabledProviders;
         mCancellationSignal = cancellationSignal;
         mHandler = new Handler(Looper.getMainLooper(), null, true);
         mRequestId = new Binder();
         mCredentialManagerUi = new CredentialManagerUi(mContext,
-                mUserId, this);
+                mUserId, this, mEnabledProviders);
         mHybridService = context.getResources().getString(
                 R.string.config_defaultCredentialManagerHybridService);
         mRequestSessionMetric.collectInitialPhaseMetricInfo(timestampStarted, mRequestId,
                 mCallingUid, ApiName.getMetricCodeFromRequestInfo(mRequestType));
+        setCancellationListener();
+    }
+
+    private void setCancellationListener() {
+        mCancellationSignal.setOnCancelListener(
+                () -> {
+                    boolean isUiActive = maybeCancelUi();
+                    finishSession(!isUiActive);
+                }
+        );
+    }
+
+    private boolean maybeCancelUi() {
+        if (mCredentialManagerUi.getStatus()
+                == CredentialManagerUi.UiStatus.USER_INTERACTION) {
+            final long originalCallingUidToken = Binder.clearCallingIdentity();
+            try {
+                mContext.startActivityAsUser(mCredentialManagerUi.createCancelIntent(
+                                mRequestId, mClientAppInfo.getPackageName())
+                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), UserHandle.of(mUserId));
+                return true;
+            } finally {
+                Binder.restoreCallingIdentity(originalCallingUidToken);
+            }
+        }
+        return false;
     }
 
     public abstract ProviderSession initiateProviderSession(CredentialProviderInfo providerInfo,
@@ -154,12 +201,19 @@
     }
 
     protected void finishSession(boolean propagateCancellation) {
-        Log.i(TAG, "finishing session");
+        Slog.d(TAG, "finishing session with propagateCancellation " + propagateCancellation);
         if (propagateCancellation) {
             mProviders.values().forEach(ProviderSession::cancelProviderRemoteSession);
         }
         mRequestSessionStatus = RequestSessionStatus.COMPLETE;
         mProviders.clear();
+        clearRequestSessionLocked();
+    }
+
+    private void clearRequestSessionLocked() {
+        synchronized (mLock) {
+            mSessionCallback.onFinishRequestSession(mUserId, mRequestId);
+        }
     }
 
     protected boolean isAnyProviderPending() {
@@ -194,7 +248,6 @@
         ArrayList<ProviderData> providerDataList = getProviderDataForUi();
         if (!providerDataList.isEmpty()) {
             Log.i(TAG, "provider list not empty about to initiate ui");
-            mRequestSessionMetric.logCandidatePhaseMetrics(mProviders);
             launchUiWithProviderData(providerDataList);
         }
     }
@@ -204,9 +257,9 @@
         Log.i(TAG, "In getProviderDataAndInitiateUi");
         Log.i(TAG, "In getProviderDataAndInitiateUi providers size: " + mProviders.size());
         ArrayList<ProviderData> providerDataList = new ArrayList<>();
+        mRequestSessionMetric.logCandidatePhaseMetrics(mProviders);
 
         if (isSessionCancelled()) {
-            mRequestSessionMetric.logCandidatePhaseMetrics(mProviders);
             finishSession(/*propagateCancellation=*/true);
             return providerDataList;
         }
@@ -258,7 +311,7 @@
      * Allows subclasses to directly finalize the call and set closing metrics on error completion.
      *
      * @param errorType the type of error given back in the flow
-     * @param errorMsg the error message given back in the flow
+     * @param errorMsg  the error message given back in the flow
      */
     protected void respondToClientWithErrorAndFinish(String errorType, String errorMsg) {
         mRequestSessionMetric.collectFinalPhaseProviderMetricStatus(
diff --git a/services/credentials/java/com/android/server/credentials/metrics/ApiName.java b/services/credentials/java/com/android/server/credentials/metrics/ApiName.java
index f40e73e..ce84d9a 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/ApiName.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/ApiName.java
@@ -20,11 +20,11 @@
 import static android.credentials.ui.RequestInfo.TYPE_GET;
 import static android.credentials.ui.RequestInfo.TYPE_UNDEFINED;
 
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_INITIAL_PHASE__API_NAME__API_NAME_CLEAR_CREDENTIAL;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_INITIAL_PHASE__API_NAME__API_NAME_CREATE_CREDENTIAL;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_INITIAL_PHASE__API_NAME__API_NAME_GET_CREDENTIAL;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_INITIAL_PHASE__API_NAME__API_NAME_IS_ENABLED_CREDENTIAL_PROVIDER_SERVICE;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_INITIAL_PHASE__API_NAME__API_NAME_UNKNOWN;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_INITIAL_PHASE_REPORTED__API_NAME__API_NAME_CLEAR_CREDENTIAL;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_INITIAL_PHASE_REPORTED__API_NAME__API_NAME_CREATE_CREDENTIAL;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_INITIAL_PHASE_REPORTED__API_NAME__API_NAME_GET_CREDENTIAL;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_INITIAL_PHASE_REPORTED__API_NAME__API_NAME_IS_ENABLED_CREDENTIAL_PROVIDER_SERVICE;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_INITIAL_PHASE_REPORTED__API_NAME__API_NAME_UNKNOWN;
 
 import android.credentials.ui.RequestInfo;
 import android.util.Log;
@@ -33,12 +33,14 @@
 import java.util.Map;
 
 public enum ApiName {
-    UNKNOWN(CREDENTIAL_MANAGER_INITIAL_PHASE__API_NAME__API_NAME_UNKNOWN),
-    GET_CREDENTIAL(CREDENTIAL_MANAGER_INITIAL_PHASE__API_NAME__API_NAME_GET_CREDENTIAL),
-    CREATE_CREDENTIAL(CREDENTIAL_MANAGER_INITIAL_PHASE__API_NAME__API_NAME_CREATE_CREDENTIAL),
-    CLEAR_CREDENTIAL(CREDENTIAL_MANAGER_INITIAL_PHASE__API_NAME__API_NAME_CLEAR_CREDENTIAL),
+    UNKNOWN(CREDENTIAL_MANAGER_INITIAL_PHASE_REPORTED__API_NAME__API_NAME_UNKNOWN),
+    GET_CREDENTIAL(CREDENTIAL_MANAGER_INITIAL_PHASE_REPORTED__API_NAME__API_NAME_GET_CREDENTIAL),
+    CREATE_CREDENTIAL(
+            CREDENTIAL_MANAGER_INITIAL_PHASE_REPORTED__API_NAME__API_NAME_CREATE_CREDENTIAL),
+    CLEAR_CREDENTIAL(
+            CREDENTIAL_MANAGER_INITIAL_PHASE_REPORTED__API_NAME__API_NAME_CLEAR_CREDENTIAL),
     IS_ENABLED_CREDENTIAL_PROVIDER_SERVICE(
-        CREDENTIAL_MANAGER_INITIAL_PHASE__API_NAME__API_NAME_IS_ENABLED_CREDENTIAL_PROVIDER_SERVICE
+CREDENTIAL_MANAGER_INITIAL_PHASE_REPORTED__API_NAME__API_NAME_IS_ENABLED_CREDENTIAL_PROVIDER_SERVICE
     );
 
     private static final String TAG = "ApiName";
@@ -58,7 +60,6 @@
         this.mInnerMetricCode = innerMetricCode;
     }
 
-
     /**
      * Gives the West-world version of the metric name.
      *
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 8fea369..4097765 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java
@@ -16,18 +16,18 @@
 
 package com.android.server.credentials.metrics;
 
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__API_STATUS__API_STATUS_CLIENT_CANCELED;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__API_STATUS__API_STATUS_FAILURE;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__API_STATUS__API_STATUS_SUCCESS;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__API_STATUS__API_STATUS_USER_CANCELED;
+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;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_USER_CANCELED;
 
 public enum ApiStatus {
-    SUCCESS(CREDENTIAL_MANAGER_FINAL_PHASE__API_STATUS__API_STATUS_SUCCESS),
-    FAILURE(CREDENTIAL_MANAGER_FINAL_PHASE__API_STATUS__API_STATUS_FAILURE),
+    SUCCESS(CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_SUCCESS),
+    FAILURE(CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_FAILURE),
     CLIENT_CANCELED(
-            CREDENTIAL_MANAGER_FINAL_PHASE__API_STATUS__API_STATUS_CLIENT_CANCELED),
+            CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_CLIENT_CANCELED),
     USER_CANCELED(
-            CREDENTIAL_MANAGER_FINAL_PHASE__API_STATUS__API_STATUS_USER_CANCELED);
+            CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_USER_CANCELED);
 
     private final int mInnerMetricCode;
 
diff --git a/services/credentials/java/com/android/server/credentials/metrics/EntryEnum.java b/services/credentials/java/com/android/server/credentials/metrics/EntryEnum.java
index 440ac51..80f9fdc 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/EntryEnum.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/EntryEnum.java
@@ -16,11 +16,11 @@
 
 package com.android.server.credentials.metrics;
 
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__CLICKED_ENTRIES__ACTION_ENTRY;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__CLICKED_ENTRIES__AUTHENTICATION_ENTRY;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__CLICKED_ENTRIES__CREDENTIAL_ENTRY;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__CLICKED_ENTRIES__REMOTE_ENTRY;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__CLICKED_ENTRIES__UNKNOWN;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CLICKED_ENTRIES__ACTION_ENTRY;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CLICKED_ENTRIES__AUTHENTICATION_ENTRY;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CLICKED_ENTRIES__CREDENTIAL_ENTRY;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CLICKED_ENTRIES__REMOTE_ENTRY;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CLICKED_ENTRIES__UNKNOWN;
 import static com.android.server.credentials.ProviderGetSession.ACTION_ENTRY_KEY;
 import static com.android.server.credentials.ProviderGetSession.AUTHENTICATION_ACTION_ENTRY_KEY;
 import static com.android.server.credentials.ProviderGetSession.CREDENTIAL_ENTRY_KEY;
@@ -32,12 +32,12 @@
 import java.util.Map;
 
 public enum EntryEnum {
-    UNKNOWN(CREDENTIAL_MANAGER_FINAL_PHASE__CLICKED_ENTRIES__UNKNOWN),
-    ACTION_ENTRY(CREDENTIAL_MANAGER_FINAL_PHASE__CLICKED_ENTRIES__ACTION_ENTRY),
-    CREDENTIAL_ENTRY(CREDENTIAL_MANAGER_FINAL_PHASE__CLICKED_ENTRIES__CREDENTIAL_ENTRY),
-    REMOTE_ENTRY(CREDENTIAL_MANAGER_FINAL_PHASE__CLICKED_ENTRIES__REMOTE_ENTRY),
+    UNKNOWN(CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CLICKED_ENTRIES__UNKNOWN),
+    ACTION_ENTRY(CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CLICKED_ENTRIES__ACTION_ENTRY),
+    CREDENTIAL_ENTRY(CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CLICKED_ENTRIES__CREDENTIAL_ENTRY),
+    REMOTE_ENTRY(CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CLICKED_ENTRIES__REMOTE_ENTRY),
     AUTHENTICATION_ENTRY(
-            CREDENTIAL_MANAGER_FINAL_PHASE__CLICKED_ENTRIES__AUTHENTICATION_ENTRY
+            CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CLICKED_ENTRIES__AUTHENTICATION_ENTRY
     );
 
     private static final String TAG = "EntryEnum";
diff --git a/services/credentials/java/com/android/server/credentials/metrics/ProviderStatusForMetrics.java b/services/credentials/java/com/android/server/credentials/metrics/ProviderStatusForMetrics.java
index 83713ab..a12a694 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/ProviderStatusForMetrics.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/ProviderStatusForMetrics.java
@@ -16,24 +16,24 @@
 
 package com.android.server.credentials.metrics;
 
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__CHOSEN_PROVIDER_STATUS__PROVIDER_FINAL_FAILURE;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__CHOSEN_PROVIDER_STATUS__PROVIDER_FINAL_SUCCESS;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__CHOSEN_PROVIDER_STATUS__PROVIDER_QUERY_FAILURE;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__CHOSEN_PROVIDER_STATUS__PROVIDER_QUERY_SUCCESS;
-import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE__CHOSEN_PROVIDER_STATUS__PROVIDER_UNKNOWN;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CHOSEN_PROVIDER_STATUS__PROVIDER_FINAL_FAILURE;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CHOSEN_PROVIDER_STATUS__PROVIDER_FINAL_SUCCESS;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CHOSEN_PROVIDER_STATUS__PROVIDER_QUERY_FAILURE;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CHOSEN_PROVIDER_STATUS__PROVIDER_QUERY_SUCCESS;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CHOSEN_PROVIDER_STATUS__PROVIDER_UNKNOWN;
 
 public enum ProviderStatusForMetrics {
 
     UNKNOWN(
-            CREDENTIAL_MANAGER_FINAL_PHASE__CHOSEN_PROVIDER_STATUS__PROVIDER_UNKNOWN),
+            CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CHOSEN_PROVIDER_STATUS__PROVIDER_UNKNOWN),
     FINAL_FAILURE(
-            CREDENTIAL_MANAGER_FINAL_PHASE__CHOSEN_PROVIDER_STATUS__PROVIDER_FINAL_FAILURE),
+        CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CHOSEN_PROVIDER_STATUS__PROVIDER_FINAL_FAILURE),
     QUERY_FAILURE(
-            CREDENTIAL_MANAGER_FINAL_PHASE__CHOSEN_PROVIDER_STATUS__PROVIDER_QUERY_FAILURE),
+        CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CHOSEN_PROVIDER_STATUS__PROVIDER_QUERY_FAILURE),
     FINAL_SUCCESS(
-            CREDENTIAL_MANAGER_FINAL_PHASE__CHOSEN_PROVIDER_STATUS__PROVIDER_FINAL_SUCCESS),
+        CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CHOSEN_PROVIDER_STATUS__PROVIDER_FINAL_SUCCESS),
     QUERY_SUCCESS(
-            CREDENTIAL_MANAGER_FINAL_PHASE__CHOSEN_PROVIDER_STATUS__PROVIDER_QUERY_SUCCESS);
+        CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__CHOSEN_PROVIDER_STATUS__PROVIDER_QUERY_SUCCESS);
 
     private final int mInnerMetricCode;
 
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
index 7eeb51c..d4f4b72 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
@@ -23,7 +23,6 @@
 import static android.app.admin.PolicyUpdateResult.RESULT_POLICY_CLEARED;
 import static android.app.admin.PolicyUpdateResult.RESULT_POLICY_SET;
 import static android.content.pm.UserProperties.INHERIT_DEVICE_POLICY_FROM_PARENT;
-import static android.provider.DeviceConfig.NAMESPACE_DEVICE_POLICY_MANAGER;
 
 import android.Manifest;
 import android.annotation.NonNull;
@@ -47,7 +46,6 @@
 import android.os.Environment;
 import android.os.UserHandle;
 import android.os.UserManager;
-import android.provider.DeviceConfig;
 import android.telephony.TelephonyManager;
 import android.util.AtomicFile;
 import android.util.Log;
@@ -86,9 +84,6 @@
             DevicePolicyIdentifiers.getIdentifierForUserRestriction(
                     UserManager.DISALLOW_CELLULAR_2G);
 
-    private static final String ENABLE_COEXISTENCE_FLAG = "enable_coexistence";
-    private static final boolean DEFAULT_ENABLE_COEXISTENCE_FLAG = true;
-
     private final Context mContext;
     private final UserManager mUserManager;
 
@@ -771,28 +766,31 @@
         Intent intent = new Intent(PolicyUpdateReceiver.ACTION_DEVICE_POLICY_SET_RESULT);
         intent.setPackage(admin.getPackageName());
 
-        List<ResolveInfo> receivers = mContext.getPackageManager().queryBroadcastReceiversAsUser(
-                intent,
-                PackageManager.ResolveInfoFlags.of(PackageManager.GET_RECEIVERS),
-                admin.getUserId());
-        if (receivers.isEmpty()) {
-            Log.i(TAG, "Couldn't find any receivers that handle ACTION_DEVICE_POLICY_SET_RESULT"
-                    + "in package " + admin.getPackageName());
-            return;
-        }
+        Binder.withCleanCallingIdentity(() -> {
+            List<ResolveInfo> receivers =
+                    mContext.getPackageManager().queryBroadcastReceiversAsUser(
+                            intent,
+                            PackageManager.ResolveInfoFlags.of(PackageManager.GET_RECEIVERS),
+                            admin.getUserId());
+            if (receivers.isEmpty()) {
+                Log.i(TAG, "Couldn't find any receivers that handle ACTION_DEVICE_POLICY_SET_RESULT"
+                        + "in package " + admin.getPackageName());
+                return;
+            }
 
-        Bundle extras = new Bundle();
-        policyDefinition.getPolicyKey().writeToBundle(extras);
-        extras.putInt(
-                EXTRA_POLICY_TARGET_USER_ID,
-                getTargetUser(admin.getUserId(), userId));
-        extras.putInt(
-                EXTRA_POLICY_UPDATE_RESULT_KEY,
-                result);
+            Bundle extras = new Bundle();
+            policyDefinition.getPolicyKey().writeToBundle(extras);
+            extras.putInt(
+                    EXTRA_POLICY_TARGET_USER_ID,
+                    getTargetUser(admin.getUserId(), userId));
+            extras.putInt(
+                    EXTRA_POLICY_UPDATE_RESULT_KEY,
+                    result);
 
-        intent.putExtras(extras);
+            intent.putExtras(extras);
 
-        maybeSendIntentToAdminReceivers(intent, UserHandle.of(admin.getUserId()), receivers);
+            maybeSendIntentToAdminReceivers(intent, UserHandle.of(admin.getUserId()), receivers);
+        });
     }
 
     // TODO(b/261430877): Finalise the decision on which admins to send the updates to.
@@ -821,27 +819,30 @@
         Intent intent = new Intent(PolicyUpdateReceiver.ACTION_DEVICE_POLICY_CHANGED);
         intent.setPackage(admin.getPackageName());
 
-        List<ResolveInfo> receivers = mContext.getPackageManager().queryBroadcastReceiversAsUser(
-                intent,
-                PackageManager.ResolveInfoFlags.of(PackageManager.GET_RECEIVERS),
-                admin.getUserId());
-        if (receivers.isEmpty()) {
-            Log.i(TAG, "Couldn't find any receivers that handle ACTION_DEVICE_POLICY_CHANGED"
-                    + "in package " + admin.getPackageName());
-            return;
-        }
+        Binder.withCleanCallingIdentity(() -> {
+            List<ResolveInfo> receivers =
+                    mContext.getPackageManager().queryBroadcastReceiversAsUser(
+                            intent,
+                            PackageManager.ResolveInfoFlags.of(PackageManager.GET_RECEIVERS),
+                            admin.getUserId());
+            if (receivers.isEmpty()) {
+                Log.i(TAG, "Couldn't find any receivers that handle ACTION_DEVICE_POLICY_CHANGED"
+                        + "in package " + admin.getPackageName());
+                return;
+            }
 
-        Bundle extras = new Bundle();
-        policyDefinition.getPolicyKey().writeToBundle(extras);
-        extras.putInt(
-                EXTRA_POLICY_TARGET_USER_ID,
-                getTargetUser(admin.getUserId(), userId));
-        extras.putInt(EXTRA_POLICY_UPDATE_RESULT_KEY, reason);
-        intent.putExtras(extras);
-        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+            Bundle extras = new Bundle();
+            policyDefinition.getPolicyKey().writeToBundle(extras);
+            extras.putInt(
+                    EXTRA_POLICY_TARGET_USER_ID,
+                    getTargetUser(admin.getUserId(), userId));
+            extras.putInt(EXTRA_POLICY_UPDATE_RESULT_KEY, reason);
+            intent.putExtras(extras);
+            intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
 
-        maybeSendIntentToAdminReceivers(
-                intent, UserHandle.of(admin.getUserId()), receivers);
+            maybeSendIntentToAdminReceivers(
+                    intent, UserHandle.of(admin.getUserId()), receivers);
+        });
     }
 
     private void maybeSendIntentToAdminReceivers(
@@ -1146,38 +1147,6 @@
         return mEnforcingAdmins.size() > 0;
     }
 
-    /**
-     * Returns {@code true} if the coexistence flag is enabled or:
-     * <ul>
-     * <li>If the provided package is an admin with existing policies
-     * <li>A new admin and no other admin have policies set
-     * <li>More than one admin have policies set
-     */
-    boolean canAdminAddPolicies(String packageName, int userId) {
-        if (isCoexistenceFlagEnabled()) {
-            return true;
-        }
-
-        if (mEnforcingAdmins.contains(userId)
-                && mEnforcingAdmins.get(userId).stream().anyMatch(admin ->
-                admin.getPackageName().equals(packageName))) {
-            return true;
-        }
-
-        int numOfEnforcingAdmins = 0;
-        for (int i = 0; i < mEnforcingAdmins.size(); i++) {
-            numOfEnforcingAdmins += mEnforcingAdmins.get(i).size();
-        }
-        return numOfEnforcingAdmins == 0 || numOfEnforcingAdmins > 1;
-    }
-
-    private boolean isCoexistenceFlagEnabled() {
-        return DeviceConfig.getBoolean(
-                NAMESPACE_DEVICE_POLICY_MANAGER,
-                ENABLE_COEXISTENCE_FLAG,
-                DEFAULT_ENABLE_COEXISTENCE_FLAG);
-    }
-
     private <V> boolean checkFor2gFailure(@NonNull PolicyDefinition<V> policyDefinition,
             @NonNull EnforcingAdmin enforcingAdmin) {
         if (!policyDefinition.getPolicyKey().getIdentifier().equals(
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index b5a5d94..d55099f 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -92,6 +92,8 @@
 import static android.app.AppOpsManager.OPSTR_SYSTEM_EXEMPT_FROM_POWER_RESTRICTIONS;
 import static android.app.AppOpsManager.OPSTR_SYSTEM_EXEMPT_FROM_SUSPENSION;
 import static android.app.admin.DeviceAdminInfo.HEADLESS_DEVICE_OWNER_MODE_AFFILIATED;
+import static android.app.admin.DeviceAdminInfo.USES_POLICY_FORCE_LOCK;
+import static android.app.admin.DeviceAdminInfo.USES_POLICY_WIPE_DATA;
 import static android.app.admin.DeviceAdminReceiver.ACTION_COMPLIANCE_ACKNOWLEDGEMENT_REQUIRED;
 import static android.app.admin.DeviceAdminReceiver.EXTRA_TRANSFER_OWNERSHIP_ADMIN_EXTRAS_BUNDLE;
 import static android.app.admin.DevicePolicyIdentifiers.AUTO_TIMEZONE_POLICY;
@@ -439,6 +441,7 @@
 import android.util.DebugUtils;
 import android.util.IndentingPrintWriter;
 import android.util.IntArray;
+import android.util.Log;
 import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
@@ -560,6 +563,8 @@
 
     private static final int REQUEST_PROFILE_OFF_DEADLINE = 5572;
 
+    private static final int MAX_PROFILE_NAME_LENGTH = 200;
+
     private static final long MS_PER_DAY = TimeUnit.DAYS.toMillis(1);
 
     private static final long EXPIRATION_GRACE_PERIOD_MS = 5 * MS_PER_DAY; // 5 days, in ms
@@ -773,6 +778,14 @@
     @EnabledSince(targetSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
     public static final long EXPLICIT_WIPE_BEHAVIOUR = 242193913L;
 
+    /**
+     * Apps targetting U+ should now expect that attempts to grant sensor permissions without
+     * authorisation will result in a security exception.
+     */
+    @ChangeId
+    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+    public static final long THROW_SECURITY_EXCEPTION_FOR_SENSOR_PERMISSIONS = 277035314L;
+
     // Only add to the end of the list. Do not change or rearrange these values, that will break
     // historical data. Do not use negative numbers or zero, logger only handles positive
     // integers.
@@ -836,18 +849,13 @@
                     + "management app's authentication policy";
     private static final String NOT_SYSTEM_CALLER_MSG = "Only the system can %s";
 
-    // ENABLE_DEVICE_POLICY_ENGINE_FLAG must be enabled before this could be enabled.
     private static final String PERMISSION_BASED_ACCESS_EXPERIMENT_FLAG =
             "enable_permission_based_access";
     private static final boolean DEFAULT_VALUE_PERMISSION_BASED_ACCESS_FLAG = false;
 
-    // This must be enabled before PERMISSION_BASED_ACCESS_EXPERIMENT_FLAG is enabled, the reason
-    // we're not just relying on PERMISSION_BASED_ACCESS_EXPERIMENT_FLAG to enable the policy engine
-    // is that we might want to enable it before the permission changes are ready if we want to test
-    // it on DPCs.
-    // Once this is enabled, it can no longer be disabled in production
-    private static final String ENABLE_DEVICE_POLICY_ENGINE_FLAG = "enable_device_policy_engine";
-    private static final boolean DEFAULT_ENABLE_DEVICE_POLICY_ENGINE_FLAG = false;
+    private static final String ENABLE_DEVICE_POLICY_ENGINE_FOR_FINANCE_FLAG =
+            "enable_device_policy_engine";
+    private static final boolean DEFAULT_ENABLE_DEVICE_POLICY_ENGINE_FOR_FINANCE_FLAG = false;
 
     // TODO(b/265683382) remove the flag after rollout.
     private static final String KEEP_PROFILES_RUNNING_FLAG = "enable_keep_profiles_running";
@@ -1414,10 +1422,7 @@
                     && (owner.getPackageName().equals(packageName))) {
                 startOwnerService(userHandle, "package-broadcast");
             }
-            if (shouldMigrateToDevicePolicyEngine()) {
-                migratePoliciesToDevicePolicyEngine();
-            }
-            if (isDevicePolicyEngineEnabled()) {
+            if (isPermissionCheckFlagEnabled()) {
                 mDevicePolicyEngine.handlePackageChanged(packageName, userHandle);
             }
             // Persist updates if the removed package was an admin or delegate.
@@ -2121,7 +2126,7 @@
         mUserManagerInternal.addUserLifecycleListener(new UserLifecycleListener());
 
         mDeviceManagementResourcesProvider.load();
-        if (isDevicePolicyEngineEnabled()) {
+        if (isPermissionCheckFlagEnabled()) {
             mDevicePolicyEngine.load();
         }
 
@@ -2315,7 +2320,6 @@
      * Creates a new {@link CallerIdentity} object to represent the caller's identity.
      */
     private CallerIdentity getCallerIdentity(@Nullable String callerPackage) {
-
         return getCallerIdentity(null, callerPackage);
     }
 
@@ -2618,7 +2622,7 @@
             ActiveAdmin profileOwner, boolean newOwner) {
         if (newOwner || mInjector.settingsSecureGetIntForUser(
                 Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userId) != 0) {
-            if (isDevicePolicyEngineEnabled()) {
+            if (isPolicyEngineForFinanceFlagEnabled()) {
                 mDevicePolicyEngine.setLocalPolicy(
                         PolicyDefinition.getPolicyDefinitionForUserRestriction(
                                 UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES),
@@ -2646,7 +2650,7 @@
         if (defaultRestrictions.equals(admin.defaultEnabledRestrictionsAlreadySet)) {
             return; // The same set of default restrictions has been already applied.
         }
-        if (isDevicePolicyEngineEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             for (String restriction : defaultRestrictions) {
                 mDevicePolicyEngine.setLocalPolicy(
                         PolicyDefinition.getPolicyDefinitionForUserRestriction(restriction),
@@ -2828,6 +2832,16 @@
         return doAdmin;
     }
 
+    ActiveAdmin getDefaultDeviceOwnerLocked(@UserIdInt int userId) {
+        ensureLocked();
+        ComponentName doComponent = mOwners.getDeviceOwnerComponent();
+        if (mOwners.getDeviceOwnerType(doComponent.getPackageName()) == DEFAULT_DEVICE_OWNER) {
+            ActiveAdmin doAdmin = getUserData(userId).mAdminMap.get(doComponent);
+            return doAdmin;
+        }
+        return null;
+    }
+
     ActiveAdmin getProfileOwnerLocked(@UserIdInt int userId) {
         ensureLocked();
         final ComponentName poAdminComponent = mOwners.getProfileOwnerComponent(userId);
@@ -2857,6 +2871,18 @@
         return getDeviceOwnerLocked(userId);
     }
 
+    ActiveAdmin getProfileOwnerOrDefaultDeviceOwnerLocked(@UserIdInt int userId) {
+        ensureLocked();
+        // Try to find an admin which can use reqPolicy
+        final ComponentName poAdminComponent = mOwners.getProfileOwnerComponent(userId);
+
+        if (poAdminComponent != null) {
+            return getProfileOwnerLocked(userId);
+        }
+
+        return getDefaultDeviceOwnerLocked(userId);
+    }
+
     @NonNull ActiveAdmin getParentOfAdminIfRequired(ActiveAdmin admin, boolean parent) {
         Objects.requireNonNull(admin);
         return parent ? admin.getParentActiveAdmin() : admin;
@@ -3562,7 +3588,7 @@
         }
 
         startOwnerService(userId, "start-user");
-        if (isDevicePolicyEngineEnabled()) {
+        if (isPermissionCheckFlagEnabled()) {
             mDevicePolicyEngine.handleStartUser(userId);
         }
     }
@@ -3589,7 +3615,7 @@
 
     void handleUnlockUser(int userId) {
         startOwnerService(userId, "unlock-user");
-        if (isDevicePolicyEngineEnabled()) {
+        if (isPermissionCheckFlagEnabled()) {
             mDevicePolicyEngine.handleUnlockUser(userId);
         }
     }
@@ -3601,7 +3627,7 @@
     void handleStopUser(int userId) {
         updateNetworkPreferenceForUser(userId, List.of(PreferentialNetworkServiceConfig.DEFAULT));
         mDeviceAdminServiceController.stopServicesForUser(userId, /* actionForLog= */ "stop-user");
-        if (isDevicePolicyEngineEnabled()) {
+        if (isPermissionCheckFlagEnabled()) {
             mDevicePolicyEngine.handleStopUser(userId);
         }
     }
@@ -3727,11 +3753,6 @@
         synchronized (getLockObject()) {
             checkActiveAdminPrecondition(adminReceiver, info, policy);
             mInjector.binderWithCleanCallingIdentity(() -> {
-                if (!canAddActiveAdminIfPolicyEngineEnabled(
-                        adminReceiver.getPackageName(), userHandle)) {
-                    throw new IllegalStateException("Can't add non-coexistable admin.");
-                }
-
                 final ActiveAdmin existingAdmin
                         = getActiveAdminUncheckedLocked(adminReceiver, userHandle);
                 if (!refreshing && existingAdmin != null) {
@@ -5305,11 +5326,8 @@
         Preconditions.checkArgument(allowedModes.contains(passwordComplexity),
                 "Provided complexity is not one of the allowed values.");
 
-        CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
-            caller = getCallerIdentity(callerPackageName);
-        } else {
-            caller = getCallerIdentity();
+        CallerIdentity caller = getCallerIdentity(callerPackageName);
+        if (!isPermissionCheckFlagEnabled()) {
             Preconditions.checkCallAuthorization(
                     isDefaultDeviceOwner(caller) || isProfileOwner(caller));
             Preconditions.checkArgument(!calledOnParent || isProfileOwner(caller));
@@ -5354,9 +5372,12 @@
                     saveSettingsLocked(caller.getUserId());
                 });
 
+
+                //TODO(b/276855301): caller.getPackageName() will be null when the coexistence flags are
+                // turned off. Change back to caller.getPackageName once this API is unflagged.
                 DevicePolicyEventLogger
                         .createEvent(DevicePolicyEnums.SET_PASSWORD_COMPLEXITY)
-                        .setAdmin(caller.getPackageName())
+                        .setAdmin(admin.info.getPackageName())
                         .setInt(passwordComplexity)
                         .setBoolean(calledOnParent)
                         .write();
@@ -5991,8 +6012,13 @@
     }
 
     @Override
-    public void lockNow(int flags, boolean parent) {
-        final CallerIdentity caller = getCallerIdentity();
+    public void lockNow(int flags, String callerPackageName, boolean parent) {
+        CallerIdentity caller;
+        if (isPermissionCheckFlagEnabled()) {
+            caller = getCallerIdentity(callerPackageName);
+        } else {
+            caller = getCallerIdentity();
+        }
 
         final int callingUserId = caller.getUserId();
         ComponentName adminComponent = null;
@@ -6001,11 +6027,13 @@
             // Make sure the caller has any active admin with the right policy or
             // the required permission.
             if (isPermissionCheckFlagEnabled()) {
-                admin = getActiveAdminOrCheckPermissionsForCallerLocked(
-                        null,
-                        DeviceAdminInfo.USES_POLICY_FORCE_LOCK,
-                        parent,
-                        Set.of(MANAGE_DEVICE_POLICY_LOCK, LOCK_DEVICE));
+                admin = enforcePermissionAndGetEnforcingAdmin(
+                        /* admin= */ null,
+                        /* permission= */ MANAGE_DEVICE_POLICY_LOCK,
+                        USES_POLICY_FORCE_LOCK,
+                        caller.getPackageName(),
+                        getAffectedUser(parent)
+                 ).getActiveAdmin();
             } else {
                 admin = getActiveAdminOrCheckPermissionForCallerLocked(
                         null,
@@ -7486,7 +7514,7 @@
             return;
         }
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(callerPackageName);
         }  else {
             caller = getCallerIdentity();
@@ -7495,10 +7523,11 @@
 
         boolean calledByProfileOwnerOnOrgOwnedDevice =
                 isProfileOwnerOfOrganizationOwnedDevice(caller.getUserId());
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
                     /*admin=*/ null,
-                    MANAGE_DEVICE_POLICY_WIPE_DATA,
+                    /*permission= */ MANAGE_DEVICE_POLICY_WIPE_DATA,
+                    USES_POLICY_WIPE_DATA,
                     caller.getPackageName(),
                     factoryReset ? UserHandle.USER_ALL : getAffectedUser(calledOnParentInstance));
             admin = enforcingAdmin.getActiveAdmin();
@@ -8528,7 +8557,7 @@
                         isProfileOwnerOfOrganizationOwnedDevice(caller));
             } else {
                 Preconditions.checkCallAuthorization(isProfileOwner(caller)
-                        || isDeviceOwner(caller));
+                        || isDefaultDeviceOwner(caller));
             }
         }
 
@@ -8542,7 +8571,7 @@
                         targetUserId).getActiveAdmin();
             } else {
                 ap = getParentOfAdminIfRequired(
-                        getProfileOwnerOrDeviceOwnerLocked(caller.getUserId()), parent);
+                        getProfileOwnerOrDefaultDeviceOwnerLocked(caller.getUserId()), parent);
             }
 
             if (ap.disableScreenCapture != disabled) {
@@ -8574,15 +8603,21 @@
         }
         if (admin != null && admin.disableScreenCapture) {
             setScreenCaptureDisabled(UserHandle.USER_ALL);
-        } else {
-            // Otherwise, update screen capture only for the calling user.
-            admin = getProfileOwnerAdminLocked(adminUserId);
-            if (admin != null && admin.disableScreenCapture) {
-                setScreenCaptureDisabled(adminUserId);
-            } else {
-                setScreenCaptureDisabled(UserHandle.USER_NULL);
-            }
+            return;
         }
+        // Otherwise, update screen capture only for the calling user.
+        admin = getProfileOwnerAdminLocked(adminUserId);
+        if (admin != null && admin.disableScreenCapture) {
+            setScreenCaptureDisabled(adminUserId);
+            return;
+        }
+        // If the admin is permission based, update only for the calling user.
+        admin = getUserData(adminUserId).createOrGetPermissionBasedAdmin(adminUserId);
+        if (admin != null && admin.disableScreenCapture) {
+            setScreenCaptureDisabled(adminUserId);
+            return;
+        }
+        setScreenCaptureDisabled(UserHandle.USER_NULL);
     }
 
     // Set the latest screen capture policy, overriding any existing ones.
@@ -8720,18 +8755,25 @@
         synchronized (getLockObject()) {
             Preconditions.checkCallAuthorization(!isManagedProfile(caller.getUserId()),
                     "Managed profile cannot set auto time required");
-            ActiveAdmin admin = getProfileOwnerOrDeviceOwnerLocked(caller.getUserId());
-            if (admin.requireAutoTime != required) {
-                admin.requireAutoTime = required;
-                saveSettingsLocked(caller.getUserId());
-                requireAutoTimeChanged = true;
+
+            if (isPolicyEngineForFinanceFlagEnabled()) {
+                EnforcingAdmin admin = getEnforcingAdminForCaller(who, who.getPackageName());
+                setGlobalUserRestrictionInternal(
+                        admin, UserManager.DISALLOW_CONFIG_DATE_TIME, required);
+            } else {
+                ActiveAdmin admin = getProfileOwnerOrDeviceOwnerLocked(caller.getUserId());
+                if (admin.requireAutoTime != required) {
+                    admin.requireAutoTime = required;
+                    saveSettingsLocked(caller.getUserId());
+                    requireAutoTimeChanged = true;
+                }
+                // requireAutoTime is now backed by DISALLOW_CONFIG_DATE_TIME restriction, so
+                // propagate updated restrictions to the framework.
+                if (requireAutoTimeChanged) {
+                    pushUserRestrictions(caller.getUserId());
+                }
             }
         }
-        // requireAutoTime is now backed by DISALLOW_CONFIG_DATE_TIME restriction, so propagate
-        // updated restrictions to the framework.
-        if (requireAutoTimeChanged) {
-            pushUserRestrictions(caller.getUserId());
-        }
         // Turn AUTO_TIME on in settings if it is required
         if (required) {
             mInjector.binderWithCleanCallingIdentity(
@@ -8753,22 +8795,30 @@
         if (!mHasFeature) {
             return false;
         }
-        synchronized (getLockObject()) {
-            ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
-            if (deviceOwner != null && deviceOwner.requireAutoTime) {
-                // If the device owner enforces auto time, we don't need to check the PO's
-                return true;
-            }
-
-            // Now check to see if any profile owner on any user enforces auto time
-            for (Integer userId : mOwners.getProfileOwnerKeys()) {
-                ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userId);
-                if (profileOwner != null && profileOwner.requireAutoTime) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
+            Boolean required = mDevicePolicyEngine.getResolvedPolicy(
+                    PolicyDefinition.getPolicyDefinitionForUserRestriction(
+                            UserManager.DISALLOW_CONFIG_DATE_TIME),
+                    mInjector.binderGetCallingUserHandle().getIdentifier());
+            return required != null && required;
+        } else {
+            synchronized (getLockObject()) {
+                ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
+                if (deviceOwner != null && deviceOwner.requireAutoTime) {
+                    // If the device owner enforces auto time, we don't need to check the PO's
                     return true;
                 }
-            }
 
-            return false;
+                // Now check to see if any profile owner on any user enforces auto time
+                for (Integer userId : mOwners.getProfileOwnerKeys()) {
+                    ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userId);
+                    if (profileOwner != null && profileOwner.requireAutoTime) {
+                        return true;
+                    }
+                }
+
+                return false;
+            }
         }
     }
 
@@ -8852,7 +8902,7 @@
             caller = getCallerIdentity(who);
         }
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPermissionCheckFlagEnabled()) {
             // The effect of this policy is device-wide.
             EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
                     who,
@@ -9065,7 +9115,7 @@
         }
 
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(who, callerPackageName);
         } else {
             caller = getCallerIdentity(who);
@@ -9074,14 +9124,15 @@
 
         checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_CAMERA_DISABLED);
 
-        ActiveAdmin admin;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
                     who,
                     MANAGE_DEVICE_POLICY_CAMERA,
                     caller.getPackageName(),
                     getProfileParentUserIfRequested(userId, parent));
-            admin = enforcingAdmin.getActiveAdmin();
+
+            setBackwardCompatibleUserRestriction(
+                    caller, enforcingAdmin, UserManager.DISALLOW_CAMERA, disabled, parent);
         } else {
             Objects.requireNonNull(who, "ComponentName is null");
             if (parent) {
@@ -9089,22 +9140,19 @@
                         isProfileOwnerOfOrganizationOwnedDevice(caller));
             }
             synchronized (getLockObject()) {
-                admin = getActiveAdminForCallerLocked(who,
+                ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                         DeviceAdminInfo.USES_POLICY_DISABLE_CAMERA, parent);
+                if (admin.disableCamera != disabled) {
+                    admin.disableCamera = disabled;
+                    saveSettingsLocked(userId);
+                }
             }
+            // Tell the user manager that the restrictions have changed.
+            pushUserRestrictions(userId);
         }
 
-        synchronized (getLockObject()) {
-            if (admin.disableCamera != disabled) {
-                admin.disableCamera = disabled;
-                saveSettingsLocked(userId);
-            }
-        }
-        // Tell the user manager that the restrictions have changed.
-        pushUserRestrictions(userId);
-
         final int affectedUserId = parent ? getProfileParentId(userId) : userId;
-        if (SecurityLog.isLoggingEnabled()) {
+        if (SecurityLog.isLoggingEnabled() && who != null) {
             SecurityLog.writeEvent(SecurityLog.TAG_CAMERA_POLICY_SET,
                     who.getPackageName(), userId, affectedUserId, disabled ? 1 : 0);
         }
@@ -9127,12 +9175,12 @@
             return false;
         }
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(who, callerPackageName);
         } else {
             caller = getCallerIdentity(who);
         }
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             Preconditions.checkCallAuthorization(
                     hasFullCrossUsersPermission(caller, userHandle)
                             || isCameraServerUid(caller)
@@ -9148,33 +9196,44 @@
             }
         }
 
-        synchronized (getLockObject()) {
-            if (who != null) {
-                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
-                return (admin != null) && admin.disableCamera;
-            }
-            // First, see if DO has set it.  If so, it's device-wide.
-            final ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
-            if (deviceOwner != null && deviceOwner.disableCamera) {
-                return true;
-            }
+        int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle;
 
-            // Return the strictest policy across all participating admins.
-            List<ActiveAdmin> admins;
-            final int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle;
-            if (isPermissionCheckFlagEnabled()) {
-                admins = getActiveAdminsForAffectedUserInclPermissionBasedAdminLocked(
-                        affectedUserId);
+        if (isPolicyEngineForFinanceFlagEnabled()) {
+            PolicyDefinition<Boolean> policy =
+                    PolicyDefinition.getPolicyDefinitionForUserRestriction(
+                            UserManager.DISALLOW_CAMERA);
+            if (who != null) {
+                EnforcingAdmin admin = getEnforcingAdminForCaller(who, callerPackageName);
+                return Boolean.TRUE.equals(
+                        mDevicePolicyEngine.getLocalPolicySetByAdmin(
+                                policy, admin, affectedUserId));
             } else {
-                admins = getActiveAdminsForAffectedUserLocked(affectedUserId);
+                return Boolean.TRUE.equals(
+                        mDevicePolicyEngine.getResolvedPolicy(policy, affectedUserId));
             }
-            // Determine whether or not the device camera is disabled for any active admins.
-            for (ActiveAdmin activeAdmin : admins) {
-                if (activeAdmin.disableCamera) {
+        } else {
+            synchronized (getLockObject()) {
+                if (who != null) {
+                    ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
+                    return (admin != null) && admin.disableCamera;
+                }
+                // First, see if DO has set it.  If so, it's device-wide.
+                final ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
+                if (deviceOwner != null && deviceOwner.disableCamera) {
                     return true;
                 }
+
+                // Return the strictest policy across all participating admins.
+                List<ActiveAdmin> admins = getActiveAdminsForAffectedUserLocked(affectedUserId);
+
+                // Determine whether or not the device camera is disabled for any active admins.
+                for (ActiveAdmin activeAdmin : admins) {
+                    if (activeAdmin.disableCamera) {
+                        return true;
+                    }
+                }
+                return false;
             }
-            return false;
         }
     }
 
@@ -9193,34 +9252,53 @@
             Objects.requireNonNull(who, "ComponentName is null");
         }
 
-
         final int userHandle = caller.getUserId();
         int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle;
         synchronized (getLockObject()) {
-            ActiveAdmin ap;
             if (isPermissionCheckFlagEnabled()) {
                 // SUPPORT USES_POLICY_DISABLE_KEYGUARD_FEATURES
-                ap = enforcePermissionAndGetEnforcingAdmin(
+                EnforcingAdmin admin = enforcePermissionAndGetEnforcingAdmin(
                         who, MANAGE_DEVICE_POLICY_KEYGUARD, caller.getPackageName(),
-                        affectedUserId).getActiveAdmin();
-            } else {
-                ap = getActiveAdminForCallerLocked(
-                        who, DeviceAdminInfo.USES_POLICY_DISABLE_KEYGUARD_FEATURES, parent);
-            }
-            if (isManagedProfile(userHandle)) {
-                if (parent) {
-                    if (isProfileOwnerOfOrganizationOwnedDevice(caller)) {
-                        which = which & PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
-                    } else {
-                        which = which & NON_ORG_OWNED_PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
-                    }
+                        affectedUserId);
+                if (which == 0) {
+                    mDevicePolicyEngine.removeLocalPolicy(
+                            PolicyDefinition.KEYGUARD_DISABLED_FEATURES, admin, affectedUserId);
                 } else {
-                    which = which & PROFILE_KEYGUARD_FEATURES;
+                    // TODO(b/273723433): revisit silent masking of features
+                    if (isManagedProfile(userHandle)) {
+                        if (parent) {
+                            if (isProfileOwnerOfOrganizationOwnedDevice(caller)) {
+                                which = which & PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
+                            } else {
+                                which = which
+                                        & NON_ORG_OWNED_PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
+                            }
+                        } else {
+                            which = which & PROFILE_KEYGUARD_FEATURES;
+                        }
+                    }
+                    mDevicePolicyEngine.setLocalPolicy(PolicyDefinition.KEYGUARD_DISABLED_FEATURES,
+                            admin, new IntegerPolicyValue(which), affectedUserId);
                 }
-            }
-            if (ap.disabledKeyguardFeatures != which) {
-                ap.disabledKeyguardFeatures = which;
-                saveSettingsLocked(userHandle);
+                invalidateBinderCaches();
+            } else {
+                ActiveAdmin ap = getActiveAdminForCallerLocked(
+                        who, DeviceAdminInfo.USES_POLICY_DISABLE_KEYGUARD_FEATURES, parent);
+                if (isManagedProfile(userHandle)) {
+                    if (parent) {
+                        if (isProfileOwnerOfOrganizationOwnedDevice(caller)) {
+                            which = which & PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
+                        } else {
+                            which = which & NON_ORG_OWNED_PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
+                        }
+                    } else {
+                        which = which & PROFILE_KEYGUARD_FEATURES;
+                    }
+                }
+                if (ap.disabledKeyguardFeatures != which) {
+                    ap.disabledKeyguardFeatures = which;
+                    saveSettingsLocked(userHandle);
+                }
             }
         }
         if (SecurityLog.isLoggingEnabled()) {
@@ -9252,15 +9330,51 @@
         Preconditions.checkCallAuthorization(
                 who == null || isCallingFromPackage(who.getPackageName(), caller.getUid())
                         || isSystemUid(caller));
+        int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle;
 
-        final long ident = mInjector.binderClearCallingIdentity();
-        try {
-            synchronized (getLockObject()) {
-                if (who != null) {
+        synchronized (getLockObject()) {
+            if (who != null) {
+                if (isPermissionCheckFlagEnabled()) {
+                    EnforcingAdmin admin = getEnforcingAdminForCaller(
+                            who, who.getPackageName());
+                    Integer features = mDevicePolicyEngine.getLocalPolicySetByAdmin(
+                            PolicyDefinition.KEYGUARD_DISABLED_FEATURES,
+                            admin,
+                            affectedUserId);
+                    return features == null ? 0 : features;
+                } else {
                     ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
                     return (admin != null) ? admin.disabledKeyguardFeatures : 0;
                 }
+            }
 
+            if (isPermissionCheckFlagEnabled()) {
+                Integer features = mDevicePolicyEngine.getResolvedPolicy(
+                        PolicyDefinition.KEYGUARD_DISABLED_FEATURES,
+                        affectedUserId);
+
+                return Binder.withCleanCallingIdentity(() -> {
+                    int combinedFeatures = features == null ? 0 : features;
+                    List<UserInfo> profiles = mUserManager.getProfiles(affectedUserId);
+                    for (UserInfo profile : profiles) {
+                        int profileId = profile.id;
+                        if (profileId == affectedUserId) {
+                            continue;
+                        }
+                        Integer profileFeatures = mDevicePolicyEngine.getResolvedPolicy(
+                                PolicyDefinition.KEYGUARD_DISABLED_FEATURES,
+                                profileId);
+                        if (profileFeatures != null) {
+                            combinedFeatures |= (profileFeatures
+                                    & PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER);
+                        }
+                    }
+                    return combinedFeatures;
+                });
+            }
+
+            final long ident = mInjector.binderClearCallingIdentity();
+            try {
                 final List<ActiveAdmin> admins;
                 if (!parent && isManagedProfile(userHandle)) {
                     // If we are being asked about a managed profile, just return keyguard features
@@ -9290,9 +9404,9 @@
                     }
                 }
                 return which;
+            } finally {
+                mInjector.binderRestoreCallingIdentity(ident);
             }
-        } finally {
-            mInjector.binderRestoreCallingIdentity(ident);
         }
     }
 
@@ -10268,8 +10382,10 @@
         Preconditions.checkCallAuthorization(
                 isDefaultDeviceOwner(caller) || isProfileOwner(caller));
 
+        final String truncatedProfileName =
+                profileName.substring(0, Math.min(profileName.length(), MAX_PROFILE_NAME_LENGTH));
         mInjector.binderWithCleanCallingIdentity(() -> {
-            mUserManager.setUserName(caller.getUserId(), profileName);
+            mUserManager.setUserName(caller.getUserId(), truncatedProfileName);
             DevicePolicyEventLogger
                     .createEvent(DevicePolicyEnums.SET_PROFILE_NAME)
                     .setAdmin(caller.getComponentName())
@@ -11160,14 +11276,14 @@
     public void addPersistentPreferredActivity(ComponentName who, String callerPackageName,
             IntentFilter filter, ComponentName activity) {
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(who, callerPackageName);
         } else {
             caller = getCallerIdentity(who);
         }
 
         final int userId = caller.getUserId();
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             EnforcingAdmin enforcingAdmin;
             if (who == null) {
                 enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
@@ -11215,14 +11331,14 @@
     public void clearPackagePersistentPreferredActivities(ComponentName who,
             String callerPackageName, String packageName) {
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(who, callerPackageName);
         } else {
             caller = getCallerIdentity(who);
         }
         final int userId = caller.getUserId();
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             EnforcingAdmin enforcingAdmin;
             if (who == null) {
                 enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
@@ -11362,7 +11478,7 @@
                     RoleManager.ROLE_DIALER, packageName, 0, UserHandle.of(callerUserId),
                     AsyncTask.THREAD_POOL_EXECUTOR, callback);
             try {
-                future.get(5, TimeUnit.SECONDS);
+                future.get(20, TimeUnit.SECONDS);
             } catch (TimeoutException e) {
                 throw new IllegalArgumentException("Timeout when setting the app as the dialer", e);
             } catch (ExecutionException e) {
@@ -11414,7 +11530,7 @@
         final CallerIdentity caller = getCallerIdentity(who, callerPackage);
         checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_APPLICATION_RESTRICTIONS);
 
-        if (useDevicePolicyEngine(caller, DELEGATION_APP_RESTRICTIONS)) {
+        if (isPermissionCheckFlagEnabled()) {
             EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
                     who,
                     MANAGE_DEVICE_POLICY_APP_RESTRICTIONS,
@@ -12410,7 +12526,7 @@
 
         final int userId = user.id;
 
-        if (isDevicePolicyEngineEnabled()) {
+        if (isPermissionCheckFlagEnabled()) {
             mDevicePolicyEngine.handleUserCreated(user);
         }
 
@@ -12519,9 +12635,8 @@
             case UserManager.RESTRICTION_NOT_SET:
                 return false;
             case UserManager.RESTRICTION_SOURCE_DEVICE_OWNER:
-                return !isDeviceOwner(admin, userId);
             case UserManager.RESTRICTION_SOURCE_PROFILE_OWNER:
-                return !isProfileOwner(admin, userId);
+                return !(isDeviceOwner(admin, userId) || isProfileOwner(admin, userId));
             default:
                 return true;
         }
@@ -12780,7 +12895,7 @@
             String packageName) {
         final CallerIdentity caller = getCallerIdentity(who, callerPackage);
 
-        if (useDevicePolicyEngine(caller, DELEGATION_APP_RESTRICTIONS)) {
+        if (isPermissionCheckFlagEnabled()) {
             EnforcingAdmin enforcingAdmin = enforceCanQueryAndGetEnforcingAdmin(
                     who,
                     MANAGE_DEVICE_POLICY_APP_RESTRICTIONS,
@@ -13009,7 +13124,7 @@
             boolean parent) {
 
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(who, callerPackage);
         } else {
             caller = getCallerIdentity(who);
@@ -13021,42 +13136,37 @@
         }
         checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_USER_RESTRICTION);
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             int affectedUserId = parent ? getProfileParentId(userId) : userId;
             EnforcingAdmin admin = enforcePermissionForUserRestriction(
                     who,
                     key,
                     caller.getPackageName(),
                     affectedUserId);
-            PolicyDefinition<Boolean> policyDefinition =
-                    PolicyDefinition.getPolicyDefinitionForUserRestriction(key);
-            if (enabledFromThisOwner) {
-                mDevicePolicyEngine.setLocalPolicy(
-                        policyDefinition,
-                        admin,
-                        new BooleanPolicyValue(true),
-                        affectedUserId);
-            } else {
-                // Remove any local and global policy that was set by the admin
-                if (!policyDefinition.isLocalOnlyPolicy()) {
-                    mDevicePolicyEngine.removeGlobalPolicy(
-                            policyDefinition,
-                            admin);
-                }
-                if (!policyDefinition.isGlobalOnlyPolicy()) {
-                    mDevicePolicyEngine.removeLocalPolicy(
-                            policyDefinition,
-                            admin,
-                            userId);
+            if (mInjector.isChangeEnabled(ENABLE_COEXISTENCE_CHANGE, callerPackage, userId)) {
+                PolicyDefinition<Boolean> policyDefinition =
+                        PolicyDefinition.getPolicyDefinitionForUserRestriction(key);
+                if (enabledFromThisOwner) {
+                    setLocalUserRestrictionInternal(
+                            admin, key, /* enabled= */ true, affectedUserId);
+                } else {
+                    // Remove any local and global policy that was set by the admin
+                    if (!policyDefinition.isLocalOnlyPolicy()) {
+                        setGlobalUserRestrictionInternal(admin, key, /* enabled= */ false);
+                    }
+                    if (!policyDefinition.isGlobalOnlyPolicy()) {
+                        setLocalUserRestrictionInternal(admin, key, /* enabled= */ false, userId);
 
-                    int parentUserId = getProfileParentId(userId);
-                    if (parentUserId != userId) {
-                        mDevicePolicyEngine.removeLocalPolicy(
-                                policyDefinition,
-                                admin,
-                                parentUserId);
+                        int parentUserId = getProfileParentId(userId);
+                        if (parentUserId != userId) {
+                            setLocalUserRestrictionInternal(
+                                    admin, key, /* enabled= */ false, parentUserId);
+                        }
                     }
                 }
+            } else {
+                setBackwardCompatibleUserRestriction(
+                        caller, admin, key, enabledFromThisOwner, parent);
             }
         } else {
             Objects.requireNonNull(who, "ComponentName is null");
@@ -13114,6 +13224,31 @@
         logUserRestrictionCall(key, enabledFromThisOwner, parent, caller);
     }
 
+    private void setBackwardCompatibleUserRestriction(
+            CallerIdentity caller, EnforcingAdmin admin, String key, boolean enabled,
+            boolean parent) {
+        synchronized (getLockObject()) {
+            if (isDeviceOwner(caller)) {
+                if (UserRestrictionsUtils.isGlobal(OWNER_TYPE_DEVICE_OWNER, key)) {
+                    setGlobalUserRestrictionInternal(admin, key, enabled);
+                } else {
+                    setLocalUserRestrictionInternal(admin, key, enabled, caller.getUserId());
+                }
+            } else if (isProfileOwner(caller)) {
+                if (UserRestrictionsUtils.isGlobal(OWNER_TYPE_PROFILE_OWNER, key)
+                        || (parent && isProfileOwnerOfOrganizationOwnedDevice(caller)
+                        && UserRestrictionsUtils.isGlobal(
+                                OWNER_TYPE_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE, key))) {
+                    setGlobalUserRestrictionInternal(admin, key, enabled);
+                } else {
+                    int affectedUserId = parent
+                            ? getProfileParentId(caller.getUserId()) : caller.getUserId();
+                    setLocalUserRestrictionInternal(admin, key, enabled, affectedUserId);
+                }
+            }
+        }
+    }
+
     @Override
     public void setUserRestrictionGlobally(String callerPackage, String key) {
         final CallerIdentity caller = getCallerIdentity(callerPackage);
@@ -13121,27 +13256,63 @@
             return;
         }
 
-        int userHandle = caller.getUserId();
         checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_USER_RESTRICTION);
 
-        if (!useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
-            throw new IllegalStateException("One or more admins are not targeting Android 14.");
+        if (!isPolicyEngineForFinanceFlagEnabled()) {
+            throw new IllegalStateException("Feature flag is not enabled.");
         }
+
+        if (!mInjector.isChangeEnabled(
+                ENABLE_COEXISTENCE_CHANGE, callerPackage, caller.getUserId())) {
+            throw new IllegalStateException("Calling package is not targeting Android U.");
+        }
+
         EnforcingAdmin admin = enforcePermissionForUserRestriction(
-                /*who=*/ null,
+                /* who= */ null,
                 key,
                 caller.getPackageName(),
                 caller.getUserId()
         );
 
-        mDevicePolicyEngine.setGlobalPolicy(
-                PolicyDefinition.getPolicyDefinitionForUserRestriction(key),
-                admin,
-                new BooleanPolicyValue(true));
+        setGlobalUserRestrictionInternal(admin, key, /* enabled= */ true);
 
         logUserRestrictionCall(key, /* enabled= */ true, /* parent= */ false, caller);
     }
 
+    private void setLocalUserRestrictionInternal(
+            EnforcingAdmin admin, String key, boolean enabled, int userId) {
+        PolicyDefinition<Boolean> policyDefinition =
+                PolicyDefinition.getPolicyDefinitionForUserRestriction(key);
+        if (enabled) {
+            mDevicePolicyEngine.setLocalPolicy(
+                    policyDefinition,
+                    admin,
+                    new BooleanPolicyValue(true),
+                    userId);
+        } else {
+            mDevicePolicyEngine.removeLocalPolicy(
+                    policyDefinition,
+                    admin,
+                    userId);
+        }
+    }
+
+    private void setGlobalUserRestrictionInternal(
+            EnforcingAdmin admin, String key, boolean enabled) {
+        PolicyDefinition<Boolean> policyDefinition =
+                PolicyDefinition.getPolicyDefinitionForUserRestriction(key);
+        if (enabled) {
+            mDevicePolicyEngine.setGlobalPolicy(
+                    PolicyDefinition.getPolicyDefinitionForUserRestriction(key),
+                    admin,
+                    new BooleanPolicyValue(true));
+        } else {
+            mDevicePolicyEngine.removeGlobalPolicy(
+                    policyDefinition,
+                    admin);
+        }
+    }
+
     private void logUserRestrictionCall(
             String key, boolean enabled, boolean parent, CallerIdentity caller) {
         final int eventId = enabled
@@ -13161,7 +13332,7 @@
     }
 
     private void saveUserRestrictionsLocked(int userId) {
-        if (isDevicePolicyEngineEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             // User restrictions are handled in the policy engine
             return;
         }
@@ -13179,6 +13350,10 @@
      * will be the target user id.
      */
     private void pushUserRestrictions(int originatingUserId) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
+            // User restrictions are handled in the policy engine
+            return;
+        }
         final Bundle global;
         final RestrictionsSet local = new RestrictionsSet();
         final boolean isDeviceOwner;
@@ -13231,17 +13406,24 @@
             return null;
         }
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(who, callerPackage);
         } else {
             caller = getCallerIdentity(who);
         }
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
+            int targetUserId = parent
+                    ? getProfileParentId(caller.getUserId()) : caller.getUserId();
             EnforcingAdmin admin = getEnforcingAdminForCaller(who, callerPackage);
-            return getUserRestrictionsFromPolicyEngine(
-                    admin,
-                    parent ? getProfileParentId(caller.getUserId()) : caller.getUserId());
+            Bundle restrictions = getUserRestrictionsFromPolicyEngine(admin, targetUserId);
+            // Add global restrictions set by the admin as well if admin is not targeting Android U.
+            if (!mInjector.isChangeEnabled(
+                    ENABLE_COEXISTENCE_CHANGE, callerPackage, caller.getUserId())) {
+                restrictions.putAll(
+                        getUserRestrictionsFromPolicyEngine(admin, UserHandle.USER_ALL));
+            }
+            return restrictions;
         } else {
             Objects.requireNonNull(who, "ComponentName is null");
             Preconditions.checkCallAuthorization(isDefaultDeviceOwner(caller)
@@ -13425,8 +13607,8 @@
             return null;
         }
         final CallerIdentity caller = getCallerIdentity(callerPackage);
-        if (!useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
-            throw new IllegalStateException("One or more admins are not targeting Android 14.");
+        if (!isPolicyEngineForFinanceFlagEnabled()) {
+            throw new IllegalStateException("Feature flag is not enabled.");
         }
 
         EnforcingAdmin admin = getEnforcingAdminForCaller(/*who=*/ null, caller.getPackageName());
@@ -13494,8 +13676,31 @@
                 Slogf.v(LOG_TAG, "calling pm.setApplicationHiddenSettingAsUser(%s, %b, %d)",
                         packageName, hidden, userId);
             }
-            result = mInjector.binderWithCleanCallingIdentity(() -> mIPackageManager
-                    .setApplicationHiddenSettingAsUser(packageName, hidden, userId));
+            if (isPermissionCheckFlagEnabled()) {
+                EnforcingAdmin admin = getEnforcingAdminForCaller(who, callerPackage);
+                mDevicePolicyEngine.setLocalPolicy(
+                        PolicyDefinition.APPLICATION_HIDDEN(packageName),
+                        admin,
+                        new BooleanPolicyValue(hidden),
+                        userId);
+                Boolean resolvedPolicy = mDevicePolicyEngine.getResolvedPolicy(
+                        PolicyDefinition.APPLICATION_HIDDEN(packageName), userId);
+                result = mInjector.binderWithCleanCallingIdentity(() -> {
+                    try {
+                        // This is a best effort to continue returning the same value that was
+                        // returned before the policy engine migration.
+                        return mInjector.getIPackageManager().getPackageInfo(
+                                packageName, MATCH_UNINSTALLED_PACKAGES, userId) != null
+                                && (mIPackageManager.getApplicationHiddenSettingAsUser(
+                                        packageName, userId) == hidden);
+                    } catch (RemoteException e) {
+                        return false;
+                    }
+                });
+            } else {
+                result = mInjector.binderWithCleanCallingIdentity(() -> mIPackageManager
+                        .setApplicationHiddenSettingAsUser(packageName, hidden, userId));
+            }
         }
         DevicePolicyEventLogger
                 .createEvent(DevicePolicyEnums.SET_APPLICATION_HIDDEN)
@@ -13811,7 +14016,7 @@
             boolean uninstallBlocked) {
         final CallerIdentity caller = getCallerIdentity(who, callerPackage);
 
-        if (useDevicePolicyEngine(caller, DELEGATION_BLOCK_UNINSTALL)) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
                     who,
                     MANAGE_DEVICE_POLICY_APPS_CONTROL,
@@ -14365,14 +14570,14 @@
             throws SecurityException {
         Objects.requireNonNull(packages, "packages is null");
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(who, callerPackageName);
         } else {
             caller = getCallerIdentity(who);
         }
         checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_LOCK_TASK_PACKAGES);
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             EnforcingAdmin enforcingAdmin;
             synchronized (getLockObject()) {
                 enforcingAdmin = enforceCanCallLockTaskLocked(who, callerPackageName);
@@ -14423,14 +14628,14 @@
     @Override
     public String[] getLockTaskPackages(ComponentName who, String callerPackageName) {
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(who, callerPackageName);
         } else {
             caller = getCallerIdentity(who);
         }
         final int userHandle = caller.getUserId();
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             synchronized (getLockObject()) {
                 enforceCanQueryLockTaskLocked(who, caller.getPackageName());
             }
@@ -14463,8 +14668,7 @@
         }
 
         final int userId = mInjector.userHandleGetCallingUserId();
-        // Is it ok to just check that no active policies exist currently?
-        if (isDevicePolicyEngineFlagEnabled() && mDevicePolicyEngine.hasActivePolicies()) {
+        if (isPermissionCheckFlagEnabled()) {
             LockTaskPolicy policy = mDevicePolicyEngine.getResolvedPolicy(
                     PolicyDefinition.LOCK_TASK, userId);
             if (policy == null) {
@@ -14490,7 +14694,7 @@
             "Cannot use LOCK_TASK_FEATURE_NOTIFICATIONS without LOCK_TASK_FEATURE_HOME");
 
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(who, callerPackageName);
         } else {
             caller = getCallerIdentity(who);
@@ -14500,7 +14704,7 @@
             checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_LOCK_TASK_FEATURES);
         }
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             EnforcingAdmin enforcingAdmin;
             synchronized (getLockObject()) {
                 enforcingAdmin = enforceCanCallLockTaskLocked(who,
@@ -14543,14 +14747,14 @@
     @Override
     public int getLockTaskFeatures(ComponentName who, String callerPackageName) {
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(who, callerPackageName);
         } else {
             caller = getCallerIdentity(who);
         }
         final int userHandle = caller.getUserId();
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             synchronized (getLockObject()) {
                 enforceCanQueryLockTaskLocked(who, caller.getPackageName());
             }
@@ -16310,12 +16514,31 @@
                 enforcePermissionGrantStateOnFinancedDevice(packageName, permission);
             }
         }
-        if (useDevicePolicyEngine(caller, DELEGATION_PERMISSION_GRANT)) {
+        if (isPermissionCheckFlagEnabled()) {
             EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
                     admin,
                     MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
                     callerPackage,
                     caller.getUserId());
+            if (SENSOR_PERMISSIONS.contains(permission)
+                    && grantState == PERMISSION_GRANT_STATE_GRANTED
+                    && (!canAdminGrantSensorsPermissions() || isCallerDelegate(caller))) {
+                if (mInjector.isChangeEnabled(THROW_SECURITY_EXCEPTION_FOR_SENSOR_PERMISSIONS,
+                        caller.getPackageName(), caller.getUserId())) {
+                    throw new SecurityException(
+                            "Caller not permitted to grant sensor permissions.");
+                } else {
+                    // This is to match the legacy behaviour.
+                    callback.sendResult(Bundle.EMPTY);
+                    return;
+                }
+            }
+            // Check all the states where Exceptions aren't thrown but the permission
+            // isn't granted either.
+            if (!canGrantPermission(caller, permission, packageName)) {
+                callback.sendResult(null);
+                return;
+            }
             // TODO(b/266924257): decide how to handle the internal state if the package doesn't
             //  exist, or the permission isn't requested by the app, because we could end up with
             //  inconsistent state between the policy engine and package manager. Also a package
@@ -16391,6 +16614,41 @@
         }
     }
 
+    private static final List<String> SENSOR_PERMISSIONS = new ArrayList<>();
+    {
+        SENSOR_PERMISSIONS.add(Manifest.permission.ACCESS_FINE_LOCATION);
+        SENSOR_PERMISSIONS.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
+        SENSOR_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
+        SENSOR_PERMISSIONS.add(Manifest.permission.CAMERA);
+        SENSOR_PERMISSIONS.add(Manifest.permission.RECORD_AUDIO);
+        SENSOR_PERMISSIONS.add(Manifest.permission.ACTIVITY_RECOGNITION);
+        SENSOR_PERMISSIONS.add(Manifest.permission.BODY_SENSORS);
+        SENSOR_PERMISSIONS.add(Manifest.permission.BACKGROUND_CAMERA);
+        SENSOR_PERMISSIONS.add(Manifest.permission.RECORD_BACKGROUND_AUDIO);
+        SENSOR_PERMISSIONS.add(Manifest.permission.BODY_SENSORS_BACKGROUND);
+        SENSOR_PERMISSIONS.add(
+                Manifest.permission.BODY_SENSORS_WRIST_TEMPERATURE);
+        SENSOR_PERMISSIONS.add(
+                    Manifest.permission.BODY_SENSORS_WRIST_TEMPERATURE_BACKGROUND);
+    }
+
+    private boolean canGrantPermission(CallerIdentity caller, String permission,
+            String targetPackageName) {
+        boolean isPostQAdmin = getTargetSdk(caller.getPackageName(), caller.getUserId())
+                >= android.os.Build.VERSION_CODES.Q;
+        if (!isPostQAdmin) {
+            // Legacy admins assume that they cannot control pre-M apps
+            if (getTargetSdk(targetPackageName, caller.getUserId())
+                    < android.os.Build.VERSION_CODES.M) {
+                return false;
+            }
+        }
+        if (!isRuntimePermission(permission)) {
+            return false;
+        }
+        return true;
+    }
+
     private void enforcePermissionGrantStateOnFinancedDevice(
             String packageName, String permission) {
         if (!Manifest.permission.READ_PHONE_STATE.equals(permission)) {
@@ -17487,7 +17745,6 @@
 
         synchronized (getLockObject()) {
             if (isPermissionCheckFlagEnabled()) {
-                // TODO: add support for DELEGATION_SECURITY_LOGGING
                 enforcePermission(MANAGE_DEVICE_POLICY_SECURITY_LOGGING, caller.getPackageName(),
                         UserHandle.USER_ALL);
             } else {
@@ -17568,7 +17825,8 @@
 
         final CallerIdentity caller = getCallerIdentity(admin, packageName);
         if (isPermissionCheckFlagEnabled()) {
-            // TODO: Restore the "affiliated users" check
+            Preconditions.checkCallAuthorization(isOrganizationOwnedDeviceWithManagedProfile()
+                    || areAllUsersAffiliatedWithDeviceLocked());
             enforcePermission(MANAGE_DEVICE_POLICY_SECURITY_LOGGING, caller.getPackageName(),
                     UserHandle.USER_ALL);
         } else {
@@ -17620,7 +17878,9 @@
 
         final CallerIdentity caller = getCallerIdentity(admin, packageName);
         if (isPermissionCheckFlagEnabled()) {
-            // TODO: Restore the "affiliated users" check
+            Preconditions.checkCallAuthorization(isOrganizationOwnedDeviceWithManagedProfile()
+                    || areAllUsersAffiliatedWithDeviceLocked());
+
             enforcePermission(MANAGE_DEVICE_POLICY_SECURITY_LOGGING, caller.getPackageName(),
                     UserHandle.USER_ALL);
         } else {
@@ -17815,11 +18075,6 @@
         // The removed admin might have disabled camera, so update user
         // restrictions.
         pushUserRestrictions(userHandle);
-
-        // The removed admin might've been stopping the migration if it was targeting pre Android U
-        if (shouldMigrateToDevicePolicyEngine()) {
-            migratePoliciesToDevicePolicyEngine();
-        }
     }
 
     @Override
@@ -18497,7 +18752,7 @@
         }
         final int userId = caller.getUserId();
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPermissionCheckFlagEnabled()) {
             EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
                     admin,
                     MANAGE_DEVICE_POLICY_RESET_PASSWORD,
@@ -18561,7 +18816,7 @@
         final int userId = caller.getUserId();
         boolean result = false;
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPermissionCheckFlagEnabled()) {
             EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
                     admin,
                     MANAGE_DEVICE_POLICY_RESET_PASSWORD,
@@ -18607,7 +18862,7 @@
         }
         int userId = caller.getUserId();
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPermissionCheckFlagEnabled()) {
             EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
                     admin,
                     MANAGE_DEVICE_POLICY_RESET_PASSWORD,
@@ -18659,7 +18914,7 @@
         boolean result = false;
         final String password = passwordOrNull != null ? passwordOrNull : "";
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPermissionCheckFlagEnabled()) {
             EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
                     admin,
                     MANAGE_DEVICE_POLICY_RESET_PASSWORD,
@@ -19848,7 +20103,7 @@
             List<String> packages) {
         Objects.requireNonNull(packages, "packages is null");
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(who, callerPackageName);
         } else {
             caller = getCallerIdentity(who);
@@ -19856,7 +20111,7 @@
         checkCanExecuteOrThrowUnsafe(
                 DevicePolicyManager.OPERATION_SET_USER_CONTROL_DISABLED_PACKAGES);
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
                     who,
                     MANAGE_DEVICE_POLICY_APPS_CONTROL,
@@ -19930,13 +20185,13 @@
     public List<String> getUserControlDisabledPackages(ComponentName who,
             String callerPackageName) {
         CallerIdentity caller;
-        if (isPermissionCheckFlagEnabled()) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             caller = getCallerIdentity(who, callerPackageName);
         } else {
             caller = getCallerIdentity(who);
         }
 
-        if (useDevicePolicyEngine(caller, /* delegateScope= */ null)) {
+        if (isPolicyEngineForFinanceFlagEnabled()) {
             enforceCanQuery(
                     MANAGE_DEVICE_POLICY_APPS_CONTROL,
                     caller.getPackageName(),
@@ -22019,7 +22274,7 @@
         }
 
         private void handleFinancedDeviceKioskRoleChange() {
-            if (!isDevicePolicyEngineEnabled()) {
+            if (!isPermissionCheckFlagEnabled()) {
                 return;
             }
             Slog.i(LOG_TAG, "Handling action " + ACTION_DEVICE_FINANCING_STATE_CHANGED);
@@ -22176,242 +22431,208 @@
 
     // Permissions of existing DPC types.
     private static final List<String> DEFAULT_DEVICE_OWNER_PERMISSIONS = List.of(
-            MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL,
+            MANAGE_DEVICE_POLICY_ACCOUNT_MANAGEMENT,
             MANAGE_DEVICE_POLICY_ACROSS_USERS,
+            MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL,
             MANAGE_DEVICE_POLICY_ACROSS_USERS_SECURITY_CRITICAL,
-            SET_TIME,
-            SET_TIME_ZONE,
-            MANAGE_DEVICE_POLICY_ORGANIZATION_IDENTITY,
-            MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
-            MANAGE_DEVICE_POLICY_WIFI,
-            MANAGE_DEVICE_POLICY_WIPE_DATA,
-            MANAGE_DEVICE_POLICY_SCREEN_CAPTURE,
-            MANAGE_DEVICE_POLICY_SYSTEM_UPDATES,
-            MANAGE_DEVICE_POLICY_SECURITY_LOGGING,
-            MANAGE_DEVICE_POLICY_USB_DATA_SIGNALLING,
-            MANAGE_DEVICE_POLICY_MTE,
-            MANAGE_DEVICE_POLICY_LOCK_CREDENTIALS,
-            MANAGE_DEVICE_POLICY_PACKAGE_STATE,
-            MANAGE_DEVICE_POLICY_LOCK,
-            MANAGE_DEVICE_POLICY_FACTORY_RESET,
-            MANAGE_DEVICE_POLICY_KEYGUARD,
-            MANAGE_DEVICE_POLICY_CERTIFICATES,
-            MANAGE_DEVICE_POLICY_KEYGUARD,
-            MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
-            MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE,
-            MANAGE_DEVICE_POLICY_APPS_CONTROL,
-            MANAGE_DEVICE_POLICY_LOCK_TASK,
-            MANAGE_DEVICE_POLICY_ACCOUNT_MANAGEMENT,
-            MANAGE_DEVICE_POLICY_CAMERA,
-            MANAGE_DEVICE_POLICY_COMMON_CRITERIA_MODE,
-            MANAGE_DEVICE_POLICY_DEFAULT_SMS,
-            MANAGE_DEVICE_POLICY_PACKAGE_STATE,
-            MANAGE_DEVICE_POLICY_PROFILE_INTERACTION,
-            MANAGE_DEVICE_POLICY_RESET_PASSWORD,
-            MANAGE_DEVICE_POLICY_STATUS_BAR,
-            MANAGE_DEVICE_POLICY_LOCK_TASK,
-            MANAGE_DEVICE_POLICY_ACCOUNT_MANAGEMENT,
             MANAGE_DEVICE_POLICY_AIRPLANE_MODE,
+            MANAGE_DEVICE_POLICY_APPS_CONTROL,
+            MANAGE_DEVICE_POLICY_APP_RESTRICTIONS,
             MANAGE_DEVICE_POLICY_AUDIO_OUTPUT,
             MANAGE_DEVICE_POLICY_AUTOFILL,
             MANAGE_DEVICE_POLICY_BLUETOOTH,
             MANAGE_DEVICE_POLICY_CALLS,
             MANAGE_DEVICE_POLICY_CAMERA,
+            MANAGE_DEVICE_POLICY_CERTIFICATES,
+            MANAGE_DEVICE_POLICY_COMMON_CRITERIA_MODE,
             MANAGE_DEVICE_POLICY_DEBUGGING_FEATURES,
+            MANAGE_DEVICE_POLICY_DEFAULT_SMS,
             MANAGE_DEVICE_POLICY_DISPLAY,
             MANAGE_DEVICE_POLICY_FACTORY_RESET,
             MANAGE_DEVICE_POLICY_FUN,
             MANAGE_DEVICE_POLICY_INSTALL_UNKNOWN_SOURCES,
+            MANAGE_DEVICE_POLICY_KEYGUARD,
             MANAGE_DEVICE_POLICY_LOCALE,
             MANAGE_DEVICE_POLICY_LOCATION,
+            MANAGE_DEVICE_POLICY_LOCK,
             MANAGE_DEVICE_POLICY_LOCK_CREDENTIALS,
+            MANAGE_DEVICE_POLICY_LOCK_TASK,
             MANAGE_DEVICE_POLICY_MICROPHONE,
             MANAGE_DEVICE_POLICY_MOBILE_NETWORK,
+            MANAGE_DEVICE_POLICY_MTE,
             MANAGE_DEVICE_POLICY_NEARBY_COMMUNICATION,
+            MANAGE_DEVICE_POLICY_ORGANIZATION_IDENTITY,
+            MANAGE_DEVICE_POLICY_PACKAGE_STATE,
             MANAGE_DEVICE_POLICY_PHYSICAL_MEDIA,
             MANAGE_DEVICE_POLICY_PRINTING,
-            MANAGE_DEVICE_POLICY_RESTRICT_PRIVATE_DNS,
             MANAGE_DEVICE_POLICY_PROFILES,
             MANAGE_DEVICE_POLICY_PROFILE_INTERACTION,
+            MANAGE_DEVICE_POLICY_RESET_PASSWORD,
+            MANAGE_DEVICE_POLICY_RESTRICT_PRIVATE_DNS,
+            MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
             MANAGE_DEVICE_POLICY_SAFE_BOOT,
+            MANAGE_DEVICE_POLICY_SCREEN_CAPTURE,
             MANAGE_DEVICE_POLICY_SCREEN_CONTENT,
+            MANAGE_DEVICE_POLICY_SECURITY_LOGGING,
             MANAGE_DEVICE_POLICY_SMS,
+            MANAGE_DEVICE_POLICY_STATUS_BAR,
+            MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE,
             MANAGE_DEVICE_POLICY_SYSTEM_DIALOGS,
+            MANAGE_DEVICE_POLICY_SYSTEM_UPDATES,
             MANAGE_DEVICE_POLICY_TIME,
+            MANAGE_DEVICE_POLICY_USB_DATA_SIGNALLING,
             MANAGE_DEVICE_POLICY_USB_FILE_TRANSFER,
             MANAGE_DEVICE_POLICY_USERS,
             MANAGE_DEVICE_POLICY_VPN,
             MANAGE_DEVICE_POLICY_WALLPAPER,
             MANAGE_DEVICE_POLICY_WIFI,
             MANAGE_DEVICE_POLICY_WINDOWS,
-            MANAGE_DEVICE_POLICY_APP_RESTRICTIONS
+            MANAGE_DEVICE_POLICY_WIPE_DATA,
+            SET_TIME,
+            SET_TIME_ZONE
     );
     private static final List<String> FINANCED_DEVICE_OWNER_PERMISSIONS = List.of(
-            MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL,
             MANAGE_DEVICE_POLICY_ACROSS_USERS,
+            MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL,
             MANAGE_DEVICE_POLICY_ACROSS_USERS_SECURITY_CRITICAL,
-            MANAGE_DEVICE_POLICY_ORGANIZATION_IDENTITY,
-            MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
-            MANAGE_DEVICE_POLICY_ORGANIZATION_IDENTITY,
-            MANAGE_DEVICE_POLICY_FACTORY_RESET,
-            MANAGE_DEVICE_POLICY_KEYGUARD,
-            MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
-            MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE,
             MANAGE_DEVICE_POLICY_APPS_CONTROL,
-            MANAGE_DEVICE_POLICY_LOCK_TASK,
             MANAGE_DEVICE_POLICY_CALLS,
             MANAGE_DEVICE_POLICY_DEBUGGING_FEATURES,
+            MANAGE_DEVICE_POLICY_FACTORY_RESET,
             MANAGE_DEVICE_POLICY_INSTALL_UNKNOWN_SOURCES,
-            MANAGE_DEVICE_POLICY_USERS,
+            MANAGE_DEVICE_POLICY_KEYGUARD,
+            MANAGE_DEVICE_POLICY_LOCK_TASK,
+            MANAGE_DEVICE_POLICY_ORGANIZATION_IDENTITY,
+            MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
             MANAGE_DEVICE_POLICY_SAFE_BOOT,
-            MANAGE_DEVICE_POLICY_TIME);
-    private static final List<String> PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE_PERMISSIONS =
+            MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE,
+            MANAGE_DEVICE_POLICY_TIME,
+            MANAGE_DEVICE_POLICY_USERS,
+            MANAGE_DEVICE_POLICY_LOCK_CREDENTIALS
+    );
+
+    /**
+     * All the permisisons granted to a profile owner.
+     */
+    private static final List<String> PROFILE_OWNER_PERMISSIONS  =
             List.of(
-                MANAGE_DEVICE_POLICY_ACROSS_USERS,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_SECURITY_CRITICAL,
-                SET_TIME,
-                SET_TIME_ZONE,
-                MANAGE_DEVICE_POLICY_ORGANIZATION_IDENTITY,
-                MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
-                MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE,
-                MANAGE_DEVICE_POLICY_APPS_CONTROL,
-                MANAGE_DEVICE_POLICY_WIFI,
-                MANAGE_DEVICE_POLICY_WIPE_DATA,
-                MANAGE_DEVICE_POLICY_SCREEN_CAPTURE,
-                MANAGE_DEVICE_POLICY_SYSTEM_UPDATES,
-                MANAGE_DEVICE_POLICY_SECURITY_LOGGING,
-                MANAGE_DEVICE_POLICY_USB_DATA_SIGNALLING,
-                MANAGE_DEVICE_POLICY_MTE,
-                MANAGE_DEVICE_POLICY_LOCK_CREDENTIALS,
-                MANAGE_DEVICE_POLICY_PACKAGE_STATE,
-                MANAGE_DEVICE_POLICY_LOCK,
-                MANAGE_DEVICE_POLICY_FACTORY_RESET,
-                MANAGE_DEVICE_POLICY_KEYGUARD,
-                MANAGE_DEVICE_POLICY_AIRPLANE_MODE,
                 MANAGE_DEVICE_POLICY_ACCOUNT_MANAGEMENT,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_SECURITY_CRITICAL,
+                MANAGE_DEVICE_POLICY_APPS_CONTROL,
+                MANAGE_DEVICE_POLICY_APP_RESTRICTIONS,
                 MANAGE_DEVICE_POLICY_AUDIO_OUTPUT,
                 MANAGE_DEVICE_POLICY_AUTOFILL,
-                MANAGE_DEVICE_POLICY_BLUETOOTH,
                 MANAGE_DEVICE_POLICY_CALLS,
-                MANAGE_DEVICE_POLICY_CAMERA,
                 MANAGE_DEVICE_POLICY_DEBUGGING_FEATURES,
                 MANAGE_DEVICE_POLICY_DISPLAY,
                 MANAGE_DEVICE_POLICY_FACTORY_RESET,
                 MANAGE_DEVICE_POLICY_INSTALL_UNKNOWN_SOURCES,
+                MANAGE_DEVICE_POLICY_KEYGUARD,
                 MANAGE_DEVICE_POLICY_LOCALE,
                 MANAGE_DEVICE_POLICY_LOCATION,
+                MANAGE_DEVICE_POLICY_LOCK,
                 MANAGE_DEVICE_POLICY_LOCK_CREDENTIALS,
-                MANAGE_DEVICE_POLICY_MICROPHONE,
-                MANAGE_DEVICE_POLICY_MOBILE_NETWORK,
                 MANAGE_DEVICE_POLICY_NEARBY_COMMUNICATION,
-                MANAGE_DEVICE_POLICY_PHYSICAL_MEDIA,
+                MANAGE_DEVICE_POLICY_ORGANIZATION_IDENTITY,
+                MANAGE_DEVICE_POLICY_PACKAGE_STATE,
                 MANAGE_DEVICE_POLICY_PRINTING,
                 MANAGE_DEVICE_POLICY_PROFILES,
                 MANAGE_DEVICE_POLICY_PROFILE_INTERACTION,
-                MANAGE_DEVICE_POLICY_RESTRICT_PRIVATE_DNS,
-                MANAGE_DEVICE_POLICY_SAFE_BOOT,
+                MANAGE_DEVICE_POLICY_RESET_PASSWORD,
+                MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
+                MANAGE_DEVICE_POLICY_SCREEN_CAPTURE,
                 MANAGE_DEVICE_POLICY_SCREEN_CONTENT,
-                MANAGE_DEVICE_POLICY_SMS,
+                MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE,
                 MANAGE_DEVICE_POLICY_SYSTEM_DIALOGS,
                 MANAGE_DEVICE_POLICY_TIME,
                 MANAGE_DEVICE_POLICY_VPN,
-                MANAGE_DEVICE_POLICY_USB_FILE_TRANSFER,
-                MANAGE_DEVICE_POLICY_COMMON_CRITERIA_MODE,
-                MANAGE_DEVICE_POLICY_DEFAULT_SMS,
-                MANAGE_DEVICE_POLICY_PACKAGE_STATE,
-                MANAGE_DEVICE_POLICY_RESET_PASSWORD,
-                MANAGE_DEVICE_POLICY_APP_RESTRICTIONS,
-                MANAGE_DEVICE_POLICY_USB_FILE_TRANSFER,
-                MANAGE_DEVICE_POLICY_KEYGUARD,
-                MANAGE_DEVICE_POLICY_WIFI,
-                MANAGE_DEVICE_POLICY_WIPE_DATA,
-                MANAGE_DEVICE_POLICY_SCREEN_CAPTURE,
-                MANAGE_DEVICE_POLICY_SYSTEM_UPDATES,
-                MANAGE_DEVICE_POLICY_SECURITY_LOGGING,
-                MANAGE_DEVICE_POLICY_USB_DATA_SIGNALLING,
-                MANAGE_DEVICE_POLICY_MTE,
-                MANAGE_DEVICE_POLICY_PACKAGE_STATE,
-                MANAGE_DEVICE_POLICY_LOCK,
-                MANAGE_DEVICE_POLICY_FACTORY_RESET,
-                MANAGE_DEVICE_POLICY_KEYGUARD,
-                MANAGE_DEVICE_POLICY_CERTIFICATES);
-    private static final List<String> PROFILE_OWNER_ON_USER_0_PERMISSIONS  = List.of(
-            SET_TIME,
-            SET_TIME_ZONE,
-            MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
-            MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE,
-            MANAGE_DEVICE_POLICY_APPS_CONTROL,
-            MANAGE_DEVICE_POLICY_LOCK_TASK,
-            MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
-            MANAGE_DEVICE_POLICY_WIPE_DATA,
-            MANAGE_DEVICE_POLICY_SCREEN_CAPTURE,
-            MANAGE_DEVICE_POLICY_LOCK_CREDENTIALS,
-            MANAGE_DEVICE_POLICY_PACKAGE_STATE,
-            MANAGE_DEVICE_POLICY_LOCK,
-            MANAGE_DEVICE_POLICY_KEYGUARD,
-            MANAGE_DEVICE_POLICY_LOCK_TASK,
-            MANAGE_DEVICE_POLICY_AIRPLANE_MODE,
-            MANAGE_DEVICE_POLICY_BLUETOOTH,
-            MANAGE_DEVICE_POLICY_DEBUGGING_FEATURES,
-            MANAGE_DEVICE_POLICY_FACTORY_RESET,
-            MANAGE_DEVICE_POLICY_FUN,
-            MANAGE_DEVICE_POLICY_INSTALL_UNKNOWN_SOURCES,
-            MANAGE_DEVICE_POLICY_MOBILE_NETWORK,
-            MANAGE_DEVICE_POLICY_USERS,
-            MANAGE_DEVICE_POLICY_PHYSICAL_MEDIA,
-            MANAGE_DEVICE_POLICY_SAFE_BOOT,
-            MANAGE_DEVICE_POLICY_SMS,
-            MANAGE_DEVICE_POLICY_TIME,
-            MANAGE_DEVICE_POLICY_USB_FILE_TRANSFER,
-            MANAGE_DEVICE_POLICY_WINDOWS,
-            MANAGE_DEVICE_POLICY_LOCK_TASK,
-            MANAGE_DEVICE_POLICY_ACCOUNT_MANAGEMENT,
-            MANAGE_DEVICE_POLICY_CAMERA,
-            MANAGE_DEVICE_POLICY_PACKAGE_STATE,
-            MANAGE_DEVICE_POLICY_RESET_PASSWORD,
-            MANAGE_DEVICE_POLICY_STATUS_BAR,
-            MANAGE_DEVICE_POLICY_APP_RESTRICTIONS);
-    private static final List<String> PROFILE_OWNER_PERMISSIONS  = List.of(
-            MANAGE_DEVICE_POLICY_ACROSS_USERS_SECURITY_CRITICAL,
-            MANAGE_DEVICE_POLICY_ORGANIZATION_IDENTITY,
-            MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
-            MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE,
-            MANAGE_DEVICE_POLICY_APPS_CONTROL,
-            MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
-            MANAGE_DEVICE_POLICY_WIPE_DATA,
-            MANAGE_DEVICE_POLICY_SCREEN_CAPTURE,
-            MANAGE_DEVICE_POLICY_LOCK_CREDENTIALS,
-            MANAGE_DEVICE_POLICY_PACKAGE_STATE,
-            MANAGE_DEVICE_POLICY_LOCK,
-            MANAGE_DEVICE_POLICY_KEYGUARD,
-            MANAGE_DEVICE_POLICY_APPS_CONTROL,
-            MANAGE_DEVICE_POLICY_ACCOUNT_MANAGEMENT,
-            MANAGE_DEVICE_POLICY_AUDIO_OUTPUT,
-            MANAGE_DEVICE_POLICY_AUTOFILL,
-            MANAGE_DEVICE_POLICY_CALLS,
-            MANAGE_DEVICE_POLICY_DEBUGGING_FEATURES,
-            MANAGE_DEVICE_POLICY_DISPLAY,
-            MANAGE_DEVICE_POLICY_FACTORY_RESET,
-            MANAGE_DEVICE_POLICY_INSTALL_UNKNOWN_SOURCES,
-            MANAGE_DEVICE_POLICY_LOCALE,
-            MANAGE_DEVICE_POLICY_LOCATION,
-            MANAGE_DEVICE_POLICY_LOCK_CREDENTIALS,
-            MANAGE_DEVICE_POLICY_NEARBY_COMMUNICATION,
-            MANAGE_DEVICE_POLICY_PRINTING,
-            MANAGE_DEVICE_POLICY_PROFILES,
-            MANAGE_DEVICE_POLICY_PROFILE_INTERACTION,
-            MANAGE_DEVICE_POLICY_SCREEN_CONTENT,
-            MANAGE_DEVICE_POLICY_SYSTEM_DIALOGS,
-            MANAGE_DEVICE_POLICY_TIME,
-            MANAGE_DEVICE_POLICY_VPN,
-            MANAGE_DEVICE_POLICY_PACKAGE_STATE,
-            MANAGE_DEVICE_POLICY_PROFILE_INTERACTION,
-            MANAGE_DEVICE_POLICY_RESET_PASSWORD,
-            MANAGE_DEVICE_POLICY_APP_RESTRICTIONS
+                MANAGE_DEVICE_POLICY_WIPE_DATA
             );
 
+    /**
+    * All the additional permissions granted to an organisation owned profile owner.
+    */
+    private static final List<String>
+            ADDITIONAL_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE_PERMISSIONS =
+                List.of(
+                    MANAGE_DEVICE_POLICY_ACROSS_USERS,
+                    MANAGE_DEVICE_POLICY_AIRPLANE_MODE,
+                    MANAGE_DEVICE_POLICY_APPS_CONTROL,
+                    MANAGE_DEVICE_POLICY_BLUETOOTH,
+                    MANAGE_DEVICE_POLICY_CAMERA,
+                    MANAGE_DEVICE_POLICY_CERTIFICATES,
+                    MANAGE_DEVICE_POLICY_COMMON_CRITERIA_MODE,
+                    MANAGE_DEVICE_POLICY_DEFAULT_SMS,
+                    MANAGE_DEVICE_POLICY_LOCALE,
+                    MANAGE_DEVICE_POLICY_MICROPHONE,
+                    MANAGE_DEVICE_POLICY_MOBILE_NETWORK,
+                    MANAGE_DEVICE_POLICY_MTE,
+                    MANAGE_DEVICE_POLICY_NEARBY_COMMUNICATION,
+                    MANAGE_DEVICE_POLICY_PHYSICAL_MEDIA,
+                    MANAGE_DEVICE_POLICY_RESTRICT_PRIVATE_DNS,
+                    MANAGE_DEVICE_POLICY_SAFE_BOOT,
+                    MANAGE_DEVICE_POLICY_SECURITY_LOGGING,
+                    MANAGE_DEVICE_POLICY_SMS,
+                    MANAGE_DEVICE_POLICY_SYSTEM_UPDATES,
+                    MANAGE_DEVICE_POLICY_USB_DATA_SIGNALLING,
+                    MANAGE_DEVICE_POLICY_USB_FILE_TRANSFER,
+                    MANAGE_DEVICE_POLICY_WIFI,
+                    SET_TIME,
+                    SET_TIME_ZONE
+                );
+
+
+    private static final List<String> ADDITIONAL_PROFILE_OWNER_ON_USER_0_PERMISSIONS =
+            List.of(
+                    MANAGE_DEVICE_POLICY_AIRPLANE_MODE,
+                    MANAGE_DEVICE_POLICY_BLUETOOTH,
+                    MANAGE_DEVICE_POLICY_CAMERA,
+                    MANAGE_DEVICE_POLICY_DISPLAY,
+                    MANAGE_DEVICE_POLICY_FUN,
+                    MANAGE_DEVICE_POLICY_LOCK_TASK,
+                    MANAGE_DEVICE_POLICY_MOBILE_NETWORK,
+                    MANAGE_DEVICE_POLICY_PHYSICAL_MEDIA,
+                    MANAGE_DEVICE_POLICY_PRINTING,
+                    MANAGE_DEVICE_POLICY_PROFILES,
+                    MANAGE_DEVICE_POLICY_PROFILE_INTERACTION,
+                    MANAGE_DEVICE_POLICY_SAFE_BOOT,
+                    MANAGE_DEVICE_POLICY_SMS,
+                    MANAGE_DEVICE_POLICY_STATUS_BAR,
+                    MANAGE_DEVICE_POLICY_SYSTEM_DIALOGS,
+                    MANAGE_DEVICE_POLICY_USB_FILE_TRANSFER,
+                    MANAGE_DEVICE_POLICY_USERS,
+                    MANAGE_DEVICE_POLICY_WINDOWS,
+                    SET_TIME,
+                    SET_TIME_ZONE
+            );
+
+    /**
+     * Combination of {@link PROFILE_OWNER_PERMISSIONS} and
+     * {@link ADDITIONAL_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE_PERMISSIONS}.
+     */
+    private static final List<String> PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE_PERMISSIONS =
+            new ArrayList();
+
+    /**
+     * Combination of {@link PROFILE_OWNER_PERMISSIONS} and
+     * {@link ADDITIONAL_PROFILE_OWNER_ON_USER_0_PERMISSIONS}.
+     */
+    private static final List<String> PROFILE_OWNER_ON_USER_0_PERMISSIONS  =
+            new ArrayList();
+
+
     private static final HashMap<Integer, List<String>> DPC_PERMISSIONS = new HashMap<>();
     {
+        // Organisation owned profile owners have all the permission of a profile owner plus
+        // some extra permissions.
+        PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE_PERMISSIONS.addAll(PROFILE_OWNER_PERMISSIONS);
+        PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE_PERMISSIONS.addAll(
+                ADDITIONAL_PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE_PERMISSIONS);
+        // Profile owners on user 0 have all the permission of a profile owner plus
+        // some extra permissions.
+        PROFILE_OWNER_ON_USER_0_PERMISSIONS.addAll(PROFILE_OWNER_PERMISSIONS);
+        PROFILE_OWNER_ON_USER_0_PERMISSIONS.addAll(ADDITIONAL_PROFILE_OWNER_ON_USER_0_PERMISSIONS);
+
         DPC_PERMISSIONS.put(DEFAULT_DEVICE_OWNER, DEFAULT_DEVICE_OWNER_PERMISSIONS);
         DPC_PERMISSIONS.put(FINANCED_DEVICE_OWNER, FINANCED_DEVICE_OWNER_PERMISSIONS);
         DPC_PERMISSIONS.put(PROFILE_OWNER_OF_ORGANIZATION_OWNED_DEVICE,
@@ -22419,14 +22640,6 @@
         DPC_PERMISSIONS.put(PROFILE_OWNER_ON_USER_0, PROFILE_OWNER_ON_USER_0_PERMISSIONS);
         DPC_PERMISSIONS.put(PROFILE_OWNER, PROFILE_OWNER_PERMISSIONS);
     }
-
-    // Map of permission Active admin DEVICE_POLICY.
-    //TODO(b/254253251) Fill this map in as new permissions are added for policies.
-    private static final HashMap<String, Integer> ACTIVE_ADMIN_POLICIES = new HashMap<>();
-    {
-        //Any ActiveAdmin is able to call the support message APIs without certain policies.
-        ACTIVE_ADMIN_POLICIES.put(MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE, null);
-    }
     //Map of Permission to Delegate Scope.
     private static final HashMap<String, String> DELEGATE_SCOPES = new HashMap<>();
     {
@@ -22440,77 +22653,40 @@
     private static final HashMap<String, String> CROSS_USER_PERMISSIONS =
             new HashMap<>();
     {
-        // Time and Timezone is intrinsically global so there is no cross-user permission.
+        // The permissions are all intrinsically global and therefore have no cross-user permission.
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_FACTORY_RESET, null);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_MTE, null);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SECURITY_LOGGING, null);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_STATUS_BAR, null);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SYSTEM_UPDATES, null);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_USB_DATA_SIGNALLING, null);
         CROSS_USER_PERMISSIONS.put(SET_TIME, null);
         CROSS_USER_PERMISSIONS.put(SET_TIME_ZONE, null);
-        // system updates are intrinsically global so there is no cross-user permission
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SYSTEM_UPDATES, null);
-        // security logs are intrinsically global so there is no cross-user permission
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SECURITY_LOGGING, null);
-        // usb signalling is intrinsically global so there is no cross-user permission
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_USB_DATA_SIGNALLING, null);
-        // mte is intrinsically global so there is no cross-user permission
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_MTE, null);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_FACTORY_RESET, null);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_STATUS_BAR, null);
-        // Organisation identity policy will involve data of other organisations on the device and
-        // therefore the FULL cross-user permission is required.
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_ORGANIZATION_IDENTITY,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_WIFI,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_WIPE_DATA,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SCREEN_CAPTURE,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS);
+
+        // The permissions are all critical for securing data within the current user and
+        // therefore are protected with MANAGE_DEVICE_POLICY_ACROSS_USERS_SECURITY_CRITICAL for
+        // cross-user calls.
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_INSTALL_UNKNOWN_SOURCES,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_SECURITY_CRITICAL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_KEYGUARD,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_SECURITY_CRITICAL);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_LOCK_CREDENTIALS,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS_SECURITY_CRITICAL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_PACKAGE_STATE,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS);
-        CROSS_USER_PERMISSIONS.put(
-                MANAGE_DEVICE_POLICY_LOCK, MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(
-                MANAGE_DEVICE_POLICY_KEYGUARD, MANAGE_DEVICE_POLICY_ACROSS_USERS_SECURITY_CRITICAL);
-        // Granting runtime permissions can grant applications significant powers therefore the FULL
-        // cross-user permission is required.
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_APPS_CONTROL,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_LOCK_TASK,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+
+        // These permissions are required for securing device ownership without accessing user data
+        // and therefore are protected with MANAGE_DEVICE_POLICY_ACROSS_USERS for cross-user calls.
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_ACCOUNT_MANAGEMENT,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_AIRPLANE_MODE,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_AUDIO_OUTPUT,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_AUTOFILL,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_BLUETOOTH,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_CALLS,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_CAMERA,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_DEBUGGING_FEATURES,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_DISPLAY,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_FACTORY_RESET,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_FUN,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_INSTALL_UNKNOWN_SOURCES,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_SECURITY_CRITICAL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_LOCALE,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_LOCATION,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_LOCK_CREDENTIALS,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_DEFAULT_SMS,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_MICROPHONE,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_MOBILE_NETWORK,
@@ -22519,46 +22695,77 @@
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_PHYSICAL_MEDIA,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_PRINTING,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_PACKAGE_STATE,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_RESTRICT_PRIVATE_DNS,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_PROFILES,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_PROFILE_INTERACTION,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SAFE_BOOT,
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SCREEN_CAPTURE,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SCREEN_CONTENT,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SMS,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SYSTEM_DIALOGS,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SAFE_BOOT,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_TIME,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_USB_FILE_TRANSFER,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_WIFI,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_WIPE_DATA,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS);
+
+        // These permissions may grant access to user data and therefore must be protected with
+        // MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL for cross-user calls.
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_APPS_CONTROL,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_APP_RESTRICTIONS,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_AUDIO_OUTPUT,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_AUTOFILL,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_COMMON_CRITERIA_MODE,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_DEBUGGING_FEATURES,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_DISPLAY,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_FUN,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_LOCALE,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_LOCATION,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_LOCK,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_LOCK_TASK,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_ORGANIZATION_IDENTITY,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_PROFILES,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_PROFILE_INTERACTION,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_PRINTING,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_RESET_PASSWORD,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SCREEN_CONTENT,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
+        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_SYSTEM_DIALOGS,
+                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_USERS,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_VPN,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_WALLPAPER,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_WIFI,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS);
         CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_WINDOWS,
                 MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_APP_RESTRICTIONS,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_COMMON_CRITERIA_MODE,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_DEFAULT_SMS,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_PACKAGE_STATE,
-                 MANAGE_DEVICE_POLICY_ACROSS_USERS);
-        CROSS_USER_PERMISSIONS.put(MANAGE_DEVICE_POLICY_RESET_PASSWORD,
-                MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL);
     }
 
     /**
@@ -22582,6 +22789,26 @@
     }
 
     /**
+     * Checks if the calling process has been granted permission to apply a device policy on a
+     * specific user.
+     * The given permission will be checked along with its associated cross-user permission if it
+     * exists and the target user is different to the calling user.
+     * Returns an {@link EnforcingAdmin} for the caller.
+     *
+     * @param admin the component name of the admin.
+     * @param callerPackageName The package name  of the calling application.
+     * @param permission The name of the permission being checked.
+     * @param deviceAdminPolicy The userId of the user which the caller needs permission to act on.
+     * @throws SecurityException if the caller has not been granted the given permission,
+     * the associated cross-user permission if the caller's user is different to the target user.
+     */
+    private EnforcingAdmin enforcePermissionAndGetEnforcingAdmin(@Nullable ComponentName admin,
+            String permission, int deviceAdminPolicy, String callerPackageName, int targetUserId) {
+        enforcePermission(permission, deviceAdminPolicy, callerPackageName, targetUserId);
+        return getEnforcingAdminForCaller(admin, callerPackageName);
+    }
+
+    /**
      * Checks whether the calling process has been granted permission to query a device policy on
      * a specific user.
      * The given permission will be checked along with its associated cross-user permission if it
@@ -22603,6 +22830,9 @@
         POLICY_IDENTIFIER_TO_PERMISSION.put(AUTO_TIMEZONE_POLICY, SET_TIME_ZONE);
     }
 
+    private static final HashMap<String, Integer> POLICY_IDENTIFIER_TO_ACTIVE_ADMIN_POLICY =
+            new HashMap<>();
+
     /**
      * Checks if the calling process has been granted permission to apply a device policy on a
      * specific user.
@@ -22618,6 +22848,36 @@
     private void enforcePermission(String permission, String callerPackageName, int targetUserId)
             throws SecurityException {
         if (!hasPermission(permission, callerPackageName, targetUserId)) {
+            // TODO(b/276920002): Split the error messages so that the cross-user permission
+            // is only mentioned when it is needed.
+            throw new SecurityException("Caller does not have the required permissions for "
+                    + "this user. Permissions required: {"
+                    + permission
+                    + ", "
+                    + CROSS_USER_PERMISSIONS.get(permission)
+                    + "(if calling cross-user)"
+                    + "}");
+        }
+    }
+
+    /**
+     * Checks if the calling process has been granted permission to apply a device policy on a
+     * specific user.
+     * The given permission will be checked along with its associated cross-user permission if it
+     * exists and the target user is different to the calling user.
+     *
+     * @param callerPackageName The package name  of the calling application.
+     * @param permission The name of the permission being checked.
+     * @param targetUserId The userId of the user which the caller needs permission to act on.
+     * @throws SecurityException if the caller has not been granted the given permission,
+     * the associated cross-user permission if the caller's user is different to the target user.
+     */
+    private void enforcePermission(String permission, int adminPolicy,
+            String callerPackageName, int targetUserId)
+            throws SecurityException {
+        if (!hasPermissionOrAdminPolicy(permission, callerPackageName, adminPolicy, targetUserId)) {
+            // TODO(b/276920002): Split the error messages so that the cross-user permission
+            // is only mentioned when it is needed.
             throw new SecurityException("Caller does not have the required permissions for "
                     + "this user. Permissions required: {"
                     + permission
@@ -22659,15 +22919,26 @@
      */
     private boolean hasPermission(String permission, String callerPackageName, int targetUserId) {
         CallerIdentity caller = getCallerIdentity(callerPackageName);
-        boolean hasPermissionOnOwnUser = hasPermission(permission, callerPackageName);
+        boolean hasPermissionOnOwnUser = hasPermission(permission, caller.getPackageName());
         boolean hasPermissionOnTargetUser = true;
         if (hasPermissionOnOwnUser & caller.getUserId() != targetUserId) {
             hasPermissionOnTargetUser = hasPermission(CROSS_USER_PERMISSIONS.get(permission),
-                    callerPackageName);
+                    caller.getPackageName());
         }
+
         return hasPermissionOnOwnUser && hasPermissionOnTargetUser;
     }
 
+    private boolean hasPermissionOrAdminPolicy(String permission, String callerPackageName,
+            int adminPolicy, int targetUserId) {
+        CallerIdentity caller = getCallerIdentity(callerPackageName);
+        if (hasPermission(permission, caller.getPackageName(), targetUserId)) {
+            return true;
+        }
+        ActiveAdmin deviceAdmin = getActiveAdminForCaller(null, caller);
+        return deviceAdmin != null && deviceAdmin.info.usesPolicy(adminPolicy);
+    }
+
     /**
      * Return whether the calling process has been granted the given permission.
      *
@@ -22705,28 +22976,11 @@
         }
         // Check the permission for the role-holder
         if (isCallerDevicePolicyManagementRoleHolder(caller)) {
-            return anyDpcHasPermission(permission, mContext.getUserId());
+            return anyDpcHasPermission(permission, caller.getUserId());
         }
         if (DELEGATE_SCOPES.containsKey(permission)) {
             return isCallerDelegate(caller, DELEGATE_SCOPES.get(permission));
         }
-        // Check if the caller is an active admin that uses a certain policy.
-        if (ACTIVE_ADMIN_POLICIES.containsKey(permission)) {
-            try {
-                if (ACTIVE_ADMIN_POLICIES.get(permission) != null) {
-                    return getActiveAdminForCallerLocked(
-                            null, ACTIVE_ADMIN_POLICIES.get(permission), false) != null;
-                } else {
-                    // If the permission maps to no policy (null) this means that any active admin
-                    // has permission.
-                    return isCallerActiveAdminOrDelegate(caller, null);
-                }
-            } catch (SecurityException e) {
-                // A security exception means there is not an active admin with permission and
-                // therefore
-                return false;
-            }
-        }
         return false;
     }
 
@@ -22779,9 +23033,7 @@
         if (admin != null) {
             return EnforcingAdmin.createDeviceAdminEnforcingAdmin(who, userId, admin);
         }
-        if (admin == null) {
-            admin = getUserData(userId).createOrGetPermissionBasedAdmin(userId);
-        }
+        admin = getUserData(userId).createOrGetPermissionBasedAdmin(userId);
         return  EnforcingAdmin.createEnforcingAdmin(caller.getPackageName(), userId, admin);
     }
 
@@ -22797,6 +23049,13 @@
                 DEFAULT_VALUE_PERMISSION_BASED_ACCESS_FLAG);
     }
 
+    private boolean isPolicyEngineForFinanceFlagEnabled() {
+        return DeviceConfig.getBoolean(
+                NAMESPACE_DEVICE_POLICY_MANAGER,
+                ENABLE_DEVICE_POLICY_ENGINE_FOR_FINANCE_FLAG,
+                DEFAULT_ENABLE_DEVICE_POLICY_ENGINE_FOR_FINANCE_FLAG);
+    }
+
     private static boolean isKeepProfilesRunningFlagEnabled() {
         return DeviceConfig.getBoolean(
                 NAMESPACE_DEVICE_POLICY_MANAGER,
@@ -23135,36 +23394,9 @@
         });
     }
 
-    // TODO(b/266808047): handle DeviceAdmin migration when there is no DPCs on the device
     private boolean shouldMigrateToDevicePolicyEngine() {
-        return mInjector.binderWithCleanCallingIdentity(() -> {
-            if (!isDevicePolicyEngineFlagEnabled()) {
-                return false;
-            }
-            if (mOwners.isMigratedToPolicyEngine()) {
-                return false;
-            }
-            // We're only checking if existing DPCs are not targeting U, regardless of what
-            // DeviceAdmins are targeting, as they can access very limited APIs, and we'll ensure
-            // that these APIs maintain the current behaviour of strictest applies.
-            boolean hasDPCs = false;
-            for (UserInfo userInfo : mUserManager.getUsers()) {
-                List<ComponentName> activeAdmins = getActiveAdmins(userInfo.id);
-                if (activeAdmins == null) {
-                    continue;
-                }
-                for (ComponentName admin : activeAdmins) {
-                    if ((isProfileOwner(admin, userInfo.id) || isDeviceOwner(admin, userInfo.id))) {
-                        if (!mInjector.isChangeEnabled(ENABLE_COEXISTENCE_CHANGE,
-                                admin.getPackageName(), userInfo.id)) {
-                            return false;
-                        }
-                        hasDPCs = true;
-                    }
-                }
-            }
-            return hasDPCs;
-        });
+        return mInjector.binderWithCleanCallingIdentity(() ->
+                isPermissionCheckFlagEnabled() && !mOwners.isMigratedToPolicyEngine());
     }
 
     /**
@@ -23350,15 +23582,13 @@
     // We need to add a mapping of policyId to permission in POLICY_IDENTIFIER_TO_PERMISSION
     // for each migrated permission.
     private List<ActiveAdmin> getNonDPCActiveAdminsForPolicyLocked(String policyIdentifier) {
-        String permission = POLICY_IDENTIFIER_TO_PERMISSION.get(policyIdentifier);
-        if (permission == null) {
-            Slogf.e(LOG_TAG, "Can't find a permission for %s in POLICY_IDENTIFIER_TO_PERMISSION",
+        Integer activeAdminPolicy = POLICY_IDENTIFIER_TO_ACTIVE_ADMIN_POLICY.get(policyIdentifier);
+        if (activeAdminPolicy == null) {
+            Slogf.e(LOG_TAG,
+                    "Can't find a active admin policy for %s in POLICY_IDENTIFIER_TO_PERMISSION",
                     policyIdentifier);
             return new ArrayList<>();
         }
-        if (!ACTIVE_ADMIN_POLICIES.containsKey(permission)) {
-            return new ArrayList<>();
-        }
 
         List<ActiveAdmin> admins = new ArrayList<>();
         for (UserInfo userInfo : mUserManager.getUsers()) {
@@ -23369,7 +23599,7 @@
                 }
                 DevicePolicyData policy = getUserDataUnchecked(userInfo.id);
                 if (isActiveAdminWithPolicyForUserLocked(
-                        policy.mAdminMap.get(admin), ACTIVE_ADMIN_POLICIES.get(permission),
+                        policy.mAdminMap.get(admin), activeAdminPolicy,
                         userInfo.id)) {
                     admins.add(policy.mAdminMap.get(admin));
                 }
@@ -23378,40 +23608,6 @@
         return admins;
     }
 
-    private boolean useDevicePolicyEngine(CallerIdentity caller, @Nullable String delegateScope) {
-        return isDevicePolicyEngineEnabled();
-    }
-
-    private boolean isDevicePolicyEngineEnabled() {
-        return isDevicePolicyEngineFlagEnabled() && isPermissionCheckFlagEnabled();
-    }
-
-    private boolean isDevicePolicyEngineFlagEnabled() {
-        return DeviceConfig.getBoolean(
-                NAMESPACE_DEVICE_POLICY_MANAGER,
-                ENABLE_DEVICE_POLICY_ENGINE_FLAG,
-                DEFAULT_ENABLE_DEVICE_POLICY_ENGINE_FLAG);
-    }
-
-    private boolean hasDPCsNotSupportingCoexistence() {
-        return mInjector.binderWithCleanCallingIdentity(() -> {
-            for (UserInfo userInfo : mUserManager.getUsers()) {
-                List<ComponentName> activeAdmins = getActiveAdmins(userInfo.id);
-                if (activeAdmins == null) {
-                    continue;
-                }
-                for (ComponentName admin : activeAdmins) {
-                    if ((isProfileOwner(admin, userInfo.id) || isDeviceOwner(admin, userInfo.id))
-                            && !mInjector.isChangeEnabled(ENABLE_COEXISTENCE_CHANGE,
-                            admin.getPackageName(), userInfo.id)) {
-                        return true;
-                    }
-                }
-            }
-            return false;
-        });
-    }
-
     // TODO: this can actually accept an EnforcingAdmin that gets created in the permission
     //  check method.
     private boolean isCallerActiveAdminOrDelegate(
@@ -23449,25 +23645,6 @@
         }
     }
 
-    // TODO(b/266808047): This will return false for DeviceAdmins not targetting U, which is
-    //  inconsistent with the migration logic that allows migration with old DeviceAdmins.
-    private boolean canAddActiveAdminIfPolicyEngineEnabled(String packageName, int userId) {
-        if (!isDevicePolicyEngineFlagEnabled()) {
-            return true;
-        }
-        if (hasDPCsNotSupportingCoexistence()) {
-            return true;
-        }
-        if (mInjector.isChangeEnabled(ENABLE_COEXISTENCE_CHANGE, packageName, userId)) {
-            // This will always return true unless we turn off coexistence, in which case it will
-            // return true if no current admins exist, or more than one admin exist
-            return mDevicePolicyEngine.canAdminAddPolicies(packageName, userId);
-        }
-        // Is it ok to just check that no active policies exist currently, or should we return false
-        // if the policy engine was ever used?
-        return !mDevicePolicyEngine.hasActivePolicies();
-    }
-
     @Override
     public boolean isDeviceFinanced(String callerPackageName) {
         CallerIdentity caller = getCallerIdentity(callerPackageName);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java
index a08c2054..a15aa53 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java
@@ -226,8 +226,7 @@
      * Passing in {@code null} for {@code packageName} will return
      * {@link #GENERIC_APPLICATION_RESTRICTIONS}.
      */
-    static PolicyDefinition<Bundle> APPLICATION_RESTRICTIONS(
-            String packageName) {
+    static PolicyDefinition<Bundle> APPLICATION_RESTRICTIONS(String packageName) {
         if (packageName == null) {
             return GENERIC_APPLICATION_RESTRICTIONS;
         }
@@ -246,6 +245,42 @@
             (Long value, Context context, Integer userId, PolicyKey policyKey) -> true,
             new LongPolicySerializer());
 
+    static PolicyDefinition<Integer> KEYGUARD_DISABLED_FEATURES = new PolicyDefinition<>(
+            new NoArgsPolicyKey(DevicePolicyIdentifiers.KEYGUARD_DISABLED_FEATURES_POLICY),
+            new FlagUnion(),
+            POLICY_FLAG_LOCAL_ONLY_POLICY,
+            // Nothing is enforced for keyguard features, we just need to store it
+            (Integer value, Context context, Integer userId, PolicyKey policyKey) -> true,
+            new IntegerPolicySerializer());
+
+    // This is saved in the static map sPolicyDefinitions so that we're able to reconstruct the
+    // actual policy with the correct arguments (i.e. packageName) when reading the policies from
+    // xml.
+    static PolicyDefinition<Boolean> GENERIC_APPLICATION_HIDDEN =
+            new PolicyDefinition<>(
+                    new PackagePolicyKey(
+                            DevicePolicyIdentifiers.APPLICATION_HIDDEN_POLICY),
+                    // TODO(b/276713779): Don't need to take in a resolution mechanism since its
+                    //  never used, but might need some refactoring to not always assume a non-null
+                    //  mechanism.
+                    TRUE_MORE_RESTRICTIVE,
+                    POLICY_FLAG_LOCAL_ONLY_POLICY,
+                    PolicyEnforcerCallbacks::setApplicationHidden,
+                    new BooleanPolicySerializer());
+
+    /**
+     * Passing in {@code null} for {@code packageName} will return
+     * {@link #GENERIC_APPLICATION_HIDDEN}.
+     */
+    static PolicyDefinition<Boolean> APPLICATION_HIDDEN(String packageName) {
+        if (packageName == null) {
+            return GENERIC_APPLICATION_HIDDEN;
+        }
+        return GENERIC_APPLICATION_HIDDEN.createPolicyDefinition(
+                new PackagePolicyKey(
+                        DevicePolicyIdentifiers.APPLICATION_HIDDEN_POLICY, packageName));
+    }
+
     private static final Map<String, PolicyDefinition<?>> POLICY_DEFINITIONS = new HashMap<>();
     private static Map<String, Integer> USER_RESTRICTION_FLAGS = new HashMap<>();
 
@@ -264,6 +299,10 @@
                 GENERIC_APPLICATION_RESTRICTIONS);
         POLICY_DEFINITIONS.put(DevicePolicyIdentifiers.RESET_PASSWORD_TOKEN_POLICY,
                 RESET_PASSWORD_TOKEN);
+        POLICY_DEFINITIONS.put(DevicePolicyIdentifiers.KEYGUARD_DISABLED_FEATURES_POLICY,
+                KEYGUARD_DISABLED_FEATURES);
+        POLICY_DEFINITIONS.put(DevicePolicyIdentifiers.APPLICATION_HIDDEN_POLICY,
+                GENERIC_APPLICATION_HIDDEN);
 
         // User Restriction Policies
         USER_RESTRICTION_FLAGS.put(UserManager.DISALLOW_MODIFY_ACCOUNTS, /* flags= */ 0);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java
index fd91249..d65d366 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java
@@ -73,7 +73,7 @@
         return Boolean.TRUE.equals(Binder.withCleanCallingIdentity(() -> {
             if (!(policyKey instanceof PackagePermissionPolicyKey)) {
                 throw new IllegalArgumentException("policyKey is not of type "
-                        + "PermissionGrantStatePolicyKey");
+                        + "PermissionGrantStatePolicyKey, passed in policyKey is: " + policyKey);
             }
             PackagePermissionPolicyKey parsedKey = (PackagePermissionPolicyKey) policyKey;
             Objects.requireNonNull(parsedKey.getPermissionName());
@@ -165,7 +165,7 @@
             try {
                 if (!(policyKey instanceof IntentFilterPolicyKey)) {
                     throw new IllegalArgumentException("policyKey is not of type "
-                            + "IntentFilterPolicyKey");
+                            + "IntentFilterPolicyKey, passed in policyKey is: " + policyKey);
                 }
                 IntentFilterPolicyKey parsedKey =
                         (IntentFilterPolicyKey) policyKey;
@@ -193,7 +193,7 @@
         return Boolean.TRUE.equals(Binder.withCleanCallingIdentity(() -> {
             if (!(policyKey instanceof PackagePolicyKey)) {
                 throw new IllegalArgumentException("policyKey is not of type "
-                        + "PackagePolicyKey");
+                        + "PackagePolicyKey, passed in policyKey is: " + policyKey);
             }
             PackagePolicyKey parsedKey = (PackagePolicyKey) policyKey;
             String packageName = Objects.requireNonNull(parsedKey.getPackageName());
@@ -211,7 +211,7 @@
         return Boolean.TRUE.equals(Binder.withCleanCallingIdentity(() -> {
             if (!(policyKey instanceof UserRestrictionPolicyKey)) {
                 throw new IllegalArgumentException("policyKey is not of type "
-                        + "UserRestrictionPolicyKey");
+                        + "UserRestrictionPolicyKey, passed in policyKey is: " + policyKey);
             }
             UserRestrictionPolicyKey parsedKey =
                     (UserRestrictionPolicyKey) policyKey;
@@ -221,4 +221,20 @@
             return true;
         }));
     }
+
+    static boolean setApplicationHidden(
+            @Nullable Boolean hide, @NonNull Context context, int userId,
+            @NonNull PolicyKey policyKey) {
+        return Boolean.TRUE.equals(Binder.withCleanCallingIdentity(() -> {
+            if (!(policyKey instanceof PackagePolicyKey)) {
+                throw new IllegalArgumentException("policyKey is not of type "
+                        + "PackagePolicyKey, passed in policyKey is: " + policyKey);
+            }
+            PackagePolicyKey parsedKey = (PackagePolicyKey) policyKey;
+            String packageName = Objects.requireNonNull(parsedKey.getPackageName());
+            IPackageManager packageManager = AppGlobals.getPackageManager();
+            return packageManager.setApplicationHiddenSettingAsUser(
+                    packageName, hide != null && hide, userId);
+        }));
+    }
 }
diff --git a/services/people/java/com/android/server/people/data/DataManager.java b/services/people/java/com/android/server/people/data/DataManager.java
index 54d2c19..db84b6c 100644
--- a/services/people/java/com/android/server/people/data/DataManager.java
+++ b/services/people/java/com/android/server/people/data/DataManager.java
@@ -1339,7 +1339,7 @@
     /** Adds {@code listener} to be notified on conversation changes. */
     public void addConversationsListener(
             @NonNull PeopleService.ConversationsListener listener) {
-        synchronized (mConversationsListeners) {
+        synchronized (mLock) {
             mConversationsListeners.add(Objects.requireNonNull(listener));
         }
     }
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/SwitchKeyboardLayoutTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/SwitchKeyboardLayoutTest.java
deleted file mode 100644
index 111cabd..0000000
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/SwitchKeyboardLayoutTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.inputmethod;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.dx.mockito.inline.extended.ExtendedMockito;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class SwitchKeyboardLayoutTest extends InputMethodManagerServiceTestBase {
-    @Test
-    public void testSwitchToNextKeyboardLayout() {
-        ExtendedMockito.spyOn(mInputMethodManagerService.mSwitchingController);
-        InputMethodManagerInternal.get().switchKeyboardLayout(1);
-        verify(mInputMethodManagerService.mSwitchingController)
-                .getNextInputMethodLocked(eq(true) /* onlyCurrentIme */, any(), any());
-    }
-}
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SdCardEjectionTests.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SdCardEjectionTests.kt
index d813962..a849b66 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SdCardEjectionTests.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SdCardEjectionTests.kt
@@ -22,6 +22,7 @@
 import com.google.common.truth.Truth.assertThat
 import org.junit.After
 import org.junit.Before
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.rules.TemporaryFolder
@@ -41,6 +42,7 @@
 @RunWith(DeviceJUnit4Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(
         DeviceJUnit4ClassRunnerWithParameters.RunnerFactory::class)
+@Ignore("b/275403538")
 class SdCardEjectionTests : BaseHostJUnit4Test() {
 
     companion object {
diff --git a/services/tests/PackageManagerServiceTests/server/AndroidManifest.xml b/services/tests/PackageManagerServiceTests/server/AndroidManifest.xml
index ddc8dfd..1ed3c7b 100644
--- a/services/tests/PackageManagerServiceTests/server/AndroidManifest.xml
+++ b/services/tests/PackageManagerServiceTests/server/AndroidManifest.xml
@@ -75,7 +75,8 @@
     <uses-permission android:name="android.permission.CONTROL_DISPLAY_BRIGHTNESS"/>
     <uses-permission android:name="android.permission.CONFIGURE_DISPLAY_BRIGHTNESS"/>
     <uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/>
-    <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG"/>
+    <uses-permission android:name="android.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG"/>
+    <uses-permission android:name="android.permission.READ_WRITE_SYNC_DISABLED_MODE_CONFIG"/>
     <uses-permission android:name="android.permission.HARDWARE_TEST"/>
     <uses-permission android:name="android.permission.BLUETOOTH"/>
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
diff --git a/services/tests/mockingservicestests/AndroidManifest.xml b/services/tests/mockingservicestests/AndroidManifest.xml
index ea0481e..aa3930a 100644
--- a/services/tests/mockingservicestests/AndroidManifest.xml
+++ b/services/tests/mockingservicestests/AndroidManifest.xml
@@ -27,7 +27,8 @@
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
     <uses-permission android:name="android.permission.MANAGE_APPOPS"/>
     <uses-permission android:name="android.permission.MONITOR_DEVICE_CONFIG_ACCESS"/>
-    <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG"/>
+    <uses-permission android:name="android.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG"/>
+    <uses-permission android:name="android.permission.READ_WRITE_SYNC_DISABLED_MODE_CONFIG"/>
     <uses-permission android:name="android.permission.WAKE_LOCK"/>
     <uses-permission
         android:name="android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD"/>
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
index 3042ede..bad04dc 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
@@ -60,6 +60,8 @@
 import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION;
 import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK;
 import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_NONE;
+import static android.os.PowerExemptionManager.REASON_CARRIER_PRIVILEGED_APP;
+import static android.os.PowerExemptionManager.REASON_DENIED;
 
 import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
 
@@ -90,6 +92,7 @@
 import static org.mockito.Mockito.anyString;
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
@@ -132,8 +135,10 @@
 import android.provider.DeviceConfig;
 import android.service.notification.StatusBarNotification;
 import android.telephony.TelephonyManager;
+import android.telephony.TelephonyManager.CarrierPrivilegesCallback;
 import android.util.Log;
 import android.util.Pair;
+import android.util.SparseArray;
 
 import androidx.test.runner.AndroidJUnit4;
 
@@ -176,9 +181,12 @@
 import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.function.BiConsumer;
@@ -233,8 +241,42 @@
 
     private static final int BATTERY_FULL_CHARGE_MAH = 5_000;
 
+    private static final String[] MOCK_PRIVILEGED_PACKAGES_0 = new String[] {
+        TEST_PACKAGE_BASE + 0,
+        TEST_PACKAGE_BASE + 1,
+    };
+    private static final String[] MOCK_PRIVILEGED_PACKAGES_1 = new String[] {
+        TEST_PACKAGE_BASE + 2,
+        TEST_PACKAGE_BASE + 3,
+    };
+    private static final String[] MOCK_PRIVILEGED_PACKAGES_2 = new String[] {
+        TEST_PACKAGE_BASE + 4,
+        TEST_PACKAGE_BASE + 5,
+    };
+    private static final int[] MOCK_PRIVILEGED_UIDS_0 = new int[] {
+        UserHandle.getUid(TEST_USER0, TEST_PACKAGE_APPID_BASE + 0),
+        UserHandle.getUid(TEST_USER0, TEST_PACKAGE_APPID_BASE + 1),
+    };
+    private static final int[] MOCK_PRIVILEGED_UIDS_1 = new int[] {
+        UserHandle.getUid(TEST_USER0, TEST_PACKAGE_APPID_BASE + 2),
+        UserHandle.getUid(TEST_USER0, TEST_PACKAGE_APPID_BASE + 3),
+    };
+    private static final int[] MOCK_PRIVILEGED_UIDS_2 = new int[] {
+        UserHandle.getUid(TEST_USER0, TEST_PACKAGE_APPID_BASE + 4),
+        UserHandle.getUid(TEST_USER0, TEST_PACKAGE_APPID_BASE + 5),
+    };
+    private static final String[][] MOCK_PRIVILEGED_PACKAGES = new String[][] {
+        MOCK_PRIVILEGED_PACKAGES_0,
+        MOCK_PRIVILEGED_PACKAGES_1,
+    };
+    private static final int[][] MOCK_PRIVILEGED_UIDS = new int[][] {
+        MOCK_PRIVILEGED_UIDS_0,
+        MOCK_PRIVILEGED_UIDS_1,
+    };
+
     @Mock private ActivityManagerInternal mActivityManagerInternal;
     @Mock private ActivityManagerService mActivityManagerService;
+    @Mock private ActivityManagerConstants mActivityManagerConstants;
     @Mock private AppOpsManager mAppOpsManager;
     @Mock private AppStandbyInternal mAppStandbyInternal;
     @Mock private AppHibernationManagerInternal mAppHibernationInternal;
@@ -255,6 +297,8 @@
     @Mock private TelephonyManager mTelephonyManager;
     @Mock private IAppOpsService mIAppOpsService;
 
+    private PhoneCarrierPrivileges mPhoneCarrierPrivileges;
+
     private long mCurrentTimeMillis;
 
     @Captor private ArgumentCaptor<AppStateTracker.BackgroundRestrictedAppListener> mFasListenerCap;
@@ -298,6 +342,14 @@
         mBgRestrictionController = spy(new AppRestrictionController(mInjector,
                     mActivityManagerService));
 
+        mActivityManagerService.mConstants = mActivityManagerConstants;
+        mPhoneCarrierPrivileges = new PhoneCarrierPrivileges(
+                mInjector.getTelephonyManager(), MOCK_PRIVILEGED_PACKAGES.length);
+        for (int i = 0; i < MOCK_PRIVILEGED_PACKAGES.length; i++) {
+            mPhoneCarrierPrivileges.addNewPrivilegePackages(i,
+                    MOCK_PRIVILEGED_PACKAGES[i], MOCK_PRIVILEGED_UIDS[i]);
+        }
+
         doReturn(PROCESS_STATE_FOREGROUND_SERVICE).when(mActivityManagerInternal)
                 .getUidProcessState(anyInt());
         doReturn(TEST_USERS).when(mUserManagerInternal).getUserIds();
@@ -2984,6 +3036,78 @@
         verifyLoadedSettings(settings);
     }
 
+    @Test
+    public void testCarrierPrivilegedAppListener() throws Exception {
+        final long shortMs = 1_000L;
+        for (int i = 0; i < MOCK_PRIVILEGED_PACKAGES.length; i++) {
+            verifyPotentialSystemExemptionReason(REASON_CARRIER_PRIVILEGED_APP,
+                    MOCK_PRIVILEGED_PACKAGES[i],
+                    MOCK_PRIVILEGED_UIDS[i]);
+        }
+        verifyPotentialSystemExemptionReason(REASON_DENIED,
+                MOCK_PRIVILEGED_PACKAGES_2,
+                MOCK_PRIVILEGED_UIDS_2);
+
+        mPhoneCarrierPrivileges.addNewPrivilegePackages(0,
+                MOCK_PRIVILEGED_PACKAGES_2,
+                MOCK_PRIVILEGED_UIDS_2);
+        Thread.sleep(shortMs);
+
+        verifyPotentialSystemExemptionReason(REASON_CARRIER_PRIVILEGED_APP,
+                MOCK_PRIVILEGED_PACKAGES_2,
+                MOCK_PRIVILEGED_UIDS_2);
+
+        verifyPotentialSystemExemptionReason(REASON_DENIED,
+                MOCK_PRIVILEGED_PACKAGES_0,
+                MOCK_PRIVILEGED_UIDS_0);
+
+        verifyPotentialSystemExemptionReason(REASON_CARRIER_PRIVILEGED_APP,
+                MOCK_PRIVILEGED_PACKAGES_1,
+                MOCK_PRIVILEGED_UIDS_1);
+
+        mPhoneCarrierPrivileges.addNewPrivilegePackages(1,
+                new String[0], new int[0]);
+        Thread.sleep(shortMs);
+
+        verifyPotentialSystemExemptionReason(REASON_CARRIER_PRIVILEGED_APP,
+                MOCK_PRIVILEGED_PACKAGES_2,
+                MOCK_PRIVILEGED_UIDS_2);
+
+        verifyPotentialSystemExemptionReason(REASON_DENIED,
+                MOCK_PRIVILEGED_PACKAGES_0,
+                MOCK_PRIVILEGED_UIDS_0);
+
+        verifyPotentialSystemExemptionReason(REASON_DENIED,
+                MOCK_PRIVILEGED_PACKAGES_1,
+                MOCK_PRIVILEGED_UIDS_1);
+
+        mPhoneCarrierPrivileges.addNewPrivilegePackages(0,
+                MOCK_PRIVILEGED_PACKAGES_0,
+                MOCK_PRIVILEGED_UIDS_0);
+        Thread.sleep(shortMs);
+
+        verifyPotentialSystemExemptionReason(REASON_DENIED,
+                MOCK_PRIVILEGED_PACKAGES_2,
+                MOCK_PRIVILEGED_UIDS_2);
+
+        verifyPotentialSystemExemptionReason(REASON_CARRIER_PRIVILEGED_APP,
+                MOCK_PRIVILEGED_PACKAGES_0,
+                MOCK_PRIVILEGED_UIDS_0);
+
+        verifyPotentialSystemExemptionReason(REASON_DENIED,
+                MOCK_PRIVILEGED_PACKAGES_1,
+                MOCK_PRIVILEGED_UIDS_1);
+    }
+
+    private void verifyPotentialSystemExemptionReason(int expectedReason,
+            String[] packages, int[] uids) throws Exception {
+        for (int i = 0; i < packages.length; i++) {
+            assertEquals(expectedReason,
+                    mBgRestrictionController.getPotentialSystemExemptionReason(
+                            uids[i], packages[i]));
+        }
+    }
+
     private void verifyLoadedSettings(RestrictionSettings settings) throws Exception {
         // Make a new copy and reset it.
         RestrictionSettings test = (RestrictionSettings) settings.clone();
@@ -3019,6 +3143,47 @@
         return result;
     }
 
+    private class PhoneCarrierPrivileges {
+        private final SparseArray<Pair<String[], int[]>> mPackages = new SparseArray<>();
+        private final SparseArray<Pair<Executor, CarrierPrivilegesCallback>> mListeners =
+                new SparseArray<>();
+
+        PhoneCarrierPrivileges(TelephonyManager telephonyManager, int phoneIds) {
+            doReturn(phoneIds).when(telephonyManager).getActiveModemCount();
+            doAnswer(inv -> {
+                registerCarrierPrivilegesCallback(
+                        inv.getArgument(0),
+                        inv.getArgument(1),
+                        inv.getArgument(2));
+                return null;
+            }).when(telephonyManager).registerCarrierPrivilegesCallback(
+                    anyInt(), anyObject(), anyObject());
+        }
+
+        public void registerCarrierPrivilegesCallback(int phoneId, Executor executor,
+                CarrierPrivilegesCallback callback) {
+            mListeners.put(phoneId, Pair.create(executor, callback));
+            final Pair<String[], int[]> pkgs = mPackages.get(phoneId);
+            final Set<String> pkgNames = pkgs != null
+                    ? Arrays.stream(pkgs.first).collect(Collectors.toUnmodifiableSet())
+                    : Collections.emptySet();
+            final Set<Integer> uids = pkgs != null
+                    ? Arrays.stream(pkgs.second).boxed().collect(Collectors.toUnmodifiableSet())
+                    : Collections.emptySet();
+            executor.execute(() -> callback.onCarrierPrivilegesChanged(pkgNames, uids));
+        }
+
+        public void addNewPrivilegePackages(int phoneId, String[] pkgNames, int[] uids) {
+            mPackages.put(phoneId, Pair.create(pkgNames, uids));
+            final Pair<Executor, CarrierPrivilegesCallback> callback = mListeners.get(phoneId);
+            if (callback != null) {
+                callback.first.execute(() -> callback.second.onCarrierPrivilegesChanged(
+                        Arrays.stream(pkgNames).collect(Collectors.toUnmodifiableSet()),
+                        Arrays.stream(uids).boxed().collect(Collectors.toUnmodifiableSet())));
+            }
+        }
+    }
+
     private class TestBgRestrictionInjector extends AppRestrictionController.Injector {
         private Context mContext;
 
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java
index 36d191b..318067e 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java
@@ -20,6 +20,7 @@
 import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED;
 import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD;
 import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED__RECEIVER_TYPE__MANIFEST;
+import static com.android.server.am.ActivityManagerDebugConfig.LOG_WRITER_INFO;
 import static com.android.server.am.BroadcastProcessQueue.REASON_CONTAINS_ALARM;
 import static com.android.server.am.BroadcastProcessQueue.REASON_CONTAINS_FOREGROUND;
 import static com.android.server.am.BroadcastProcessQueue.REASON_CONTAINS_INTERACTIVE;
@@ -90,8 +91,8 @@
 import org.junit.Test;
 import org.mockito.Mock;
 
-import java.io.ByteArrayOutputStream;
 import java.io.PrintWriter;
+import java.io.Writer;
 import java.lang.reflect.Array;
 import java.util.ArrayList;
 import java.util.List;
@@ -371,9 +372,9 @@
                 List.of(makeMockRegisteredReceiver()), false);
         queue.enqueueOrReplaceBroadcast(airplaneRecord, 0, false);
 
-        queue.setProcessCached(false);
+        queue.setProcessAndUidCached(null, false);
         final long notCachedRunnableAt = queue.getRunnableAt();
-        queue.setProcessCached(true);
+        queue.setProcessAndUidCached(null, true);
         final long cachedRunnableAt = queue.getRunnableAt();
         assertThat(cachedRunnableAt).isGreaterThan(notCachedRunnableAt);
         assertFalse(queue.isRunnable());
@@ -398,9 +399,9 @@
                 List.of(makeMockRegisteredReceiver()), false);
         queue.enqueueOrReplaceBroadcast(airplaneRecord, 0, false);
 
-        queue.setProcessCached(false);
+        queue.setProcessAndUidCached(null, false);
         final long notCachedRunnableAt = queue.getRunnableAt();
-        queue.setProcessCached(true);
+        queue.setProcessAndUidCached(null, true);
         final long cachedRunnableAt = queue.getRunnableAt();
         assertThat(cachedRunnableAt).isGreaterThan(notCachedRunnableAt);
         assertTrue(queue.isRunnable());
@@ -430,13 +431,13 @@
         // verify that:
         // (a) the queue is immediately runnable by existence of a fg-priority broadcast
         // (b) the next one up is the fg-priority broadcast despite its later enqueue time
-        queue.setProcessCached(false);
+        queue.setProcessAndUidCached(null, false);
         assertTrue(queue.isRunnable());
         assertThat(queue.getRunnableAt()).isAtMost(airplaneRecord.enqueueClockTime);
         assertEquals(ProcessList.SCHED_GROUP_DEFAULT, queue.getPreferredSchedulingGroupLocked());
         assertEquals(queue.peekNextBroadcastRecord(), airplaneRecord);
 
-        queue.setProcessCached(true);
+        queue.setProcessAndUidCached(null, true);
         assertTrue(queue.isRunnable());
         assertThat(queue.getRunnableAt()).isAtMost(airplaneRecord.enqueueClockTime);
         assertEquals(ProcessList.SCHED_GROUP_DEFAULT, queue.getPreferredSchedulingGroupLocked());
@@ -499,7 +500,7 @@
     private void doRunnableAt_Cached(BroadcastRecord testRecord, int testRunnableAtReason) {
         final BroadcastProcessQueue queue = new BroadcastProcessQueue(mConstants,
                 PACKAGE_GREEN, getUidForPackage(PACKAGE_GREEN));
-        queue.setProcessCached(true);
+        queue.setProcessAndUidCached(null, true);
 
         final BroadcastRecord lazyRecord = makeBroadcastRecord(
                 new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED),
@@ -595,7 +596,7 @@
         // about the actual output, just that we don't crash
         queue.getActive().setDeliveryState(0, BroadcastRecord.DELIVERY_SCHEDULED, "Test-driven");
         queue.dumpLocked(SystemClock.uptimeMillis(),
-                new IndentingPrintWriter(new PrintWriter(new ByteArrayOutputStream())));
+                new IndentingPrintWriter(new PrintWriter(Writer.nullWriter())));
 
         queue.makeActiveNextPending();
         assertEquals(Intent.ACTION_LOCALE_CHANGED, queue.getActive().intent.getAction());
@@ -1141,7 +1142,7 @@
             mImpl.enqueueBroadcastLocked(makeBroadcastRecord(timeTick, optionsTimeTick));
             mImpl.enqueueBroadcastLocked(makeBroadcastRecord(timeTick, optionsTimeTick));
         }
-        mImpl.waitForIdle(null);
+        mImpl.waitForIdle(LOG_WRITER_INFO);
 
         // Verify that there is only one delivery event reported since one of the broadcasts
         // should have been skipped.
@@ -1165,6 +1166,11 @@
             List<Intent> intents) {
         for (int i = 0; i < intents.size(); i++) {
             queue.makeActiveNextPending();
+
+            // While we're here, give our health check some test coverage
+            queue.assertHealthLocked();
+            queue.dumpLocked(0L, new IndentingPrintWriter(Writer.nullWriter()));
+
             final Intent actualIntent = queue.getActive().intent;
             final Intent expectedIntent = intents.get(i);
             final String errMsg = "actual=" + actualIntent + ", expected=" + expectedIntent
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
index bca39ae..b6bc02a 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
@@ -18,6 +18,7 @@
 
 import static android.os.UserHandle.USER_SYSTEM;
 
+import static com.android.server.am.ActivityManagerDebugConfig.LOG_WRITER_INFO;
 import static com.android.server.am.BroadcastProcessQueue.reasonToString;
 import static com.android.server.am.BroadcastRecord.deliveryStateToString;
 import static com.android.server.am.BroadcastRecord.isReceiverEquals;
@@ -38,6 +39,7 @@
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
@@ -105,10 +107,10 @@
 import org.mockito.MockitoAnnotations;
 import org.mockito.verification.VerificationMode;
 
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
+import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -222,7 +224,7 @@
         realAms.mActivityTaskManager = new ActivityTaskManagerService(mContext);
         realAms.mActivityTaskManager.initialize(null, null, mContext.getMainLooper());
         realAms.mAtmInternal = spy(realAms.mActivityTaskManager.getAtmInternal());
-        realAms.mOomAdjuster.mCachedAppOptimizer = spy(realAms.mOomAdjuster.mCachedAppOptimizer);
+        realAms.mOomAdjuster = spy(realAms.mOomAdjuster);
         realAms.mPackageManagerInt = mPackageManagerInt;
         realAms.mUsageStatsService = mUsageStatsManagerInt;
         realAms.mProcessesReady = true;
@@ -230,6 +232,7 @@
         doAnswer((invocation) -> {
             Log.v(TAG, "Intercepting startProcessLocked() for "
                     + Arrays.toString(invocation.getArguments()));
+            assertHealth();
             final ProcessStartBehavior behavior = mNextProcessStartBehavior
                     .getAndSet(ProcessStartBehavior.SUCCESS);
             if (behavior == ProcessStartBehavior.FAIL_NULL) {
@@ -461,6 +464,7 @@
         doAnswer((invocation) -> {
             Log.v(TAG, "Intercepting scheduleReceiver() for "
                     + Arrays.toString(invocation.getArguments()));
+            assertHealth();
             final Intent intent = invocation.getArgument(0);
             final Bundle extras = invocation.getArgument(5);
             mScheduledBroadcasts.add(makeScheduledBroadcast(r, intent));
@@ -482,6 +486,7 @@
         doAnswer((invocation) -> {
             Log.v(TAG, "Intercepting scheduleRegisteredReceiver() for "
                     + Arrays.toString(invocation.getArguments()));
+            assertHealth();
             final Intent intent = invocation.getArgument(1);
             final Bundle extras = invocation.getArgument(4);
             final boolean ordered = invocation.getArgument(5);
@@ -599,6 +604,13 @@
                 BackgroundStartPrivileges.NONE, false, null);
     }
 
+    private void assertHealth() {
+        if (mImpl == Impl.MODERN) {
+            // If this fails, it'll throw a clear reason message
+            ((BroadcastQueueModernImpl) mQueue).assertHealthLocked();
+        }
+    }
+
     private static Map<String, Object> asMap(Bundle bundle) {
         final Map<String, Object> map = new HashMap<>();
         if (bundle != null) {
@@ -659,7 +671,7 @@
     }
 
     private void waitForIdle() throws Exception {
-        mQueue.waitForIdle(null);
+        mQueue.waitForIdle(LOG_WRITER_INFO);
     }
 
     private void verifyScheduleReceiver(ProcessRecord app, Intent intent) throws Exception {
@@ -768,14 +780,11 @@
         // about the actual output, just that we don't crash
         mQueue.dumpDebug(new ProtoOutputStream(),
                 ActivityManagerServiceDumpBroadcastsProto.BROADCAST_QUEUE);
-        mQueue.dumpLocked(FileDescriptor.err, new PrintWriter(new ByteArrayOutputStream()),
+        mQueue.dumpLocked(FileDescriptor.err, new PrintWriter(Writer.nullWriter()),
                 null, 0, true, true, true, null, false);
         mQueue.dumpToDropBoxLocked(TAG);
 
         BroadcastQueue.logv(TAG);
-        BroadcastQueue.logv(TAG, null);
-        BroadcastQueue.logv(TAG, new PrintWriter(new ByteArrayOutputStream()));
-
         BroadcastQueue.logw(TAG);
 
         assertNotNull(mQueue.toString());
@@ -951,7 +960,7 @@
                 // cold-started apps to be thawed, but the modern stack does
             } else {
                 // Confirm that app was thawed
-                verify(mAms.mOomAdjuster.mCachedAppOptimizer, atLeastOnce()).unfreezeTemporarily(
+                verify(mAms.mOomAdjuster, atLeastOnce()).unfreezeTemporarily(
                         eq(receiverApp), eq(OomAdjuster.OOM_ADJ_REASON_START_RECEIVER));
 
                 // Confirm that we added package to process
@@ -1168,7 +1177,7 @@
             // about the actual output, just that we don't crash
             mQueue.dumpDebug(new ProtoOutputStream(),
                     ActivityManagerServiceDumpBroadcastsProto.BROADCAST_QUEUE);
-            mQueue.dumpLocked(FileDescriptor.err, new PrintWriter(new ByteArrayOutputStream()),
+            mQueue.dumpLocked(FileDescriptor.err, new PrintWriter(Writer.nullWriter()),
                     null, 0, true, true, true, null, false);
         }
 
@@ -1394,7 +1403,7 @@
                 anyInt(), any());
 
         // Finally, verify that we thawed the final receiver
-        verify(mAms.mOomAdjuster.mCachedAppOptimizer).unfreezeTemporarily(eq(callerApp),
+        verify(mAms.mOomAdjuster).unfreezeTemporarily(eq(callerApp),
                 eq(OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER));
     }
 
@@ -1661,8 +1670,8 @@
         final ProcessRecord receiverYellowApp = makeActiveProcessRecord(PACKAGE_YELLOW);
         final ProcessRecord receiverOrangeApp = makeActiveProcessRecord(PACKAGE_ORANGE);
 
-        receiverGreenApp.setCached(true);
-        receiverBlueApp.setCached(true);
+        mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_GREEN), true);
+        mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_BLUE), true);
 
         final Intent timeTick = new Intent(Intent.ACTION_TIME_TICK);
         final BroadcastOptions opts = BroadcastOptions.makeBasic()
@@ -1706,13 +1715,11 @@
                 eq(UserHandle.USER_SYSTEM), anyInt(), anyInt(), any());
 
         // Shift blue to be active and confirm that deferred broadcast is delivered
-        receiverBlueApp.setCached(false);
         mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_BLUE), false);
         waitForIdle();
         verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, timeTick);
 
         // Shift green to be active and confirm that deferred broadcast is delivered
-        receiverGreenApp.setCached(false);
         mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_GREEN), false);
         waitForIdle();
         verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, timeTick);
@@ -1891,10 +1898,10 @@
             assertFalse(mQueue.isBeyondBarrierLocked(afterSecond));
         }
 
-        mQueue.waitForBarrier(null);
+        mQueue.waitForBarrier(LOG_WRITER_INFO);
         assertTrue(mQueue.isBeyondBarrierLocked(afterFirst));
 
-        mQueue.waitForIdle(null);
+        mQueue.waitForIdle(LOG_WRITER_INFO);
         assertTrue(mQueue.isIdleLocked());
         assertTrue(mQueue.isBeyondBarrierLocked(beforeFirst));
         assertTrue(mQueue.isBeyondBarrierLocked(afterFirst));
@@ -2046,9 +2053,9 @@
         final ProcessRecord receiverBlueApp = makeActiveProcessRecord(PACKAGE_BLUE);
         final ProcessRecord receiverYellowApp = makeActiveProcessRecord(PACKAGE_YELLOW);
 
-        receiverGreenApp.setCached(true);
-        receiverBlueApp.setCached(true);
-        receiverYellowApp.setCached(false);
+        mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_GREEN), true);
+        mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_BLUE), true);
+        mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_YELLOW), false);
 
         final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
         final BroadcastOptions opts = BroadcastOptions.makeBasic()
@@ -2071,7 +2078,6 @@
         verifyScheduleRegisteredReceiver(times(1), receiverYellowApp, airplane);
 
         // Shift green to be active and confirm that deferred broadcast is delivered
-        receiverGreenApp.setCached(false);
         mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_GREEN), false);
         waitForIdle();
         verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, airplane);
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java
index 1fbb8dd..eb6efd2 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java
@@ -166,10 +166,6 @@
                     CachedAppOptimizer.DEFAULT_STATSD_SAMPLE_RATE);
             assertThat(mCachedAppOptimizerUnderTest.mFreezerStatsdSampleRate).isEqualTo(
                     CachedAppOptimizer.DEFAULT_STATSD_SAMPLE_RATE);
-            assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
-                    CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
-            assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
-                    CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);
             assertThat(mCachedAppOptimizerUnderTest.mFullAnonRssThrottleKb).isEqualTo(
                     CachedAppOptimizer.DEFAULT_COMPACT_FULL_RSS_THROTTLE_KB);
             assertThat(mCachedAppOptimizerUnderTest.mFullDeltaRssThrottleKb).isEqualTo(
@@ -261,10 +257,6 @@
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3 + 1);
         assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4 + 1);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5 + 1);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6 + 1);
         assertThat(mCachedAppOptimizerUnderTest.mFullDeltaRssThrottleKb).isEqualTo(
                 CachedAppOptimizer.DEFAULT_COMPACT_FULL_DELTA_RSS_THROTTLE_KB + 1);
         assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMinOomAdj).isEqualTo(
@@ -275,10 +267,6 @@
                 CachedAppOptimizer.DEFAULT_STATSD_SAMPLE_RATE + 0.1f);
         assertThat(mCachedAppOptimizerUnderTest.mFreezerStatsdSampleRate).isEqualTo(
                 CachedAppOptimizer.DEFAULT_STATSD_SAMPLE_RATE + 0.1f);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5 + 1);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6 + 1);
         assertThat(mCachedAppOptimizerUnderTest.mFullAnonRssThrottleKb).isEqualTo(
                 CachedAppOptimizer.DEFAULT_COMPACT_FULL_RSS_THROTTLE_KB + 1);
         assertThat(mCachedAppOptimizerUnderTest.mProcStateThrottle).containsExactly(1, 2, 3);
@@ -425,10 +413,6 @@
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3 + 1);
         assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4 + 1);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5 + 1);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6 + 1);
         assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMinOomAdj).isEqualTo(
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ + 1);
         assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMaxOomAdj).isEqualTo(
@@ -454,10 +438,6 @@
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3);
         assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);
 
         // Repeat for each of the throttle keys.
         mCountDown = new CountDownLatch(1);
@@ -472,10 +452,6 @@
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3);
         assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);
 
         mCountDown = new CountDownLatch(1);
         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
@@ -489,10 +465,6 @@
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3);
         assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);
 
         mCountDown = new CountDownLatch(1);
         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
@@ -506,10 +478,6 @@
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3);
         assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);
 
         mCountDown = new CountDownLatch(1);
         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
@@ -523,10 +491,6 @@
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3);
         assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);
 
         mCountDown = new CountDownLatch(1);
         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
@@ -540,10 +504,6 @@
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3);
         assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                 CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
-        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
-                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);
     }
 
     @Test
@@ -953,15 +913,7 @@
         mProcessDependencies.setRssAfterCompaction(rssAfter);
 
         // When moving within cached state
-        mCachedAppOptimizerUnderTest.onOomAdjustChanged(
-                ProcessList.CACHED_APP_MIN_ADJ, ProcessList.CACHED_APP_MIN_ADJ + 1, processRecord);
-        waitForHandler();
-        // THEN process IS NOT compacted.
-        assertThat(mCachedAppOptimizerUnderTest.mLastCompactionStats.get(pid)).isNull();
-
-        // When moving into cached state
-        mCachedAppOptimizerUnderTest.onOomAdjustChanged(ProcessList.CACHED_APP_MIN_ADJ - 1,
-                ProcessList.CACHED_APP_MIN_ADJ + 1, processRecord);
+        mCachedAppOptimizerUnderTest.onProcessFrozen(processRecord);
         waitForHandler();
         // THEN process IS compacted.
         assertThat(mCachedAppOptimizerUnderTest.mLastCompactionStats.get(pid)).isNotNull();
diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java
index fc503b7..45fefe4 100644
--- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java
+++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java
@@ -804,7 +804,7 @@
         when(logicalDisplayMock.getDisplayInfoLocked()).thenReturn(info);
         when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled);
         when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false);
-        when(logicalDisplayMock.getBrightnessThrottlingDataIdLocked()).thenReturn(
+        when(logicalDisplayMock.getThermalBrightnessThrottlingDataIdLocked()).thenReturn(
                 DisplayDeviceConfig.DEFAULT_ID);
         when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo);
         when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId);
diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java
index c021ef6..d9133a4 100644
--- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java
@@ -809,7 +809,7 @@
         when(logicalDisplayMock.getDisplayInfoLocked()).thenReturn(info);
         when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled);
         when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false);
-        when(logicalDisplayMock.getBrightnessThrottlingDataIdLocked()).thenReturn(
+        when(logicalDisplayMock.getThermalBrightnessThrottlingDataIdLocked()).thenReturn(
                 DisplayDeviceConfig.DEFAULT_ID);
         when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo);
         when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId);
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/JobNotificationCoordinatorTest.java b/services/tests/mockingservicestests/src/com/android/server/job/JobNotificationCoordinatorTest.java
index 03f667f..df2f59a1 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/JobNotificationCoordinatorTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/JobNotificationCoordinatorTest.java
@@ -23,6 +23,8 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
@@ -39,6 +41,7 @@
 import android.os.UserHandle;
 
 import com.android.server.LocalServices;
+import com.android.server.job.controllers.JobStatus;
 import com.android.server.notification.NotificationManagerInternal;
 
 import org.junit.After;
@@ -493,6 +496,44 @@
                         eq(notificationId), eq(UserHandle.getUserId(uid)));
     }
 
+    @Test
+    public void testUserInitiatedJob_hasNotificationFlag() {
+        final JobNotificationCoordinator coordinator = new JobNotificationCoordinator();
+        final JobServiceContext jsc = mock(JobServiceContext.class);
+        final JobStatus js = mock(JobStatus.class);
+        js.startedAsUserInitiatedJob = true;
+        doReturn(js).when(jsc).getRunningJobLocked();
+        final Notification notification = createValidNotification();
+        final int uid = 10123;
+        final int pid = 42;
+        final int notificationId = 23;
+
+        coordinator.enqueueNotification(jsc, TEST_PACKAGE, pid, uid, notificationId, notification,
+                JobService.JOB_END_NOTIFICATION_POLICY_REMOVE);
+        verify(mNotificationManagerInternal)
+                .enqueueNotification(eq(TEST_PACKAGE), eq(TEST_PACKAGE), eq(uid), eq(pid), any(),
+                        eq(notificationId), eq(notification), eq(UserHandle.getUserId(uid)));
+        assertNotEquals(notification.flags & Notification.FLAG_USER_INITIATED_JOB, 0);
+    }
+
+    @Test
+    public void testNonUserInitiatedJob_doesNotHaveNotificationFlag() {
+        final JobNotificationCoordinator coordinator = new JobNotificationCoordinator();
+        final JobServiceContext jsc = mock(JobServiceContext.class);
+        doReturn(mock(JobStatus.class)).when(jsc).getRunningJobLocked();
+        final Notification notification = createValidNotification();
+        final int uid = 10123;
+        final int pid = 42;
+        final int notificationId = 23;
+
+        coordinator.enqueueNotification(jsc, TEST_PACKAGE, pid, uid, notificationId, notification,
+                JobService.JOB_END_NOTIFICATION_POLICY_REMOVE);
+        verify(mNotificationManagerInternal)
+                .enqueueNotification(eq(TEST_PACKAGE), eq(TEST_PACKAGE), eq(uid), eq(pid), any(),
+                        eq(notificationId), eq(notification), eq(UserHandle.getUserId(uid)));
+        assertEquals(notification.flags & Notification.FLAG_USER_INITIATED_JOB, 0);
+    }
+
     private Notification createValidNotification() {
         final Notification notification = mock(Notification.class);
         doReturn(mock(Icon.class)).when(notification).getSmallIcon();
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
index 2d8fa1b..2180a78 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
@@ -21,11 +21,13 @@
 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
 import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
 import static android.net.NetworkCapabilities.TRANSPORT_VPN;
 import static android.text.format.DateUtils.SECOND_IN_MILLIS;
 
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.inOrder;
@@ -50,6 +52,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.app.ActivityManager;
 import android.app.job.JobInfo;
 import android.content.ComponentName;
 import android.content.Context;
@@ -81,6 +84,7 @@
 import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.stubbing.Answer;
 
 import java.time.Clock;
 import java.time.ZoneOffset;
@@ -322,6 +326,109 @@
     }
 
     @Test
+    public void testMeteredAllowed() throws Exception {
+        final JobInfo.Builder jobBuilder = createJob()
+                .setEstimatedNetworkBytes(DataUnit.MEBIBYTES.toBytes(1),
+                        DataUnit.MEBIBYTES.toBytes(1))
+                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
+        final JobStatus job = spy(createJobStatus(jobBuilder));
+
+        final ConnectivityController controller = new ConnectivityController(mService,
+                mFlexibilityController);
+
+        // Unmetered network is always "metered allowed"
+        {
+            final Network net = mock(Network.class);
+            final NetworkCapabilities caps = createCapabilitiesBuilder()
+                    .addCapability(NET_CAPABILITY_NOT_CONGESTED)
+                    .addCapability(NET_CAPABILITY_NOT_METERED)
+                    .build();
+            assertTrue(controller.isSatisfied(job, net, caps, mConstants));
+        }
+
+        // Temporarily unmetered network is always "metered allowed"
+        {
+            final Network net = mock(Network.class);
+            final NetworkCapabilities caps = createCapabilitiesBuilder()
+                    .addCapability(NET_CAPABILITY_NOT_CONGESTED)
+                    .addCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)
+                    .build();
+            assertTrue(controller.isSatisfied(job, net, caps, mConstants));
+        }
+
+        // Respond with the default values in NetworkPolicyManager. If those ever change enough
+        // to cause these tests to fail, we would likely need to go and update
+        // ConnectivityController.
+        doAnswer(
+                (Answer<Integer>) invocationOnMock
+                        -> NetworkPolicyManager.getDefaultProcessNetworkCapabilities(
+                        invocationOnMock.getArgument(0)))
+                .when(mService).getUidCapabilities(anyInt());
+
+        // Foreground is always allowed for metered network
+        {
+            final Network net = mock(Network.class);
+            final NetworkCapabilities caps = createCapabilitiesBuilder()
+                    .addCapability(NET_CAPABILITY_NOT_CONGESTED)
+                    .build();
+
+            when(mService.getUidProcState(anyInt()))
+                    .thenReturn(ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
+            assertTrue(controller.isSatisfied(job, net, caps, mConstants));
+
+            when(mService.getUidProcState(anyInt()))
+                    .thenReturn(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+            assertTrue(controller.isSatisfied(job, net, caps, mConstants));
+
+            when(mService.getUidProcState(anyInt())).thenReturn(ActivityManager.PROCESS_STATE_TOP);
+            assertTrue(controller.isSatisfied(job, net, caps, mConstants));
+
+            when(mService.getUidProcState(anyInt())).thenReturn(JobInfo.BIAS_DEFAULT);
+            when(job.getFlags()).thenReturn(JobInfo.FLAG_WILL_BE_FOREGROUND);
+            assertTrue(controller.isSatisfied(job, net, caps, mConstants));
+        }
+
+        when(mService.getUidProcState(anyInt())).thenReturn(ActivityManager.PROCESS_STATE_UNKNOWN);
+        when(job.getFlags()).thenReturn(0);
+
+        // User initiated is always allowed for metered network
+        {
+            final Network net = mock(Network.class);
+            final NetworkCapabilities caps = createCapabilitiesBuilder()
+                    .addCapability(NET_CAPABILITY_NOT_CONGESTED)
+                    .build();
+            when(job.shouldTreatAsUserInitiatedJob()).thenReturn(true);
+            assertTrue(controller.isSatisfied(job, net, caps, mConstants));
+        }
+
+        // Background non-user-initiated should follow the app's restricted state
+        {
+            final Network net = mock(Network.class);
+            final NetworkCapabilities caps = createCapabilitiesBuilder()
+                    .addCapability(NET_CAPABILITY_NOT_CONGESTED)
+                    .build();
+            when(job.shouldTreatAsUserInitiatedJob()).thenReturn(false);
+            when(mNetPolicyManager.getRestrictBackgroundStatus(anyInt()))
+                    .thenReturn(ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED);
+            assertTrue(controller.isSatisfied(job, net, caps, mConstants));
+            // Test cache
+            when(mNetPolicyManager.getRestrictBackgroundStatus(anyInt()))
+                    .thenReturn(ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED);
+            assertTrue(controller.isSatisfied(job, net, caps, mConstants));
+            // Clear cache
+            controller.onAppRemovedLocked(job.getSourcePackageName(), job.getSourceUid());
+            assertFalse(controller.isSatisfied(job, net, caps, mConstants));
+            // Test cache
+            when(mNetPolicyManager.getRestrictBackgroundStatus(anyInt()))
+                    .thenReturn(ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED);
+            assertFalse(controller.isSatisfied(job, net, caps, mConstants));
+            // Clear cache
+            controller.onAppRemovedLocked(job.getSourcePackageName(), job.getSourceUid());
+            assertTrue(controller.isSatisfied(job, net, caps, mConstants));
+        }
+    }
+
+    @Test
     public void testStrongEnough_Cellular() {
         mConstants.CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS = 0;
 
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 df6f999..c040b19 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
@@ -397,6 +397,14 @@
         job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures,
                 numSystemStops, 0, 0, 0);
         assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority());
+
+        // Less than 2 failures, but job is downgraded.
+        numFailures = 1;
+        numSystemStops = 0;
+        job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures,
+                numSystemStops, 0, 0, 0);
+        job.addInternalFlags(JobStatus.INTERNAL_FLAG_DEMOTED_BY_USER);
+        assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority());
     }
 
     @Test
@@ -500,6 +508,80 @@
     }
 
     @Test
+    public void testGetEffectivePriority_UserInitiated() {
+        final JobInfo jobInfo =
+                new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setUserInitiated(true)
+                        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
+                        .build();
+        JobStatus job = createJobStatus(jobInfo);
+
+        // Less than 2 failures, priority shouldn't be affected.
+        assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority());
+        int numFailures = 1;
+        int numSystemStops = 0;
+        job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures,
+                numSystemStops, 0, 0, 0);
+        assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority());
+
+        // 2+ failures, priority shouldn't be affected while job is still a UI job
+        numFailures = 2;
+        job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures,
+                numSystemStops, 0, 0, 0);
+        assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority());
+        numFailures = 5;
+        job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures,
+                numSystemStops, 0, 0, 0);
+        assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority());
+        numFailures = 8;
+        job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures,
+                numSystemStops, 0, 0, 0);
+        assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority());
+
+        // System stops shouldn't factor in the downgrade.
+        numSystemStops = 10;
+        numFailures = 0;
+        job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures,
+                numSystemStops, 0, 0, 0);
+        assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority());
+
+        // Job can no long run as user-initiated. Downgrades should be effective.
+        // Priority can't be max.
+        job = createJobStatus(jobInfo);
+        job.addInternalFlags(JobStatus.INTERNAL_FLAG_DEMOTED_BY_USER);
+        assertFalse(job.shouldTreatAsUserInitiatedJob());
+
+        // Less than 2 failures.
+        assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority());
+        numFailures = 1;
+        numSystemStops = 0;
+        job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures,
+                numSystemStops, 0, 0, 0);
+        assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority());
+
+        // 2+ failures, priority should start getting lower
+        numFailures = 2;
+        job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures,
+                numSystemStops, 0, 0, 0);
+        assertEquals(JobInfo.PRIORITY_DEFAULT, job.getEffectivePriority());
+        numFailures = 5;
+        job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures,
+                numSystemStops, 0, 0, 0);
+        assertEquals(JobInfo.PRIORITY_LOW, job.getEffectivePriority());
+        numFailures = 8;
+        job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures,
+                numSystemStops, 0, 0, 0);
+        assertEquals(JobInfo.PRIORITY_MIN, job.getEffectivePriority());
+
+        // System stops shouldn't factor in the downgrade.
+        numSystemStops = 10;
+        numFailures = 0;
+        job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures,
+                numSystemStops, 0, 0, 0);
+        assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority());
+    }
+
+    @Test
     public void testShouldTreatAsUserInitiated() {
         JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar"))
                 .setUserInitiated(false)
diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp
index 6f26a5f..cfeaf0b 100644
--- a/services/tests/servicestests/Android.bp
+++ b/services/tests/servicestests/Android.bp
@@ -42,6 +42,7 @@
         "androidx.test.ext.truth",
         "androidx.test.runner",
         "androidx.test.rules",
+        "androidx.test.ext.junit",
         "cts-wm-util",
         "platform-compat-test-rules",
         "mockito-target-minus-junit4",
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index 6861c2f0..107dde2 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -74,7 +74,8 @@
     <uses-permission android:name="android.permission.CONTROL_DISPLAY_BRIGHTNESS"/>
     <uses-permission android:name="android.permission.CONFIGURE_DISPLAY_BRIGHTNESS"/>
     <uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/>
-    <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG"/>
+    <uses-permission android:name="android.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG"/>
+    <uses-permission android:name="android.permission.READ_WRITE_SYNC_DISABLED_MODE_CONFIG"/>
     <uses-permission android:name="android.permission.HARDWARE_TEST"/>
     <uses-permission android:name="android.permission.BLUETOOTH"/>
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java
index b5e0e07..dd44a79 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java
@@ -50,6 +50,7 @@
 
 public class ProxyAccessibilityServiceConnectionTest {
     private static final int DISPLAY_ID = 1000;
+    private static final int DEVICE_ID = 2000;
     private static final int CONNECTION_ID = 1000;
     private static final ComponentName COMPONENT_NAME = new ComponentName(
             "com.android.server.accessibility", ".ProxyAccessibilityServiceConnectionTest");
@@ -90,7 +91,7 @@
                 mAccessibilityServiceInfo, CONNECTION_ID , new Handler(
                         getInstrumentation().getContext().getMainLooper()),
                 mMockLock, mMockSecurityPolicy, mMockSystemSupport, mMockA11yTrace,
-                mMockWindowManagerInternal, mMockA11yWindowManager, DISPLAY_ID);
+                mMockWindowManagerInternal, mMockA11yWindowManager, DISPLAY_ID, DEVICE_ID);
     }
 
     @Test
@@ -101,7 +102,7 @@
 
         mProxyConnection.setInstalledAndEnabledServices(infos);
 
-        verify(mMockSystemSupport).onClientChangeLocked(true);
+        verify(mMockSystemSupport).onProxyChanged(DEVICE_ID);
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java
index e4aed97..07c6182 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java
@@ -30,6 +30,7 @@
 
 import android.app.StatusBarManager;
 import android.content.Intent;
+import android.hardware.biometrics.AuthenticateOptions;
 import android.hardware.biometrics.IBiometricContextListener;
 import android.hardware.biometrics.IBiometricContextListener.FoldState;
 import android.hardware.biometrics.common.OperationContext;
@@ -59,6 +60,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.function.Consumer;
 
 @Presubmit
@@ -102,22 +104,52 @@
 
     @Test
     public void testIsAod() throws RemoteException {
-        mListener.onDozeChanged(true /* isAod */, false /* isAwake */);
-        assertThat(mProvider.isAod()).isTrue();
-        mListener.onDozeChanged(false /* isAod */, false /* isAwake */);
-        assertThat(mProvider.isAod()).isFalse();
+        final Map<Integer, Boolean> expectedAod = Map.of(
+                AuthenticateOptions.DISPLAY_STATE_UNKNOWN, false,
+                AuthenticateOptions.DISPLAY_STATE_AOD, true,
+                AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN, false,
+                AuthenticateOptions.DISPLAY_STATE_NO_UI, false,
+                AuthenticateOptions.DISPLAY_STATE_SCREENSAVER, false
+        );
+
+        for (Map.Entry<Integer, Boolean> entry : expectedAod.entrySet()) {
+            mListener.onDisplayStateChanged(entry.getKey());
+
+            assertThat(mProvider.isAod()).isEqualTo(entry.getValue());
+        }
     }
 
     @Test
     public void testIsAwake() throws RemoteException {
-        mListener.onDozeChanged(false /* isAod */, true /* isAwake */);
-        assertThat(mProvider.isAwake()).isTrue();
-        mListener.onDozeChanged(false /* isAod */, false /* isAwake */);
-        assertThat(mProvider.isAwake()).isFalse();
-        mListener.onDozeChanged(true /* isAod */, true /* isAwake */);
-        assertThat(mProvider.isAwake()).isTrue();
-        mListener.onDozeChanged(true /* isAod */, false /* isAwake */);
-        assertThat(mProvider.isAwake()).isFalse();
+        final Map<Integer, Boolean> expectedAwake = Map.of(
+                AuthenticateOptions.DISPLAY_STATE_UNKNOWN, true,
+                AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN, true,
+                AuthenticateOptions.DISPLAY_STATE_SCREENSAVER, true,
+                AuthenticateOptions.DISPLAY_STATE_NO_UI, false,
+                AuthenticateOptions.DISPLAY_STATE_AOD, false
+        );
+
+        for (Map.Entry<Integer, Boolean> entry : expectedAwake.entrySet()) {
+            mListener.onDisplayStateChanged(entry.getKey());
+
+            assertThat(mProvider.isAwake()).isEqualTo(entry.getValue());
+        }
+    }
+
+    @Test
+    public void testGetDisplayState() throws RemoteException {
+        final List<Integer> states = List.of(
+                AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN,
+                AuthenticateOptions.DISPLAY_STATE_SCREENSAVER,
+                AuthenticateOptions.DISPLAY_STATE_NO_UI,
+                AuthenticateOptions.DISPLAY_STATE_AOD,
+                AuthenticateOptions.DISPLAY_STATE_UNKNOWN);
+
+        for (int state : states) {
+            mListener.onDisplayStateChanged(state);
+
+            assertThat(mProvider.getDisplayState()).isEqualTo(state);
+        }
     }
 
     @Test
@@ -147,21 +179,54 @@
     }
 
     @Test
+    public void testSubscribesToDisplayState() throws RemoteException {
+        final List<Integer> actual = new ArrayList<>();
+        final List<Integer> expected = List.of(AuthenticateOptions.DISPLAY_STATE_AOD,
+                AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN,
+                AuthenticateOptions.DISPLAY_STATE_AOD,
+                AuthenticateOptions.DISPLAY_STATE_AOD,
+                AuthenticateOptions.DISPLAY_STATE_NO_UI,
+                AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN);
+
+        mProvider.subscribe(mOpContext, ctx -> {
+            assertThat(ctx).isSameInstanceAs(mOpContext.toAidlContext());
+            assertThat(mProvider.getDisplayState()).isEqualTo(ctx.displayState);
+            actual.add(ctx.displayState);
+        });
+
+        for (int v : expected) {
+            mListener.onDisplayStateChanged(v);
+        }
+
+        assertThat(actual).containsExactly(
+                AuthenticateOptions.DISPLAY_STATE_AOD,
+                AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN,
+                AuthenticateOptions.DISPLAY_STATE_AOD,
+                AuthenticateOptions.DISPLAY_STATE_NO_UI,
+                AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN).inOrder();
+    }
+
+    @Test
     public void testSubscribesToAod() throws RemoteException {
         final List<Boolean> actual = new ArrayList<>();
 
         mProvider.subscribe(mOpContext, ctx -> {
             assertThat(ctx).isSameInstanceAs(mOpContext.toAidlContext());
             assertThat(mProvider.isAod()).isEqualTo(ctx.isAod);
-            assertThat(mProvider.isAwake()).isFalse();
             actual.add(ctx.isAod);
         });
 
-        for (boolean v : List.of(true, false, true, true, false, false)) {
-            mListener.onDozeChanged(v /* isDozing */, false /* isAwake */);
+        for (int v : List.of(
+                AuthenticateOptions.DISPLAY_STATE_AOD,
+                AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN,
+                AuthenticateOptions.DISPLAY_STATE_AOD,
+                AuthenticateOptions.DISPLAY_STATE_AOD,
+                AuthenticateOptions.DISPLAY_STATE_NO_UI,
+                AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN)) {
+            mListener.onDisplayStateChanged(v);
         }
 
-        assertThat(actual).containsExactly(true, false, true, false).inOrder();
+        assertThat(actual).containsExactly(true, false, true, false, false).inOrder();
     }
 
     @Test
@@ -170,16 +235,20 @@
 
         mProvider.subscribe(mOpContext, ctx -> {
             assertThat(ctx).isSameInstanceAs(mOpContext.toAidlContext());
-            assertThat(ctx.isAod).isFalse();
-            assertThat(mProvider.isAod()).isFalse();
             actual.add(mProvider.isAwake());
         });
 
-        for (boolean v : List.of(true, false, true, true, false, false)) {
-            mListener.onDozeChanged(false /* isDozing */, v /* isAwake */);
+        for (int v : List.of(
+                AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN,
+                AuthenticateOptions.DISPLAY_STATE_NO_UI,
+                AuthenticateOptions.DISPLAY_STATE_SCREENSAVER,
+                AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN,
+                AuthenticateOptions.DISPLAY_STATE_AOD,
+                AuthenticateOptions.DISPLAY_STATE_NO_UI)) {
+            mListener.onDisplayStateChanged(v);
         }
 
-        assertThat(actual).containsExactly(true, false, true, false).inOrder();
+        assertThat(actual).containsExactly(true, false, true, true, false, false).inOrder();
     }
 
     @Test
@@ -188,13 +257,13 @@
         mProvider.subscribe(mOpContext, emptyConsumer);
         mProvider.unsubscribe(mOpContext);
 
-        mListener.onDozeChanged(true /* isDozing */, false /* isAwake */);
+        mListener.onDisplayStateChanged(AuthenticateOptions.DISPLAY_STATE_AOD);
 
         final Consumer<OperationContext> nonEmptyConsumer = mock(Consumer.class);
         mProvider.subscribe(mOpContext, nonEmptyConsumer);
-        mListener.onDozeChanged(false /* isDozing */, false /* isAwake */);
+        mListener.onDisplayStateChanged(AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN);
         mProvider.unsubscribe(mOpContext);
-        mListener.onDozeChanged(true /* isDozing */, false /* isAwake */);
+        mListener.onDisplayStateChanged(AuthenticateOptions.DISPLAY_STATE_NO_UI);
 
         verify(emptyConsumer, never()).accept(any());
         verify(nonEmptyConsumer).accept(same(mOpContext.toAidlContext()));
@@ -235,7 +304,7 @@
 
     @Test
     public void testUpdate() throws RemoteException {
-        mListener.onDozeChanged(false /* isDozing */, false /* isAwake */);
+        mListener.onDisplayStateChanged(AuthenticateOptions.DISPLAY_STATE_NO_UI);
 
         OperationContextExt context = mProvider.updateContext(mOpContext, false /* crypto */);
         OperationContext aidlContext = context.toAidlContext();
@@ -252,7 +321,8 @@
             final int id = 40 + type;
             final boolean aod = (type & 1) == 0;
 
-            mListener.onDozeChanged(aod /* isDozing */, false /* isAwake */);
+            mListener.onDisplayStateChanged(aod ? AuthenticateOptions.DISPLAY_STATE_AOD
+                    : AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN);
             mSessionListener.onSessionStarted(type, InstanceId.fakeInstanceId(id));
             context = mProvider.updateContext(mOpContext, false /* crypto */);
             aidlContext = context.toAidlContext();
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/OperationContextExtTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/OperationContextExtTest.java
index c7962c8..c652b74 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/log/OperationContextExtTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/log/OperationContextExtTest.java
@@ -19,7 +19,9 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Intent;
+import android.hardware.biometrics.AuthenticateOptions;
 import android.hardware.biometrics.IBiometricContextListener;
+import android.hardware.biometrics.common.DisplayState;
 import android.hardware.biometrics.common.OperationContext;
 import android.hardware.biometrics.common.OperationReason;
 import android.platform.test.annotations.Presubmit;
@@ -37,6 +39,8 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 
+import java.util.Map;
+
 @Presubmit
 @SmallTest
 public class OperationContextExtTest {
@@ -59,15 +63,18 @@
 
         final int id = 5;
         final byte reason = OperationReason.UNKNOWN;
+        final int displayState = DisplayState.NO_UI;
         aidlContext.id = id;
         aidlContext.isAod = true;
         aidlContext.isCrypto = true;
         aidlContext.reason = reason;
+        aidlContext.displayState = displayState;
 
         assertThat(context.getId()).isEqualTo(id);
         assertThat(context.isAod()).isTrue();
         assertThat(context.isCrypto()).isTrue();
         assertThat(context.getReason()).isEqualTo(reason);
+        assertThat(context.getDisplayState()).isEqualTo(displayState);
     }
 
     @Test
@@ -78,6 +85,25 @@
     }
 
     @Test
+    public void mapsDisplayStatesToAidl() {
+        final Map<Integer, Integer> map = Map.of(
+                AuthenticateOptions.DISPLAY_STATE_UNKNOWN, DisplayState.UNKNOWN,
+                AuthenticateOptions.DISPLAY_STATE_AOD, DisplayState.AOD,
+                AuthenticateOptions.DISPLAY_STATE_NO_UI, DisplayState.NO_UI,
+                AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN, DisplayState.LOCKSCREEN,
+                AuthenticateOptions.DISPLAY_STATE_SCREENSAVER, DisplayState.SCREENSAVER,
+                100, DisplayState.UNKNOWN
+        );
+
+        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
+            final OperationContextExt context = new OperationContextExt(newAidlContext());
+            when(mBiometricContext.getDisplayState()).thenReturn(entry.getKey());
+            assertThat(context.update(mBiometricContext).getDisplayState())
+                    .isEqualTo(entry.getValue());
+        }
+    }
+
+    @Test
     public void updatesFromSourceForKeyguard() {
         final BiometricContextSessionInfo info =
                 new BiometricContextSessionInfo(InstanceId.fakeInstanceId(9));
@@ -102,11 +128,13 @@
         final int rotation = Surface.ROTATION_270;
         final int foldState = IBiometricContextListener.FoldState.HALF_OPENED;
         final int dockState = Intent.EXTRA_DOCK_STATE_CAR;
+        final int displayState = AuthenticateOptions.DISPLAY_STATE_AOD;
 
         when(mBiometricContext.getCurrentRotation()).thenReturn(rotation);
         when(mBiometricContext.getFoldState()).thenReturn(foldState);
         when(mBiometricContext.getDockedState()).thenReturn(dockState);
         when(mBiometricContext.isDisplayOn()).thenReturn(true);
+        when(mBiometricContext.getDisplayState()).thenReturn(displayState);
 
         final OperationContextExt context = new OperationContextExt(newAidlContext());
 
@@ -124,6 +152,7 @@
         assertThat(context.getFoldState()).isEqualTo(foldState);
         assertThat(context.getOrientation()).isEqualTo(rotation);
         assertThat(context.isDisplayOn()).isTrue();
+        assertThat(context.getDisplayState()).isEqualTo(DisplayState.AOD);
     }
 
     private static OperationContext newAidlContext() {
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClientTest.java
index 6b0e330..7468901 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClientTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClientTest.java
@@ -68,6 +68,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Consumer;
 
 @Presubmit
 @SmallTest
@@ -106,6 +107,8 @@
     private AuthSessionCoordinator mAuthSessionCoordinator;
     @Captor
     private ArgumentCaptor<OperationContextExt> mOperationContextCaptor;
+    @Captor
+    private ArgumentCaptor<Consumer<OperationContext>> mContextInjector;
 
     @Rule
     public final MockitoRule mockito = MockitoJUnit.rule();
@@ -145,6 +148,28 @@
     }
 
     @Test
+    public void notifyHalWhenContextChanges() throws RemoteException {
+        final FaceAuthenticationClient client = createClient();
+        client.start(mCallback);
+
+        final ArgumentCaptor<OperationContext> captor =
+                ArgumentCaptor.forClass(OperationContext.class);
+        verify(mHal).authenticateWithContext(eq(OP_ID), captor.capture());
+        OperationContext opContext = captor.getValue();
+
+        // fake an update to the context
+        verify(mBiometricContext).subscribe(
+                mOperationContextCaptor.capture(), mContextInjector.capture());
+        assertThat(opContext).isSameInstanceAs(
+                mOperationContextCaptor.getValue().toAidlContext());
+        mContextInjector.getValue().accept(opContext);
+        verify(mHal).onContextChanged(same(opContext));
+
+        client.stopHalOperation();
+        verify(mBiometricContext).unsubscribe(same(mOperationContextCaptor.getValue()));
+    }
+
+    @Test
     public void cancelsAuthWhenNotInForeground() throws Exception {
         final ActivityManager.RunningTaskInfo topTask = new ActivityManager.RunningTaskInfo();
         topTask.topActivity = new ComponentName("other", "thing");
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceDetectClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceDetectClientTest.java
index 0abfa7e..c26eee9 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceDetectClientTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceDetectClientTest.java
@@ -56,6 +56,8 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 
+import java.util.function.Consumer;
+
 @Presubmit
 @SmallTest
 public class FaceDetectClientTest {
@@ -84,6 +86,8 @@
     private Sensor.HalSessionCallback mHalSessionCallback;
     @Captor
     private ArgumentCaptor<OperationContextExt> mOperationContextCaptor;
+    @Captor
+    private ArgumentCaptor<Consumer<OperationContext>> mContextInjector;
 
     @Rule
     public final MockitoRule mockito = MockitoJUnit.rule();
@@ -121,6 +125,32 @@
         verify(mHal, never()).detectInteraction();
     }
 
+    @Test
+    public void notifyHalWhenContextChanges() throws RemoteException {
+        final FaceDetectClient client = createClient();
+        client.start(mCallback);
+
+        final ArgumentCaptor<OperationContext> captor =
+                ArgumentCaptor.forClass(OperationContext.class);
+        verify(mHal).detectInteractionWithContext(captor.capture());
+        OperationContext opContext = captor.getValue();
+
+        // fake an update to the context
+        verify(mBiometricContext).subscribe(
+                mOperationContextCaptor.capture(), mContextInjector.capture());
+        assertThat(opContext).isSameInstanceAs(
+                mOperationContextCaptor.getValue().toAidlContext());
+        mContextInjector.getValue().accept(opContext);
+        verify(mHal).onContextChanged(same(opContext));
+
+        client.stopHalOperation();
+        verify(mBiometricContext).unsubscribe(same(mOperationContextCaptor.getValue()));
+    }
+
+    private FaceDetectClient createClient() throws RemoteException {
+        return createClient(100 /* version */);
+    }
+
     private FaceDetectClient createClient(int version) throws RemoteException {
         when(mHal.getInterfaceVersion()).thenReturn(version);
 
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClientTest.java
index d75aca1..54d116f 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClientTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClientTest.java
@@ -16,6 +16,8 @@
 
 package com.android.server.biometrics.sensors.face.aidl;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyByte;
@@ -25,6 +27,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.hardware.biometrics.common.OperationContext;
 import android.hardware.biometrics.face.ISession;
 import android.hardware.face.Face;
 import android.os.IBinder;
@@ -52,6 +55,8 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 
+import java.util.function.Consumer;
+
 @Presubmit
 @SmallTest
 public class FaceEnrollClientTest {
@@ -81,6 +86,8 @@
     private Sensor.HalSessionCallback mHalSessionCallback;
     @Captor
     private ArgumentCaptor<OperationContextExt> mOperationContextCaptor;
+    @Captor
+    private ArgumentCaptor<Consumer<OperationContext>> mContextInjector;
 
     @Rule
     public final MockitoRule mockito = MockitoJUnit.rule();
@@ -108,11 +115,38 @@
         InOrder order = inOrder(mHal, mBiometricContext);
         order.verify(mBiometricContext).updateContext(
                 mOperationContextCaptor.capture(), anyBoolean());
-        order.verify(mHal).enrollWithContext(any(), anyByte(), any(), any(),
-                same(mOperationContextCaptor.getValue().toAidlContext()));
+
+        final OperationContext aidlContext = mOperationContextCaptor.getValue().toAidlContext();
+        order.verify(mHal).enrollWithContext(any(), anyByte(), any(), any(), same(aidlContext));
         verify(mHal, never()).enroll(any(), anyByte(), any(), any());
     }
 
+    @Test
+    public void notifyHalWhenContextChanges() throws RemoteException {
+        final FaceEnrollClient client = createClient();
+        client.start(mCallback);
+
+        final ArgumentCaptor<OperationContext> captor =
+                ArgumentCaptor.forClass(OperationContext.class);
+        verify(mHal).enrollWithContext(any(), anyByte(), any(), any(), captor.capture());
+        OperationContext opContext = captor.getValue();
+
+        // fake an update to the context
+        verify(mBiometricContext).subscribe(
+                mOperationContextCaptor.capture(), mContextInjector.capture());
+        assertThat(opContext).isSameInstanceAs(
+                mOperationContextCaptor.getValue().toAidlContext());
+        mContextInjector.getValue().accept(opContext);
+        verify(mHal).onContextChanged(same(opContext));
+
+        client.stopHalOperation();
+        verify(mBiometricContext).unsubscribe(same(mOperationContextCaptor.getValue()));
+    }
+
+    private FaceEnrollClient createClient() throws RemoteException {
+        return createClient(200 /* version */);
+    }
+
     private FaceEnrollClient createClient(int version) throws RemoteException {
         when(mHal.getInterfaceVersion()).thenReturn(version);
 
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java
index c664500..f8f40fe 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java
@@ -338,7 +338,7 @@
         assertThat(opContext).isSameInstanceAs(
                 mOperationContextCaptor.getValue().toAidlContext());
         mContextInjector.getValue().accept(opContext);
-        verify(mHal).onContextChanged(eq(opContext));
+        verify(mHal).onContextChanged(same(opContext));
 
         client.stopHalOperation();
         verify(mBiometricContext).unsubscribe(same(mOperationContextCaptor.getValue()));
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClientTest.java
index c20cc39..6dfdd87 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClientTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClientTest.java
@@ -55,6 +55,8 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 
+import java.util.function.Consumer;
+
 @Presubmit
 @SmallTest
 public class FingerprintDetectClientTest {
@@ -83,6 +85,8 @@
     private Sensor.HalSessionCallback mHalSessionCallback;
     @Captor
     private ArgumentCaptor<OperationContextExt> mOperationContextCaptor;
+    @Captor
+    private ArgumentCaptor<Consumer<OperationContext>> mContextInjector;
 
     @Rule
     public final MockitoRule mockito = MockitoJUnit.rule();
@@ -121,6 +125,32 @@
         verify(mHal, never()).detectInteraction();
     }
 
+    @Test
+    public void notifyHalWhenContextChanges() throws RemoteException {
+        final FingerprintDetectClient client = createClient();
+        client.start(mCallback);
+
+        final ArgumentCaptor<OperationContext> captor =
+                ArgumentCaptor.forClass(OperationContext.class);
+        verify(mHal).detectInteractionWithContext(captor.capture());
+        OperationContext opContext = captor.getValue();
+
+        // fake an update to the context
+        verify(mBiometricContext).subscribe(
+                mOperationContextCaptor.capture(), mContextInjector.capture());
+        assertThat(opContext).isSameInstanceAs(
+                mOperationContextCaptor.getValue().toAidlContext());
+        mContextInjector.getValue().accept(opContext);
+        verify(mHal).onContextChanged(same(opContext));
+
+        client.stopHalOperation();
+        verify(mBiometricContext).unsubscribe(same(mOperationContextCaptor.getValue()));
+    }
+
+    private FingerprintDetectClient createClient() throws RemoteException {
+        return createClient(200 /* version */);
+    }
+
     private FingerprintDetectClient createClient(int version) throws RemoteException {
         when(mHal.getInterfaceVersion()).thenReturn(version);
 
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java
index 7646c40..3c89278 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java
@@ -16,8 +16,6 @@
 
 package com.android.server.biometrics.sensors.fingerprint.aidl;
 
-import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_POWER_PRESSED;
-
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyFloat;
 import static org.mockito.ArgumentMatchers.anyInt;
@@ -110,8 +108,6 @@
     @Captor
     private ArgumentCaptor<OperationContextExt> mOperationContextCaptor;
     @Captor
-    private ArgumentCaptor<PointerContext> mPointerContextCaptor;
-    @Captor
     private ArgumentCaptor<Consumer<OperationContext>> mContextInjector;
 
     @Rule
@@ -246,7 +242,7 @@
                 mOperationContextCaptor.capture(), mContextInjector.capture());
         mContextInjector.getValue().accept(
                 mOperationContextCaptor.getValue().toAidlContext());
-        verify(mHal).onContextChanged(eq(opContext));
+        verify(mHal).onContextChanged(same(opContext));
 
         client.stopHalOperation();
         verify(mBiometricContext).unsubscribe(same(mOperationContextCaptor.getValue()));
diff --git a/services/tests/servicestests/src/com/android/server/credentials/ProviderRegistryGetSessionTest.java b/services/tests/servicestests/src/com/android/server/credentials/ProviderRegistryGetSessionTest.java
index 13d49aa..6bc0fbf 100644
--- a/services/tests/servicestests/src/com/android/server/credentials/ProviderRegistryGetSessionTest.java
+++ b/services/tests/servicestests/src/com/android/server/credentials/ProviderRegistryGetSessionTest.java
@@ -148,7 +148,7 @@
         assertThat(packageNameCaptor.getValue()).isEqualTo(CALLING_PACKAGE_NAME);
         assertThat(flattenedRequestCaptor.getValue()).containsExactly(FLATTENED_REQUEST);
         verify(mGetRequestSession).onProviderStatusChanged(statusCaptor.capture(),
-                cpComponentNameCaptor.capture());
+                cpComponentNameCaptor.capture(), ProviderSession.CredentialsSource.REGISTRY);
         assertThat(statusCaptor.getValue()).isEqualTo(ProviderSession.Status.CREDENTIALS_RECEIVED);
         assertThat(cpComponentNameCaptor.getValue()).isEqualTo(CREDENTIAL_PROVIDER_COMPONENT);
         assertThat(mProviderRegistryGetSession.mCredentialEntries).hasSize(2);
@@ -245,8 +245,6 @@
                 ProviderRegistryGetSession.CREDENTIAL_ENTRY_KEY,
                 entryKey, providerPendingIntentResponse);
 
-        verify(mGetRequestSession).onProviderStatusChanged(statusCaptor.capture(),
-                cpComponentNameCaptor.capture());
         assertThat(statusCaptor.getValue()).isEqualTo(ProviderSession.Status.CREDENTIALS_RECEIVED);
         verify(mGetRequestSession).onFinalErrorReceived(cpComponentNameCaptor.capture(),
                 exceptionTypeCaptor.capture(), exceptionMessageCaptor.capture());
@@ -279,8 +277,6 @@
                 ProviderRegistryGetSession.CREDENTIAL_ENTRY_KEY,
                 entryKey, providerPendingIntentResponse);
 
-        verify(mGetRequestSession).onProviderStatusChanged(statusCaptor.capture(),
-                cpComponentNameCaptor.capture());
         assertThat(statusCaptor.getValue()).isEqualTo(ProviderSession.Status.CREDENTIALS_RECEIVED);
         verify(mGetRequestSession).onFinalErrorReceived(cpComponentNameCaptor.capture(),
                 exceptionTypeCaptor.capture(), exceptionMessageCaptor.capture());
@@ -313,8 +309,6 @@
                 ProviderRegistryGetSession.CREDENTIAL_ENTRY_KEY,
                 entryKey, providerPendingIntentResponse);
 
-        verify(mGetRequestSession).onProviderStatusChanged(statusCaptor.capture(),
-                cpComponentNameCaptor.capture());
         assertThat(statusCaptor.getValue()).isEqualTo(ProviderSession.Status.CREDENTIALS_RECEIVED);
         verify(mGetRequestSession).onFinalResponseReceived(cpComponentNameCaptor.capture(),
                 getCredentialResponseCaptor.capture());
diff --git a/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java b/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java
index fc25152..3bef413 100644
--- a/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java
@@ -126,7 +126,7 @@
                         return mClock::now;
                     }
 
-                }, // pass in test looper instead, pass in offsetable clock
+                }, // pass in test looper instead, pass in offsettable clock
                 () -> { }, mTestLooper.getLooper(), mSensorManager, lightSensor,
                 mBrightnessMappingStrategy, LIGHT_SENSOR_WARMUP_TIME, BRIGHTNESS_MIN_FLOAT,
                 BRIGHTNESS_MAX_FLOAT, DOZE_SCALE_FACTOR, LIGHT_SENSOR_RATE,
@@ -300,6 +300,179 @@
     }
 
     @Test
+    public void testShortTermModelTimesOut() throws Exception {
+        ArgumentCaptor<SensorEventListener> listenerCaptor =
+                ArgumentCaptor.forClass(SensorEventListener.class);
+        verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor),
+                eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
+        SensorEventListener listener = listenerCaptor.getValue();
+
+        // Sensor reads 123 lux,
+        listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 123));
+        // User sets brightness to 100
+        mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null,
+                /* brightness= */ 0.5f, /* userChangedBrightness= */ true, /* adjustment= */ 0,
+                /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT,
+                /* shouldResetShortTermModel= */ true);
+
+        when(mBrightnessMappingStrategy.getShortTermModelTimeout()).thenReturn(2000L);
+
+        mController.switchToIdleMode();
+        when(mIdleBrightnessMappingStrategy.isForIdleMode()).thenReturn(true);
+        when(mBrightnessMappingStrategy.shouldResetShortTermModel(
+                123f, 0.5f)).thenReturn(true);
+
+        // Sensor reads 1000 lux,
+        listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 1000));
+        mTestLooper.moveTimeForward(
+                mBrightnessMappingStrategy.getShortTermModelTimeout() + 1000);
+        mTestLooper.dispatchAll();
+
+        mController.switchToInteractiveScreenBrightnessMode();
+        mTestLooper.moveTimeForward(4000);
+        mTestLooper.dispatchAll();
+
+        // Verify only happens on the first configure. (i.e. not again when switching back)
+        // Intentionally using any() to ensure it's not called whatsoever.
+        verify(mBrightnessMappingStrategy, times(1))
+                .addUserDataPoint(123.0f, 0.5f);
+        verify(mBrightnessMappingStrategy, times(1))
+                .addUserDataPoint(anyFloat(), anyFloat());
+    }
+
+    @Test
+    public void testShortTermModelDoesntTimeOut() throws Exception {
+        ArgumentCaptor<SensorEventListener> listenerCaptor =
+                ArgumentCaptor.forClass(SensorEventListener.class);
+        verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor),
+                eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
+        SensorEventListener listener = listenerCaptor.getValue();
+
+        // Sensor reads 123 lux,
+        listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 123));
+        // User sets brightness to 100
+        mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */,
+                0.51f /* brightness= */, true /* userChangedBrightness= */, 0 /* adjustment= */,
+                false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT,
+                /* shouldResetShortTermModel= */ true);
+
+        when(mBrightnessMappingStrategy.shouldResetShortTermModel(
+                anyFloat(), anyFloat())).thenReturn(true);
+        when(mBrightnessMappingStrategy.getShortTermModelTimeout()).thenReturn(2000L);
+        when(mBrightnessMappingStrategy.getUserBrightness()).thenReturn(0.51f);
+        when(mBrightnessMappingStrategy.getUserLux()).thenReturn(123.0f);
+
+        mController.switchToIdleMode();
+        when(mIdleBrightnessMappingStrategy.isForIdleMode()).thenReturn(true);
+
+        // Time does not move forward, since clock is doesn't increment naturally.
+        mTestLooper.dispatchAll();
+
+        // Sensor reads 100000 lux,
+        listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 678910));
+        mController.switchToInteractiveScreenBrightnessMode();
+
+        // Verify short term model is not reset.
+        verify(mBrightnessMappingStrategy, never()).clearUserDataPoints();
+
+        // Verify that we add the data point once when the user sets it, and again when we return
+        // interactive mode.
+        verify(mBrightnessMappingStrategy, times(2))
+                .addUserDataPoint(123.0f, 0.51f);
+    }
+
+    @Test
+    public void testShortTermModelIsRestoredWhenSwitchingWithinTimeout() throws Exception {
+        ArgumentCaptor<SensorEventListener> listenerCaptor =
+                ArgumentCaptor.forClass(SensorEventListener.class);
+        verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor),
+                eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
+        SensorEventListener listener = listenerCaptor.getValue();
+
+        // Sensor reads 123 lux,
+        listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 123));
+        // User sets brightness to 100
+        mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null,
+                /* brightness= */ 0.5f, /* userChangedBrightness= */ true, /* adjustment= */ 0,
+                /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT,
+                /* shouldResetShortTermModel= */ true);
+
+        when(mBrightnessMappingStrategy.getShortTermModelTimeout()).thenReturn(2000L);
+        when(mBrightnessMappingStrategy.getUserBrightness()).thenReturn(0.5f);
+        when(mBrightnessMappingStrategy.getUserLux()).thenReturn(123f);
+
+        mController.switchToIdleMode();
+        when(mIdleBrightnessMappingStrategy.isForIdleMode()).thenReturn(true);
+        when(mIdleBrightnessMappingStrategy.getUserBrightness()).thenReturn(-1f);
+        when(mIdleBrightnessMappingStrategy.getUserLux()).thenReturn(-1f);
+        when(mBrightnessMappingStrategy.shouldResetShortTermModel(
+                123f, 0.5f)).thenReturn(true);
+
+        // Sensor reads 1000 lux,
+        listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 1000));
+        mTestLooper.moveTimeForward(
+                mBrightnessMappingStrategy.getShortTermModelTimeout() + 1000);
+        mTestLooper.dispatchAll();
+
+        mController.switchToInteractiveScreenBrightnessMode();
+        mTestLooper.moveTimeForward(4000);
+        mTestLooper.dispatchAll();
+
+        // Verify only happens on the first configure. (i.e. not again when switching back)
+        // Intentionally using any() to ensure it's not called whatsoever.
+        verify(mBrightnessMappingStrategy, times(1))
+                .addUserDataPoint(123.0f, 0.5f);
+        verify(mBrightnessMappingStrategy, times(1))
+                .addUserDataPoint(anyFloat(), anyFloat());
+    }
+
+    @Test
+    public void testShortTermModelNotRestoredAfterTimeout() throws Exception {
+        ArgumentCaptor<SensorEventListener> listenerCaptor =
+                ArgumentCaptor.forClass(SensorEventListener.class);
+        verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor),
+                eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
+        SensorEventListener listener = listenerCaptor.getValue();
+
+        // Sensor reads 123 lux,
+        listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 123));
+        // User sets brightness to 100
+        mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null,
+                /* brightness= */ 0.5f, /* userChangedBrightness= */ true, /* adjustment= */ 0,
+                /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT,
+                /* shouldResetShortTermModel= */ true);
+
+        when(mBrightnessMappingStrategy.getShortTermModelTimeout()).thenReturn(2000L);
+
+        when(mBrightnessMappingStrategy.getUserBrightness()).thenReturn(0.5f);
+        when(mBrightnessMappingStrategy.getUserLux()).thenReturn(123f);
+
+        mController.switchToIdleMode();
+        when(mIdleBrightnessMappingStrategy.isForIdleMode()).thenReturn(true);
+        when(mIdleBrightnessMappingStrategy.getUserBrightness()).thenReturn(-1f);
+        when(mIdleBrightnessMappingStrategy.getUserLux()).thenReturn(-1f);
+
+        when(mBrightnessMappingStrategy.shouldResetShortTermModel(
+                123f, 0.5f)).thenReturn(true);
+
+        // Sensor reads 1000 lux,
+        listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 1000));
+        // Do not fast-forward time.
+        mTestLooper.dispatchAll();
+
+        mController.switchToInteractiveScreenBrightnessMode();
+        // Do not fast-forward time
+        mTestLooper.dispatchAll();
+
+        // Verify this happens on the first configure and again when switching back
+        // Intentionally using any() to ensure it's not called any other times whatsoever.
+        verify(mBrightnessMappingStrategy, times(2))
+                .addUserDataPoint(123.0f, 0.5f);
+        verify(mBrightnessMappingStrategy, times(2))
+                .addUserDataPoint(anyFloat(), anyFloat());
+    }
+
+    @Test
     public void testSwitchToIdleMappingStrategy() throws Exception {
         ArgumentCaptor<SensorEventListener> listenerCaptor =
                 ArgumentCaptor.forClass(SensorEventListener.class);
@@ -326,6 +499,11 @@
         // Called once for init, and once when switching,
         // setAmbientLux() is called twice and once in updateAutoBrightness()
         verify(mBrightnessMappingStrategy, times(5)).isForIdleMode();
+        // Called when switching.
+        verify(mBrightnessMappingStrategy, times(1)).getShortTermModelTimeout();
+        verify(mBrightnessMappingStrategy, times(1)).getUserBrightness();
+        verify(mBrightnessMappingStrategy, times(1)).getUserLux();
+
         // Ensure, after switching, original BMS is not used anymore
         verifyNoMoreInteractions(mBrightnessMappingStrategy);
 
diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessThrottlerTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessThrottlerTest.java
index ffe2fec..46956d7 100644
--- a/services/tests/servicestests/src/com/android/server/display/BrightnessThrottlerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/BrightnessThrottlerTest.java
@@ -41,8 +41,8 @@
 
 import com.android.internal.os.BackgroundThread;
 import com.android.server.display.BrightnessThrottler.Injector;
-import com.android.server.display.DisplayDeviceConfig.BrightnessThrottlingData;
-import com.android.server.display.DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel;
+import com.android.server.display.DisplayDeviceConfig.ThermalBrightnessThrottlingData;
+import com.android.server.display.DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel;
 import com.android.server.display.mode.DisplayModeDirectorTest;
 
 import org.junit.Before;
@@ -54,6 +54,7 @@
 import org.mockito.MockitoAnnotations;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
 @SmallTest
@@ -92,7 +93,7 @@
     /////////////////
 
     @Test
-    public void testBrightnessThrottlingData() {
+    public void testThermalBrightnessThrottlingData() {
         List<ThrottlingLevel> singleLevel = new ArrayList<>();
         singleLevel.add(new ThrottlingLevel(PowerManager.THERMAL_STATUS_CRITICAL, 0.25f));
 
@@ -119,34 +120,32 @@
                 PowerManager.BRIGHTNESS_MAX + EPSILON));
 
         // Test invalid data
-        BrightnessThrottlingData data;
-        data = BrightnessThrottlingData.create((List<ThrottlingLevel>)null);
+        ThermalBrightnessThrottlingData data;
+        data = ThermalBrightnessThrottlingData.create((List<ThrottlingLevel>) null);
         assertEquals(data, null);
-        data = BrightnessThrottlingData.create((BrightnessThrottlingData)null);
+        data = ThermalBrightnessThrottlingData.create(new ArrayList<ThrottlingLevel>());
         assertEquals(data, null);
-        data = BrightnessThrottlingData.create(new ArrayList<ThrottlingLevel>());
+        data = ThermalBrightnessThrottlingData.create(unsortedThermalLevels);
         assertEquals(data, null);
-        data = BrightnessThrottlingData.create(unsortedThermalLevels);
+        data = ThermalBrightnessThrottlingData.create(unsortedBrightnessLevels);
         assertEquals(data, null);
-        data = BrightnessThrottlingData.create(unsortedBrightnessLevels);
+        data = ThermalBrightnessThrottlingData.create(unsortedLevels);
         assertEquals(data, null);
-        data = BrightnessThrottlingData.create(unsortedLevels);
-        assertEquals(data, null);
-        data = BrightnessThrottlingData.create(invalidLevel);
+        data = ThermalBrightnessThrottlingData.create(invalidLevel);
         assertEquals(data, null);
 
         // Test valid data
-        data = BrightnessThrottlingData.create(singleLevel);
+        data = ThermalBrightnessThrottlingData.create(singleLevel);
         assertNotEquals(data, null);
         assertThrottlingLevelsEquals(singleLevel, data.throttlingLevels);
 
-        data = BrightnessThrottlingData.create(validLevels);
+        data = ThermalBrightnessThrottlingData.create(validLevels);
         assertNotEquals(data, null);
         assertThrottlingLevelsEquals(validLevels, data.throttlingLevels);
     }
 
     @Test
-    public void testThrottlingUnsupported() throws Exception {
+    public void testThermalThrottlingUnsupported() {
         final BrightnessThrottler throttler = createThrottlerUnsupported();
         assertFalse(throttler.deviceSupportsThrottling());
 
@@ -158,13 +157,13 @@
     }
 
     @Test
-    public void testThrottlingSingleLevel() throws Exception {
+    public void testThermalThrottlingSingleLevel() throws Exception {
         final ThrottlingLevel level = new ThrottlingLevel(PowerManager.THERMAL_STATUS_CRITICAL,
             0.25f);
 
         List<ThrottlingLevel> levels = new ArrayList<>();
         levels.add(level);
-        final BrightnessThrottlingData data = BrightnessThrottlingData.create(levels);
+        final ThermalBrightnessThrottlingData data = ThermalBrightnessThrottlingData.create(levels);
         final BrightnessThrottler throttler = createThrottlerSupported(data);
         assertTrue(throttler.deviceSupportsThrottling());
 
@@ -213,7 +212,7 @@
     }
 
     @Test
-    public void testThrottlingMultiLevel() throws Exception {
+    public void testThermalThrottlingMultiLevel() throws Exception {
         final ThrottlingLevel levelLo = new ThrottlingLevel(PowerManager.THERMAL_STATUS_MODERATE,
             0.62f);
         final ThrottlingLevel levelHi = new ThrottlingLevel(PowerManager.THERMAL_STATUS_CRITICAL,
@@ -222,7 +221,7 @@
         List<ThrottlingLevel> levels = new ArrayList<>();
         levels.add(levelLo);
         levels.add(levelHi);
-        final BrightnessThrottlingData data = BrightnessThrottlingData.create(levels);
+        final ThermalBrightnessThrottlingData data = ThermalBrightnessThrottlingData.create(levels);
         final BrightnessThrottler throttler = createThrottlerSupported(data);
         assertTrue(throttler.deviceSupportsThrottling());
 
@@ -293,51 +292,32 @@
         assertEquals(BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE, throttler.getBrightnessMaxReason());
     }
 
-    @Test public void testUpdateThrottlingData() throws Exception {
+    @Test public void testUpdateThermalThrottlingData() throws Exception {
         // Initialise brightness throttling levels
         // Ensure that they are overridden by setting the data through device config.
         final ThrottlingLevel level = new ThrottlingLevel(PowerManager.THERMAL_STATUS_CRITICAL,
                 0.25f);
         List<ThrottlingLevel> levels = new ArrayList<>();
         levels.add(level);
-        final BrightnessThrottlingData data = BrightnessThrottlingData.create(levels);
-        mDeviceConfigFake.setBrightnessThrottlingData("123,1,critical,0.4");
+        final ThermalBrightnessThrottlingData data = ThermalBrightnessThrottlingData.create(levels);
+        mDeviceConfigFake.setThermalBrightnessThrottlingData("123,1,critical,0.4");
         final BrightnessThrottler throttler = createThrottlerSupported(data);
 
         verify(mThermalServiceMock).registerThermalEventListenerWithType(
                 mThermalEventListenerCaptor.capture(), eq(Temperature.TYPE_SKIN));
         final IThermalEventListener listener = mThermalEventListenerCaptor.getValue();
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.4f);
 
-        // Set status too low to trigger throttling
-        listener.notifyThrottling(getSkinTemp(level.thermalStatus - 1));
-        mTestLooper.dispatchAll();
-        assertEquals(PowerManager.BRIGHTNESS_MAX, throttler.getBrightnessCap(), 0f);
-        assertFalse(throttler.isThrottled());
-
-        // Set status high enough to trigger throttling
-        listener.notifyThrottling(getSkinTemp(level.thermalStatus));
-        mTestLooper.dispatchAll();
-        assertEquals(0.4f, throttler.getBrightnessCap(), 0f);
-        assertTrue(throttler.isThrottled());
-
-        // Update thresholds
-        // This data is equivalent to the string "123,1,critical,0.8", passed below
-        final ThrottlingLevel newLevel = new ThrottlingLevel(PowerManager.THERMAL_STATUS_CRITICAL,
-                0.8f);
         // Set new (valid) data from device config
-        mDeviceConfigFake.setBrightnessThrottlingData("123,1,critical,0.8");
+        mDeviceConfigFake.setThermalBrightnessThrottlingData("123,1,critical,0.8");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.8f);
 
-        // Set status too low to trigger throttling
-        listener.notifyThrottling(getSkinTemp(newLevel.thermalStatus - 1));
-        mTestLooper.dispatchAll();
-        assertEquals(PowerManager.BRIGHTNESS_MAX, throttler.getBrightnessCap(), 0f);
-        assertFalse(throttler.isThrottled());
-
-        // Set status high enough to trigger throttling
-        listener.notifyThrottling(getSkinTemp(newLevel.thermalStatus));
-        mTestLooper.dispatchAll();
-        assertEquals(newLevel.brightness, throttler.getBrightnessCap(), 0f);
-        assertTrue(throttler.isThrottled());
+        mDeviceConfigFake.setThermalBrightnessThrottlingData(
+                "123,1,critical,0.75;123,1,critical,0.99,id_2");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.75f);
+        mDeviceConfigFake.setThermalBrightnessThrottlingData(
+                "123,1,critical,0.8,default;123,1,critical,0.99,id_2");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.8f);
     }
 
     @Test public void testInvalidThrottlingStrings() throws Exception {
@@ -347,33 +327,54 @@
                 0.25f);
         List<ThrottlingLevel> levels = new ArrayList<>();
         levels.add(level);
-        final BrightnessThrottlingData data = BrightnessThrottlingData.create(levels);
+        final ThermalBrightnessThrottlingData data = ThermalBrightnessThrottlingData.create(levels);
         final BrightnessThrottler throttler = createThrottlerSupported(data);
         verify(mThermalServiceMock).registerThermalEventListenerWithType(
                 mThermalEventListenerCaptor.capture(), eq(Temperature.TYPE_SKIN));
         final IThermalEventListener listener = mThermalEventListenerCaptor.getValue();
 
         // None of these are valid so shouldn't override the original data
-        mDeviceConfigFake.setBrightnessThrottlingData("321,1,critical,0.4");  // Not the current id
-        testThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
-        mDeviceConfigFake.setBrightnessThrottlingData("123,0,critical,0.4");  // Incorrect number
-        testThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
-        mDeviceConfigFake.setBrightnessThrottlingData("123,2,critical,0.4");  // Incorrect number
-        testThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
-        mDeviceConfigFake.setBrightnessThrottlingData("123,1,invalid,0.4");   // Invalid level
-        testThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
-        mDeviceConfigFake.setBrightnessThrottlingData("123,1,critical,none"); // Invalid brightness
-        testThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
-        mDeviceConfigFake.setBrightnessThrottlingData("123,1,critical,-3");   // Invalid brightness
-        testThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
-        mDeviceConfigFake.setBrightnessThrottlingData("invalid string");      // Invalid format
-        testThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
-        mDeviceConfigFake.setBrightnessThrottlingData("");                    // Invalid format
-        testThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
+
+        // Not the current id
+        mDeviceConfigFake.setThermalBrightnessThrottlingData("321,1,critical,0.4");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
+        // Incorrect number
+        mDeviceConfigFake.setThermalBrightnessThrottlingData("123,0,critical,0.4");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
+        // Incorrect number
+        mDeviceConfigFake.setThermalBrightnessThrottlingData("123,2,critical,0.4");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
+        // Invalid level
+        mDeviceConfigFake.setThermalBrightnessThrottlingData("123,1,invalid,0.4");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
+        // Invalid brightness
+        mDeviceConfigFake.setThermalBrightnessThrottlingData("123,1,critical,none");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
+        // Invalid brightness
+        mDeviceConfigFake.setThermalBrightnessThrottlingData("123,1,critical,-3");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
+        // Invalid format
+        mDeviceConfigFake.setThermalBrightnessThrottlingData("invalid string");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
+        // Invalid format
+        mDeviceConfigFake.setThermalBrightnessThrottlingData("");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
+        // Invalid string format
+        mDeviceConfigFake.setThermalBrightnessThrottlingData(
+                "123,default,1,critical,0.75,1,critical,0.99");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
+        // Invalid level string and number string
+        mDeviceConfigFake.setThermalBrightnessThrottlingData(
+                "123,1,1,critical,0.75,id_2,1,critical,0.99");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
+        // Invalid format - (two default ids for same display)
+        mDeviceConfigFake.setThermalBrightnessThrottlingData(
+                "123,1,critical,0.75,default;123,1,critical,0.99");
+        testThermalThrottling(throttler, listener, PowerManager.BRIGHTNESS_MAX, 0.25f);
     }
 
-    private void testThrottling(BrightnessThrottler throttler, IThermalEventListener listener,
-            float tooLowCap, float tooHighCap) throws Exception {
+    private void testThermalThrottling(BrightnessThrottler throttler,
+            IThermalEventListener listener, float tooLowCap, float tooHighCap) throws Exception {
         final ThrottlingLevel level = new ThrottlingLevel(PowerManager.THERMAL_STATUS_CRITICAL,
                 tooHighCap);
 
@@ -396,7 +397,7 @@
                 0.25f);
         List<ThrottlingLevel> levels = new ArrayList<>();
         levels.add(level);
-        final BrightnessThrottlingData data = BrightnessThrottlingData.create(levels);
+        final ThermalBrightnessThrottlingData data = ThermalBrightnessThrottlingData.create(levels);
 
         // These are identical to the string set below
         final ThrottlingLevel levelSevere = new ThrottlingLevel(PowerManager.THERMAL_STATUS_SEVERE,
@@ -406,7 +407,7 @@
         final ThrottlingLevel levelEmergency = new ThrottlingLevel(
                 PowerManager.THERMAL_STATUS_EMERGENCY, 0.1f);
 
-        mDeviceConfigFake.setBrightnessThrottlingData(
+        mDeviceConfigFake.setThermalBrightnessThrottlingData(
                 "123,3,severe,0.9,critical,0.5,emergency,0.1");
         final BrightnessThrottler throttler = createThrottlerSupported(data);
 
@@ -472,13 +473,18 @@
     }
 
     private BrightnessThrottler createThrottlerUnsupported() {
-        return new BrightnessThrottler(mInjectorMock, mHandler, mHandler, null, () -> {}, null);
+        return new BrightnessThrottler(mInjectorMock, mHandler, mHandler,
+                /* throttlingChangeCallback= */ () -> {}, /* uniqueDisplayId= */ null,
+                /* thermalThrottlingDataId= */ null,
+                /* thermalThrottlingDataMap= */ new HashMap<>(1));
     }
 
-    private BrightnessThrottler createThrottlerSupported(BrightnessThrottlingData data) {
+    private BrightnessThrottler createThrottlerSupported(ThermalBrightnessThrottlingData data) {
         assertNotNull(data);
+        HashMap<String, ThermalBrightnessThrottlingData> throttlingDataMap = new HashMap<>(1);
+        throttlingDataMap.put("default", data);
         return new BrightnessThrottler(mInjectorMock, mHandler, BackgroundThread.getHandler(),
-                data, () -> {}, "123");
+                () -> {}, "123", "default", throttlingDataMap);
     }
 
     private Temperature getSkinTemp(@ThrottlingStatus int status) {
diff --git a/services/tests/servicestests/src/com/android/server/display/DeviceStateToLayoutMapTest.java b/services/tests/servicestests/src/com/android/server/display/DeviceStateToLayoutMapTest.java
index a7d3df9..130e6ad 100644
--- a/services/tests/servicestests/src/com/android/server/display/DeviceStateToLayoutMapTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DeviceStateToLayoutMapTest.java
@@ -84,11 +84,11 @@
     }
 
     @Test
-    public void testBrightnessThrottlingMapId() {
+    public void testThermalBrightnessThrottlingMapId() {
         Layout configLayout = mDeviceStateToLayoutMap.get(2);
 
-        assertEquals("concurrent1", configLayout.getAt(0).getBrightnessThrottlingMapId());
-        assertEquals("concurrent2", configLayout.getAt(1).getBrightnessThrottlingMapId());
+        assertEquals("concurrent1", configLayout.getAt(0).getThermalBrightnessThrottlingMapId());
+        assertEquals("concurrent2", configLayout.getAt(1).getThermalBrightnessThrottlingMapId());
     }
 
     @Test
@@ -108,7 +108,7 @@
     }
 
     @Test
-    public void testRefreshRateThermalThrottlingMapId() {
+    public void testThermalRefreshRateThrottlingMapId() {
         Layout configLayout = mDeviceStateToLayoutMap.get(4);
 
         assertEquals("test2", configLayout.getAt(0).getRefreshRateThermalThrottlingMapId());
@@ -124,12 +124,14 @@
                 /* isDefault= */ true, /* isEnabled= */ true, /* displayGroupName= */ null,
                 mDisplayIdProducerMock,  Layout.Display.POSITION_FRONT, Display.DEFAULT_DISPLAY,
                 /* brightnessThrottlingMapId= */ "brightness1",
-                /* refreshRateZoneId= */ "zone1", /* refreshRateThermalThrottlingMapId= */ "rr1");
+                /* refreshRateZoneId= */ "zone1",
+                /* refreshRateThermalThrottlingMapId= */ "rr1");
         testLayout.createDisplayLocked(DisplayAddress.fromPhysicalDisplayId(678L),
                 /* isDefault= */ false, /* isEnabled= */ false, /* displayGroupName= */ "group1",
                 mDisplayIdProducerMock, Layout.Display.POSITION_REAR, Display.DEFAULT_DISPLAY,
                 /* brightnessThrottlingMapId= */ "brightness2",
-                /* refreshRateZoneId= */ "zone2", /* refreshRateThermalThrottlingMapId= */ "rr2");
+                /* refreshRateZoneId= */ "zone2",
+                /* refreshRateThermalThrottlingMapId= */ "rr2");
 
         assertEquals(testLayout, configLayout);
     }
@@ -147,7 +149,8 @@
         layout.createDisplayLocked(DisplayAddress.fromPhysicalDisplayId(id), /* isDefault= */ false,
                 enabled, group, mDisplayIdProducerMock, Layout.Display.POSITION_UNKNOWN,
                 Display.DEFAULT_DISPLAY, /* brightnessThrottlingMapId= */ null,
-                /* refreshRateZoneId= */ null, /* refreshRateThermalThrottlingMapId= */ null);
+                /* refreshRateZoneId= */ null,
+                /* refreshRateThermalThrottlingMapId= */ null);
     }
 
     private void setupDeviceStateToLayoutMap() throws IOException {
diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java
index 9fd647b..5837b21 100644
--- a/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java
@@ -50,6 +50,7 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
 @SmallTest
@@ -186,50 +187,72 @@
         assertArrayEquals(new int[]{-1, 10, 20, 30, 40},
                 mDisplayDeviceConfig.getScreenOffBrightnessSensorValueToLux());
 
-        List<DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel> throttlingLevels =
-                new ArrayList();
-        throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
+        List<DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel>
+                defaultThrottlingLevels = new ArrayList<>();
+        defaultThrottlingLevels.add(
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel(
                 DisplayDeviceConfig.convertThermalStatus(ThermalStatus.light), 0.4f
         ));
-        throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
+        defaultThrottlingLevels.add(
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel(
                 DisplayDeviceConfig.convertThermalStatus(ThermalStatus.moderate), 0.3f
         ));
-        throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
+        defaultThrottlingLevels.add(
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel(
                 DisplayDeviceConfig.convertThermalStatus(ThermalStatus.severe), 0.2f
         ));
-        throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
+        defaultThrottlingLevels.add(
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel(
                 DisplayDeviceConfig.convertThermalStatus(ThermalStatus.critical), 0.1f
         ));
-        throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
+        defaultThrottlingLevels.add(
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel(
                 DisplayDeviceConfig.convertThermalStatus(ThermalStatus.emergency), 0.05f
         ));
-        throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
+        defaultThrottlingLevels.add(
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel(
                 DisplayDeviceConfig.convertThermalStatus(ThermalStatus.shutdown), 0.025f
         ));
-        assertEquals(new DisplayDeviceConfig.BrightnessThrottlingData(throttlingLevels),
-                mDisplayDeviceConfig.getBrightnessThrottlingData("default"));
 
-        throttlingLevels.clear();
-        throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
+        DisplayDeviceConfig.ThermalBrightnessThrottlingData defaultThrottlingData =
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData(defaultThrottlingLevels);
+
+        List<DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel>
+                concurrentThrottlingLevels = new ArrayList<>();
+        concurrentThrottlingLevels.add(
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel(
                 DisplayDeviceConfig.convertThermalStatus(ThermalStatus.light), 0.2f
         ));
-        throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
+        concurrentThrottlingLevels.add(
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel(
                 DisplayDeviceConfig.convertThermalStatus(ThermalStatus.moderate), 0.15f
         ));
-        throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
+        concurrentThrottlingLevels.add(
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel(
                 DisplayDeviceConfig.convertThermalStatus(ThermalStatus.severe), 0.1f
         ));
-        throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
+        concurrentThrottlingLevels.add(
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel(
                 DisplayDeviceConfig.convertThermalStatus(ThermalStatus.critical), 0.05f
         ));
-        throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
+        concurrentThrottlingLevels.add(
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel(
                 DisplayDeviceConfig.convertThermalStatus(ThermalStatus.emergency), 0.025f
         ));
-        throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
+        concurrentThrottlingLevels.add(
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel(
                 DisplayDeviceConfig.convertThermalStatus(ThermalStatus.shutdown), 0.0125f
         ));
-        assertEquals(new DisplayDeviceConfig.BrightnessThrottlingData(throttlingLevels),
-                mDisplayDeviceConfig.getBrightnessThrottlingData("concurrent"));
+        DisplayDeviceConfig.ThermalBrightnessThrottlingData concurrentThrottlingData =
+                new DisplayDeviceConfig.ThermalBrightnessThrottlingData(concurrentThrottlingLevels);
+
+        HashMap<String, DisplayDeviceConfig.ThermalBrightnessThrottlingData> throttlingDataMap =
+                new HashMap<>(2);
+        throttlingDataMap.put("default", defaultThrottlingData);
+        throttlingDataMap.put("concurrent", concurrentThrottlingData);
+
+        assertEquals(throttlingDataMap,
+                mDisplayDeviceConfig.getThermalBrightnessThrottlingDataMapByThrottlingId());
 
         assertNotNull(mDisplayDeviceConfig.getHostUsiVersion());
         assertEquals(mDisplayDeviceConfig.getHostUsiVersion().getMajorVersion(), 2);
@@ -246,8 +269,7 @@
                 mDisplayDeviceConfig.getHdrBrightnessFromSdr(0.62f, 1.25f),
                 SMALL_DELTA);
 
-
-        // Todo: Add asserts for BrightnessThrottlingData, DensityMapping,
+        // Todo: Add asserts for DensityMapping,
         // HighBrightnessModeData AmbientLightSensor, RefreshRateLimitations and ProximitySensor.
     }
 
@@ -329,16 +351,16 @@
         assertArrayEquals(mDisplayDeviceConfig.getHighAmbientBrightnessThresholds(),
                 HIGH_AMBIENT_THRESHOLD_OF_PEAK_REFRESH_RATE);
 
-        // Todo: Add asserts for BrightnessThrottlingData, DensityMapping,
+        // Todo: Add asserts for ThermalBrightnessThrottlingData, DensityMapping,
         // HighBrightnessModeData AmbientLightSensor, RefreshRateLimitations and ProximitySensor.
     }
 
     @Test
-    public void testRefreshRateThermalThrottlingFromDisplayConfig() throws IOException {
+    public void testThermalRefreshRateThrottlingFromDisplayConfig() throws IOException {
         setupDisplayDeviceConfigFromDisplayConfigFile();
 
         SparseArray<SurfaceControl.RefreshRateRange> defaultMap =
-                mDisplayDeviceConfig.getRefreshRateThrottlingData(null);
+                mDisplayDeviceConfig.getThermalRefreshRateThrottlingData(null);
         assertNotNull(defaultMap);
         assertEquals(2, defaultMap.size());
         assertEquals(30, defaultMap.get(Temperature.THROTTLING_CRITICAL).min, SMALL_DELTA);
@@ -347,7 +369,7 @@
         assertEquals(30, defaultMap.get(Temperature.THROTTLING_SHUTDOWN).max, SMALL_DELTA);
 
         SparseArray<SurfaceControl.RefreshRateRange> testMap =
-                mDisplayDeviceConfig.getRefreshRateThrottlingData("test");
+                mDisplayDeviceConfig.getThermalRefreshRateThrottlingData("test");
         assertNotNull(testMap);
         assertEquals(1, testMap.size());
         assertEquals(60, testMap.get(Temperature.THROTTLING_EMERGENCY).min, SMALL_DELTA);
diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
index b5237a5..acfc073 100644
--- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
@@ -37,6 +37,7 @@
 import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doReturn;
@@ -289,7 +290,7 @@
     }
 
     @Test
-    public void testCreateVirtualDisplay_sentToInputManager() {
+    public void testCreateVirtualDisplay_sentToInputManager() throws RemoteException {
         // This is to update the display device config such that DisplayManagerService can ignore
         // the usage of SensorManager, which is available only after the PowerManagerService
         // is ready.
@@ -316,7 +317,8 @@
         builder.setFlags(flags);
         int displayId = bs.createVirtualDisplay(builder.build(), mMockAppToken /* callback */,
                 null /* projection */, PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
 
         displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class));
 
@@ -442,7 +444,8 @@
         builder.setUniqueId(uniqueId);
         int displayId = bs.createVirtualDisplay(builder.build(), mMockAppToken /* callback */,
                 null /* projection */, PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
 
         displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class));
 
@@ -455,7 +458,7 @@
     }
 
     @Test
-    public void testCreateVirtualDisplayOwnFocus() {
+    public void testCreateVirtualDisplayOwnFocus() throws RemoteException {
         DisplayManagerService displayManager =
                 new DisplayManagerService(mContext, mBasicInjector);
         registerDefaultDisplays(displayManager);
@@ -479,7 +482,8 @@
         builder.setUniqueId(uniqueId);
         int displayId = bs.createVirtualDisplay(builder.build(), /* callback= */ mMockAppToken,
                 /* projection= */ null, PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
 
         displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class));
 
@@ -492,7 +496,7 @@
     }
 
     @Test
-    public void testCreateVirtualDisplayOwnFocus_nonTrustedDisplay() {
+    public void testCreateVirtualDisplayOwnFocus_nonTrustedDisplay() throws RemoteException {
         DisplayManagerService displayManager =
                 new DisplayManagerService(mContext, mBasicInjector);
         registerDefaultDisplays(displayManager);
@@ -513,7 +517,8 @@
         builder.setUniqueId(uniqueId);
         int displayId = bs.createVirtualDisplay(builder.build(), /* callback= */ mMockAppToken,
                 /* projection= */ null, PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
 
         displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class));
 
@@ -755,7 +760,8 @@
         builder.setUniqueId(uniqueId);
         final int firstDisplayId = binderService.createVirtualDisplay(builder.build(),
                 mMockAppToken /* callback */, null /* projection */, PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
 
         // The second virtual display requests to mirror the first virtual display.
         final String uniqueId2 = "uniqueId --- displayIdToMirrorTest #2";
@@ -767,7 +773,8 @@
         final int secondDisplayId = binderService.createVirtualDisplay(builder2.build(),
                 mMockAppToken2 /* callback */, null /* projection */,
                 PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
         displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class));
 
         // flush the handler
@@ -805,7 +812,8 @@
                         virtualDevice /* virtualDeviceToken */,
                         mock(DisplayWindowPolicyController.class),
                         PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
         int displayGroupId1 = localService.getDisplayInfo(displayId1).displayGroupId;
 
         // Create a second virtual display. This should be added to the previously created display
@@ -821,7 +829,8 @@
                         virtualDevice /* virtualDeviceToken */,
                         mock(DisplayWindowPolicyController.class),
                         PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
         int displayGroupId2 = localService.getDisplayInfo(displayId2).displayGroupId;
 
         assertEquals(
@@ -859,7 +868,8 @@
                         virtualDevice /* virtualDeviceToken */,
                         mock(DisplayWindowPolicyController.class),
                         PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
         int displayGroupId1 = localService.getDisplayInfo(displayId1).displayGroupId;
 
         // Create a second virtual display. With the flag VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP,
@@ -878,7 +888,8 @@
                         virtualDevice /* virtualDeviceToken */,
                         mock(DisplayWindowPolicyController.class),
                         PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
         int displayGroupId2 = localService.getDisplayInfo(displayId2).displayGroupId;
 
         assertNotEquals(
@@ -922,7 +933,8 @@
                         virtualDevice /* virtualDeviceToken */,
                         mock(DisplayWindowPolicyController.class),
                         PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
 
         // Check that FLAG_ALWAYS_UNLOCKED is set.
         assertNotEquals(
@@ -948,7 +960,8 @@
                         virtualDevice /* virtualDeviceToken */,
                         mock(DisplayWindowPolicyController.class),
                         PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
 
         // Check that FLAG_ALWAYS_UNLOCKED is set.
         assertNotEquals(
@@ -972,7 +985,8 @@
                         null /* virtualDeviceToken */,
                         mock(DisplayWindowPolicyController.class),
                         PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
 
         // Check that FLAG_ALWAYS_UNLOCKED is not set.
         assertEquals(
@@ -1004,7 +1018,8 @@
                 .setFlags(VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY);
         final int firstDisplayId = binderService.createVirtualDisplay(builder.build(),
                 mMockAppToken /* callback */, null /* projection */, PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
 
         // The second virtual display requests to mirror the first virtual display.
         final String uniqueId2 = "uniqueId --- displayIdToMirrorTest #2";
@@ -1016,7 +1031,8 @@
         final int secondDisplayId = binderService.createVirtualDisplay(builder2.build(),
                 mMockAppToken2 /* callback */, null /* projection */,
                 PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
         displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class));
 
         // flush the handler
@@ -1032,14 +1048,50 @@
     }
 
     @Test
+    public void testCreateVirtualDisplay_isValidProjection_notValid()
+            throws RemoteException {
+        when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
+        IMediaProjection projection = mock(IMediaProjection.class);
+        doReturn(false).when(projection).isValid();
+        when(mMockProjectionService
+                .setContentRecordingSession(any(ContentRecordingSession.class), eq(projection)))
+                .thenReturn(true);
+        doReturn(true).when(mMockProjectionService).isCurrentProjection(eq(projection));
+
+        final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(
+                VIRTUAL_DISPLAY_NAME, 600, 800, 320);
+        builder.setUniqueId("uniqueId --- isValid false");
+
+        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
+        registerDefaultDisplays(displayManager);
+        displayManager.windowManagerAndInputReady();
+
+        // Pass in a non-null projection.
+        DisplayManagerService.BinderService binderService = displayManager.new BinderService();
+        final int displayId = binderService.createVirtualDisplay(builder.build(),
+                mMockAppToken /* callback */, projection, PACKAGE_NAME);
+
+        // VirtualDisplay is created for mirroring.
+        assertThat(displayId).isNotEqualTo(Display.INVALID_DISPLAY);
+        verify(mMockProjectionService, atLeastOnce()).setContentRecordingSession(
+                any(ContentRecordingSession.class), nullable(IMediaProjection.class));
+        // But mirroring doesn't begin.
+        verify(mMockProjectionService, atLeastOnce()).setContentRecordingSession(
+                mContentRecordingSessionCaptor.capture(), nullable(IMediaProjection.class));
+        ContentRecordingSession session = mContentRecordingSessionCaptor.getValue();
+        assertThat(session.isWaitingToRecord()).isTrue();
+    }
+
+    @Test
     public void testCreateVirtualDisplay_setContentRecordingSessionSuccess()
             throws RemoteException {
         final int displayToRecord = 50;
         when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
-        when(mMockWindowManagerInternal
-                .setContentRecordingSession(any(ContentRecordingSession.class)))
-                .thenReturn(true);
         IMediaProjection projection = mock(IMediaProjection.class);
+        doReturn(true).when(projection).isValid();
+        when(mMockProjectionService
+                .setContentRecordingSession(any(ContentRecordingSession.class), eq(projection)))
+                .thenReturn(true);
         doReturn(true).when(mMockProjectionService).isCurrentProjection(eq(projection));
 
         final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(
@@ -1056,21 +1108,23 @@
                 mMockAppToken /* callback */, projection, PACKAGE_NAME);
 
         assertThat(displayId).isNotEqualTo(Display.INVALID_DISPLAY);
-        verify(mMockWindowManagerInternal, atLeastOnce()).setContentRecordingSession(
-                mContentRecordingSessionCaptor.capture());
+        verify(mMockProjectionService, atLeastOnce()).setContentRecordingSession(
+                mContentRecordingSessionCaptor.capture(), nullable(IMediaProjection.class));
         ContentRecordingSession session = mContentRecordingSessionCaptor.getValue();
         assertThat(session.getContentToRecord()).isEqualTo(RECORD_CONTENT_DISPLAY);
         assertThat(session.getVirtualDisplayId()).isEqualTo(displayId);
         assertThat(session.getDisplayToRecord()).isEqualTo(displayToRecord);
+        assertThat(session.isWaitingToRecord()).isFalse();
     }
 
     @Test
     public void testCreateVirtualDisplay_setContentRecordingSessionFail() throws RemoteException {
         when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
-        when(mMockWindowManagerInternal
-                .setContentRecordingSession(any(ContentRecordingSession.class)))
-                .thenReturn(false);
         IMediaProjection projection = mock(IMediaProjection.class);
+        doReturn(true).when(projection).isValid();
+        when(mMockProjectionService
+                .setContentRecordingSession(any(ContentRecordingSession.class), eq(projection)))
+                .thenReturn(false);
         doReturn(true).when(mMockProjectionService).isCurrentProjection(eq(projection));
 
         final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(
@@ -1093,12 +1147,12 @@
             throws RemoteException {
         final int displayToRecord = 50;
         when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
-        when(mMockWindowManagerInternal
-                .setContentRecordingSession(any(ContentRecordingSession.class)))
-                .thenReturn(true);
         IMediaProjection projection = mock(IMediaProjection.class);
+        doReturn(true).when(projection).isValid();
+        when(mMockProjectionService
+                .setContentRecordingSession(any(ContentRecordingSession.class), eq(projection)))
+                .thenReturn(true);
         doReturn(mock(IBinder.class)).when(projection).getLaunchCookie();
-
         doReturn(true).when(mMockProjectionService).isCurrentProjection(eq(projection));
 
         final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(
@@ -1115,8 +1169,8 @@
                 mMockAppToken /* callback */, projection, PACKAGE_NAME);
 
         assertThat(displayId).isNotEqualTo(Display.INVALID_DISPLAY);
-        verify(mMockWindowManagerInternal, atLeastOnce()).setContentRecordingSession(
-                mContentRecordingSessionCaptor.capture());
+        verify(mMockProjectionService, atLeastOnce()).setContentRecordingSession(
+                mContentRecordingSessionCaptor.capture(), nullable(IMediaProjection.class));
         ContentRecordingSession session = mContentRecordingSessionCaptor.getValue();
         assertThat(session.getContentToRecord()).isEqualTo(RECORD_CONTENT_TASK);
         assertThat(session.getVirtualDisplayId()).isEqualTo(displayId);
@@ -1124,7 +1178,8 @@
     }
 
     @Test
-    public void testCreateVirtualDisplay_setContentRecordingSession_noProjection_noFlags() {
+    public void testCreateVirtualDisplay_setContentRecordingSession_noProjection_noFlags()
+            throws RemoteException {
         when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
 
         // Set no flags for the VirtualDisplay.
@@ -1143,12 +1198,13 @@
 
         // VirtualDisplay is created but not for mirroring.
         assertThat(displayId).isNotEqualTo(Display.INVALID_DISPLAY);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(
-                any(ContentRecordingSession.class));
+        verify(mMockProjectionService, never()).setContentRecordingSession(
+                any(ContentRecordingSession.class), nullable(IMediaProjection.class));
     }
 
     @Test
-    public void testCreateVirtualDisplay_setContentRecordingSession_noProjection_noMirroringFlag() {
+    public void testCreateVirtualDisplay_setContentRecordingSession_noProjection_noMirroringFlag()
+            throws RemoteException {
         when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
 
         // Set a non-mirroring flag for the VirtualDisplay.
@@ -1168,18 +1224,19 @@
 
         // VirtualDisplay is created but not for mirroring.
         assertThat(displayId).isNotEqualTo(Display.INVALID_DISPLAY);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(
-                any(ContentRecordingSession.class));
+        verify(mMockProjectionService, never()).setContentRecordingSession(
+                any(ContentRecordingSession.class), nullable(IMediaProjection.class));
     }
 
     @Test
     public void testCreateVirtualDisplay_setContentRecordingSession_projection_noMirroringFlag()
             throws RemoteException {
         when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
-        when(mMockWindowManagerInternal
-                .setContentRecordingSession(any(ContentRecordingSession.class)))
-                .thenReturn(true);
         IMediaProjection projection = mock(IMediaProjection.class);
+        doReturn(true).when(projection).isValid();
+        when(mMockProjectionService
+                .setContentRecordingSession(any(ContentRecordingSession.class), eq(projection)))
+                .thenReturn(true);
         doReturn(true).when(mMockProjectionService).isCurrentProjection(eq(projection));
 
         // Set no flags for the VirtualDisplay.
@@ -1198,8 +1255,8 @@
 
         // VirtualDisplay is created for mirroring.
         assertThat(displayId).isNotEqualTo(Display.INVALID_DISPLAY);
-        verify(mMockWindowManagerInternal, atLeastOnce()).setContentRecordingSession(
-                any(ContentRecordingSession.class));
+        verify(mMockProjectionService, atLeastOnce()).setContentRecordingSession(
+                any(ContentRecordingSession.class), nullable(IMediaProjection.class));
     }
 
     /**
@@ -1228,7 +1285,8 @@
         builder.setUniqueId(uniqueId);
         final int displayId = binderService.createVirtualDisplay(builder.build(),
                 mMockAppToken /* callback */, null /* projection */, PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
 
         displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class));
 
@@ -1243,7 +1301,8 @@
      * ADD_TRUSTED_DISPLAY is granted.
      */
     @Test
-    public void testOwnDisplayGroup_allowCreationWithAddTrustedDisplayPermission() {
+    public void testOwnDisplayGroup_allowCreationWithAddTrustedDisplayPermission()
+            throws RemoteException {
         DisplayManagerService displayManager =
                 new DisplayManagerService(mContext, mBasicInjector);
         registerDefaultDisplays(displayManager);
@@ -1261,7 +1320,8 @@
 
         int displayId = bs.createVirtualDisplay(builder.build(), mMockAppToken /* callback */,
                 null /* projection */, PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
         displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class));
         displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */);
         DisplayDeviceInfo ddi = displayManager.getDisplayDeviceInfoInternal(displayId);
@@ -1329,7 +1389,8 @@
         int displayId = localService.createVirtualDisplay(builder.build(),
                 mMockAppToken /* callback */, virtualDevice /* virtualDeviceToken */,
                 mock(DisplayWindowPolicyController.class), PACKAGE_NAME);
-        verify(mMockWindowManagerInternal, never()).setContentRecordingSession(Mockito.any());
+        verify(mMockProjectionService, never()).setContentRecordingSession(any(),
+                nullable(IMediaProjection.class));
         displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class));
         displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */);
         DisplayDeviceInfo ddi = displayManager.getDisplayDeviceInfoInternal(displayId);
diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java
index 567548e..7536c79 100644
--- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java
@@ -649,9 +649,9 @@
         assertEquals(0, mLogicalDisplayMapper.getDisplayLocked(device2)
                 .getLeadDisplayIdLocked());
         assertEquals("concurrent", mLogicalDisplayMapper.getDisplayLocked(device1)
-                .getBrightnessThrottlingDataIdLocked());
+                .getThermalBrightnessThrottlingDataIdLocked());
         assertEquals("concurrent", mLogicalDisplayMapper.getDisplayLocked(device2)
-                .getBrightnessThrottlingDataIdLocked());
+                .getThermalBrightnessThrottlingDataIdLocked());
 
         mLogicalDisplayMapper.setDeviceStateLocked(1, false);
         advanceTime(1000);
@@ -661,10 +661,10 @@
         assertFalse(mLogicalDisplayMapper.getDisplayLocked(device2).isInTransitionLocked());
         assertEquals(DisplayDeviceConfig.DEFAULT_ID,
                 mLogicalDisplayMapper.getDisplayLocked(device1)
-                        .getBrightnessThrottlingDataIdLocked());
+                        .getThermalBrightnessThrottlingDataIdLocked());
         assertEquals(DisplayDeviceConfig.DEFAULT_ID,
                 mLogicalDisplayMapper.getDisplayLocked(device2)
-                        .getBrightnessThrottlingDataIdLocked());
+                        .getThermalBrightnessThrottlingDataIdLocked());
 
         mLogicalDisplayMapper.setDeviceStateLocked(2, false);
         advanceTime(1000);
@@ -674,10 +674,10 @@
         assertFalse(mLogicalDisplayMapper.getDisplayLocked(device2).isInTransitionLocked());
         assertEquals(DisplayDeviceConfig.DEFAULT_ID,
                 mLogicalDisplayMapper.getDisplayLocked(device1)
-                        .getBrightnessThrottlingDataIdLocked());
+                        .getThermalBrightnessThrottlingDataIdLocked());
         assertEquals(DisplayDeviceConfig.DEFAULT_ID,
                 mLogicalDisplayMapper.getDisplayLocked(device2)
-                        .getBrightnessThrottlingDataIdLocked());
+                        .getThermalBrightnessThrottlingDataIdLocked());
     }
 
     @Test
@@ -863,7 +863,7 @@
         layout.createDisplayLocked(address, /* isDefault= */ false, enabled, group, mIdProducer,
                 Layout.Display.POSITION_UNKNOWN, Display.DEFAULT_DISPLAY,
                 /* brightnessThrottlingMapId= */ null, /* refreshRateZoneId= */ null,
-                /* refreshRateThrottlingMapId= */ null);
+                /* refreshRateThermalThrottlingMapId= */ null);
     }
 
     private void advanceTime(long timeMs) {
diff --git a/services/tests/servicestests/src/com/android/server/display/mode/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/mode/DisplayModeDirectorTest.java
index db5a469..6907145 100644
--- a/services/tests/servicestests/src/com/android/server/display/mode/DisplayModeDirectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/mode/DisplayModeDirectorTest.java
@@ -2583,7 +2583,7 @@
                     KEY_REFRESH_RATE_IN_HBM_HDR, String.valueOf(fps));
         }
 
-        public void setBrightnessThrottlingData(String brightnessThrottlingData) {
+        public void setThermalBrightnessThrottlingData(String brightnessThrottlingData) {
             putPropertyAndNotify(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
                     KEY_BRIGHTNESS_THROTTLING_DATA, brightnessThrottlingData);
         }
diff --git a/services/tests/servicestests/src/com/android/server/input/KeyboardBacklightControllerTests.kt b/services/tests/servicestests/src/com/android/server/input/KeyboardBacklightControllerTests.kt
index 1d23e12..00eb80d 100644
--- a/services/tests/servicestests/src/com/android/server/input/KeyboardBacklightControllerTests.kt
+++ b/services/tests/servicestests/src/com/android/server/input/KeyboardBacklightControllerTests.kt
@@ -24,6 +24,7 @@
 import android.hardware.input.IKeyboardBacklightState
 import android.hardware.input.InputManager
 import android.hardware.lights.Light
+import android.os.UEventObserver
 import android.os.test.TestLooper
 import android.platform.test.annotations.Presubmit
 import android.view.InputDevice
@@ -39,6 +40,7 @@
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.Mock
+import org.mockito.Mockito.any
 import org.mockito.Mockito.anyInt
 import org.mockito.Mockito.eq
 import org.mockito.Mockito.spy
@@ -95,6 +97,7 @@
     private lateinit var testLooper: TestLooper
     private var lightColorMap: HashMap<Int, Int> = HashMap()
     private var lastBacklightState: KeyboardBacklightState? = null
+    private var sysfsNodeChanges = 0
 
     @Before
     fun setup() {
@@ -121,6 +124,9 @@
             lightColorMap.put(args[1] as Int, args[2] as Int)
         }
         lightColorMap.clear()
+        `when`(native.sysfsNodeChanged(any())).then {
+            sysfsNodeChanges++
+        }
     }
 
     @After
@@ -393,6 +399,64 @@
         )
     }
 
+    @Test
+    fun testKeyboardBacklightSysfsNodeAdded_AfterInputDeviceAdded() {
+        var counter = sysfsNodeChanges
+        keyboardBacklightController.onKeyboardBacklightUEvent(UEventObserver.UEvent(
+            "ACTION=add\u0000SUBSYSTEM=leds\u0000DEVPATH=/xyz/leds/abc::no_backlight\u0000"
+        ))
+        assertEquals(
+            "Should not reload sysfs node if UEvent path doesn't contain kbd_backlight",
+            counter,
+            sysfsNodeChanges
+        )
+
+        keyboardBacklightController.onKeyboardBacklightUEvent(UEventObserver.UEvent(
+            "ACTION=add\u0000SUBSYSTEM=power\u0000DEVPATH=/xyz/leds/abc::kbd_backlight\u0000"
+        ))
+        assertEquals(
+            "Should not reload sysfs node if UEvent doesn't belong to subsystem LED",
+            counter,
+            sysfsNodeChanges
+        )
+
+        keyboardBacklightController.onKeyboardBacklightUEvent(UEventObserver.UEvent(
+            "ACTION=remove\u0000SUBSYSTEM=leds\u0000DEVPATH=/xyz/leds/abc::kbd_backlight\u0000"
+        ))
+        assertEquals(
+            "Should not reload sysfs node if UEvent doesn't have ACTION(add)",
+            counter,
+            sysfsNodeChanges
+        )
+
+        keyboardBacklightController.onKeyboardBacklightUEvent(UEventObserver.UEvent(
+            "ACTION=add\u0000SUBSYSTEM=leds\u0000DEVPATH=/xyz/pqr/abc::kbd_backlight\u0000"
+        ))
+        assertEquals(
+            "Should not reload sysfs node if UEvent path doesn't belong to leds/ directory",
+            counter,
+            sysfsNodeChanges
+        )
+
+        keyboardBacklightController.onKeyboardBacklightUEvent(UEventObserver.UEvent(
+            "ACTION=add\u0000SUBSYSTEM=leds\u0000DEVPATH=/xyz/leds/abc::kbd_backlight\u0000"
+        ))
+        assertEquals(
+            "Should reload sysfs node if a valid Keyboard backlight LED UEvent occurs",
+            ++counter,
+            sysfsNodeChanges
+        )
+
+        keyboardBacklightController.onKeyboardBacklightUEvent(UEventObserver.UEvent(
+            "ACTION=add\u0000SUBSYSTEM=leds\u0000DEVPATH=/xyz/leds/abc:kbd_backlight:red\u0000"
+        ))
+        assertEquals(
+            "Should reload sysfs node if a valid Keyboard backlight LED UEvent occurs",
+            ++counter,
+            sysfsNodeChanges
+        )
+    }
+
     inner class KeyboardBacklightListener : IKeyboardBacklightListener.Stub() {
         override fun onBrightnessChanged(
             deviceId: Int,
diff --git a/services/tests/servicestests/src/com/android/server/inputmethod/HardwareKeyboardShortcutControllerTest.java b/services/tests/servicestests/src/com/android/server/inputmethod/HardwareKeyboardShortcutControllerTest.java
new file mode 100644
index 0000000..6eedeea
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/inputmethod/HardwareKeyboardShortcutControllerTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.inputmethod;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+import java.util.List;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public final class HardwareKeyboardShortcutControllerTest {
+
+    @Test
+    public void testForwardRotation() {
+        final List<String> handles = Arrays.asList("0", "1", "2", "3");
+        assertEquals("2", HardwareKeyboardShortcutController.getNeighborItem(handles, "1", true));
+        assertEquals("3", HardwareKeyboardShortcutController.getNeighborItem(handles, "2", true));
+        assertEquals("0", HardwareKeyboardShortcutController.getNeighborItem(handles, "3", true));
+    }
+
+    @Test
+    public void testBackwardRotation() {
+        final List<String> handles = Arrays.asList("0", "1", "2", "3");
+        assertEquals("0", HardwareKeyboardShortcutController.getNeighborItem(handles, "1", false));
+        assertEquals("3", HardwareKeyboardShortcutController.getNeighborItem(handles, "0", false));
+        assertEquals("2", HardwareKeyboardShortcutController.getNeighborItem(handles, "3", false));
+    }
+
+    @Test
+    public void testNotMatching() {
+        final List<String> handles = Arrays.asList("0", "1", "2", "3");
+        assertNull(HardwareKeyboardShortcutController.getNeighborItem(handles, "X", true));
+        assertNull(HardwareKeyboardShortcutController.getNeighborItem(handles, "X", false));
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java
new file mode 100644
index 0000000..36c2001
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java
@@ -0,0 +1,427 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.media.projection;
+
+
+import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
+import static android.media.projection.MediaProjectionManager.TYPE_MIRRORING;
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.testng.Assert.assertThrows;
+
+import android.app.ActivityManagerInternal;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.ApplicationInfoFlags;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.media.projection.IMediaProjectionCallback;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.platform.test.annotations.Presubmit;
+import android.view.ContentRecordingSession;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.server.LocalServices;
+import com.android.server.testutils.OffsettableClock;
+import com.android.server.wm.WindowManagerInternal;
+
+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;
+
+/**
+ * Tests for the {@link MediaProjectionManagerService} class.
+ *
+ * Build/Install/Run:
+ * atest FrameworksServicesTests:MediaProjectionManagerServiceTest
+ */
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class MediaProjectionManagerServiceTest {
+    private static final int UID = 10;
+    private static final String PACKAGE_NAME = "test.package";
+    private final ApplicationInfo mAppInfo = new ApplicationInfo();
+    private static final ContentRecordingSession DISPLAY_SESSION =
+            ContentRecordingSession.createDisplaySession(DEFAULT_DISPLAY);
+    // Callback registered by an app on a MediaProjection instance.
+    private final FakeIMediaProjectionCallback mIMediaProjectionCallback =
+            new FakeIMediaProjectionCallback();
+
+    private final MediaProjectionManagerService.Injector mPreventReusedTokenEnabledInjector =
+            new MediaProjectionManagerService.Injector() {
+                @Override
+                boolean shouldMediaProjectionPreventReusingConsent(
+                        MediaProjectionManagerService.MediaProjection projection) {
+                    return true;
+                }
+            };
+
+    private final MediaProjectionManagerService.Injector mPreventReusedTokenDisabledInjector =
+            new MediaProjectionManagerService.Injector() {
+                @Override
+                boolean shouldMediaProjectionPreventReusingConsent(
+                        MediaProjectionManagerService.MediaProjection projection) {
+                    return false;
+                }
+            };
+
+    private Context mContext;
+    private MediaProjectionManagerService mService;
+    private OffsettableClock mClock;
+    private ContentRecordingSession mWaitingDisplaySession =
+            ContentRecordingSession.createDisplaySession(DEFAULT_DISPLAY);
+
+    @Mock
+    private ActivityManagerInternal mAmInternal;
+    @Mock
+    private WindowManagerInternal mWindowManagerInternal;
+    @Mock
+    private PackageManager mPackageManager;
+
+    @Before
+    public void setup() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
+        LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+        LocalServices.addService(ActivityManagerInternal.class, mAmInternal);
+        LocalServices.removeServiceForTest(WindowManagerInternal.class);
+        LocalServices.addService(WindowManagerInternal.class, mWindowManagerInternal);
+
+        mContext = spy(new ContextWrapper(
+                InstrumentationRegistry.getInstrumentation().getTargetContext()));
+        doReturn(mPackageManager).when(mContext).getPackageManager();
+
+        mClock = new OffsettableClock.Stopped();
+        mWaitingDisplaySession.setWaitingToRecord(true);
+        mWaitingDisplaySession.setVirtualDisplayId(5);
+
+        mAppInfo.targetSdkVersion = 32;
+
+        mService = new MediaProjectionManagerService(mContext);
+    }
+
+    @After
+    public void tearDown() {
+        LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+        LocalServices.removeServiceForTest(WindowManagerInternal.class);
+    }
+
+    @Test
+    public void testGetActiveProjectionInfoInternal() throws NameNotFoundException {
+        assertThat(mService.getActiveProjectionInfo()).isNull();
+
+        MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions();
+
+        // Create a projection, active is still null.
+        assertThat(projection).isNotNull();
+        assertThat(mService.getActiveProjectionInfo()).isNull();
+
+        // Start the projection, active is now not null.
+        projection.start(mIMediaProjectionCallback);
+        assertThat(mService.getActiveProjectionInfo()).isNotNull();
+    }
+
+    @Test
+    public void testCreateProjection() throws NameNotFoundException {
+        MediaProjectionManagerService.MediaProjection projection =
+                startProjectionPreconditions(/* packageAttemptedReusingGrantedConsent= */ false);
+        projection.start(mIMediaProjectionCallback);
+
+        MediaProjectionManagerService.MediaProjection secondProjection =
+                startProjectionPreconditions(/* packageAttemptedReusingGrantedConsent= */ false);
+        assertThat(secondProjection).isNotNull();
+        assertThat(secondProjection).isNotEqualTo(projection);
+    }
+
+    @Test
+    public void testCreateProjection_attemptReuse_noPriorProjectionGrant()
+            throws NameNotFoundException {
+        MediaProjectionManagerService.MediaProjection projection =
+                startProjectionPreconditions(/* packageAttemptedReusingGrantedConsent= */ false);
+        projection.start(mIMediaProjectionCallback);
+
+        MediaProjectionManagerService.MediaProjection secondProjection =
+                startProjectionPreconditions(/* packageAttemptedReusingGrantedConsent= */ true);
+
+        assertThat(secondProjection).isNotNull();
+        assertThat(secondProjection).isNotEqualTo(projection);
+    }
+
+    @Test
+    public void testCreateProjection_attemptReuse_priorProjectionGrant_notWaiting()
+            throws NameNotFoundException {
+        MediaProjectionManagerService.MediaProjection projection =
+                startProjectionPreconditions(/* packageAttemptedReusingGrantedConsent= */ false);
+        projection.start(mIMediaProjectionCallback);
+
+        // Mark this projection as not waiting.
+        doReturn(true).when(mWindowManagerInternal).setContentRecordingSession(
+                any(ContentRecordingSession.class));
+        mService.setContentRecordingSession(DISPLAY_SESSION);
+
+        // We are allowed to create another projection.
+        MediaProjectionManagerService.MediaProjection secondProjection =
+                startProjectionPreconditions(/* packageAttemptedReusingGrantedConsent= */ true);
+
+        assertThat(secondProjection).isNotNull();
+
+        // But this is a new projection.
+        assertThat(secondProjection).isNotEqualTo(projection);
+    }
+
+    @Test
+    public void testCreateProjection_attemptReuse_priorProjectionGrant_waiting_differentPackage()
+            throws NameNotFoundException {
+        MediaProjectionManagerService.MediaProjection projection =
+                startProjectionPreconditions(/* packageAttemptedReusingGrantedConsent= */ false);
+        projection.start(mIMediaProjectionCallback);
+
+        // Mark this projection as not waiting.
+        mService.setContentRecordingSession(mWaitingDisplaySession);
+
+        // We are allowed to create another projection.
+        MediaProjectionManagerService.MediaProjection secondProjection =
+                mService.createProjectionInternal(UID + 10, PACKAGE_NAME + "foo",
+                        TYPE_MIRRORING, /* isPermanentGrant= */ true,
+                        UserHandle.CURRENT, /* packageAttemptedReusingGrantedConsent= */ true);
+
+        assertThat(secondProjection).isNotNull();
+
+        // But this is a new projection.
+        assertThat(secondProjection).isNotEqualTo(projection);
+    }
+
+    @Test
+    public void testIsValid_multipleStarts_preventionDisabled() throws NameNotFoundException {
+        MediaProjectionManagerService service = new MediaProjectionManagerService(mContext,
+                mPreventReusedTokenDisabledInjector);
+        MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions(
+                service);
+        // No starts yet, and not timed out yet - so still valid.
+        assertThat(projection.isValid()).isTrue();
+
+        // Only one start - so still valid.
+        projection.start(mIMediaProjectionCallback);
+        assertThat(projection.isValid()).isTrue();
+
+        // Second start - technically allowed to start again, without stopping in between.
+        // Token should no longer be valid.
+        projection.start(mIMediaProjectionCallback);
+        assertThat(projection.isValid()).isFalse();
+    }
+
+    @Test
+    public void testIsValid_restart() throws NameNotFoundException {
+        MediaProjectionManagerService service = new MediaProjectionManagerService(mContext,
+                mPreventReusedTokenDisabledInjector);
+        MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions(
+                service);
+        // No starts yet, and not timed out yet - so still valid.
+        assertThat(projection.isValid()).isTrue();
+
+        // Only one start - so still valid.
+        projection.start(mIMediaProjectionCallback);
+        assertThat(projection.isValid()).isTrue();
+
+        projection.stop();
+
+        // Second start - so not valid.
+        projection.start(mIMediaProjectionCallback);
+        assertThat(projection.isValid()).isFalse();
+    }
+
+    @Test
+    public void testIsValid_timeout() throws NameNotFoundException {
+        final MediaProjectionManagerService.Injector mClockInjector =
+                new MediaProjectionManagerService.Injector() {
+                    @Override
+                    MediaProjectionManagerService.Clock createClock() {
+                        // Always return the same value for elapsed time.
+                        return () -> mClock.now();
+                    }
+                    @Override
+                    boolean shouldMediaProjectionPreventReusingConsent(
+                            MediaProjectionManagerService.MediaProjection projection) {
+                        return false;
+                    }
+                };
+        final MediaProjectionManagerService service = new MediaProjectionManagerService(mContext,
+                mClockInjector);
+        MediaProjectionManagerService.MediaProjection projection = createProjectionPreconditions(
+                service);
+        mClock.fastForward(projection.mDefaultTimeoutMs + 10);
+
+        // Immediate timeout - so no longer valid.
+        assertThat(projection.isValid()).isFalse();
+    }
+
+    @Test
+    public void testIsValid_virtualDisplayAlreadyCreated() throws NameNotFoundException {
+        MediaProjectionManagerService service = new MediaProjectionManagerService(mContext,
+                mPreventReusedTokenDisabledInjector);
+        MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions(
+                service);
+        // Simulate MediaProjection#createVirtualDisplay being invoked previously.
+        projection.notifyVirtualDisplayCreated(10);
+
+        // Trying to re-use token on another MediaProjection#createVirtualDisplay - no longer valid.
+        assertThat(projection.isValid()).isFalse();
+    }
+
+    // TODO(269273190): Test flag using compat annotations instead.
+    @Test
+    public void testIsValid_invalid_preventionEnabled()
+            throws NameNotFoundException {
+        MediaProjectionManagerService service = new MediaProjectionManagerService(mContext,
+                mPreventReusedTokenEnabledInjector);
+        MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions(
+                service);
+        projection.start(mIMediaProjectionCallback);
+        projection.stop();
+        // Second start - so not valid.
+        projection.start(mIMediaProjectionCallback);
+
+        assertThrows(IllegalStateException.class, projection::isValid);
+    }
+
+    // TODO(269273190): Test flag using compat annotations instead.
+    @Test
+    public void testIsValid_invalid_preventionDisabled()
+            throws NameNotFoundException {
+        MediaProjectionManagerService service = new MediaProjectionManagerService(mContext,
+                mPreventReusedTokenDisabledInjector);
+        MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions(
+                service);
+        projection.start(mIMediaProjectionCallback);
+        projection.stop();
+
+        // Second start - so not valid.
+        projection.start(mIMediaProjectionCallback);
+
+        assertThat(projection.isValid()).isFalse();
+    }
+
+    @Test
+    public void testIsCurrentProjectionInternal_invalid() throws NameNotFoundException {
+        IBinder iBinder = mock(IBinder.class);
+        MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions();
+
+        // Create a projection, current is false.
+        assertThat(projection).isNotNull();
+        assertThat(mService.isCurrentProjection(iBinder)).isFalse();
+
+        // Start the projection, and test a random token.
+        projection.start(mIMediaProjectionCallback);
+        assertThat(mService.isCurrentProjection(iBinder)).isFalse();
+    }
+
+    @Test
+    public void testIsCurrentProjectionInternal_noProjection() {
+        IBinder iBinder = mock(IBinder.class);
+        assertThat(mService.isCurrentProjection(iBinder)).isFalse();
+    }
+
+    @Test
+    public void testIsCurrentProjectionInternal_currentProjection()
+            throws NameNotFoundException {
+        MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions();
+
+        // Create a projection, current is false.
+        assertThat(projection).isNotNull();
+        assertThat(mService.isCurrentProjection(projection.asBinder())).isFalse();
+
+        // Start the projection, is current is now true.
+        projection.start(mIMediaProjectionCallback);
+        assertThat(mService.isCurrentProjection(projection.asBinder())).isTrue();
+    }
+
+    // Set up preconditions for creating a projection.
+    private MediaProjectionManagerService.MediaProjection createProjectionPreconditions(
+            MediaProjectionManagerService service)
+            throws NameNotFoundException {
+        doReturn(mAppInfo).when(mPackageManager).getApplicationInfoAsUser(anyString(),
+                any(ApplicationInfoFlags.class), any(UserHandle.class));
+        return service.createProjectionInternal(UID, PACKAGE_NAME,
+                TYPE_MIRRORING, /* isPermanentGrant= */ true, UserHandle.CURRENT,
+                /* packageAttemptedReusingGrantedConsent= */ false);
+    }
+
+    // Set up preconditions for creating a projection.
+    private MediaProjectionManagerService.MediaProjection createProjectionPreconditions()
+            throws NameNotFoundException {
+        return createProjectionPreconditions(mService);
+    }
+
+    // Set up preconditions for starting a projection, with no foreground service requirements.
+    private MediaProjectionManagerService.MediaProjection startProjectionPreconditions(
+            MediaProjectionManagerService service)
+            throws NameNotFoundException {
+        mAppInfo.privateFlags |= PRIVATE_FLAG_PRIVILEGED;
+        return createProjectionPreconditions(service);
+    }
+
+    // Set up preconditions for starting a projection, specifying if it is possible to reuse the
+    // the current projection.
+    private MediaProjectionManagerService.MediaProjection startProjectionPreconditions(
+            boolean packageAttemptedReusingGrantedConsent)
+            throws NameNotFoundException {
+        mAppInfo.privateFlags |= PRIVATE_FLAG_PRIVILEGED;
+        doReturn(mAppInfo).when(mPackageManager).getApplicationInfoAsUser(anyString(),
+                any(ApplicationInfoFlags.class), any(UserHandle.class));
+        return mService.createProjectionInternal(UID, PACKAGE_NAME,
+                TYPE_MIRRORING, /* isPermanentGrant= */ true, UserHandle.CURRENT,
+                packageAttemptedReusingGrantedConsent);
+    }
+
+    // Set up preconditions for starting a projection, with no foreground service requirements.
+    private MediaProjectionManagerService.MediaProjection startProjectionPreconditions()
+            throws NameNotFoundException {
+        mAppInfo.privateFlags |= PRIVATE_FLAG_PRIVILEGED;
+        return createProjectionPreconditions(mService);
+    }
+
+    private static class FakeIMediaProjectionCallback extends IMediaProjectionCallback.Stub {
+        @Override
+        public void onStop() throws RemoteException {
+        }
+
+        @Override
+        public void onCapturedContentResize(int width, int height) throws RemoteException {
+        }
+
+        @Override
+        public void onCapturedContentVisibilityChanged(boolean isVisible) throws RemoteException {
+        }
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
index 0b6756d..6bcda3f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
@@ -178,6 +178,8 @@
                 UserHandle.of(userInfo.id));
         assertThat(userContext.getSystemService(
                 UserManager.class).isMediaSharedWithParent()).isTrue();
+        assertThat(Settings.Secure.getInt(userContext.getContentResolver(),
+                Settings.Secure.USER_SETUP_COMPLETE, 0)).isEqualTo(1);
 
         List<UserInfo> list = mUserManager.getUsers();
         List<UserInfo> cloneUsers = list.stream().filter(
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexMetadataHelperTest.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexMetadataHelperTest.java
index b2843d8..de82854 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/DexMetadataHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexMetadataHelperTest.java
@@ -422,7 +422,8 @@
                     null /* splitNames */, null /* isFeatureSplits */, null /* usesSplitNames */,
                     null /* configForSplit */, null /* splitApkPaths */,
                     null /* splitRevisionCodes */, baseApk.getTargetSdkVersion(),
-                    null /* requiredSplitTypes */, null /* splitTypes */);
+                    null /* requiredSplitTypes */, null /* splitTypes */,
+                    false /* allowUpdateOwnership */);
             Assert.assertEquals(dm.length(), DexMetadataHelper.getPackageDexMetadataSize(pkgLite));
         }
 
diff --git a/services/tests/servicestests/src/com/android/server/power/stats/CpuWakeupStatsTest.java b/services/tests/servicestests/src/com/android/server/power/stats/CpuWakeupStatsTest.java
index 397d7b5..7cf5bc8 100644
--- a/services/tests/servicestests/src/com/android/server/power/stats/CpuWakeupStatsTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/stats/CpuWakeupStatsTest.java
@@ -26,8 +26,9 @@
 
 import android.content.Context;
 import android.os.Handler;
+import android.util.IntArray;
 import android.util.SparseArray;
-import android.util.SparseBooleanArray;
+import android.util.SparseIntArray;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -57,10 +58,24 @@
     private static final int TEST_UID_4 = 56926423;
     private static final int TEST_UID_5 = 76421423;
 
+    private static final int TEST_PROC_STATE_1 = 72331;
+    private static final int TEST_PROC_STATE_2 = 792351;
+    private static final int TEST_PROC_STATE_3 = 138831;
+    private static final int TEST_PROC_STATE_4 = 23231;
+    private static final int TEST_PROC_STATE_5 = 42;
+
     private static final Context sContext = InstrumentationRegistry.getTargetContext();
     private final Handler mHandler = Mockito.mock(Handler.class);
     private final ThreadLocalRandom mRandom = ThreadLocalRandom.current();
 
+    private void populateDefaultProcStates(CpuWakeupStats obj) {
+        obj.mUidProcStates.put(TEST_UID_1, TEST_PROC_STATE_1);
+        obj.mUidProcStates.put(TEST_UID_2, TEST_PROC_STATE_2);
+        obj.mUidProcStates.put(TEST_UID_3, TEST_PROC_STATE_3);
+        obj.mUidProcStates.put(TEST_UID_4, TEST_PROC_STATE_4);
+        obj.mUidProcStates.put(TEST_UID_5, TEST_PROC_STATE_5);
+    }
+
     @Test
     public void removesOldWakeups() {
         // The xml resource doesn't matter for this test.
@@ -96,6 +111,8 @@
         final CpuWakeupStats obj = new CpuWakeupStats(sContext, R.xml.irq_device_map_3, mHandler);
         final long wakeupTime = 12423121;
 
+        populateDefaultProcStates(obj);
+
         obj.noteWakeupTimeAndReason(wakeupTime, 1, KERNEL_REASON_ALARM_IRQ);
 
         // Outside the window, so should be ignored.
@@ -106,15 +123,20 @@
         // Should be attributed
         obj.noteWakingActivity(CPU_WAKEUP_SUBSYSTEM_ALARM, wakeupTime + 5, TEST_UID_3, TEST_UID_5);
 
-        final SparseArray<SparseBooleanArray> attribution = obj.mWakeupAttribution.get(wakeupTime);
+        final SparseArray<SparseIntArray> attribution = obj.mWakeupAttribution.get(wakeupTime);
         assertThat(attribution).isNotNull();
         assertThat(attribution.size()).isEqualTo(1);
         assertThat(attribution.contains(CPU_WAKEUP_SUBSYSTEM_ALARM)).isTrue();
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_1)).isEqualTo(false);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_2)).isEqualTo(false);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_3)).isEqualTo(true);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_4)).isEqualTo(false);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_5)).isEqualTo(true);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).indexOfKey(TEST_UID_1)).isLessThan(
+                0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).indexOfKey(TEST_UID_2)).isLessThan(
+                0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_3)).isEqualTo(
+                TEST_PROC_STATE_3);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).indexOfKey(TEST_UID_4)).isLessThan(
+                0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_5)).isEqualTo(
+                TEST_PROC_STATE_5);
     }
 
     @Test
@@ -122,6 +144,8 @@
         final CpuWakeupStats obj = new CpuWakeupStats(sContext, R.xml.irq_device_map_3, mHandler);
         final long wakeupTime = 12423121;
 
+        populateDefaultProcStates(obj);
+
         obj.noteWakeupTimeAndReason(wakeupTime, 1, KERNEL_REASON_WIFI_IRQ);
 
         // Outside the window, so should be ignored.
@@ -132,15 +156,17 @@
         // Should be attributed
         obj.noteWakingActivity(CPU_WAKEUP_SUBSYSTEM_WIFI, wakeupTime + 3, TEST_UID_4, TEST_UID_5);
 
-        final SparseArray<SparseBooleanArray> attribution = obj.mWakeupAttribution.get(wakeupTime);
+        final SparseArray<SparseIntArray> attribution = obj.mWakeupAttribution.get(wakeupTime);
         assertThat(attribution).isNotNull();
         assertThat(attribution.size()).isEqualTo(1);
         assertThat(attribution.contains(CPU_WAKEUP_SUBSYSTEM_WIFI)).isTrue();
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_1)).isEqualTo(false);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_2)).isEqualTo(false);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_3)).isEqualTo(false);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_4)).isEqualTo(true);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_5)).isEqualTo(true);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).indexOfKey(TEST_UID_1)).isLessThan(0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).indexOfKey(TEST_UID_2)).isLessThan(0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).indexOfKey(TEST_UID_3)).isLessThan(0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_4)).isEqualTo(
+                TEST_PROC_STATE_4);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_5)).isEqualTo(
+                TEST_PROC_STATE_5);
     }
 
     @Test
@@ -148,6 +174,8 @@
         final CpuWakeupStats obj = new CpuWakeupStats(sContext, R.xml.irq_device_map_3, mHandler);
         final long wakeupTime = 92123210;
 
+        populateDefaultProcStates(obj);
+
         obj.noteWakeupTimeAndReason(wakeupTime, 4,
                 KERNEL_REASON_WIFI_IRQ + ":" + KERNEL_REASON_ALARM_IRQ);
 
@@ -173,23 +201,31 @@
         obj.noteWakingActivity(CPU_WAKEUP_SUBSYSTEM_WIFI, wakeupTime - 1, TEST_UID_2,
                 TEST_UID_5);
 
-        final SparseArray<SparseBooleanArray> attribution = obj.mWakeupAttribution.get(wakeupTime);
+        final SparseArray<SparseIntArray> attribution = obj.mWakeupAttribution.get(wakeupTime);
         assertThat(attribution).isNotNull();
         assertThat(attribution.size()).isEqualTo(2);
 
         assertThat(attribution.contains(CPU_WAKEUP_SUBSYSTEM_ALARM)).isTrue();
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_1)).isEqualTo(false);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_2)).isEqualTo(false);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_3)).isEqualTo(true);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_4)).isEqualTo(true);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_5)).isEqualTo(true);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).indexOfKey(TEST_UID_1)).isLessThan(
+                0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).indexOfKey(TEST_UID_2)).isLessThan(
+                0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_3)).isEqualTo(
+                TEST_PROC_STATE_3);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_4)).isEqualTo(
+                TEST_PROC_STATE_4);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_ALARM).get(TEST_UID_5)).isEqualTo(
+                TEST_PROC_STATE_5);
 
         assertThat(attribution.contains(CPU_WAKEUP_SUBSYSTEM_WIFI)).isTrue();
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_1)).isEqualTo(true);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_2)).isEqualTo(true);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_3)).isEqualTo(false);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_4)).isEqualTo(false);
-        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_5)).isEqualTo(true);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_1)).isEqualTo(
+                TEST_PROC_STATE_1);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_2)).isEqualTo(
+                TEST_PROC_STATE_2);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).indexOfKey(TEST_UID_3)).isLessThan(0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).indexOfKey(TEST_UID_4)).isLessThan(0);
+        assertThat(attribution.get(CPU_WAKEUP_SUBSYSTEM_WIFI).get(TEST_UID_5)).isEqualTo(
+                TEST_PROC_STATE_5);
     }
 
     @Test
@@ -206,12 +242,12 @@
         obj.noteWakingActivity(CPU_WAKEUP_SUBSYSTEM_WIFI, wakeupTime - 3, TEST_UID_4,
                 TEST_UID_5);
 
-        final SparseArray<SparseBooleanArray> attribution = obj.mWakeupAttribution.get(wakeupTime);
+        final SparseArray<SparseIntArray> attribution = obj.mWakeupAttribution.get(wakeupTime);
         assertThat(attribution).isNotNull();
         assertThat(attribution.size()).isEqualTo(1);
         assertThat(attribution.contains(CPU_WAKEUP_SUBSYSTEM_UNKNOWN)).isTrue();
-        final SparseBooleanArray uids = attribution.get(CPU_WAKEUP_SUBSYSTEM_UNKNOWN);
-        assertThat(uids == null || uids.size() == 0).isTrue();
+        final SparseIntArray uidProcStates = attribution.get(CPU_WAKEUP_SUBSYSTEM_UNKNOWN);
+        assertThat(uidProcStates == null || uidProcStates.size() == 0).isTrue();
     }
 
     @Test
@@ -259,4 +295,39 @@
         // Any nearby activity should not end up in the attribution map.
         assertThat(obj.mWakeupAttribution.size()).isEqualTo(0);
     }
+
+    @Test
+    public void uidProcStateBookkeeping() {
+        final CpuWakeupStats obj = new CpuWakeupStats(sContext, R.xml.irq_device_map_3, mHandler);
+
+        assertThat(obj.mUidProcStates.size()).isEqualTo(0);
+
+        final IntArray uids = new IntArray(87);
+        for (int i = 0; i < 87; i++) {
+            final int uid = mRandom.nextInt(1 << 20);
+            if (uids.indexOf(uid) < 0) {
+                uids.add(uid);
+            }
+        }
+
+        for (int i = 0; i < uids.size(); i++) {
+            final int uid = uids.get(i);
+            for (int j = 0; j < 43; j++) {
+                final int procState = mRandom.nextInt(1 << 15);
+                obj.noteUidProcessState(uid, procState);
+                assertThat(obj.mUidProcStates.get(uid)).isEqualTo(procState);
+            }
+            assertThat(obj.mUidProcStates.size()).isEqualTo(i + 1);
+        }
+
+        for (int i = 0; i < uids.size(); i++) {
+            obj.onUidRemoved(uids.get(i));
+            assertThat(obj.mUidProcStates.indexOfKey(uids.get(i))).isLessThan(0);
+        }
+
+        assertThat(obj.mUidProcStates.size()).isEqualTo(0);
+
+        obj.onUidRemoved(213);
+        assertThat(obj.mUidProcStates.size()).isEqualTo(0);
+    }
 }
diff --git a/services/tests/uiservicestests/AndroidManifest.xml b/services/tests/uiservicestests/AndroidManifest.xml
index 09ee598..f44c1d1 100644
--- a/services/tests/uiservicestests/AndroidManifest.xml
+++ b/services/tests/uiservicestests/AndroidManifest.xml
@@ -33,7 +33,8 @@
     <uses-permission android:name="android.permission.OBSERVE_ROLE_HOLDERS" />
     <uses-permission android:name="android.permission.GET_INTENT_SENDER_INTENT"/>
     <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
-    <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG" />
+    <uses-permission android:name="android.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG" />
+    <uses-permission android:name="android.permission.READ_WRITE_SYNC_DISABLED_MODE_CONFIG" />
     <uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" />
 
     <application android:debuggable="true">
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 42d1ace..eceb589 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -28,6 +28,7 @@
 import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
 import static android.app.Notification.FLAG_NO_CLEAR;
 import static android.app.Notification.FLAG_ONGOING_EVENT;
+import static android.app.Notification.FLAG_USER_INITIATED_JOB;
 import static android.app.NotificationChannel.USER_LOCKED_ALLOW_BUBBLE;
 import static android.app.NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED;
 import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
@@ -197,7 +198,6 @@
 import android.telephony.TelephonyManager;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
-import android.testing.TestableContext;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
 import android.testing.TestablePermissions;
@@ -228,6 +228,7 @@
 import com.android.server.SystemService;
 import com.android.server.SystemService.TargetUser;
 import com.android.server.UiServiceTestCase;
+import com.android.server.job.JobSchedulerInternal;
 import com.android.server.lights.LightsManager;
 import com.android.server.lights.LogicalLight;
 import com.android.server.notification.NotificationManagerService.NotificationAssistants;
@@ -254,7 +255,6 @@
 import org.mockito.ArgumentMatchers;
 import org.mockito.InOrder;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
@@ -337,6 +337,8 @@
     @Mock
     ActivityManagerInternal mAmi;
     @Mock
+    JobSchedulerInternal mJsi;
+    @Mock
     private Looper mMainLooper;
     @Mock
     private NotificationManager mMockNm;
@@ -445,6 +447,8 @@
         LocalServices.addService(DeviceIdleInternal.class, deviceIdleInternal);
         LocalServices.removeServiceForTest(ActivityManagerInternal.class);
         LocalServices.addService(ActivityManagerInternal.class, mAmi);
+        LocalServices.removeServiceForTest(JobSchedulerInternal.class);
+        LocalServices.addService(JobSchedulerInternal.class, mJsi);
         LocalServices.removeServiceForTest(PackageManagerInternal.class);
         LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal);
         LocalServices.removeServiceForTest(PermissionPolicyInternal.class);
@@ -1253,7 +1257,7 @@
         waitForIdle();
 
         update = new NotificationChannel("blockedbyuser", "name", IMPORTANCE_NONE);
-        update.setFgServiceShown(true);
+        update.setUserVisibleTaskShown(true);
         mBinderService.updateNotificationChannelForPackage(PKG, mUid, update);
         waitForIdle();
         assertEquals(IMPORTANCE_NONE, mBinderService.getNotificationChannel(
@@ -1638,12 +1642,6 @@
                 any(), anyString(), anyInt(), anyString(), anyInt())).thenReturn(SHOW_IMMEDIATELY);
         mContext.getTestablePermissions().setPermission(
                 android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS, PERMISSION_GRANTED);
-        DeviceConfig.setProperty(
-                DeviceConfig.NAMESPACE_SYSTEMUI,
-                SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED,
-                "true",
-                false);
-        Thread.sleep(300);
 
         final String tag = "testEnqueueNotificationWithTag_FgsAddsFlags_dismissalAllowed";
 
@@ -1665,38 +1663,6 @@
     }
 
     @Test
-    public void testEnqueueNotificationWithTag_FGSaddsFlags_dismissalNotAllowed() throws Exception {
-        when(mAmi.applyForegroundServiceNotification(
-                any(), anyString(), anyInt(), anyString(), anyInt())).thenReturn(SHOW_IMMEDIATELY);
-        mContext.getTestablePermissions().setPermission(
-                android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS, PERMISSION_GRANTED);
-        DeviceConfig.setProperty(
-                DeviceConfig.NAMESPACE_SYSTEMUI,
-                SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED,
-                "false",
-                false);
-        Thread.sleep(300);
-
-        final String tag = "testEnqueueNotificationWithTag_FGSaddsNoClear";
-
-        Notification n = new Notification.Builder(mContext, mTestNotificationChannel.getId())
-                .setContentTitle("foo")
-                .setSmallIcon(android.R.drawable.sym_def_app_icon)
-                .setFlag(FLAG_FOREGROUND_SERVICE, true)
-                .build();
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
-                n, UserHandle.getUserHandleForUid(mUid), null, 0);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, tag,
-                sbn.getId(), sbn.getNotification(), sbn.getUserId());
-        waitForIdle();
-
-        StatusBarNotification[] notifs =
-                mBinderService.getActiveNotifications(PKG);
-        assertThat(notifs[0].getNotification().flags).isEqualTo(
-                FLAG_FOREGROUND_SERVICE | FLAG_CAN_COLORIZE | FLAG_NO_CLEAR | FLAG_ONGOING_EVENT);
-    }
-
-    @Test
     public void testEnqueueNotificationWithTag_nullAction_fixed() throws Exception {
         Notification n = new Notification.Builder(mContext, mTestNotificationChannel.getId())
                 .setContentTitle("foo")
@@ -4774,7 +4740,7 @@
     }
 
     @Test
-    public void testBumpFGImportance_noChannelChangePreOApp() throws Exception {
+    public void testBumpFGImportance_channelChangePreOApp() throws Exception {
         String preOPkg = PKG_N_MR1;
         final ApplicationInfo legacy = new ApplicationInfo();
         legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1;
@@ -4792,7 +4758,7 @@
                 .setPriority(Notification.PRIORITY_MIN);
 
         StatusBarNotification sbn = new StatusBarNotification(preOPkg, preOPkg, 9,
-                "testBumpFGImportance_noChannelChangePreOApp",
+                "testBumpFGImportance_channelChangePreOApp",
                 Binder.getCallingUid(), 0, nb.build(),
                 UserHandle.getUserHandleForUid(Binder.getCallingUid()), null, 0);
 
@@ -4812,11 +4778,11 @@
                 .setPriority(Notification.PRIORITY_MIN);
 
         sbn = new StatusBarNotification(preOPkg, preOPkg, 9,
-                "testBumpFGImportance_noChannelChangePreOApp", Binder.getCallingUid(),
+                "testBumpFGImportance_channelChangePreOApp", Binder.getCallingUid(),
                 0, nb.build(), UserHandle.getUserHandleForUid(Binder.getCallingUid()), null, 0);
 
         mBinderService.enqueueNotificationWithTag(preOPkg, preOPkg,
-                "testBumpFGImportance_noChannelChangePreOApp",
+                "testBumpFGImportance_channelChangePreOApp",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         waitForIdle();
         assertEquals(IMPORTANCE_LOW,
@@ -4824,7 +4790,7 @@
 
         NotificationChannel defaultChannel = mBinderService.getNotificationChannel(
                 preOPkg, mContext.getUserId(), preOPkg, NotificationChannel.DEFAULT_CHANNEL_ID);
-        assertEquals(IMPORTANCE_UNSPECIFIED, defaultChannel.getImportance());
+        assertEquals(IMPORTANCE_LOW, defaultChannel.getImportance());
     }
 
     @Test
@@ -6947,6 +6913,7 @@
     public void testTextToastsCallStatusBar_visibleBgUsers_nonUiContext_defaultDisplay()
             throws Exception {
         mockIsVisibleBackgroundUsersSupported(true);
+        mockIsUserVisible(SECONDARY_DISPLAY_ID, true);
         mockDisplayAssignedToUser(SECONDARY_DISPLAY_ID);
         allowTestPackageToToast();
 
@@ -8648,7 +8615,7 @@
         assertNotNull(n.publicVersion.bigContentView);
         assertNotNull(n.publicVersion.headsUpContentView);
 
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         assertNull(n.contentView);
         assertNull(n.bigContentView);
@@ -10462,8 +10429,11 @@
         verify(mMockNm, never()).notify(anyString(), anyInt(), any(Notification.class));
     }
 
-    private void verifyStickyHun(Flag flag, int permissionState, boolean isSticky)
-            throws Exception {
+    private void verifyStickyHun(Flag flag, int permissionState, boolean appRequested,
+            boolean isSticky) throws Exception {
+
+        when(mPermissionHelper.hasRequestedPermission(Manifest.permission.USE_FULL_SCREEN_INTENT,
+                PKG, mUserId)).thenReturn(appRequested);
 
         mTestFlagResolver.setFlagOverride(flag, true);
 
@@ -10475,7 +10445,7 @@
                 .setFullScreenIntent(mock(PendingIntent.class), true)
                 .build();
 
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         final int stickyFlag = n.flags & Notification.FLAG_FSI_REQUESTED_BUT_DENIED;
 
@@ -10491,7 +10461,7 @@
             throws Exception {
 
         verifyStickyHun(/* flag= */ SHOW_STICKY_HUN_FOR_DENIED_FSI,
-                /* permissionState= */ PermissionManager.PERMISSION_HARD_DENIED,
+                /* permissionState= */ PermissionManager.PERMISSION_HARD_DENIED, true,
                 /* isSticky= */ true);
     }
 
@@ -10500,16 +10470,25 @@
             throws Exception {
 
         verifyStickyHun(/* flag= */ SHOW_STICKY_HUN_FOR_DENIED_FSI,
-                /* permissionState= */ PermissionManager.PERMISSION_SOFT_DENIED,
+                /* permissionState= */ PermissionManager.PERMISSION_SOFT_DENIED, true,
                 /* isSticky= */ true);
     }
 
     @Test
+    public void testFixNotification_fsiPermissionSoftDenied_appNotRequest_noShowStickyHun()
+            throws Exception {
+        verifyStickyHun(/* flag= */ SHOW_STICKY_HUN_FOR_DENIED_FSI,
+                /* permissionState= */ PermissionManager.PERMISSION_SOFT_DENIED, false,
+                /* isSticky= */ false);
+    }
+
+
+    @Test
     public void testFixNotification_flagEnableStickyHun_fsiPermissionGranted_showFsi()
             throws Exception {
 
         verifyStickyHun(/* flag= */ SHOW_STICKY_HUN_FOR_DENIED_FSI,
-                /* permissionState= */ PermissionManager.PERMISSION_GRANTED,
+                /* permissionState= */ PermissionManager.PERMISSION_GRANTED, true,
                 /* isSticky= */ false);
     }
 
@@ -10518,7 +10497,7 @@
             throws Exception {
 
         verifyStickyHun(/* flag= */ FSI_FORCE_DEMOTE,
-                /* permissionState= */ PermissionManager.PERMISSION_HARD_DENIED,
+                /* permissionState= */ PermissionManager.PERMISSION_HARD_DENIED, true,
                 /* isSticky= */ true);
     }
 
@@ -10527,7 +10506,7 @@
             throws Exception {
 
         verifyStickyHun(/* flag= */ FSI_FORCE_DEMOTE,
-                /* permissionState= */ PermissionManager.PERMISSION_SOFT_DENIED,
+                /* permissionState= */ PermissionManager.PERMISSION_SOFT_DENIED, true,
                 /* isSticky= */ true);
     }
 
@@ -10536,7 +10515,7 @@
             throws Exception {
 
         verifyStickyHun(/* flag= */ FSI_FORCE_DEMOTE,
-                /* permissionState= */ PermissionManager.PERMISSION_GRANTED,
+                /* permissionState= */ PermissionManager.PERMISSION_GRANTED, true,
                 /* isSticky= */ true);
     }
 
@@ -10551,7 +10530,7 @@
                 .setFlag(FLAG_CAN_COLORIZE, true)
                 .build();
 
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         assertFalse(n.isForegroundService());
         assertFalse(n.hasColorizedPermission());
@@ -10579,7 +10558,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should not be set
         assertSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -10598,7 +10577,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be set
         assertNotSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -10622,7 +10601,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be set
         assertNotSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -10639,7 +10618,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should not be set
         assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -10657,7 +10636,7 @@
         n.flags |= Notification.FLAG_NO_DISMISS;
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be cleared
         assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -10675,7 +10654,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should not be set
         assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -10696,7 +10675,7 @@
         n.flags |= Notification.FLAG_NO_DISMISS;
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be cleared
         assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -10713,7 +10692,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should not be set
         assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -10732,7 +10711,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be set
         assertNotSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -10760,7 +10739,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be cleared
         assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -10781,12 +10760,589 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE);
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should not be set
         assertSame(0, n.flags & Notification.FLAG_NO_DISMISS);
     }
 
+    @Test
+    public void testCancelAllNotifications_IgnoreUserInitiatedJob() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
+        sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+                "testCancelAllNotifications_IgnoreUserInitiatedJob",
+                sbn.getId(), sbn.getNotification(), sbn.getUserId());
+        mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(sbn.getPackageName());
+        assertEquals(1, notifs.length);
+        assertEquals(1, mService.getNotificationRecordCount());
+    }
+
+    @Test
+    public void testCancelAllNotifications_UijFlag_NoUij_Allowed() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(false);
+        final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
+        sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+                "testCancelAllNotifications_UijFlag_NoUij_Allowed",
+                sbn.getId(), sbn.getNotification(), sbn.getUserId());
+        mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(sbn.getPackageName());
+        assertEquals(0, notifs.length);
+    }
+
+    @Test
+    public void testCancelAllNotificationsOtherPackage_IgnoresUijNotification() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
+        sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+                "testCancelAllNotifications_IgnoreOtherPackages",
+                sbn.getId(), sbn.getNotification(), sbn.getUserId());
+        mBinderService.cancelAllNotifications("other_pkg_name", sbn.getUserId());
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(sbn.getPackageName());
+        assertEquals(1, notifs.length);
+        assertEquals(1, mService.getNotificationRecordCount());
+    }
+
+    @Test
+    public void testRemoveUserInitiatedJobFlag_ImmediatelyAfterEnqueue() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        Notification n = new Notification.Builder(mContext, mTestNotificationChannel.getId())
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .build();
+        StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, null, mUid, 0,
+                n, UserHandle.getUserHandleForUid(mUid), null, 0);
+        sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        mBinderService.enqueueNotificationWithTag(PKG, PKG, null,
+                sbn.getId(), sbn.getNotification(), sbn.getUserId());
+        mInternalService.removeUserInitiatedJobFlagFromNotification(PKG, sbn.getId(),
+                sbn.getUserId());
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(sbn.getPackageName());
+        assertFalse(notifs[0].getNotification().isUserInitiatedJob());
+    }
+
+    @Test
+    public void testCancelAfterSecondEnqueueDoesNotSpecifyUserInitiatedJobFlag() throws Exception {
+        final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
+        sbn.getNotification().flags = Notification.FLAG_ONGOING_EVENT | FLAG_USER_INITIATED_JOB;
+        mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+                sbn.getId(), sbn.getNotification(), sbn.getUserId());
+        sbn.getNotification().flags = Notification.FLAG_ONGOING_EVENT;
+        mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+                sbn.getId(), sbn.getNotification(), sbn.getUserId());
+        mBinderService.cancelNotificationWithTag(PKG, PKG, sbn.getTag(), sbn.getId(),
+                sbn.getUserId());
+        waitForIdle();
+        assertEquals(0, mBinderService.getActiveNotifications(sbn.getPackageName()).length);
+        assertEquals(0, mService.getNotificationRecordCount());
+    }
+
+    @Test
+    public void testCancelNotificationWithTag_fromApp_cannotCancelUijChild() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        mService.isSystemUid = false;
+        final NotificationRecord parent = generateNotificationRecord(
+                mTestNotificationChannel, 1, "group", true);
+        final NotificationRecord child = generateNotificationRecord(
+                mTestNotificationChannel, 2, "group", false);
+        final NotificationRecord child2 = generateNotificationRecord(
+                mTestNotificationChannel, 3, "group", false);
+        child2.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        mService.addNotification(parent);
+        mService.addNotification(child);
+        mService.addNotification(child2);
+        mService.getBinderService().cancelNotificationWithTag(
+                parent.getSbn().getPackageName(), parent.getSbn().getPackageName(),
+                parent.getSbn().getTag(), parent.getSbn().getId(), parent.getSbn().getUserId());
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+        assertEquals(1, notifs.length);
+    }
+
+    @Test
+    public void testCancelNotificationWithTag_fromApp_cannotCancelUijParent() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        mService.isSystemUid = false;
+        final NotificationRecord parent = generateNotificationRecord(
+                mTestNotificationChannel, 1, "group", true);
+        parent.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        final NotificationRecord child = generateNotificationRecord(
+                mTestNotificationChannel, 2, "group", false);
+        final NotificationRecord child2 = generateNotificationRecord(
+                mTestNotificationChannel, 3, "group", false);
+        mService.addNotification(parent);
+        mService.addNotification(child);
+        mService.addNotification(child2);
+        mService.getBinderService().cancelNotificationWithTag(
+                parent.getSbn().getPackageName(), parent.getSbn().getPackageName(),
+                parent.getSbn().getTag(), parent.getSbn().getId(), parent.getSbn().getUserId());
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+        assertEquals(3, notifs.length);
+    }
+
+    @Test
+    public void testCancelAllNotificationsFromApp_cannotCancelUijChild() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        mService.isSystemUid = false;
+        final NotificationRecord parent = generateNotificationRecord(
+                mTestNotificationChannel, 1, "group", true);
+        final NotificationRecord child = generateNotificationRecord(
+                mTestNotificationChannel, 2, "group", false);
+        final NotificationRecord child2 = generateNotificationRecord(
+                mTestNotificationChannel, 3, "group", false);
+        child2.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        final NotificationRecord newGroup = generateNotificationRecord(
+                mTestNotificationChannel, 4, "group2", false);
+        mService.addNotification(parent);
+        mService.addNotification(child);
+        mService.addNotification(child2);
+        mService.addNotification(newGroup);
+        mService.getBinderService().cancelAllNotifications(
+                parent.getSbn().getPackageName(), parent.getSbn().getUserId());
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+        assertEquals(1, notifs.length);
+    }
+
+    @Test
+    public void testCancelAllNotifications_fromApp_cannotCancelUijParent() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        mService.isSystemUid = false;
+        final NotificationRecord parent = generateNotificationRecord(
+                mTestNotificationChannel, 1, "group", true);
+        parent.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        final NotificationRecord child = generateNotificationRecord(
+                mTestNotificationChannel, 2, "group", false);
+        final NotificationRecord child2 = generateNotificationRecord(
+                mTestNotificationChannel, 3, "group", false);
+        final NotificationRecord newGroup = generateNotificationRecord(
+                mTestNotificationChannel, 4, "group2", false);
+        mService.addNotification(parent);
+        mService.addNotification(child);
+        mService.addNotification(child2);
+        mService.addNotification(newGroup);
+        mService.getBinderService().cancelAllNotifications(
+                parent.getSbn().getPackageName(), parent.getSbn().getUserId());
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+        assertEquals(1, notifs.length);
+    }
+
+    @Test
+    public void testCancelNotificationsFromListener_clearAll_GroupWithUijParent() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        final NotificationRecord parent = generateNotificationRecord(
+                mTestNotificationChannel, 1, "group", true);
+        parent.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        final NotificationRecord child = generateNotificationRecord(
+                mTestNotificationChannel, 2, "group", false);
+        final NotificationRecord child2 = generateNotificationRecord(
+                mTestNotificationChannel, 3, "group", false);
+        final NotificationRecord newGroup = generateNotificationRecord(
+                mTestNotificationChannel, 4, "group2", false);
+        mService.addNotification(parent);
+        mService.addNotification(child);
+        mService.addNotification(child2);
+        mService.addNotification(newGroup);
+        mService.getBinderService().cancelNotificationsFromListener(null, null);
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+        assertEquals(0, notifs.length);
+    }
+
+    @Test
+    public void testCancelNotificationsFromListener_clearAll_GroupWithUijChild() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        final NotificationRecord parent = generateNotificationRecord(
+                mTestNotificationChannel, 1, "group", true);
+        final NotificationRecord child = generateNotificationRecord(
+                mTestNotificationChannel, 2, "group", false);
+        final NotificationRecord child2 = generateNotificationRecord(
+                mTestNotificationChannel, 3, "group", false);
+        child2.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        final NotificationRecord newGroup = generateNotificationRecord(
+                mTestNotificationChannel, 4, "group2", false);
+        mService.addNotification(parent);
+        mService.addNotification(child);
+        mService.addNotification(child2);
+        mService.addNotification(newGroup);
+        mService.getBinderService().cancelNotificationsFromListener(null, null);
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+        assertEquals(0, notifs.length);
+    }
+
+    @Test
+    public void testCancelNotificationsFromListener_clearAll_Uij() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        final NotificationRecord child2 = generateNotificationRecord(
+                mTestNotificationChannel, 3, null, false);
+        child2.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        mService.addNotification(child2);
+        mService.getBinderService().cancelNotificationsFromListener(null, null);
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(child2.getSbn().getPackageName());
+        assertEquals(0, notifs.length);
+    }
+
+    @Test
+    public void testCancelNotificationsFromListener_byKey_GroupWithUijParent() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        final NotificationRecord parent = generateNotificationRecord(
+                mTestNotificationChannel, 1, "group", true);
+        parent.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        final NotificationRecord child = generateNotificationRecord(
+                mTestNotificationChannel, 2, "group", false);
+        final NotificationRecord child2 = generateNotificationRecord(
+                mTestNotificationChannel, 3, "group", false);
+        final NotificationRecord newGroup = generateNotificationRecord(
+                mTestNotificationChannel, 4, "group2", false);
+        mService.addNotification(parent);
+        mService.addNotification(child);
+        mService.addNotification(child2);
+        mService.addNotification(newGroup);
+        String[] keys = {parent.getSbn().getKey(), child.getSbn().getKey(),
+                child2.getSbn().getKey(), newGroup.getSbn().getKey()};
+        mService.getBinderService().cancelNotificationsFromListener(null, keys);
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+        assertEquals(0, notifs.length);
+    }
+
+    @Test
+    public void testCancelNotificationsFromListener_byKey_GroupWithUijChild() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        final NotificationRecord parent = generateNotificationRecord(
+                mTestNotificationChannel, 1, "group", true);
+        final NotificationRecord child = generateNotificationRecord(
+                mTestNotificationChannel, 2, "group", false);
+        final NotificationRecord child2 = generateNotificationRecord(
+                mTestNotificationChannel, 3, "group", false);
+        child2.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        final NotificationRecord newGroup = generateNotificationRecord(
+                mTestNotificationChannel, 4, "group2", false);
+        mService.addNotification(parent);
+        mService.addNotification(child);
+        mService.addNotification(child2);
+        mService.addNotification(newGroup);
+        String[] keys = {parent.getSbn().getKey(), child.getSbn().getKey(),
+                child2.getSbn().getKey(), newGroup.getSbn().getKey()};
+        mService.getBinderService().cancelNotificationsFromListener(null, keys);
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+        assertEquals(0, notifs.length);
+    }
+
+    @Test
+    public void testCancelNotificationsFromListener_byKey_Uij() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        final NotificationRecord child = generateNotificationRecord(
+                mTestNotificationChannel, 3, null, false);
+        child.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        mService.addNotification(child);
+        String[] keys = {child.getSbn().getKey()};
+        mService.getBinderService().cancelNotificationsFromListener(null, keys);
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(child.getSbn().getPackageName());
+        assertEquals(0, notifs.length);
+    }
+
+    @Test
+    public void testUserInitiatedCancelAllWithGroup_UserInitiatedFlag() throws Exception {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        final NotificationRecord parent = generateNotificationRecord(
+                mTestNotificationChannel, 1, "group", true);
+        final NotificationRecord child = generateNotificationRecord(
+                mTestNotificationChannel, 2, "group", false);
+        final NotificationRecord child2 = generateNotificationRecord(
+                mTestNotificationChannel, 3, "group", false);
+        child2.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        final NotificationRecord newGroup = generateNotificationRecord(
+                mTestNotificationChannel, 4, "group2", false);
+        mService.addNotification(parent);
+        mService.addNotification(child);
+        mService.addNotification(child2);
+        mService.addNotification(newGroup);
+        mService.mNotificationDelegate.onClearAll(mUid, Binder.getCallingPid(), parent.getUserId());
+        waitForIdle();
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+        assertEquals(0, notifs.length);
+    }
+
+    @Test
+    public void testDeleteChannelGroupChecksForUijs() throws Exception {
+        when(mCompanionMgr.getAssociations(PKG, UserHandle.getUserId(mUid)))
+                .thenReturn(singletonList(mock(AssociationInfo.class)));
+        CountDownLatch latch = new CountDownLatch(2);
+        mService.createNotificationChannelGroup(PKG, mUid,
+                new NotificationChannelGroup("group", "group"), true, false);
+        new Thread(() -> {
+            NotificationChannel notificationChannel = new NotificationChannel("id", "id",
+                    NotificationManager.IMPORTANCE_HIGH);
+            notificationChannel.setGroup("group");
+            ParceledListSlice<NotificationChannel> pls =
+                    new ParceledListSlice(ImmutableList.of(notificationChannel));
+            try {
+                mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls);
+            } catch (RemoteException e) {
+                throw new RuntimeException(e);
+            }
+            latch.countDown();
+        }).start();
+        new Thread(() -> {
+            try {
+                synchronized (this) {
+                    wait(5000);
+                }
+                mService.createNotificationChannelGroup(PKG, mUid,
+                        new NotificationChannelGroup("new", "new group"), true, false);
+                NotificationChannel notificationChannel =
+                        new NotificationChannel("id", "id", NotificationManager.IMPORTANCE_HIGH);
+                notificationChannel.setGroup("new");
+                ParceledListSlice<NotificationChannel> pls =
+                        new ParceledListSlice(ImmutableList.of(notificationChannel));
+                try {
+                    mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls);
+                    mBinderService.deleteNotificationChannelGroup(PKG, "group");
+                } catch (RemoteException e) {
+                    throw new RuntimeException(e);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            latch.countDown();
+        }).start();
+
+        latch.await();
+        verify(mJsi).isNotificationChannelAssociatedWithAnyUserInitiatedJobs(
+                anyString(), anyInt(), anyString());
+    }
+
+    @Test
+    public void testRemoveUserInitiatedJobFlagFromNotification_enqueued() {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        Notification n = new Notification.Builder(mContext, "").build();
+        n.flags |= FLAG_USER_INITIATED_JOB;
+
+        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 9, null, mUid, 0,
+                n, UserHandle.getUserHandleForUid(mUid), null, 0);
+        NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
+
+        mService.addEnqueuedNotification(r);
+
+        mInternalService.removeUserInitiatedJobFlagFromNotification(
+                PKG, r.getSbn().getId(), r.getSbn().getUserId());
+
+        waitForIdle();
+
+        verify(mListeners, timeout(200).times(0)).notifyPostedLocked(any(), any());
+    }
+
+    @Test
+    public void testRemoveUserInitiatedJobFlagFromNotification_posted() {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        Notification n = new Notification.Builder(mContext, "").build();
+        n.flags |= FLAG_USER_INITIATED_JOB;
+
+        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 9, null, mUid, 0,
+                n, UserHandle.getUserHandleForUid(mUid), null, 0);
+        NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
+
+        mService.addNotification(r);
+
+        mInternalService.removeUserInitiatedJobFlagFromNotification(
+                PKG, r.getSbn().getId(), r.getSbn().getUserId());
+
+        waitForIdle();
+
+        ArgumentCaptor<NotificationRecord> captor =
+                ArgumentCaptor.forClass(NotificationRecord.class);
+        verify(mListeners, times(1)).notifyPostedLocked(captor.capture(), any());
+
+        assertEquals(0, captor.getValue().getNotification().flags);
+    }
+
+    @Test
+    public void testCannotRemoveUserInitiatedJobFlagWhenOverLimit_enqueued() {
+        for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
+            Notification n = new Notification.Builder(mContext, "").build();
+            StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, i, null, mUid, 0,
+                    n, UserHandle.getUserHandleForUid(mUid), null, 0);
+            NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
+            mService.addEnqueuedNotification(r);
+        }
+        Notification n = new Notification.Builder(mContext, "").build();
+        n.flags |= FLAG_USER_INITIATED_JOB;
+
+        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG,
+                NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS, null, mUid, 0,
+                n, UserHandle.getUserHandleForUid(mUid), null, 0);
+        NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
+
+        mService.addEnqueuedNotification(r);
+
+        mInternalService.removeUserInitiatedJobFlagFromNotification(
+                PKG, r.getSbn().getId(), r.getSbn().getUserId());
+
+        waitForIdle();
+
+        assertEquals(NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS,
+                mService.getNotificationRecordCount());
+    }
+
+    @Test
+    public void testCannotRemoveUserInitiatedJobFlagWhenOverLimit_posted() {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
+            Notification n = new Notification.Builder(mContext, "").build();
+            StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, i, null, mUid, 0,
+                    n, UserHandle.getUserHandleForUid(mUid), null, 0);
+            NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
+            mService.addNotification(r);
+        }
+        Notification n = new Notification.Builder(mContext, "").build();
+        n.flags |= FLAG_USER_INITIATED_JOB;
+
+        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG,
+                NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS, null, mUid, 0,
+                n, UserHandle.getUserHandleForUid(mUid), null, 0);
+        NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
+
+        mService.addNotification(r);
+
+        mInternalService.removeUserInitiatedJobFlagFromNotification(
+                PKG, r.getSbn().getId(), r.getSbn().getUserId());
+
+        waitForIdle();
+
+        assertEquals(NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS,
+                mService.getNotificationRecordCount());
+    }
+
+    @Test
+    public void testCanPostUijWhenOverLimit() throws RemoteException {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
+            StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
+                    i, null, false).getSbn();
+            mBinderService.enqueueNotificationWithTag(PKG, PKG, "testCanPostUijWhenOverLimit",
+                    sbn.getId(), sbn.getNotification(), sbn.getUserId());
+        }
+
+        final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
+        sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+                "testCanPostUijWhenOverLimit - uij over limit!",
+                sbn.getId(), sbn.getNotification(), sbn.getUserId());
+
+        waitForIdle();
+
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(sbn.getPackageName());
+        assertEquals(NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS + 1, notifs.length);
+        assertEquals(NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS + 1,
+                mService.getNotificationRecordCount());
+    }
+
+    @Test
+    public void testCannotPostNonUijWhenOverLimit() throws RemoteException {
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(true);
+        for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
+            StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
+                    i, null, false).getSbn();
+            mBinderService.enqueueNotificationWithTag(PKG, PKG, "testCannotPostNonUijWhenOverLimit",
+                    sbn.getId(), sbn.getNotification(), sbn.getUserId());
+            waitForIdle();
+        }
+
+        final StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
+                100, null, false).getSbn();
+        sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+                "testCannotPostNonUijWhenOverLimit - uij over limit!",
+                sbn.getId(), sbn.getNotification(), sbn.getUserId());
+
+        final StatusBarNotification sbn2 = generateNotificationRecord(mTestNotificationChannel,
+                101, null, false).getSbn();
+        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+                "testCannotPostNonUijWhenOverLimit - non uij over limit!",
+                sbn2.getId(), sbn2.getNotification(), sbn2.getUserId());
+
+        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))
+                .thenReturn(false);
+        final StatusBarNotification sbn3 = generateNotificationRecord(mTestNotificationChannel,
+                101, null, false).getSbn();
+        sbn3.getNotification().flags |= FLAG_USER_INITIATED_JOB;
+        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+                "testCannotPostNonUijWhenOverLimit - fake uij over limit!",
+                sbn3.getId(), sbn3.getNotification(), sbn3.getUserId());
+
+        waitForIdle();
+
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(sbn.getPackageName());
+        assertEquals(NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS + 1, notifs.length);
+        assertEquals(NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS + 1,
+                mService.getNotificationRecordCount());
+    }
+
+    @Test
+    public void fixNotification_withUijFlag_butIsNotUij() throws Exception {
+        final ApplicationInfo applicationInfo = new ApplicationInfo();
+        when(mPackageManagerClient.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
+                .thenReturn(applicationInfo);
+
+        Notification n = new Notification.Builder(mContext, "test")
+                .setFlag(FLAG_USER_INITIATED_JOB, true)
+                .build();
+
+        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        assertFalse(n.isUserInitiatedJob());
+    }
+
     private void setDpmAppOppsExemptFromDismissal(boolean isOn) {
         DeviceConfig.setProperty(
                 DeviceConfig.NAMESPACE_DEVICE_POLICY_MANAGER,
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
index f2b1dc9..397e3c1 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
@@ -138,6 +138,68 @@
     }
 
     @Test
+    public void testHasRequestedPermission_otherPermission() throws Exception {
+        final String permission = "correct";
+
+        String packageName = "testHasRequestedPermission_otherPermission";
+
+        PackageInfo info = new PackageInfo();
+        info.packageName = packageName;
+        info.requestedPermissions = new String[]{"something else"};
+
+        when(mPackageManager.getPackageInfo(packageName, GET_PERMISSIONS, 0)).thenReturn(info);
+
+        assertThat(mPermissionHelper.hasRequestedPermission(permission, packageName, 0)).isFalse();
+
+    }
+
+    @Test
+    public void testHasRequestedPermission_noPermissions() throws Exception {
+        final String permission = "correct";
+
+        String packageName = "testHasRequestedPermission_noPermissions";
+
+        PackageInfo info = new PackageInfo();
+        info.packageName = packageName;
+
+        when(mPackageManager.getPackageInfo(packageName, GET_PERMISSIONS, 0)).thenReturn(info);
+
+        assertThat(mPermissionHelper.hasRequestedPermission(permission, packageName, 0)).isFalse();
+    }
+
+    @Test
+    public void testHasRequestedPermission_singlePermissions() throws Exception {
+        final String permission = "correct";
+
+        String packageName = "testHasRequestedPermission_twoPermissions";
+
+        PackageInfo info = new PackageInfo();
+        info.packageName = packageName;
+        info.requestedPermissions =
+                new String[]{permission};
+
+        when(mPackageManager.getPackageInfo(packageName, GET_PERMISSIONS, 0)).thenReturn(info);
+
+        assertThat(mPermissionHelper.hasRequestedPermission(permission, packageName, 0)).isTrue();
+    }
+
+    @Test
+    public void testHasRequestedPermission_twoPermissions() throws Exception {
+        final String permission = "correct";
+
+        String packageName = "testHasRequestedPermission_twoPermissions";
+
+        PackageInfo info = new PackageInfo();
+        info.packageName = packageName;
+        info.requestedPermissions =
+                new String[]{"something else", permission};
+
+        when(mPackageManager.getPackageInfo(packageName, GET_PERMISSIONS, 0)).thenReturn(info);
+
+        assertThat(mPermissionHelper.hasRequestedPermission(permission, packageName, 0)).isTrue();
+    }
+
+    @Test
     public void testGetAppsGrantedPermission_noApps() throws Exception {
         int userId = 1;
         ParceledListSlice<PackageInfo> infos = ParceledListSlice.emptyList();
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 893f538..3ba9400 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java
@@ -120,12 +120,20 @@
                 .showLights(false)
                 .showBadges(false)
                 .showInAmbientDisplay(false)
+                .allowCalls(ZenPolicy.PEOPLE_TYPE_CONTACTS)
+                .allowMessages(ZenPolicy.PEOPLE_TYPE_STARRED)
+                .allowConversations(ZenPolicy.CONVERSATION_SENDERS_NONE)
                 .build();
 
         ZenModeConfig config = getMutedAllConfig();
         config.allowAlarms = true;
         config.allowReminders = true;
         config.allowEvents = true;
+        config.allowCalls = true;
+        config.allowCallsFrom = Policy.PRIORITY_SENDERS_CONTACTS;
+        config.allowMessages = true;
+        config.allowMessagesFrom = Policy.PRIORITY_SENDERS_STARRED;
+        config.allowConversations = false;
         config.suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_BADGE;
         config.suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_LIGHTS;
         config.suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_AMBIENT;
@@ -138,6 +146,10 @@
         assertEquals(expected.getPriorityCategoryEvents(), actual.getPriorityCategoryEvents());
         assertEquals(expected.getVisualEffectLights(), actual.getVisualEffectLights());
         assertEquals(expected.getVisualEffectAmbient(), actual.getVisualEffectAmbient());
+        assertEquals(expected.getPriorityConversationSenders(),
+                actual.getPriorityConversationSenders());
+        assertEquals(expected.getPriorityCallSenders(), actual.getPriorityCallSenders());
+        assertEquals(expected.getPriorityMessageSenders(), actual.getPriorityMessageSenders());
     }
 
     @Test
diff --git a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/ConversionUtilTest.java b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/ConversionUtilTest.java
new file mode 100644
index 0000000..ff2ce15
--- /dev/null
+++ b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/ConversionUtilTest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.soundtrigger;
+
+import static android.hardware.soundtrigger.ConversionUtil.aidl2apiAudioFormatWithDefault;
+import static android.hardware.soundtrigger.ConversionUtil.aidl2apiPhrase;
+import static android.hardware.soundtrigger.ConversionUtil.aidl2apiRecognitionConfig;
+import static android.hardware.soundtrigger.ConversionUtil.api2aidlPhrase;
+import static android.hardware.soundtrigger.ConversionUtil.api2aidlRecognitionConfig;
+import static android.hardware.soundtrigger.ConversionUtil.byteArrayToSharedMemory;
+import static android.hardware.soundtrigger.ConversionUtil.sharedMemoryToByteArray;
+import static android.hardware.soundtrigger.SoundTrigger.ConfidenceLevel;
+import static android.hardware.soundtrigger.SoundTrigger.RECOGNITION_MODE_GENERIC;
+import static android.hardware.soundtrigger.SoundTrigger.RECOGNITION_MODE_USER_AUTHENTICATION;
+import static android.hardware.soundtrigger.SoundTrigger.RECOGNITION_MODE_USER_IDENTIFICATION;
+import static android.hardware.soundtrigger.SoundTrigger.RECOGNITION_MODE_VOICE_TRIGGER;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import android.hardware.soundtrigger.ConversionUtil;
+import android.hardware.soundtrigger.SoundTrigger;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Locale;
+
+@RunWith(AndroidJUnit4.class)
+public class ConversionUtilTest {
+    private static final String TAG = "ConversionUtilTest";
+
+    @Test
+    public void testDefaultAudioFormatConstruction() {
+        // This method should generate a real format when passed null
+        final var format = aidl2apiAudioFormatWithDefault(
+                null /** exercise default **/,
+                true /** isInput **/
+                );
+        assertNotNull(format);
+    }
+
+    @Test
+    public void testRecognitionConfigRoundTrip() {
+        final int flags = SoundTrigger.ModuleProperties.AUDIO_CAPABILITY_ECHO_CANCELLATION
+                | SoundTrigger.ModuleProperties.AUDIO_CAPABILITY_NOISE_SUPPRESSION;
+        final var data = new byte[] {0x11, 0x22};
+        final var keyphrases = new SoundTrigger.KeyphraseRecognitionExtra[2];
+        keyphrases[0] = new SoundTrigger.KeyphraseRecognitionExtra(99,
+                RECOGNITION_MODE_VOICE_TRIGGER | RECOGNITION_MODE_USER_IDENTIFICATION, 13,
+                    new ConfidenceLevel[] {new ConfidenceLevel(9999, 50),
+                                           new ConfidenceLevel(5000, 80)});
+        keyphrases[1] = new SoundTrigger.KeyphraseRecognitionExtra(101,
+                RECOGNITION_MODE_GENERIC, 8, new ConfidenceLevel[] {
+                    new ConfidenceLevel(7777, 30),
+                    new ConfidenceLevel(2222, 60)});
+
+        var apiconfig = new SoundTrigger.RecognitionConfig(true, false /** must be false **/,
+                keyphrases, data, flags);
+        assertEquals(apiconfig, aidl2apiRecognitionConfig(api2aidlRecognitionConfig(apiconfig)));
+    }
+
+    @Test
+    public void testByteArraySharedMemRoundTrip() {
+        final var data = new byte[] { 0x11, 0x22, 0x33, 0x44,
+                (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef };
+        assertArrayEquals(data, sharedMemoryToByteArray(byteArrayToSharedMemory(data, "name"),
+                    10000000));
+
+    }
+
+    @Test
+    public void testPhraseRoundTrip() {
+        final var users = new int[] {10001, 10002};
+        final var apiphrase = new SoundTrigger.Keyphrase(17 /** id **/,
+                RECOGNITION_MODE_VOICE_TRIGGER | RECOGNITION_MODE_USER_AUTHENTICATION,
+                Locale.forLanguageTag("no_NO"),
+                "Hello Android", /** keyphrase **/
+                users);
+        assertEquals(apiphrase, aidl2apiPhrase(api2aidlPhrase(apiphrase)));
+    }
+}
diff --git a/tests/SoundTriggerTests/src/android/hardware/soundtrigger/SoundTriggerTest.java b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/SoundTriggerTest.java
similarity index 89%
rename from tests/SoundTriggerTests/src/android/hardware/soundtrigger/SoundTriggerTest.java
rename to services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/SoundTriggerTest.java
index f49d9c9..e6a1be8 100644
--- a/tests/SoundTriggerTests/src/android/hardware/soundtrigger/SoundTriggerTest.java
+++ b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/SoundTriggerTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.hardware.soundtrigger;
+package com.android.server.soundtrigger;
 
 import android.hardware.soundtrigger.SoundTrigger.ConfidenceLevel;
 import android.hardware.soundtrigger.SoundTrigger.Keyphrase;
@@ -22,6 +22,7 @@
 import android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra;
 import android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel;
 import android.hardware.soundtrigger.SoundTrigger.RecognitionEvent;
+import android.hardware.soundtrigger.SoundTrigger;
 import android.media.AudioFormat;
 import android.os.Parcel;
 import android.test.InstrumentationTestCase;
@@ -50,10 +51,7 @@
         Keyphrase unparceled = Keyphrase.CREATOR.createFromParcel(parcel);
 
         // Verify that they are the same
-        assertEquals(keyphrase.getId(), unparceled.getId());
-        assertNull(unparceled.getUsers());
-        assertEquals(keyphrase.getLocale(), unparceled.getLocale());
-        assertEquals(keyphrase.getText(), unparceled.getText());
+        assertEquals(keyphrase, unparceled);
     }
 
     @SmallTest
@@ -115,10 +113,7 @@
         KeyphraseSoundModel unparceled = KeyphraseSoundModel.CREATOR.createFromParcel(parcel);
 
         // Verify that they are the same
-        assertEquals(ksm.getUuid(), unparceled.getUuid());
-        assertNull(unparceled.getData());
-        assertEquals(ksm.getType(), unparceled.getType());
-        assertTrue(Arrays.equals(keyphrases, unparceled.getKeyphrases()));
+        assertEquals(ksm, unparceled);
     }
 
     @SmallTest
@@ -162,10 +157,7 @@
         KeyphraseSoundModel unparceled = KeyphraseSoundModel.CREATOR.createFromParcel(parcel);
 
         // Verify that they are the same
-        assertEquals(ksm.getUuid(), unparceled.getUuid());
-        assertEquals(ksm.getType(), unparceled.getType());
-        assertNull(unparceled.getKeyphrases());
-        assertTrue(Arrays.equals(ksm.getData(), unparceled.getData()));
+        assertEquals(ksm, unparceled);
     }
 
     @SmallTest
@@ -226,7 +218,11 @@
                 3 /* captureDelayMs */,
                 4 /* capturePreambleMs */,
                 false /* triggerInData */,
-                null /* captureFormat */,
+                new AudioFormat.Builder()
+                        .setSampleRate(16000)
+                        .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+                        .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
+                        .build(),
                 null /* data */,
                 12345678 /* halEventReceivedMillis */);
 
@@ -251,7 +247,11 @@
                 3 /* captureDelayMs */,
                 4 /* capturePreambleMs */,
                 false /* triggerInData */,
-                null /* captureFormat */,
+                new AudioFormat.Builder()
+                        .setSampleRate(16000)
+                        .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+                        .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
+                        .build(),
                 new byte[1] /* data */,
                 12345678 /* halEventReceivedMillis */);
 
@@ -278,7 +278,11 @@
                 3 /* captureDelayMs */,
                 4 /* capturePreambleMs */,
                 false /* triggerInData */,
-                null /* captureFormat */,
+                new AudioFormat.Builder()
+                        .setSampleRate(16000)
+                        .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+                        .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
+                        .build(),
                 data,
                 12345678 /* halEventReceivedMillis */);
 
@@ -335,7 +339,11 @@
                 3 /* captureDelayMs */,
                 4 /* capturePreambleMs */,
                 false /* triggerInData */,
-                null /* captureFormat */,
+                new AudioFormat.Builder()
+                        .setSampleRate(16000)
+                        .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+                        .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
+                        .build(),
                 null /* data */,
                 null /* keyphraseExtras */,
                 12345678 /* halEventReceivedMillis */);
@@ -364,7 +372,11 @@
                 3 /* captureDelayMs */,
                 4 /* capturePreambleMs */,
                 false /* triggerInData */,
-                null /* captureFormat */,
+                new AudioFormat.Builder()
+                        .setSampleRate(16000)
+                        .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+                        .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
+                        .build(),
                 new byte[1] /* data */,
                 kpExtra,
                 12345678 /* halEventReceivedMillis */);
@@ -409,7 +421,11 @@
                 3 /* captureDelayMs */,
                 4 /* capturePreambleMs */,
                 false /* triggerInData */,
-                null /* captureFormat */,
+                new AudioFormat.Builder()
+                        .setSampleRate(16000)
+                        .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+                        .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
+                        .build(),
                 data,
                 kpExtra,
                 12345678 /* halEventReceivedMillis */);
diff --git a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/ConversionUtilTest.java b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/ConversionUtilTest.java
index 5661b12..7b7a0a3 100644
--- a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/ConversionUtilTest.java
+++ b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/ConversionUtilTest.java
@@ -16,36 +16,18 @@
 
 package com.android.server.soundtrigger_middleware;
 
-import static android.hardware.soundtrigger.ConversionUtil.aidl2apiAudioFormatWithDefault;
-import static android.hardware.soundtrigger.ConversionUtil.aidl2apiPhrase;
-import static android.hardware.soundtrigger.ConversionUtil.aidl2apiRecognitionConfig;
-import static android.hardware.soundtrigger.ConversionUtil.api2aidlPhrase;
-import static android.hardware.soundtrigger.ConversionUtil.api2aidlRecognitionConfig;
-import static android.hardware.soundtrigger.ConversionUtil.byteArrayToSharedMemory;
-import static android.hardware.soundtrigger.ConversionUtil.sharedMemoryToByteArray;
-import static android.hardware.soundtrigger.SoundTrigger.ConfidenceLevel;
-import static android.hardware.soundtrigger.SoundTrigger.RECOGNITION_MODE_GENERIC;
-import static android.hardware.soundtrigger.SoundTrigger.RECOGNITION_MODE_USER_AUTHENTICATION;
-import static android.hardware.soundtrigger.SoundTrigger.RECOGNITION_MODE_USER_IDENTIFICATION;
-import static android.hardware.soundtrigger.SoundTrigger.RECOGNITION_MODE_VOICE_TRIGGER;
-
-import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 
 import android.hardware.audio.common.V2_0.Uuid;
-import android.hardware.soundtrigger.SoundTrigger;
 
 import androidx.test.runner.AndroidJUnit4;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.Locale;
-
 @RunWith(AndroidJUnit4.class)
 public class ConversionUtilTest {
-    private static final String TAG = "ConversionUtilTest";
+    private static final String TAG = "SoundTriggerMiddlewareConversionUtilTest";
 
     @Test
     public void testUuidRoundTrip() {
@@ -62,54 +44,4 @@
         Uuid reconstructed = ConversionUtil.aidl2hidlUuid(aidl);
         assertEquals(hidl, reconstructed);
     }
-
-    @Test
-    public void testDefaultAudioFormatConstruction() {
-        // This method should generate a real format when passed null
-        final var format = aidl2apiAudioFormatWithDefault(
-                null /** exercise default **/,
-                true /** isInput **/
-                );
-        assertNotNull(format);
-    }
-
-    @Test
-    public void testRecognitionConfigRoundTrip() {
-        final int flags = SoundTrigger.ModuleProperties.AUDIO_CAPABILITY_ECHO_CANCELLATION
-                | SoundTrigger.ModuleProperties.AUDIO_CAPABILITY_NOISE_SUPPRESSION;
-        final var data = new byte[] {0x11, 0x22};
-        final var keyphrases = new SoundTrigger.KeyphraseRecognitionExtra[2];
-        keyphrases[0] = new SoundTrigger.KeyphraseRecognitionExtra(99,
-                RECOGNITION_MODE_VOICE_TRIGGER | RECOGNITION_MODE_USER_IDENTIFICATION, 13,
-                    new ConfidenceLevel[] {new ConfidenceLevel(9999, 50),
-                                           new ConfidenceLevel(5000, 80)});
-        keyphrases[1] = new SoundTrigger.KeyphraseRecognitionExtra(101,
-                RECOGNITION_MODE_GENERIC, 8, new ConfidenceLevel[] {
-                    new ConfidenceLevel(7777, 30),
-                    new ConfidenceLevel(2222, 60)});
-
-        var apiconfig = new SoundTrigger.RecognitionConfig(true, false /** must be false **/,
-                keyphrases, data, flags);
-        assertEquals(apiconfig, aidl2apiRecognitionConfig(api2aidlRecognitionConfig(apiconfig)));
-    }
-
-    @Test
-    public void testByteArraySharedMemRoundTrip() {
-        final var data = new byte[] { 0x11, 0x22, 0x33, 0x44,
-                (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef };
-        assertArrayEquals(data, sharedMemoryToByteArray(byteArrayToSharedMemory(data, "name"),
-                    10000000));
-
-    }
-
-    @Test
-    public void testPhraseRoundTrip() {
-        final var users = new int[] {10001, 10002};
-        final var apiphrase = new SoundTrigger.Keyphrase(17 /** id **/,
-                RECOGNITION_MODE_VOICE_TRIGGER | RECOGNITION_MODE_USER_AUTHENTICATION,
-                Locale.forLanguageTag("no_NO"),
-                "Hello Android", /** keyphrase **/
-                users);
-        assertEquals(apiphrase, aidl2apiPhrase(api2aidlPhrase(apiphrase)));
-    }
 }
diff --git a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingTest.java b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingTest.java
index 8694094..4d3c26f 100644
--- a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingTest.java
+++ b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingTest.java
@@ -37,6 +37,7 @@
 import android.os.Process;
 import android.os.RemoteException;
 
+import androidx.test.filters.FlakyTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import com.android.internal.util.FakeLatencyTracker;
@@ -93,10 +94,12 @@
     }
 
     @Test
+    @FlakyTest(bugId = 275113847)
     public void testSetUpAndTearDown() {
     }
 
     @Test
+    @FlakyTest(bugId = 275113847)
     public void testOnPhraseRecognitionStartsLatencyTrackerWithSuccessfulPhraseIdTrigger()
             throws RemoteException {
         ArgumentCaptor<ISoundTriggerCallback> soundTriggerCallbackCaptor = ArgumentCaptor.forClass(
@@ -112,6 +115,7 @@
     }
 
     @Test
+    @FlakyTest(bugId = 275113847)
     public void testOnPhraseRecognitionRestartsActiveSession() throws RemoteException {
         ArgumentCaptor<ISoundTriggerCallback> soundTriggerCallbackCaptor = ArgumentCaptor.forClass(
                 ISoundTriggerCallback.class);
@@ -131,6 +135,7 @@
     }
 
     @Test
+    @FlakyTest(bugId = 275113847)
     public void testOnPhraseRecognitionNeverStartsLatencyTrackerWithNonSuccessEvent()
             throws RemoteException {
         ArgumentCaptor<ISoundTriggerCallback> soundTriggerCallbackCaptor = ArgumentCaptor.forClass(
@@ -147,6 +152,7 @@
     }
 
     @Test
+    @FlakyTest(bugId = 275113847)
     public void testOnPhraseRecognitionNeverStartsLatencyTrackerWithNoKeyphraseId()
             throws RemoteException {
         ArgumentCaptor<ISoundTriggerCallback> soundTriggerCallbackCaptor = ArgumentCaptor.forClass(
diff --git a/services/tests/wmtests/AndroidManifest.xml b/services/tests/wmtests/AndroidManifest.xml
index 593ee4a..2696d2b 100644
--- a/services/tests/wmtests/AndroidManifest.xml
+++ b/services/tests/wmtests/AndroidManifest.xml
@@ -42,7 +42,8 @@
     <uses-permission android:name="android.permission.READ_COMPAT_CHANGE_CONFIG" />
     <uses-permission android:name="android.permission.LOG_COMPAT_CHANGE" />
     <uses-permission android:name="android.permission.CAPTURE_BLACKOUT_CONTENT"/>
-    <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG" />
+    <uses-permission android:name="android.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG" />
+    <uses-permission android:name="android.permission.READ_WRITE_SYNC_DISABLED_MODE_CONFIG" />
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.MANAGE_MEDIA_PROJECTION"/>
diff --git a/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java b/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java
index 49af2c1..5863e9d 100644
--- a/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/PowerKeyGestureTests.java
@@ -20,6 +20,7 @@
 
 import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_POWER_ASSISTANT;
 import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_POWER_GLOBAL_ACTIONS;
+import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_POWER_DREAM_OR_SLEEP;
 
 import android.provider.Settings;
 import android.view.Display;
@@ -49,6 +50,32 @@
     }
 
     /**
+     * Power single press to start dreaming when so configured.
+     */
+    @Test
+    public void testPowerSinglePressRequestsDream() {
+        mPhoneWindowManager.overrideShortPressOnPower(SHORT_PRESS_POWER_DREAM_OR_SLEEP);
+        mPhoneWindowManager.overrideCanStartDreaming(true);
+        sendKey(KEYCODE_POWER);
+        mPhoneWindowManager.assertDreamRequest();
+        mPhoneWindowManager.assertLockedAfterAppTransitionFinished();
+    }
+
+    /**
+     * Power double-press to launch camera does not lock device when the single press behavior is to
+     * dream.
+     */
+    @Test
+    public void testPowerDoublePressWillNotLockDevice() {
+        mPhoneWindowManager.overrideShortPressOnPower(SHORT_PRESS_POWER_DREAM_OR_SLEEP);
+        mPhoneWindowManager.overrideCanStartDreaming(false);
+        sendKey(KEYCODE_POWER);
+        sendKey(KEYCODE_POWER);
+        mPhoneWindowManager.assertCameraLaunch();
+        mPhoneWindowManager.assertWillNotLockAfterAppTransitionFinished();
+    }
+
+    /**
      * Power double press to trigger camera.
      */
     @Test
diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
index b693974..a2ee8a4 100644
--- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
+++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
@@ -84,6 +84,7 @@
 import com.android.server.wm.DisplayPolicy;
 import com.android.server.wm.DisplayRotation;
 import com.android.server.wm.WindowManagerInternal;
+import com.android.server.wm.WindowManagerInternal.AppTransitionListener;
 
 import junit.framework.Assert;
 
@@ -289,6 +290,10 @@
         }
     }
 
+    void overrideShortPressOnPower(int behavior) {
+        mPhoneWindowManager.mShortPressOnPowerBehavior = behavior;
+    }
+
      // Override assist perform function.
     void overrideLongPressOnPower(int behavior) {
         mPhoneWindowManager.mLongPressOnPowerBehavior = behavior;
@@ -311,6 +316,10 @@
         }
     }
 
+    void overrideCanStartDreaming(boolean canDream) {
+        doReturn(canDream).when(mDreamManagerInternal).canStartDreaming(anyBoolean());
+    }
+
     void overrideDisplayState(int state) {
         doReturn(state).when(mDisplay).getState();
         Mockito.reset(mPowerManager);
@@ -374,6 +383,10 @@
                 timeout(SHORTCUT_KEY_DELAY_MILLIS)).performAccessibilityShortcut();
     }
 
+    void assertDreamRequest() {
+        verify(mDreamManagerInternal).requestDream();
+    }
+
     void assertPowerSleep() {
         waitForIdle();
         verify(mPowerManager,
@@ -454,4 +467,17 @@
         waitForIdle();
         verify(mInputManagerInternal).toggleCapsLock(anyInt());
     }
+
+    void assertWillNotLockAfterAppTransitionFinished() {
+        Assert.assertFalse(mPhoneWindowManager.mLockAfterAppTransitionFinished);
+    }
+
+    void assertLockedAfterAppTransitionFinished() {
+        ArgumentCaptor<AppTransitionListener> transitionCaptor =
+                ArgumentCaptor.forClass(AppTransitionListener.class);
+        verify(mWindowManagerInternal).registerAppTransitionListener(
+                transitionCaptor.capture());
+        transitionCaptor.getValue().onAppTransitionFinishedLocked(any());
+        verify(mPhoneWindowManager).lockNow(null);
+    }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
index d0628f1..17ae215 100644
--- a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
@@ -89,11 +89,12 @@
 
     @Before
     public void setUp() throws Exception {
-        mBackNavigationController = Mockito.spy(new BackNavigationController());
+        final BackNavigationController original = new BackNavigationController();
+        original.setWindowManager(mWm);
+        mBackNavigationController = Mockito.spy(original);
         LocalServices.removeServiceForTest(WindowManagerInternal.class);
         mWindowManagerInternal = mock(WindowManagerInternal.class);
         LocalServices.addService(WindowManagerInternal.class, mWindowManagerInternal);
-        mBackNavigationController.setWindowManager(mWm);
         mBackAnimationAdapter = mock(BackAnimationAdapter.class);
         mRootHomeTask = initHomeActivity();
     }
@@ -129,7 +130,9 @@
         // verify if back animation would start.
         assertTrue("Animation scheduled", backNavigationInfo.isPrepareRemoteAnimation());
 
-        // reset drawning status
+        // reset drawing status
+        backNavigationInfo.onBackNavigationFinished(false);
+        mBackNavigationController.clearBackAnimations();
         topTask.forAllWindows(w -> {
             makeWindowVisibleAndDrawn(w);
         }, true);
@@ -138,6 +141,8 @@
         assertThat(typeToString(backNavigationInfo.getType()))
                 .isEqualTo(typeToString(BackNavigationInfo.TYPE_CALLBACK));
 
+        backNavigationInfo.onBackNavigationFinished(false);
+        mBackNavigationController.clearBackAnimations();
         doReturn(true).when(recordA).canShowWhenLocked();
         backNavigationInfo = startBackNavigation();
         assertThat(typeToString(backNavigationInfo.getType()))
@@ -194,6 +199,8 @@
         assertTrue("Animation scheduled", backNavigationInfo.isPrepareRemoteAnimation());
 
         // reset drawing status
+        backNavigationInfo.onBackNavigationFinished(false);
+        mBackNavigationController.clearBackAnimations();
         testCase.recordFront.forAllWindows(w -> {
             makeWindowVisibleAndDrawn(w);
         }, true);
@@ -202,6 +209,8 @@
         assertThat(typeToString(backNavigationInfo.getType()))
                 .isEqualTo(typeToString(BackNavigationInfo.TYPE_CALLBACK));
 
+        backNavigationInfo.onBackNavigationFinished(false);
+        mBackNavigationController.clearBackAnimations();
         doReturn(true).when(testCase.recordBack).canShowWhenLocked();
         backNavigationInfo = startBackNavigation();
         assertThat(typeToString(backNavigationInfo.getType()))
@@ -240,6 +249,8 @@
         assertThat(typeToString(backNavigationInfo.getType()))
                 .isEqualTo(typeToString(BackNavigationInfo.TYPE_RETURN_TO_HOME));
 
+        backNavigationInfo.onBackNavigationFinished(false);
+        mBackNavigationController.clearBackAnimations();
         setupKeyguardOccluded();
         backNavigationInfo = startBackNavigation();
         assertThat(typeToString(backNavigationInfo.getType()))
@@ -553,6 +564,7 @@
         assertTrue(toHomeBuilder.mIsLaunchBehind);
         toHomeBuilder.build();
         verify(animationHandler, never()).createStartingSurface(any());
+        animationHandler.clearBackAnimateTarget();
 
         // Back to ACTIVITY and TASK have the same logic, just with different target.
         final ActivityRecord topActivity = createActivityRecord(task);
diff --git a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
index e85b574..5282585e9 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
@@ -147,8 +147,8 @@
 
         int width = 100;
         int height = 300;
-        Rect bounds = new Rect(0, 0, width, height);
-        mDimmer.updateDims(mTransaction, bounds);
+        mDimmer.mDimState.mDimBounds.set(0, 0, width, height);
+        mDimmer.updateDims(mTransaction);
 
         verify(mTransaction).setWindowCrop(getDimLayer(), width, height);
         verify(mTransaction).show(getDimLayer());
@@ -194,7 +194,7 @@
         SurfaceControl dimLayer = getDimLayer();
         mDimmer.resetDimStates();
 
-        mDimmer.updateDims(mTransaction, new Rect());
+        mDimmer.updateDims(mTransaction);
         verify(mSurfaceAnimatorStarter).startAnimation(any(SurfaceAnimator.class), any(
                 SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean(),
                 eq(ANIMATION_TYPE_DIMMER));
@@ -212,29 +212,29 @@
         mDimmer.resetDimStates();
         mDimmer.dimAbove(mTransaction, child, alpha);
 
-        mDimmer.updateDims(mTransaction, new Rect());
+        mDimmer.updateDims(mTransaction);
         verify(mTransaction).show(dimLayer);
         verify(mTransaction, never()).remove(dimLayer);
     }
 
     @Test
     public void testDimUpdateWhileDimming() {
-        Rect bounds = new Rect();
         TestWindowContainer child = new TestWindowContainer(mWm);
         mHost.addChild(child, 0);
 
         final float alpha = 0.8f;
         mDimmer.dimAbove(mTransaction, child, alpha);
+        final Rect bounds = mDimmer.mDimState.mDimBounds;
 
         SurfaceControl dimLayer = getDimLayer();
         bounds.set(0, 0, 10, 10);
-        mDimmer.updateDims(mTransaction, bounds);
+        mDimmer.updateDims(mTransaction);
         verify(mTransaction).setWindowCrop(dimLayer, bounds.width(), bounds.height());
         verify(mTransaction, times(1)).show(dimLayer);
         verify(mTransaction).setPosition(dimLayer, 0, 0);
 
         bounds.set(10, 10, 30, 30);
-        mDimmer.updateDims(mTransaction, bounds);
+        mDimmer.updateDims(mTransaction);
         verify(mTransaction).setWindowCrop(dimLayer, bounds.width(), bounds.height());
         verify(mTransaction).setPosition(dimLayer, 10, 10);
     }
@@ -246,13 +246,13 @@
 
         mDimmer.dimAbove(mTransaction, child, 1);
         SurfaceControl dimLayer = getDimLayer();
-        mDimmer.updateDims(mTransaction, new Rect());
+        mDimmer.updateDims(mTransaction);
         verify(mTransaction, times(1)).show(dimLayer);
 
         reset(mSurfaceAnimatorStarter);
         mDimmer.dontAnimateExit();
         mDimmer.resetDimStates();
-        mDimmer.updateDims(mTransaction, new Rect());
+        mDimmer.updateDims(mTransaction);
         verify(mSurfaceAnimatorStarter, never()).startAnimation(any(SurfaceAnimator.class), any(
                 SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean(),
                 eq(ANIMATION_TYPE_DIMMER));
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
index 20d410c..c8fdee0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
@@ -81,6 +81,17 @@
         return win;
     }
 
+    private WindowState createDreamWindow() {
+        final WindowState win = createDreamWindow(null, TYPE_BASE_APPLICATION, "dream");
+        final WindowManager.LayoutParams attrs = win.mAttrs;
+        attrs.width = MATCH_PARENT;
+        attrs.height = MATCH_PARENT;
+        attrs.flags =
+                FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR | FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
+        attrs.format = PixelFormat.OPAQUE;
+        return win;
+    }
+
     private WindowState createDimmingDialogWindow(boolean canBeImTarget) {
         final WindowState win = spy(createWindow(null, TYPE_APPLICATION, "dimmingDialog"));
         final WindowManager.LayoutParams attrs = win.mAttrs;
@@ -341,27 +352,28 @@
         assertTrue(imeSource.getFrame().contains(navBarSource.getFrame()));
     }
 
-    @SetupWindows(addWindows = W_NAVIGATION_BAR)
+    @SetupWindows(addWindows = W_INPUT_METHOD)
     @Test
-    public void testInsetsGivenContentFrame() {
+    public void testImeInsetsGivenContentFrame() {
         final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
         final DisplayInfo displayInfo = new DisplayInfo();
         displayInfo.logicalWidth = 1000;
         displayInfo.logicalHeight = 2000;
         displayInfo.rotation = ROTATION_0;
 
-        WindowManager.LayoutParams attrs = mNavBarWindow.mAttrs;
-        displayPolicy.addWindowLw(mNavBarWindow, attrs);
-        mNavBarWindow.setRequestedSize(attrs.width, attrs.height);
-        mNavBarWindow.getControllableInsetProvider().setServerVisible(true);
+        mDisplayContent.setInputMethodWindowLocked(mImeWindow);
+        mImeWindow.getControllableInsetProvider().setServerVisible(true);
 
-        mNavBarWindow.mGivenContentInsets.set(0, 10, 0, 0);
+        mImeWindow.mGivenContentInsets.set(0, 10, 0, 0);
 
-        displayPolicy.layoutWindowLw(mNavBarWindow, null, mDisplayContent.mDisplayFrames);
+        displayPolicy.layoutWindowLw(mImeWindow, null, mDisplayContent.mDisplayFrames);
         final InsetsState state = mDisplayContent.getInsetsStateController().getRawInsetsState();
-        final InsetsSource navBarSource = state.peekSource(
-                mNavBarWindow.getControllableInsetProvider().getSource().getId());
-        assertEquals(attrs.height - 10, navBarSource.getFrame().height());
+        final InsetsSource imeSource = state.peekSource(ID_IME);
+
+        assertNotNull(imeSource);
+        assertFalse(imeSource.getFrame().isEmpty());
+        assertEquals(mImeWindow.getWindowFrames().mFrame.height() - 10,
+                imeSource.getFrame().height());
     }
 
     @SetupWindows(addWindows = { W_ACTIVITY, W_NAVIGATION_BAR })
@@ -384,4 +396,25 @@
         displayPolicy.requestTransientBars(mNavBarWindow, true);
         assertTrue(mDisplayContent.getInsetsPolicy().isTransient(navigationBars()));
     }
+
+    @UseTestDisplay(addWindows = { W_NAVIGATION_BAR })
+    @Test
+    public void testTransientBarsSuppressedOnDreams() {
+        final WindowState win = createDreamWindow();
+
+        ((TestWindowManagerPolicy) mWm.mPolicy).mIsUserSetupComplete = true;
+        win.mAttrs.insetsFlags.behavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
+        win.setRequestedVisibleTypes(0, navigationBars());
+
+        final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
+        displayPolicy.addWindowLw(mNavBarWindow, mNavBarWindow.mAttrs);
+        final InsetsSourceProvider navBarProvider = mNavBarWindow.getControllableInsetProvider();
+        navBarProvider.updateControlForTarget(win, false);
+        navBarProvider.getSource().setVisible(false);
+
+        displayPolicy.setCanSystemBarsBeShownByUser(true);
+        displayPolicy.requestTransientBars(mNavBarWindow, true);
+
+        assertFalse(mDisplayContent.getInsetsPolicy().isTransient(navigationBars()));
+    }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java
index 226ecf4..495f868 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java
@@ -62,6 +62,7 @@
 import android.os.IBinder;
 import android.os.PowerManagerInternal;
 import android.os.SystemClock;
+import android.os.Handler;
 import android.platform.test.annotations.Presubmit;
 import android.provider.Settings;
 import android.view.DisplayAddress;
@@ -76,6 +77,9 @@
 import com.android.server.UiThread;
 import com.android.server.policy.WindowManagerPolicy;
 import com.android.server.statusbar.StatusBarManagerInternal;
+import com.android.server.testutils.OffsettableClock;
+import com.android.server.testutils.TestHandler;
+import com.android.server.wm.DisplayContent.FixedRotationTransitionListener;
 
 import org.junit.After;
 import org.junit.AfterClass;
@@ -104,6 +108,9 @@
     private static final long UI_HANDLER_WAIT_TIMEOUT_MS = 50;
 
     private StatusBarManagerInternal mPreviousStatusBarManagerInternal;
+    private static final OffsettableClock sClock = new OffsettableClock.Stopped();
+    private static TestHandler sHandler;
+    private static long sCurrentUptimeMillis = 10_000;
 
     private static WindowManagerService sMockWm;
     private DisplayContent mMockDisplayContent;
@@ -113,6 +120,7 @@
     private Resources mMockRes;
     private SensorManager mMockSensorManager;
     private Sensor mFakeOrientationSensor;
+    private Sensor mFakeHingeAngleSensor;
     private DisplayWindowSettings mMockDisplayWindowSettings;
     private ContentResolver mMockResolver;
     private FakeSettingsProvider mFakeSettingsProvider;
@@ -125,6 +133,9 @@
     private ContentObserver mUserRotationObserver;
     private SensorEventListener mOrientationSensorListener;
 
+    ArgumentCaptor<SensorEventListener> mHingeAngleSensorListenerCaptor = ArgumentCaptor.forClass(
+            SensorEventListener.class);
+
     private DisplayRotationBuilder mBuilder;
 
     private DeviceStateController mDeviceStateController;
@@ -135,6 +146,7 @@
         sMockWm = mock(WindowManagerService.class);
         sMockWm.mPowerManagerInternal = mock(PowerManagerInternal.class);
         sMockWm.mPolicy = mock(WindowManagerPolicy.class);
+        sHandler = new TestHandler(null, sClock);
     }
 
     @AfterClass
@@ -468,12 +480,16 @@
     }
 
     private SensorEvent createSensorEvent(int rotation) throws Exception {
+        return createSensorEvent(mFakeOrientationSensor, rotation);
+    }
+
+    private SensorEvent createSensorEvent(Sensor sensor, int value) throws Exception {
         final Constructor<SensorEvent> constructor =
                 SensorEvent.class.getDeclaredConstructor(int.class);
         constructor.setAccessible(true);
         final SensorEvent event = constructor.newInstance(1);
-        event.sensor = mFakeOrientationSensor;
-        event.values[0] = rotation;
+        event.sensor = sensor;
+        event.values[0] = value;
         event.timestamp = SystemClock.elapsedRealtimeNanos();
         return event;
     }
@@ -792,7 +808,7 @@
         // ... until half-fold
         mTarget.foldStateChanged(DeviceStateController.DeviceState.HALF_FOLDED);
         assertTrue(waitForUiHandler());
-        verify(sMockWm).updateRotation(anyBoolean(), anyBoolean());
+        verify(sMockWm).updateRotation(false, false);
         assertTrue(waitForUiHandler());
         assertEquals(Surface.ROTATION_0, mTarget.rotationForOrientation(
                 SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0));
@@ -800,7 +816,7 @@
         // ... then transition back to flat
         mTarget.foldStateChanged(DeviceStateController.DeviceState.OPEN);
         assertTrue(waitForUiHandler());
-        verify(sMockWm, atLeast(1)).updateRotation(anyBoolean(), anyBoolean());
+        verify(sMockWm, atLeast(1)).updateRotation(false, false);
         assertTrue(waitForUiHandler());
         assertEquals(Surface.ROTATION_270, mTarget.rotationForOrientation(
                 SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0));
@@ -943,6 +959,120 @@
                 Surface.ROTATION_0, Surface.ROTATION_90, false /* forceUpdate */));
     }
 
+    @Test
+    public void testSensorRotationAfterDisplayChangeBeforeTimeout_ignoresSensor() throws Exception {
+        mBuilder.setSupportHalfFoldAutoRotateOverride(true)
+                .setPauseRotationWhenUnfolding(true)
+                .setDisplaySwitchRotationBlockTimeMs(1000)
+                .build();
+        configureDisplayRotation(SCREEN_ORIENTATION_PORTRAIT, false, false);
+        thawRotation();
+        enableOrientationSensor();
+
+        mTarget.physicalDisplayChanged();
+
+        moveTimeForward(900);
+        mOrientationSensorListener.onSensorChanged(createSensorEvent(Surface.ROTATION_90));
+        assertEquals(Surface.ROTATION_0, mTarget.rotationForOrientation(
+                SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0));
+    }
+
+    @Test
+    public void testSensorRotationAfterDisplayChangeAfterTimeout_usesSensor() throws Exception {
+        mBuilder.setSupportHalfFoldAutoRotateOverride(true)
+                .setPauseRotationWhenUnfolding(true)
+                .setDisplaySwitchRotationBlockTimeMs(1000)
+                .build();
+        configureDisplayRotation(SCREEN_ORIENTATION_PORTRAIT, false, false);
+        thawRotation();
+        enableOrientationSensor();
+
+        mTarget.physicalDisplayChanged();
+
+        moveTimeForward(1100);
+        mOrientationSensorListener.onSensorChanged(createSensorEvent(Surface.ROTATION_90));
+        assertEquals(Surface.ROTATION_90, mTarget.rotationForOrientation(
+                SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0));
+    }
+
+    @Test
+    public void testSensorRotationAfterHingeEventBeforeTimeout_ignoresSensor() throws Exception {
+        mBuilder.setSupportHalfFoldAutoRotateOverride(true)
+                .setPauseRotationWhenUnfolding(true)
+                .setMaxHingeAngle(165)
+                .setHingeAngleRotationBlockTimeMs(400)
+                .build();
+        configureDisplayRotation(SCREEN_ORIENTATION_PORTRAIT, false, false);
+        thawRotation();
+        enableOrientationSensor();
+
+        sendHingeAngleEvent(130);
+
+        moveTimeForward( 300);
+        mOrientationSensorListener.onSensorChanged(createSensorEvent(Surface.ROTATION_90));
+        assertEquals(Surface.ROTATION_0, mTarget.rotationForOrientation(
+                SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0));
+    }
+
+    @Test
+    public void testSensorRotationAfterHingeEventBeforeTimeoutFlagDisabled_usesSensorData()
+            throws Exception {
+        mBuilder.setSupportHalfFoldAutoRotateOverride(true)
+                .setPauseRotationWhenUnfolding(false)
+                .setMaxHingeAngle(165)
+                .setHingeAngleRotationBlockTimeMs(400)
+                .build();
+        configureDisplayRotation(SCREEN_ORIENTATION_PORTRAIT, false, false);
+        thawRotation();
+        enableOrientationSensor();
+
+        sendHingeAngleEvent(130);
+
+        moveTimeForward( 300);
+        mOrientationSensorListener.onSensorChanged(createSensorEvent(Surface.ROTATION_90));
+        assertEquals(Surface.ROTATION_90, mTarget.rotationForOrientation(
+                SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0));
+    }
+
+    @Test
+    public void testSensorRotationAfterHingeEventAfterTimeout_usesSensorData() throws Exception {
+        mBuilder.setSupportHalfFoldAutoRotateOverride(true)
+                .setPauseRotationWhenUnfolding(true)
+                .setMaxHingeAngle(165)
+                .setHingeAngleRotationBlockTimeMs(400)
+                .build();
+        configureDisplayRotation(SCREEN_ORIENTATION_PORTRAIT, false, false);
+        thawRotation();
+        enableOrientationSensor();
+
+        sendHingeAngleEvent(180);
+
+        moveTimeForward(1010);
+        mOrientationSensorListener.onSensorChanged(createSensorEvent(Surface.ROTATION_90));
+        assertEquals(Surface.ROTATION_90, mTarget.rotationForOrientation(
+                SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0));
+    }
+
+
+    @Test
+    public void testSensorRotationAfterLargeHingeEventBeforeTimeout_usesSensor() throws Exception {
+        mBuilder.setSupportHalfFoldAutoRotateOverride(true)
+                .setPauseRotationWhenUnfolding(true)
+                .setMaxHingeAngle(165)
+                .setHingeAngleRotationBlockTimeMs(400)
+                .build();
+        configureDisplayRotation(SCREEN_ORIENTATION_PORTRAIT, false, false);
+        thawRotation();
+        enableOrientationSensor();
+
+        sendHingeAngleEvent(180);
+
+        moveTimeForward(300);
+        mOrientationSensorListener.onSensorChanged(createSensorEvent(Surface.ROTATION_90));
+        assertEquals(Surface.ROTATION_90, mTarget.rotationForOrientation(
+                SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0));
+    }
+
     // ========================
     // Non-rotation API Tests
     // ========================
@@ -963,6 +1093,12 @@
                 + " fixed to user rotation.", mTarget.isFixedToUserRotation());
     }
 
+    private void moveTimeForward(long timeMillis) {
+        sCurrentUptimeMillis += timeMillis;
+        sClock.fastForward(timeMillis);
+        sHandler.timeAdvance();
+    }
+
     /**
      * Call {@link DisplayRotation#configure(int, int)} to configure {@link #mTarget}
      * according to given parameters.
@@ -995,6 +1131,17 @@
         mTarget.configure(width, height);
     }
 
+    private void sendHingeAngleEvent(int hingeAngle) {
+        mHingeAngleSensorListenerCaptor.getAllValues().forEach(sensorEventListener -> {
+            try {
+                sensorEventListener.onSensorChanged(createSensorEvent(mFakeHingeAngleSensor,
+                            hingeAngle));
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+    }
+
     private void freezeRotation(int rotation) {
         mTarget.freezeRotation(rotation);
 
@@ -1016,7 +1163,11 @@
     private class DisplayRotationBuilder {
         private boolean mIsDefaultDisplay = true;
         private boolean mSupportAutoRotation = true;
+        private boolean mPauseRotationWhenUnfolding = false;
         private boolean mSupportHalfFoldAutoRotateOverride = false;
+        private int mDisplaySwitchRotationBlockTimeMs;
+        private int mHingeAngleRotationBlockTimeMs;
+        private int mMaxHingeAngle;
 
         private int mLidOpenRotation = WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT;
         private int mCarDockRotation;
@@ -1028,6 +1179,29 @@
             return this;
         }
 
+        public DisplayRotationBuilder setPauseRotationWhenUnfolding(
+                boolean pauseRotationWhenUnfolding) {
+            mPauseRotationWhenUnfolding = pauseRotationWhenUnfolding;
+            return this;
+        }
+
+        public DisplayRotationBuilder setDisplaySwitchRotationBlockTimeMs(
+                int displaySwitchRotationBlockTimeMs) {
+            mDisplaySwitchRotationBlockTimeMs = displaySwitchRotationBlockTimeMs;
+            return this;
+        }
+
+        public DisplayRotationBuilder setHingeAngleRotationBlockTimeMs(
+                int hingeAngleRotationBlockTimeMs) {
+            mHingeAngleRotationBlockTimeMs = hingeAngleRotationBlockTimeMs;
+            return this;
+        }
+
+        public DisplayRotationBuilder setMaxHingeAngle(int maxHingeAngle) {
+            mMaxHingeAngle = maxHingeAngle;
+            return this;
+        }
+
         private DisplayRotationBuilder setSupportAutoRotation(boolean supportAutoRotation) {
             mSupportAutoRotation = supportAutoRotation;
             return this;
@@ -1153,10 +1327,27 @@
             when(mMockDisplayContent.getWindowConfiguration())
                     .thenReturn(new WindowConfiguration());
 
+            Field field = DisplayContent.class
+                    .getDeclaredField("mFixedRotationTransitionListener");
+            field.setAccessible(true);
+            field.set(mMockDisplayContent, mock(FixedRotationTransitionListener.class));
+
             mMockDisplayPolicy = mock(DisplayPolicy.class);
 
             mMockRes = mock(Resources.class);
             when(mMockContext.getResources()).thenReturn((mMockRes));
+            when(mMockRes.getBoolean(com.android.internal.R.bool
+                    .config_windowManagerPauseRotationWhenUnfolding))
+                    .thenReturn(mPauseRotationWhenUnfolding);
+            when(mMockRes.getInteger(com.android.internal.R.integer
+                    .config_pauseRotationWhenUnfolding_displaySwitchTimeout))
+                    .thenReturn(mDisplaySwitchRotationBlockTimeMs);
+            when(mMockRes.getInteger(com.android.internal.R.integer
+                    .config_pauseRotationWhenUnfolding_hingeEventTimeout))
+                    .thenReturn(mHingeAngleRotationBlockTimeMs);
+            when(mMockRes.getInteger(com.android.internal.R.integer
+                    .config_pauseRotationWhenUnfolding_maxHingeAngle))
+                    .thenReturn(mMaxHingeAngle);
             when(mMockRes.getBoolean(com.android.internal.R.bool.config_supportAutoRotation))
                     .thenReturn(mSupportAutoRotation);
             when(mMockRes.getInteger(com.android.internal.R.integer.config_lidOpenRotation))
@@ -1169,11 +1360,16 @@
                     .thenReturn(convertRotationToDegrees(mUndockedHdmiRotation));
 
             mMockSensorManager = mock(SensorManager.class);
+            when(mMockContext.getSystemService(SensorManager.class))
+                    .thenReturn(mMockSensorManager);
             when(mMockContext.getSystemService(Context.SENSOR_SERVICE))
                     .thenReturn(mMockSensorManager);
             mFakeOrientationSensor = createSensor(Sensor.TYPE_DEVICE_ORIENTATION);
             when(mMockSensorManager.getSensorList(Sensor.TYPE_DEVICE_ORIENTATION)).thenReturn(
                     Collections.singletonList(mFakeOrientationSensor));
+            mFakeHingeAngleSensor = mock(Sensor.class);
+            when(mMockSensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE)).thenReturn(
+                    mFakeHingeAngleSensor);
 
             when(mMockContext.getResources().getBoolean(
                     com.android.internal.R.bool.config_windowManagerHalfFoldAutoRotateOverride))
@@ -1200,6 +1396,10 @@
 
             reset(sMockWm);
 
+            verify(mMockSensorManager, atLeast(0)).registerListener(
+                    mHingeAngleSensorListenerCaptor.capture(), eq(mFakeHingeAngleSensor), anyInt(),
+                    any());
+
             captureObservers();
         }
     }
@@ -1226,5 +1426,15 @@
                 mProposedRotationCallback.accept(rotation);
             }
         }
+
+        @Override
+        Handler getHandler() {
+            return sHandler;
+        }
+
+        @Override
+        long uptimeMillis() {
+            return sCurrentUptimeMillis;
+        }
     }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerInsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java
similarity index 88%
rename from services/tests/wmtests/src/com/android/server/wm/WindowContainerInsetsSourceProviderTest.java
rename to services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java
index ef20f2b..5e513f1 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerInsetsSourceProviderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java
@@ -42,20 +42,20 @@
 @SmallTest
 @Presubmit
 @RunWith(WindowTestRunner.class)
-public class WindowContainerInsetsSourceProviderTest extends WindowTestsBase {
+public class InsetsSourceProviderTest extends WindowTestsBase {
 
     private InsetsSource mSource = new InsetsSource(
             InsetsSource.createId(null, 0, statusBars()), statusBars());
-    private WindowContainerInsetsSourceProvider mProvider;
+    private InsetsSourceProvider mProvider;
     private InsetsSource mImeSource = new InsetsSource(ID_IME, ime());
-    private WindowContainerInsetsSourceProvider mImeProvider;
+    private InsetsSourceProvider mImeProvider;
 
     @Before
     public void setUp() throws Exception {
         mSource.setVisible(true);
-        mProvider = new WindowContainerInsetsSourceProvider(mSource,
+        mProvider = new InsetsSourceProvider(mSource,
                 mDisplayContent.getInsetsStateController(), mDisplayContent);
-        mImeProvider = new WindowContainerInsetsSourceProvider(mImeSource,
+        mImeProvider = new InsetsSourceProvider(mImeSource,
                 mDisplayContent.getInsetsStateController(), mDisplayContent);
     }
 
@@ -76,25 +76,6 @@
     }
 
     @Test
-    public void testPostLayout_givenInsets() {
-        final WindowState ime = createWindow(null, TYPE_APPLICATION, "ime");
-        ime.getFrame().set(0, 0, 500, 100);
-        ime.mGivenContentInsets.set(0, 0, 0, 60);
-        ime.mGivenVisibleInsets.set(0, 0, 0, 75);
-        ime.mHasSurface = true;
-        mProvider.setWindowContainer(ime, null, null);
-        mProvider.updateSourceFrame(ime.getFrame());
-        mProvider.onPostLayout();
-        assertEquals(new Rect(0, 0, 500, 40), mProvider.getSource().getFrame());
-        assertEquals(new Rect(0, 0, 500, 25), mProvider.getSource().getVisibleFrame());
-        assertEquals(Insets.of(0, 40, 0, 0),
-                mProvider.getSource().calculateInsets(new Rect(0, 0, 500, 500),
-                        false /* ignoreVisibility */));
-        assertEquals(Insets.of(0, 25, 0, 0),
-                mProvider.getSource().calculateVisibleInsets(new Rect(0, 0, 500, 500)));
-    }
-
-    @Test
     public void testPostLayout_invisible() {
         final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
         statusBar.getFrame().set(0, 0, 500, 100);
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
index 74fde65..ff2944a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
@@ -287,7 +287,7 @@
         // IME cannot be the IME target.
         ime.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
 
-        WindowContainerInsetsSourceProvider statusBarProvider =
+        InsetsSourceProvider statusBarProvider =
                 getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars());
         final SparseArray<TriConsumer<DisplayFrames, WindowContainer, Rect>> imeOverrideProviders =
                 new SparseArray<>();
@@ -353,7 +353,7 @@
     public void testTransientVisibilityOfFixedRotationState() {
         final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
         final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
-        final WindowContainerInsetsSourceProvider provider = getController()
+        final InsetsSourceProvider provider = getController()
                 .getOrCreateSourceProvider(ID_STATUS_BAR, statusBars());
         provider.setWindowContainer(statusBar, null, null);
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java
index 43fc1c4..7cb7c79d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java
@@ -111,7 +111,6 @@
         mDisplayUniqueId = "test:" + sNextUniqueId++;
         mTestDisplay = new TestDisplayContent.Builder(mAtm, 1000, 1500)
                 .setUniqueId(mDisplayUniqueId).build();
-        mTestDisplay.getDefaultTaskDisplayArea().setWindowingMode(TEST_WINDOWING_MODE);
         when(mRootWindowContainer.getDisplayContent(eq(mDisplayUniqueId)))
                 .thenReturn(mTestDisplay);
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java
index 12e4825..a15ee69 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java
@@ -41,6 +41,7 @@
 import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE;
 import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE;
 import static android.view.WindowManager.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS;
+import static android.view.WindowManager.PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED;
 import static android.view.WindowManager.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -146,7 +147,7 @@
         mActivity = setUpActivityWithComponent();
         mController = new LetterboxUiController(mWm, mActivity);
         prepareActivityThatShouldIgnoreRequestedOrientationDuringRelaunch();
-        mController.setRelauchingAfterRequestedOrientationChanged(false);
+        mController.setRelaunchingAfterRequestedOrientationChanged(false);
 
         spyOn(mDisplayContent.mDisplayRotationCompatPolicy);
         doReturn(true).when(mDisplayContent.mDisplayRotationCompatPolicy)
@@ -190,6 +191,8 @@
 
     @Test
     public void testShouldIgnoreOrientationRequestLoop_overrideDisabled_returnsFalse() {
+        doReturn(true).when(mLetterboxConfiguration)
+                .isPolicyForIgnoringRequestedOrientationEnabled();
         doReturn(false).when(mActivity).isLetterboxedForFixedOrientationAndAspectRatio();
         // Request 3 times to simulate orientation request loop
         for (int i = 0; i <= MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP; i++) {
@@ -200,8 +203,30 @@
 
     @Test
     @EnableCompatChanges({OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED})
+    public void testShouldIgnoreOrientationRequestLoop_propertyIsFalseAndOverride_returnsFalse()
+            throws Exception {
+        doReturn(true).when(mLetterboxConfiguration)
+                .isPolicyForIgnoringRequestedOrientationEnabled();
+        mockThatProperty(PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED,
+                /* value */ false);
+        doReturn(false).when(mActivity).isLetterboxedForFixedOrientationAndAspectRatio();
+
+        mController = new LetterboxUiController(mWm, mActivity);
+
+        // Request 3 times to simulate orientation request loop
+        for (int i = 0; i <= MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP; i++) {
+            assertShouldIgnoreOrientationRequestLoop(/* shouldIgnore */ false,
+                    /* expectedCount */ 0);
+        }
+    }
+
+    @Test
+    @EnableCompatChanges({OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED})
     public void testShouldIgnoreOrientationRequestLoop_isLetterboxed_returnsFalse() {
+        doReturn(true).when(mLetterboxConfiguration)
+                .isPolicyForIgnoringRequestedOrientationEnabled();
         doReturn(true).when(mActivity).isLetterboxedForFixedOrientationAndAspectRatio();
+
         // Request 3 times to simulate orientation request loop
         for (int i = 0; i <= MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP; i++) {
             assertShouldIgnoreOrientationRequestLoop(/* shouldIgnore */ false,
@@ -212,7 +237,10 @@
     @Test
     @EnableCompatChanges({OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED})
     public void testShouldIgnoreOrientationRequestLoop_noLoop_returnsFalse() {
+        doReturn(true).when(mLetterboxConfiguration)
+                .isPolicyForIgnoringRequestedOrientationEnabled();
         doReturn(false).when(mActivity).isLetterboxedForFixedOrientationAndAspectRatio();
+
         // No orientation request loop
         assertShouldIgnoreOrientationRequestLoop(/* shouldIgnore */ false,
                 /* expectedCount */ 0);
@@ -222,7 +250,10 @@
     @EnableCompatChanges({OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED})
     public void testShouldIgnoreOrientationRequestLoop_timeout_returnsFalse()
             throws InterruptedException {
+        doReturn(true).when(mLetterboxConfiguration)
+                .isPolicyForIgnoringRequestedOrientationEnabled();
         doReturn(false).when(mActivity).isLetterboxedForFixedOrientationAndAspectRatio();
+
         for (int i = MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP; i > 0; i--) {
             assertShouldIgnoreOrientationRequestLoop(/* shouldIgnore */ false,
                     /* expectedCount */ 0);
@@ -233,7 +264,10 @@
     @Test
     @EnableCompatChanges({OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED})
     public void testShouldIgnoreOrientationRequestLoop_returnsTrue() {
+        doReturn(true).when(mLetterboxConfiguration)
+                .isPolicyForIgnoringRequestedOrientationEnabled();
         doReturn(false).when(mActivity).isLetterboxedForFixedOrientationAndAspectRatio();
+
         for (int i = 0; i < MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP; i++) {
             assertShouldIgnoreOrientationRequestLoop(/* shouldIgnore */ false,
                     /* expectedCount */ i);
@@ -870,7 +904,7 @@
     private void prepareActivityThatShouldIgnoreRequestedOrientationDuringRelaunch() {
         doReturn(true).when(mLetterboxConfiguration)
                 .isPolicyForIgnoringRequestedOrientationEnabled();
-        mController.setRelauchingAfterRequestedOrientationChanged(true);
+        mController.setRelaunchingAfterRequestedOrientationChanged(true);
     }
 
     private ActivityRecord setUpActivityWithComponent() {
diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
index 9ebc730..10f4158 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
@@ -924,6 +924,11 @@
 
     @Test
     public void testFreezeTaskListOrder_timeout() {
+        for (Task t : mTasks) {
+            // Make all the tasks non-empty
+            new ActivityBuilder(mAtm).setTask(t).build();
+        }
+
         // Add some tasks
         mRecentTasks.add(mTasks.get(0));
         mRecentTasks.add(mTasks.get(1));
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 de41117..e96d1ab 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -178,6 +178,44 @@
     }
 
     @Test
+    public void testActivityInHistoryAndNotVisibleIsNotUsedAsOpaqueForTranslucentActivities() {
+        mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
+        setUpDisplaySizeWithApp(2000, 1000);
+        prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+        mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        mActivity.nowVisible = false;
+        // Translucent Activity
+        final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
+                .setLaunchedFromUid(mActivity.getUid())
+                .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
+                .build();
+        doReturn(false).when(translucentActivity).fillsParent();
+
+        mTask.addChild(translucentActivity);
+
+        assertFalse(translucentActivity.mLetterboxUiController.hasInheritedLetterboxBehavior());
+    }
+
+    @Test
+    public void testActivityInHistoryAndVisibleIsUsedAsOpaqueForTranslucentActivities() {
+        mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
+        setUpDisplaySizeWithApp(2000, 1000);
+        prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+        mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        mActivity.nowVisible = true;
+        // Translucent Activity
+        final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
+                .setLaunchedFromUid(mActivity.getUid())
+                .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
+                .build();
+        doReturn(false).when(translucentActivity).fillsParent();
+
+        mTask.addChild(translucentActivity);
+
+        assertTrue(translucentActivity.mLetterboxUiController.hasInheritedLetterboxBehavior());
+    }
+
+    @Test
     public void testCleanLetterboxConfigListenerWhenTranslucentIsDestroyed() {
         mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
         setUpDisplaySizeWithApp(2000, 1000);
@@ -201,6 +239,7 @@
     public void testHorizontalReachabilityEnabledForTranslucentActivities() {
         setUpDisplaySizeWithApp(2500, 1000);
         mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        mActivity.nowVisible = true;
         final LetterboxConfiguration config = mWm.mLetterboxConfiguration;
         config.setTranslucentLetterboxingOverrideEnabled(true);
         config.setLetterboxHorizontalPositionMultiplier(0.5f);
@@ -276,6 +315,7 @@
     public void testVerticalReachabilityEnabledForTranslucentActivities() {
         setUpDisplaySizeWithApp(1000, 2500);
         mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        mActivity.nowVisible = true;
         final LetterboxConfiguration config = mWm.mLetterboxConfiguration;
         config.setTranslucentLetterboxingOverrideEnabled(true);
         config.setLetterboxVerticalPositionMultiplier(0.5f);
@@ -354,6 +394,7 @@
         prepareUnresizable(mActivity, 1.5f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT);
         mActivity.info.setMinAspectRatio(1.2f);
         mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        mActivity.nowVisible = true;
         // Translucent Activity
         final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
                 .setLaunchedFromUid(mActivity.getUid())
@@ -410,6 +451,7 @@
         prepareUnresizable(mActivity, 1.5f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT);
         mActivity.info.setMinAspectRatio(1.2f);
         mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        mActivity.nowVisible = true;
         // Translucent Activity
         final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
                 .setLaunchedFromUid(mActivity.getUid())
@@ -503,6 +545,7 @@
                 true /* ignoreOrientationRequest */);
         mActivity.mWmService.mLetterboxConfiguration.setLetterboxHorizontalPositionMultiplier(
                 1.0f /*letterboxVerticalPositionMultiplier*/);
+        mActivity.nowVisible = true;
         prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
         // We launch a transparent activity
         final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
@@ -535,6 +578,7 @@
         mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
         setUpDisplaySizeWithApp(2800, 1400);
         mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        mActivity.nowVisible = true;
         prepareUnresizable(mActivity, -1f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT);
         // Rotate to put activity in size compat mode.
         rotateDisplay(mActivity.mDisplayContent, ROTATION_90);
@@ -769,6 +813,8 @@
 
         spyOn(mActivity.mLetterboxUiController);
         doReturn(true).when(mActivity.mLetterboxUiController)
+                .isSurfaceReadyToShow(any());
+        doReturn(true).when(mActivity.mLetterboxUiController)
                 .isSurfaceVisible(any());
 
         assertTrue(mActivity.mLetterboxUiController.shouldShowLetterboxUi(
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
index d7bf4b0..90506d4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -1885,6 +1885,39 @@
         assertEquals(newParent.getDisplayArea(), change.mCommonAncestor);
     }
 
+    @Test
+    public void testMoveToTopWhileVisible() {
+        final Transition transition = createTestTransition(TRANSIT_OPEN);
+        final ArrayMap<WindowContainer, Transition.ChangeInfo> changes = transition.mChanges;
+        final ArraySet<WindowContainer> participants = transition.mParticipants;
+
+        // Start with taskB on top and taskA on bottom but both visible.
+        final Task rootTaskA = createTask(mDisplayContent);
+        final Task leafTaskA = createTaskInRootTask(rootTaskA, 0 /* userId */);
+        final Task taskB = createTask(mDisplayContent);
+        leafTaskA.setVisibleRequested(true);
+        taskB.setVisibleRequested(true);
+        // manually collect since this is a test transition and not known by transitionController.
+        transition.collect(leafTaskA);
+        rootTaskA.moveToFront("test", leafTaskA);
+
+        // All the tasks were already visible, so there shouldn't be any changes
+        ArrayList<Transition.ChangeInfo> targets = Transition.calculateTargets(
+                participants, changes);
+        assertTrue(targets.isEmpty());
+
+        // After collecting order changes, it should recognize that a task moved to top.
+        transition.collectOrderChanges();
+        targets = Transition.calculateTargets(participants, changes);
+        assertEquals(1, targets.size());
+
+        // Make sure the flag is set
+        final TransitionInfo info = Transition.calculateTransitionInfo(
+                transition.mType, 0 /* flags */, targets, mMockT);
+        assertTrue((info.getChanges().get(0).getFlags() & TransitionInfo.FLAG_MOVED_TO_TOP) != 0);
+        assertEquals(TRANSIT_CHANGE, info.getChanges().get(0).getMode());
+    }
+
     private static void makeTaskOrganized(Task... tasks) {
         final ITaskOrganizer organizer = mock(ITaskOrganizer.class);
         for (Task t : tasks) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
index 6261e56..a1ddd57 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -484,7 +484,7 @@
                 windowState.mSurfaceAnimator).getAnimationType();
         assertTrue(parent.isAnimating(CHILDREN));
 
-        windowState.setControllableInsetProvider(mock(WindowContainerInsetsSourceProvider.class));
+        windowState.setControllableInsetProvider(mock(InsetsSourceProvider.class));
         assertFalse(parent.isAnimating(CHILDREN));
     }
 
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 373f994..d19c996 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
@@ -801,8 +801,8 @@
                 new Rect(0, 0, 1080, 200));
         mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct);
 
-        assertThat(navigationBarInsetsReceiverTask.mLocalInsetsSourceProviders
-                .valueAt(0).getSource().getType()).isEqualTo(
+        assertThat(navigationBarInsetsReceiverTask.mLocalInsetsSources
+                .valueAt(0).getType()).isEqualTo(
                         WindowInsets.Type.systemOverlays());
     }
 
@@ -831,7 +831,7 @@
                 WindowInsets.Type.systemOverlays());
         mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct2);
 
-        assertThat(navigationBarInsetsReceiverTask.mLocalInsetsSourceProviders.size()).isEqualTo(0);
+        assertThat(navigationBarInsetsReceiverTask.mLocalInsetsSources.size()).isEqualTo(0);
     }
 
     @Test
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 b48fd7d..fdb3502 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -691,6 +691,7 @@
         // Child window without scale (e.g. different app) should apply inverse scale of parent.
         doReturn(1f).when(cmp).getCompatScale(anyString(), anyInt());
         final WindowState child2 = createWindow(w, TYPE_APPLICATION_SUB_PANEL, "child2");
+        makeWindowVisible(w, child2);
         clearInvocations(t);
         child2.prepareSurfaces();
         verify(t).setMatrix(child2.mSurfaceControl, w.mInvGlobalScale, 0, 0, w.mInvGlobalScale);
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 0d7cdc8..7e3ec55 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -17,6 +17,7 @@
 package com.android.server.wm;
 
 import static android.app.AppOpsManager.OP_NONE;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
 import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
@@ -467,6 +468,12 @@
         return createWindow(null, type, activity, name);
     }
 
+    WindowState createDreamWindow(WindowState parent, int type, String name) {
+        final WindowToken token = createWindowToken(
+                mDisplayContent, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_DREAM, type);
+        return createWindow(parent, type, token, name);
+    }
+
     // TODO: Move these calls to a builder?
     WindowState createWindow(WindowState parent, int type, DisplayContent dc, String name,
             IWindow iwindow) {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 8948e494..a98429a 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -46,6 +46,7 @@
 import android.app.AppOpsManager;
 import android.app.IUidObserver;
 import android.app.PendingIntent;
+import android.app.UidObserver;
 import android.app.admin.DevicePolicyManagerInternal;
 import android.app.usage.AppLaunchEstimateInfo;
 import android.app.usage.AppStandbyInfo;
@@ -592,33 +593,17 @@
         }
     }
 
-    private final IUidObserver mUidObserver = new IUidObserver.Stub() {
+    private final IUidObserver mUidObserver = new UidObserver() {
         @Override
         public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
             mHandler.obtainMessage(MSG_UID_STATE_CHANGED, uid, procState).sendToTarget();
         }
 
         @Override
-        public void onUidIdle(int uid, boolean disabled) {
-            // Ignored
-        }
-
-        @Override
         public void onUidGone(int uid, boolean disabled) {
             onUidStateChanged(uid, ActivityManager.PROCESS_STATE_NONEXISTENT, 0,
                     ActivityManager.PROCESS_CAPABILITY_NONE);
         }
-
-        @Override
-        public void onUidActive(int uid) {
-            // Ignored
-        }
-
-        @Override public void onUidCachedChanged(int uid, boolean cached) {
-        }
-
-        @Override public void onUidProcAdjChanged(int uid) {
-        }
     };
 
     @Override
diff --git a/services/voiceinteraction/OWNERS b/services/voiceinteraction/OWNERS
index ef1061b..40e8d26 100644
--- a/services/voiceinteraction/OWNERS
+++ b/services/voiceinteraction/OWNERS
@@ -1 +1,2 @@
 include /core/java/android/service/voice/OWNERS
+include /media/java/android/media/soundtrigger/OWNERS
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/OWNERS b/services/voiceinteraction/java/com/android/server/soundtrigger/OWNERS
index 01b2cb9..1e41886 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/OWNERS
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/OWNERS
@@ -1,2 +1 @@
[email protected]
[email protected]
+include /media/java/android/media/soundtrigger/OWNERS
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/FakeSoundTriggerHal.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/FakeSoundTriggerHal.java
index 86c4bbf..37a325e 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/FakeSoundTriggerHal.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/FakeSoundTriggerHal.java
@@ -276,16 +276,15 @@
         // for our clients.
         mGlobalEventSession = new IInjectGlobalEvent.Stub() {
             /**
-             * Overrides IInjectGlobalEvent method.
              * Simulate a HAL process restart. This method is not included in regular HAL interface,
              * since the entire process is restarted by sending a signal.
              * Since we run in-proc, we must offer an explicit restart method.
              * oneway
              */
             @Override
-            public void triggerRestart() throws RemoteException {
+            public void triggerRestart() {
                 synchronized (FakeSoundTriggerHal.this.mLock) {
-                    if (mIsDead) throw new DeadObjectException();
+                    if (mIsDead) return;
                     mIsDead = true;
                     mInjectionDispatcher.wrap((ISoundTriggerInjection cb) ->
                             cb.onRestarted(this));
@@ -305,15 +304,15 @@
                 }
             }
 
-            /**
-             * Overrides IInjectGlobalEvent method.
-             * oneway
-             */
+            // oneway
             @Override
             public void setResourceContention(boolean isResourcesContended,
-                        IAcknowledgeEvent callback) throws RemoteException {
+                        IAcknowledgeEvent callback) {
                 synchronized (FakeSoundTriggerHal.this.mLock) {
-                    if (mIsDead) throw new DeadObjectException();
+                    // oneway, so don't throw on death
+                    if (mIsDead || mIsResourceContended == isResourcesContended) {
+                        return;
+                    }
                     mIsResourceContended = isResourcesContended;
                     // Introducing contention is the only injection which can't be
                     // observed by the ST client.
@@ -325,7 +324,19 @@
                     }
                 }
             }
+
+            // oneway
+            @Override
+            public void triggerOnResourcesAvailable() {
+                synchronized (FakeSoundTriggerHal.this.mLock) {
+                    // oneway, so don't throw on death
+                    if (mIsDead) return;
+                    mGlobalCallbackDispatcher.wrap((ISoundTriggerHwGlobalCallback cb) ->
+                            cb.onResourcesAvailable());
+                }
+            }
         };
+
         // Register the global event injection interface
         mInjectionDispatcher.wrap((ISoundTriggerInjection cb)
                 -> cb.registerGlobalEventInjection(mGlobalEventSession));
@@ -465,7 +476,9 @@
             if (session == null) {
                 Slog.wtf(TAG, "Attempted to start recognition with invalid handle");
             }
-
+            if (mIsResourceContended) {
+                throw new ServiceSpecificException(Status.RESOURCE_CONTENTION);
+            }
             if (session.getIsUnloaded()) {
                 // TODO(b/274470274) this is a deficiency in the existing HAL API, there is no way
                 // to handle this race gracefully
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java
index 2f8d17d..4c134af 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java
@@ -35,7 +35,7 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.SystemClock;
-import android.util.Log;
+import android.util.Slog;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.ArrayUtils;
@@ -463,7 +463,7 @@
                 printObject(originatorIdentity),
                 printArgs(args),
                 printObject(retVal));
-        Log.i(TAG, message);
+        Slog.i(TAG, message);
         appendMessage(message);
     }
 
@@ -474,7 +474,7 @@
                 object,
                 printObject(originatorIdentity),
                 printArgs(args));
-        Log.i(TAG, message);
+        Slog.i(TAG, message);
         appendMessage(message);
     }
 
@@ -486,7 +486,7 @@
                 object,
                 printObject(originatorIdentity),
                 printArgs(args));
-        Log.e(TAG, message, ex);
+        Slog.e(TAG, message, ex);
         appendMessage(message + " " + ex.toString());
     }
 
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
index 48a39e6..f3cb9ba 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
@@ -74,9 +74,8 @@
 
 import java.io.PrintWriter;
 import java.time.Instant;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.function.Function;
@@ -122,8 +121,8 @@
     private static final int DETECTION_SERVICE_TYPE_VISUAL_QUERY = 2;
 
     // TODO: This may need to be a Handler(looper)
-    private final ScheduledExecutorService mScheduledExecutorService =
-            Executors.newSingleThreadScheduledExecutor();
+    private final ScheduledThreadPoolExecutor mScheduledExecutorService =
+            new ScheduledThreadPoolExecutor(1);
     @Nullable private final ScheduledFuture<?> mCancellationTaskFuture;
     private final IBinder.DeathRecipient mAudioServerDeathRecipient = this::audioServerDied;
     @NonNull private final ServiceConnectionFactory mHotwordDetectionServiceConnectionFactory;
@@ -210,6 +209,7 @@
         if (mReStartPeriodSeconds <= 0) {
             mCancellationTaskFuture = null;
         } else {
+            mScheduledExecutorService.setRemoveOnCancelPolicy(true);
             // TODO: we need to be smarter here, e.g. schedule it a bit more often,
             //  but wait until the current session is closed.
             mCancellationTaskFuture = mScheduledExecutorService.scheduleAtFixedRate(() -> {
diff --git a/telecomm/java/android/telecom/CallAttributes.java b/telecomm/java/android/telecom/CallAttributes.java
index 1a0f192..f3ef834 100644
--- a/telecomm/java/android/telecom/CallAttributes.java
+++ b/telecomm/java/android/telecom/CallAttributes.java
@@ -58,6 +58,9 @@
     /** @hide **/
     public static final String CALL_CAPABILITIES_KEY = "TelecomCapabilities";
 
+    /** @hide **/
+    public static final String CALLER_PID = "CallerPid";
+
     private CallAttributes(@NonNull PhoneAccountHandle phoneAccountHandle,
             @NonNull CharSequence displayName,
             @NonNull Uri address,
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index d2431f1..7abae18 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -5761,6 +5761,57 @@
         public static final String KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY =
                 KEY_PREFIX + "capability_type_presence_uce_int_array";
 
+        /**
+         * Specifies the policy for disabling NR SA mode. Default value is
+         *{@link #SA_DISABLE_POLICY_NONE}.
+         * The value set as below:
+         * <ul>
+         * <li>0: {@link #SA_DISABLE_POLICY_NONE }</li>
+         * <li>1: {@link #SA_DISABLE_POLICY_WFC_ESTABLISHED }</li>
+         * <li>2: {@link #SA_DISABLE_POLICY_WFC_ESTABLISHED_WHEN_VONR_DISABLED  }</li>
+         * <li>3: {@link #SA_DISABLE_POLICY_VOWIFI_REGISTERED  }</li>
+         * </ul>
+         * @hide
+         */
+        public static final String KEY_SA_DISABLE_POLICY_INT = KEY_PREFIX + "sa_disable_policy_int";
+
+        /** @hide */
+        @IntDef({
+                SA_DISABLE_POLICY_NONE,
+                SA_DISABLE_POLICY_WFC_ESTABLISHED,
+                SA_DISABLE_POLICY_WFC_ESTABLISHED_WHEN_VONR_DISABLED,
+                SA_DISABLE_POLICY_VOWIFI_REGISTERED
+        })
+        public @interface NrSaDisablePolicy {}
+
+        /**
+         * Do not disables NR SA mode.
+         * @hide
+         */
+        public static final int SA_DISABLE_POLICY_NONE = 0;
+
+        /**
+         * Disables NR SA mode when VoWiFi call is established in order to improve the delay or
+         * voice mute when the handover from ePDG to NR is not supported in UE or network.
+         * @hide
+         */
+        public static final int SA_DISABLE_POLICY_WFC_ESTABLISHED = 1;
+
+        /**
+         * Disables NR SA mode when VoWiFi call is established when VoNR is disabled in order to
+         * improve the delay or voice mute when the handover from ePDG to NR is not supported
+         * in UE or network.
+         * @hide
+         */
+        public static final int SA_DISABLE_POLICY_WFC_ESTABLISHED_WHEN_VONR_DISABLED = 2;
+
+        /**
+         * Disables NR SA mode when IMS is registered over WiFi in order to improve the delay or
+         * voice mute when the handover from ePDG to NR is not supported in UE or network.
+         * @hide
+         */
+        public static final int SA_DISABLE_POLICY_VOWIFI_REGISTERED = 3;
+
         private Ims() {}
 
         private static PersistableBundle getDefaults() {
@@ -5832,6 +5883,7 @@
             defaults.putInt(KEY_REGISTRATION_RETRY_BASE_TIMER_MILLIS_INT, 30000);
             defaults.putInt(KEY_REGISTRATION_RETRY_MAX_TIMER_MILLIS_INT, 1800000);
             defaults.putInt(KEY_REGISTRATION_SUBSCRIBE_EXPIRY_TIMER_SEC_INT, 600000);
+            defaults.putInt(KEY_SA_DISABLE_POLICY_INT, SA_DISABLE_POLICY_NONE);
 
             defaults.putIntArray(
                     KEY_IPSEC_AUTHENTICATION_ALGORITHMS_INT_ARRAY,
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 286e71c1..78c6196 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -3652,17 +3652,10 @@
     }
 
     /**
-     * Enables or disables a subscription. This is currently used in the settings page. It will
-     * fail and return false if operation is not supported or failed.
+     * Enable or disable a subscription. This method is same as
+     * {@link #setUiccApplicationsEnabled(int, boolean)}.
      *
-     * To disable an active subscription on a physical (non-Euicc) SIM,
-     * {@link #canDisablePhysicalSubscription} needs to be true.
-     *
-     * <p>
-     * Permissions android.Manifest.permission.MODIFY_PHONE_STATE is required
-     *
-     * @param subscriptionId Subscription to be enabled or disabled. It could be a eSIM or pSIM
-     * subscription.
+     * @param subscriptionId Subscription to be enabled or disabled.
      * @param enable whether user is turning it on or off.
      *
      * @return whether the operation is successful.
@@ -3672,19 +3665,15 @@
     @SystemApi
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
     public boolean setSubscriptionEnabled(int subscriptionId, boolean enable) {
-        if (VDBG) {
-            logd("setSubscriptionActivated subId= " + subscriptionId + " enable " + enable);
-        }
         try {
             ISub iSub = TelephonyManager.getSubscriptionService();
             if (iSub != null) {
-                return iSub.setSubscriptionEnabled(enable, subscriptionId);
+                iSub.setUiccApplicationsEnabled(enable, subscriptionId);
             }
         } catch (RemoteException ex) {
-            // ignore it
+            return false;
         }
-
-        return false;
+        return true;
     }
 
     /**
@@ -3707,11 +3696,7 @@
             logd("setUiccApplicationsEnabled subId= " + subscriptionId + " enable " + enabled);
         }
         try {
-            ISub iSub = ISub.Stub.asInterface(
-                    TelephonyFrameworkInitializer
-                            .getTelephonyServiceManager()
-                            .getSubscriptionServiceRegisterer()
-                            .get());
+            ISub iSub = TelephonyManager.getSubscriptionService();
             if (iSub != null) {
                 iSub.setUiccApplicationsEnabled(enabled, subscriptionId);
             }
@@ -3739,11 +3724,7 @@
             logd("canDisablePhysicalSubscription");
         }
         try {
-            ISub iSub = ISub.Stub.asInterface(
-                    TelephonyFrameworkInitializer
-                            .getTelephonyServiceManager()
-                            .getSubscriptionServiceRegisterer()
-                            .get());
+            ISub iSub = TelephonyManager.getSubscriptionService();
             if (iSub != null) {
                 return iSub.canDisablePhysicalSubscription();
             }
@@ -3867,10 +3848,15 @@
     }
 
     /**
-     * DO NOT USE.
-     * This API is designed for features that are not finished at this point. Do not call this API.
+     * Get the active subscription id by logical SIM slot index.
+     *
+     * @param slotIndex The logical SIM slot index.
+     * @return The active subscription id.
+     *
+     * @throws IllegalArgumentException if the provided slot index is invalid.
+     * @throws SecurityException if callers do not hold the required permission.
+     *
      * @hide
-     * TODO b/135547512: further clean up
      */
     @SystemApi
     @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
diff --git a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
index fa4c9b2..ff378ba 100644
--- a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
+++ b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
@@ -43,6 +43,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Consumer;
 import java.util.function.Supplier;
 
 /**
@@ -325,11 +326,19 @@
     }
 
     private void addRegistrationCallback(IImsRegistrationCallback c) throws RemoteException {
+        // This is purposefully not synchronized with broadcastToCallbacksLocked because the
+        // list of callbacks to notify is copied over from the original list modified here. I also
+        // do not want to risk introducing a deadlock by using the same mCallbacks Object to
+        // synchronize on outgoing and incoming operations.
         mCallbacks.register(c);
         updateNewCallbackWithState(c);
     }
 
     private void removeRegistrationCallback(IImsRegistrationCallback c) {
+        // This is purposefully not synchronized with broadcastToCallbacksLocked because the
+        // list of callbacks to notify is copied over from the original list modified here. I also
+        // do not want to risk introducing a deadlock by using the same mCallbacks Object to
+        // synchronize on outgoing and incoming operations.
         mCallbacks.unregister(c);
     }
 
@@ -420,7 +429,7 @@
     @SystemApi
     public final void onRegistered(@NonNull ImsRegistrationAttributes attributes) {
         updateToState(attributes, RegistrationManager.REGISTRATION_STATE_REGISTERED);
-        mCallbacks.broadcastAction((c) -> {
+        broadcastToCallbacksLocked((c) -> {
             try {
                 c.onRegistered(attributes);
             } catch (RemoteException e) {
@@ -449,7 +458,7 @@
     @SystemApi
     public final void onRegistering(@NonNull ImsRegistrationAttributes attributes) {
         updateToState(attributes, RegistrationManager.REGISTRATION_STATE_REGISTERING);
-        mCallbacks.broadcastAction((c) -> {
+        broadcastToCallbacksLocked((c) -> {
             try {
                 c.onRegistering(attributes);
             } catch (RemoteException e) {
@@ -507,7 +516,7 @@
         updateToDisconnectedState(info, suggestedAction, imsRadioTech);
         // ImsReasonInfo should never be null.
         final ImsReasonInfo reasonInfo = (info != null) ? info : new ImsReasonInfo();
-        mCallbacks.broadcastAction((c) -> {
+        broadcastToCallbacksLocked((c) -> {
             try {
                 c.onDeregistered(reasonInfo, suggestedAction, imsRadioTech);
             } catch (RemoteException e) {
@@ -569,7 +578,7 @@
         updateToDisconnectedState(info, suggestedAction, imsRadioTech);
         // ImsReasonInfo should never be null.
         final ImsReasonInfo reasonInfo = (info != null) ? info : new ImsReasonInfo();
-        mCallbacks.broadcastAction((c) -> {
+        broadcastToCallbacksLocked((c) -> {
             try {
                 c.onDeregisteredWithDetails(reasonInfo, suggestedAction, imsRadioTech, details);
             } catch (RemoteException e) {
@@ -591,7 +600,7 @@
     public final void onTechnologyChangeFailed(@ImsRegistrationTech int imsRadioTech,
             ImsReasonInfo info) {
         final ImsReasonInfo reasonInfo = (info != null) ? info : new ImsReasonInfo();
-        mCallbacks.broadcastAction((c) -> {
+        broadcastToCallbacksLocked((c) -> {
             try {
                 c.onTechnologyChangeFailed(imsRadioTech, reasonInfo);
             } catch (RemoteException e) {
@@ -614,7 +623,20 @@
             mUris = ArrayUtils.cloneOrNull(uris);
             mUrisSet = true;
         }
-        mCallbacks.broadcastAction((c) -> onSubscriberAssociatedUriChanged(c, uris));
+        broadcastToCallbacksLocked((c) -> onSubscriberAssociatedUriChanged(c, uris));
+    }
+
+    /**
+     * Broadcast the specified operation in a synchronized manner so that multiple threads do not
+     * try to call broadcast at the same time, which will generate an error.
+     * @param c The Consumer lambda method containing the callback to call.
+     */
+    private void broadcastToCallbacksLocked(Consumer<IImsRegistrationCallback> c) {
+        // One broadcast can happen at a time, so synchronize threads so only one
+        // beginBroadcast/endBroadcast happens at a time.
+        synchronized (mCallbacks) {
+            mCallbacks.broadcastAction(c);
+        }
     }
 
     private void onSubscriberAssociatedUriChanged(IImsRegistrationCallback callback, Uri[] uris) {
diff --git a/telephony/java/android/telephony/satellite/ISatelliteDatagramCallback.aidl b/telephony/java/android/telephony/satellite/ISatelliteDatagramCallback.aidl
index 2954c2d..e229f05 100644
--- a/telephony/java/android/telephony/satellite/ISatelliteDatagramCallback.aidl
+++ b/telephony/java/android/telephony/satellite/ISatelliteDatagramCallback.aidl
@@ -18,7 +18,7 @@
 
 import android.telephony.satellite.SatelliteDatagram;
 
-import com.android.internal.telephony.ILongConsumer;
+import com.android.internal.telephony.IVoidConsumer;
 
 /**
  * Interface for satellite datagrams callback.
@@ -31,10 +31,10 @@
      * @param datagramId An id that uniquely identifies incoming datagram.
      * @param datagram Datagram received from satellite.
      * @param pendingCount Number of datagrams yet to be received from satellite.
-     * @param callback This callback will be used by datagram receiver app to send received
-     *                 datagramId to Telephony. If the callback is not received within five minutes,
-     *                 Telephony will resend the datagram.
+     * @param callback This callback will be used by datagram receiver app to to inform
+     *                 Telephony that datagram is received. If the callback is not received
+     *                 within five minutes, Telephony will resend the datagram.
      */
     void onSatelliteDatagramReceived(long datagramId, in SatelliteDatagram datagram,
-            int pendingCount, ILongConsumer callback);
+            int pendingCount, IVoidConsumer callback);
 }
diff --git a/telephony/java/android/telephony/satellite/SatelliteDatagramCallback.java b/telephony/java/android/telephony/satellite/SatelliteDatagramCallback.java
index d8a6faf..d0409bf 100644
--- a/telephony/java/android/telephony/satellite/SatelliteDatagramCallback.java
+++ b/telephony/java/android/telephony/satellite/SatelliteDatagramCallback.java
@@ -19,7 +19,7 @@
 import android.annotation.NonNull;
 import android.compat.annotation.UnsupportedAppUsage;
 
-import com.android.internal.telephony.ILongConsumer;
+import java.util.function.Consumer;
 
 /**
  * A callback class for listening to satellite datagrams.
@@ -33,11 +33,11 @@
      * @param datagramId An id that uniquely identifies incoming datagram.
      * @param datagram Datagram to be received over satellite.
      * @param pendingCount Number of datagrams yet to be received by the app.
-     * @param callback This callback will be used by datagram receiver app to send received
-     *                 datagramId to Telephony. If the callback is not received within five minutes,
-     *                 Telephony will resend the datagram.
+     * @param callback This callback will be used by datagram receiver app to inform Telephony
+     *                 that they received the datagram. If the callback is not received within
+     *                 five minutes, Telephony will resend the datagram.
      */
     @UnsupportedAppUsage
     void onSatelliteDatagramReceived(long datagramId, @NonNull SatelliteDatagram datagram,
-            int pendingCount, @NonNull ILongConsumer callback);
+            int pendingCount, @NonNull Consumer<Void> callback);
 }
diff --git a/telephony/java/android/telephony/satellite/SatelliteManager.java b/telephony/java/android/telephony/satellite/SatelliteManager.java
index 7d82fd8..20f9bc8b 100644
--- a/telephony/java/android/telephony/satellite/SatelliteManager.java
+++ b/telephony/java/android/telephony/satellite/SatelliteManager.java
@@ -37,7 +37,7 @@
 import android.telephony.TelephonyFrameworkInitializer;
 
 import com.android.internal.telephony.IIntegerConsumer;
-import com.android.internal.telephony.ILongConsumer;
+import com.android.internal.telephony.IVoidConsumer;
 import com.android.internal.telephony.ITelephony;
 import com.android.telephony.Rlog;
 
@@ -862,7 +862,7 @@
      *
      * @param token The token to be used as a unique identifier for provisioning with satellite
      *              gateway.
-     * @param regionId The region ID for the device's current location.
+     * @param provisionData Data from the provisioning app that can be used by provisioning server
      * @param cancellationSignal The optional signal used by the caller to cancel the provision
      *                           request. Even when the cancellation is signaled, Telephony will
      *                           still trigger the callback to return the result of this request.
@@ -874,13 +874,14 @@
      */
     @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION)
     @UnsupportedAppUsage
-    public void provisionSatelliteService(@NonNull String token, @NonNull String regionId,
+    public void provisionSatelliteService(@NonNull String token, @NonNull byte[] provisionData,
             @Nullable CancellationSignal cancellationSignal,
             @NonNull @CallbackExecutor Executor executor,
             @SatelliteError @NonNull Consumer<Integer> resultListener) {
         Objects.requireNonNull(token);
         Objects.requireNonNull(executor);
         Objects.requireNonNull(resultListener);
+        Objects.requireNonNull(provisionData);
 
         ICancellationSignal cancelRemote = null;
         try {
@@ -893,7 +894,7 @@
                                 () -> resultListener.accept(result)));
                     }
                 };
-                cancelRemote = telephony.provisionSatelliteService(mSubId, token, regionId,
+                cancelRemote = telephony.provisionSatelliteService(mSubId, token, provisionData,
                         errorCallback);
             } else {
                 throw new IllegalStateException("telephony service is null.");
@@ -1186,10 +1187,22 @@
                             @Override
                             public void onSatelliteDatagramReceived(long datagramId,
                                     @NonNull SatelliteDatagram datagram, int pendingCount,
-                                    @NonNull ILongConsumer ack) {
+                                    @NonNull IVoidConsumer internalAck) {
+                                Consumer<Void> externalAck = new Consumer<Void>() {
+                                    @Override
+                                    public void accept(Void result) {
+                                        try {
+                                            internalAck.accept();
+                                        }  catch (RemoteException e) {
+                                              logd("onSatelliteDatagramReceived "
+                                                      + "RemoteException: " + e);
+                                        }
+                                    }
+                                };
+
                                 executor.execute(() -> Binder.withCleanCallingIdentity(
                                         () -> callback.onSatelliteDatagramReceived(
-                                                datagramId, datagram, pendingCount, ack)));
+                                                datagramId, datagram, pendingCount, externalAck)));
                             }
                         };
                 sSatelliteDatagramCallbackMap.put(callback, internalCallback);
@@ -1244,7 +1257,7 @@
      * This method requests modem to check if there are any pending datagrams to be received over
      * satellite. If there are any incoming datagrams, they will be received via
      * {@link SatelliteDatagramCallback#onSatelliteDatagramReceived(long, SatelliteDatagram, int,
-     *        ILongConsumer)}
+     * Consumer)} )}
      *
      * @param executor The executor on which the result listener will be called.
      * @param resultListener Listener for the {@link SatelliteError} result of the operation.
diff --git a/telephony/java/android/telephony/satellite/stub/ISatellite.aidl b/telephony/java/android/telephony/satellite/stub/ISatellite.aidl
index a780cb9..ea4e2e2 100644
--- a/telephony/java/android/telephony/satellite/stub/ISatellite.aidl
+++ b/telephony/java/android/telephony/satellite/stub/ISatellite.aidl
@@ -67,6 +67,15 @@
             in IIntegerConsumer resultCallback);
 
     /**
+     * Allow cellular modem scanning while satellite mode is on.
+     * @param enabled  {@code true} to enable cellular modem while satellite mode is on
+     * and {@code false} to disable
+     * @param errorCallback The callback to receive the error code result of the operation.
+     */
+    void enableCellularModemWhileSatelliteModeIsOn(in boolean enabled,
+        in IIntegerConsumer errorCallback);
+
+    /**
      * Request to enable or disable the satellite modem and demo mode. If the satellite modem
      * is enabled, this may also disable the cellular modem, and if the satellite modem is disabled,
      * this may also re-enable the cellular modem.
@@ -194,7 +203,7 @@
      *
      * @param token The token to be used as a unique identifier for provisioning with satellite
      *              gateway.
-     * @param regionId The region ID for the device's current location.
+     * @param provisionData Data from the provisioning app that can be used by provisioning server
      * @param resultCallback The callback to receive the error code result of the operation.
      *
      * Valid error codes returned:
@@ -210,7 +219,7 @@
      *   SatelliteError:REQUEST_ABORTED
      *   SatelliteError:NETWORK_TIMEOUT
      */
-    void provisionSatelliteService(in String token, in String regionId,
+    void provisionSatelliteService(in String token, in byte[] provisionData,
             in IIntegerConsumer resultCallback);
 
     /**
diff --git a/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java b/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java
index debb394..d606f87 100644
--- a/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java
+++ b/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java
@@ -79,6 +79,15 @@
         }
 
         @Override
+        public void enableCellularModemWhileSatelliteModeIsOn(boolean enabled,
+                IIntegerConsumer errorCallback) throws RemoteException {
+            executeMethodAsync(
+                    () -> SatelliteImplBase.this
+                            .enableCellularModemWhileSatelliteModeIsOn(enabled, errorCallback),
+                    "enableCellularModemWhileSatelliteModeIsOn");
+        }
+
+        @Override
         public void requestSatelliteEnabled(boolean enableSatellite, boolean enableDemoMode,
                 IIntegerConsumer errorCallback) throws RemoteException {
             executeMethodAsync(
@@ -132,11 +141,11 @@
         }
 
         @Override
-        public void provisionSatelliteService(String token, String regionId,
+        public void provisionSatelliteService(String token, byte[] provisionData,
                 IIntegerConsumer errorCallback) throws RemoteException {
             executeMethodAsync(
                     () -> SatelliteImplBase.this
-                            .provisionSatelliteService(token, regionId, errorCallback),
+                            .provisionSatelliteService(token, provisionData, errorCallback),
                     "provisionSatelliteService");
         }
 
@@ -261,6 +270,17 @@
     }
 
     /**
+     * Allow cellular modem scanning while satellite mode is on.
+     * @param enabled  {@code true} to enable cellular modem while satellite mode is on
+     * and {@code false} to disable
+     * @param errorCallback The callback to receive the error code result of the operation.
+     */
+    public void enableCellularModemWhileSatelliteModeIsOn(boolean enabled,
+            @NonNull IIntegerConsumer errorCallback) {
+        // stub implementation
+    }
+
+    /**
      * Request to enable or disable the satellite modem and demo mode. If the satellite modem is
      * enabled, this may also disable the cellular modem, and if the satellite modem is disabled,
      * this may also re-enable the cellular modem.
@@ -401,7 +421,8 @@
      *
      * @param token The token to be used as a unique identifier for provisioning with satellite
      *              gateway.
-     * @param regionId The region ID for the device's current location.
+     * @param provisionData Data from the provisioning app that can be used by provisioning 
+     *                      server
      * @param errorCallback The callback to receive the error code result of the operation.
      *
      * Valid error codes returned:
@@ -417,7 +438,7 @@
      *   SatelliteError:REQUEST_ABORTED
      *   SatelliteError:NETWORK_TIMEOUT
      */
-    public void provisionSatelliteService(@NonNull String token, @NonNull String regionId,
+    public void provisionSatelliteService(@NonNull String token, @NonNull byte[] provisionData,
             @NonNull IIntegerConsumer errorCallback) {
         // stub implementation
     }
diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl
index 632a687..6a5380d 100644
--- a/telephony/java/com/android/internal/telephony/ISub.aidl
+++ b/telephony/java/com/android/internal/telephony/ISub.aidl
@@ -265,8 +265,6 @@
     String getSubscriptionProperty(int subId, String propKey, String callingPackage,
             String callingFeatureId);
 
-    boolean setSubscriptionEnabled(boolean enable, int subId);
-
     boolean isSubscriptionEnabled(int subId);
 
     int getEnabledSubscriptionId(int slotIndex);
@@ -277,7 +275,7 @@
 
     boolean canDisablePhysicalSubscription();
 
-    int setUiccApplicationsEnabled(boolean enabled, int subscriptionId);
+    void setUiccApplicationsEnabled(boolean enabled, int subscriptionId);
 
     int setDeviceToDeviceStatusSharing(int sharing, int subId);
 
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index bab08b5..cbdf38ae 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -2823,15 +2823,15 @@
      * @param subId The subId of the subscription to be provisioned.
      * @param token The token to be used as a unique identifier for provisioning with satellite
      *              gateway.
-     * @param regionId The region ID for the device's current location.
+     * @provisionData Data from the provisioning app that can be used by provisioning server
      * @param callback The callback to get the result of the request.
      *
      * @return The signal transport used by callers to cancel the provision request.
      */
     @JavaPassthrough(annotation="@android.annotation.RequiresPermission("
             + "android.Manifest.permission.SATELLITE_COMMUNICATION)")
-    ICancellationSignal provisionSatelliteService(int subId, in String token, in String regionId,
-            in IIntegerConsumer callback);
+    ICancellationSignal provisionSatelliteService(int subId, in String token,
+            in byte[] provisionData, in IIntegerConsumer callback);
 
     /**
      * Unregister the subscription with the satellite provider.
@@ -2980,4 +2980,13 @@
     @JavaPassthrough(annotation="@android.annotation.RequiresPermission("
             + "android.Manifest.permission.SATELLITE_COMMUNICATION)")
     void requestTimeForNextSatelliteVisibility(int subId, in ResultReceiver receiver);
+
+    /**
+     * This API can be used by only CTS to update satellite vendor service package name.
+     *
+     * @param servicePackageName The package name of the satellite vendor service.
+     * @return {@code true} if the satellite vendor service is set successfully,
+     * {@code false} otherwise.
+     */
+    boolean setSatelliteServicePackageName(in String servicePackageName);
 }
diff --git a/telephony/java/com/android/internal/telephony/IVoidConsumer.aidl b/telephony/java/com/android/internal/telephony/IVoidConsumer.aidl
new file mode 100644
index 0000000..b5557fd
--- /dev/null
+++ b/telephony/java/com/android/internal/telephony/IVoidConsumer.aidl
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ package com.android.internal.telephony;
+
+ /**
+  * Copies consumer pattern for an operation that requires void result from another process to
+  * finish.
+  */
+ oneway interface IVoidConsumer {
+    void accept();
+ }
\ No newline at end of file
diff --git a/tests/FlickerTests/Android.bp b/tests/FlickerTests/Android.bp
index fef5211..4ba538e 100644
--- a/tests/FlickerTests/Android.bp
+++ b/tests/FlickerTests/Android.bp
@@ -50,6 +50,9 @@
         "platform-test-annotations",
         "wm-flicker-window-extensions",
     ],
+    data: [
+        ":FlickerTestApp",
+    ],
 }
 
 java_library {
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt
index 9c3460c..f389e13 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt
@@ -260,7 +260,7 @@
                     snapshotLayers
                         .mapNotNull { snapshotLayer -> snapshotLayer.layer.visibleRegion }
                         .toTypedArray()
-                val snapshotRegion = RegionSubject(visibleAreas, this, timestamp)
+                val snapshotRegion = RegionSubject(visibleAreas, timestamp)
                 val appVisibleRegion = it.visibleRegion(component)
                 if (snapshotRegion.region.isNotEmpty) {
                     snapshotRegion.coversExactly(appVisibleRegion.region)
@@ -280,21 +280,28 @@
  *
  * @param originalLayer
  * ```
+ *
  * Layer that should be visible at the start
+ *
  * @param newLayer Layer that should be visible at the end
  * @param ignoreEntriesWithRotationLayer If entries with a visible rotation layer should be ignored
+ *
  * ```
  *      when checking the transition. If true we will not fail the assertion if a rotation layer is
  *      visible to fill the gap between the [originalLayer] being visible and the [newLayer] being
  *      visible.
  * @param ignoreSnapshot
  * ```
+ *
  * If the snapshot layer should be ignored during the transition
+ *
  * ```
  *     (useful mostly for app launch)
  * @param ignoreSplashscreen
  * ```
+ *
  * If the splashscreen layer should be ignored during the transition.
+ *
  * ```
  *      If true then we will allow for a splashscreen to be shown before the layer is shown,
  *      otherwise we won't and the layer must appear immediately.
@@ -317,8 +324,7 @@
             assertion.then().isVisible(ComponentNameMatcher.SNAPSHOT, isOptional = true)
         }
         if (ignoreSplashscreen) {
-            assertion.then().isSplashScreenVisibleFor(
-                    ComponentNameMatcher(newLayer.packageName, className = ""), isOptional = true)
+            assertion.then().isSplashScreenVisibleFor(newLayer, isOptional = true)
         }
 
         assertion.then().isVisible(newLayer)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt
index 47b2cda..5dc2dd7 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt
@@ -17,6 +17,7 @@
 package com.android.server.wm.flicker.close
 
 import android.platform.test.annotations.FlakyTest
+import android.tools.device.flicker.annotation.FlickerServiceCompatible
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -39,27 +40,20 @@
  *     Launch an app [testApp] and wait animation to complete
  *     Press back button
  * ```
- *
  * To run only the presubmit assertions add: `--
- *
  * ```
  *      --module-arg FlickerTests:exclude-annotation:androidx.test.filters.FlakyTest
  *      --module-arg FlickerTests:include-annotation:android.platform.test.annotations.Presubmit`
  * ```
- *
  * To run only the postsubmit assertions add: `--
- *
  * ```
  *      --module-arg FlickerTests:exclude-annotation:androidx.test.filters.FlakyTest
  *      --module-arg FlickerTests:include-annotation:android.platform.test.annotations.Postsubmit`
  * ```
- *
  * To run only the flaky assertions add: `--
- *
  * ```
  *      --module-arg FlickerTests:include-annotation:androidx.test.filters.FlakyTest`
  * ```
- *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
@@ -71,6 +65,7 @@
  * ```
  */
 @RequiresDevice
+@FlickerServiceCompatible
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTestCfArm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTestCfArm.kt
index 70eedd9..9fa84019 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTestCfArm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTestCfArm.kt
@@ -16,6 +16,7 @@
 
 package com.android.server.wm.flicker.close
 
+import android.tools.device.flicker.annotation.FlickerServiceCompatible
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
@@ -24,6 +25,7 @@
 import org.junit.runners.MethodSorters
 import org.junit.runners.Parameterized
 
+@FlickerServiceCompatible
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
index d8abb4e..b042a14 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
@@ -17,6 +17,7 @@
 package com.android.server.wm.flicker.close
 
 import android.platform.test.annotations.FlakyTest
+import android.tools.device.flicker.annotation.FlickerServiceCompatible
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -39,27 +40,20 @@
  *     Launch an app [testApp] and wait animation to complete
  *     Press home button
  * ```
- *
  * To run only the presubmit assertions add: `--
- *
  * ```
  *      --module-arg FlickerTests:exclude-annotation:androidx.test.filters.FlakyTest
  *      --module-arg FlickerTests:include-annotation:android.platform.test.annotations.Presubmit`
  * ```
- *
  * To run only the postsubmit assertions add: `--
- *
  * ```
  *      --module-arg FlickerTests:exclude-annotation:androidx.test.filters.FlakyTest
  *      --module-arg FlickerTests:include-annotation:android.platform.test.annotations.Postsubmit`
  * ```
- *
  * To run only the flaky assertions add: `--
- *
  * ```
  *      --module-arg FlickerTests:include-annotation:androidx.test.filters.FlakyTest`
  * ```
- *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
@@ -71,6 +65,7 @@
  * ```
  */
 @RequiresDevice
+@FlickerServiceCompatible
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTestCfArm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTestCfArm.kt
index c74f54b..136995a 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTestCfArm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTestCfArm.kt
@@ -16,6 +16,7 @@
 
 package com.android.server.wm.flicker.close
 
+import android.tools.device.flicker.annotation.FlickerServiceCompatible
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
@@ -24,6 +25,7 @@
 import org.junit.runners.MethodSorters
 import org.junit.runners.Parameterized
 
+@FlickerServiceCompatible
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/AssistantAppHelper.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/AssistantAppHelper.kt
index 7aea05d..fde0981 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/AssistantAppHelper.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/AssistantAppHelper.kt
@@ -71,7 +71,7 @@
      * Open Assistance UI.
      *
      * @param longpress open the UI by long pressing power button. Otherwise open the UI through
-     * vioceinteraction shell command directly.
+     *   vioceinteraction shell command directly.
      */
     @JvmOverloads
     fun openUI(longpress: Boolean = false) {
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/GameAppHelper.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/GameAppHelper.kt
index 79c048a..d4f48fe 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/GameAppHelper.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/GameAppHelper.kt
@@ -60,7 +60,6 @@
      *
      * @param wmHelper Helper used to get window region.
      * @param direction UiAutomator Direction enum to indicate the swipe direction.
-     *
      * @return true if the swipe operation is successful.
      */
     fun switchToPreviousAppByQuickSwitchGesture(
@@ -96,7 +95,6 @@
      * @param packageName The targe application's package name.
      * @param identifier The resource id of the target object.
      * @param timeout The timeout duration in milliseconds.
-     *
      * @return true if the target object exists.
      */
     @JvmOverloads
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/GestureHelper.java b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/GestureHelper.java
index a8f1b3d..6b24598 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/GestureHelper.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/GestureHelper.java
@@ -20,6 +20,7 @@
 import android.app.Instrumentation;
 import android.app.UiAutomation;
 import android.os.SystemClock;
+import android.util.Log;
 import android.view.InputDevice;
 import android.view.InputEvent;
 import android.view.MotionEvent;
@@ -32,6 +33,7 @@
  * Injects gestures given an {@link Instrumentation} object.
  */
 public class GestureHelper {
+    private static final String TAG = GestureHelper.class.getSimpleName();
     // Inserted after each motion event injection.
     private static final int MOTION_EVENT_INJECTION_DELAY_MILLIS = 5;
 
@@ -208,6 +210,9 @@
             for (int j = 0; j < coords.length; j++) {
                 coords[j].x += (endPoints[j].x - startPoints[j].x) / steps;
                 coords[j].y += (endPoints[j].y - startPoints[j].y) / steps;
+
+                // TODO: remove logging once b/269505548 is resolved
+                Log.d(TAG, "(" + coords[j].x + ", " + coords[j].y + ")");
             }
 
             eventTime = SystemClock.uptimeMillis();
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/LetterboxAppHelper.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/LetterboxAppHelper.kt
new file mode 100644
index 0000000..1ccac13
--- /dev/null
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/LetterboxAppHelper.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm.flicker.helpers
+
+import android.app.Instrumentation
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.Until
+import com.android.server.wm.flicker.testapp.ActivityOptions
+import android.tools.common.datatypes.component.ComponentNameMatcher
+import android.tools.device.traces.parsers.toFlickerComponent
+import android.tools.device.traces.parsers.WindowManagerStateHelper
+import android.tools.device.apphelpers.StandardAppHelper
+import android.tools.device.helpers.FIND_TIMEOUT
+import android.tools.device.helpers.SYSTEMUI_PACKAGE
+
+class LetterboxAppHelper
+@JvmOverloads
+constructor(
+    instr: Instrumentation,
+    launcherName: String = ActivityOptions.NonResizeablePortraitActivity.LABEL,
+    component: ComponentNameMatcher =
+        ActivityOptions.NonResizeablePortraitActivity.COMPONENT.toFlickerComponent()
+) : StandardAppHelper(instr, launcherName, component) {
+
+    fun clickRestart(wmHelper: WindowManagerStateHelper) {
+        val restartButton = uiDevice.wait(Until.findObject(By.res(
+            SYSTEMUI_PACKAGE, "size_compat_restart_button")), FIND_TIMEOUT)
+        restartButton?.run { restartButton.click() } ?: error("Restart button not found")
+
+        // size compat mode restart confirmation dialog button
+        val restartDialogButton = uiDevice.wait(Until.findObject(By.res(
+            SYSTEMUI_PACKAGE, "letterbox_restart_dialog_restart_button")), FIND_TIMEOUT)
+        restartDialogButton?.run { restartDialogButton.click() }
+            ?: error("Restart dialog button not found")
+        wmHelper.StateSyncBuilder().withAppTransitionIdle().waitForAndVerify()
+    }
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/PipAppHelper.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/PipAppHelper.kt
index e497ae4..a72c12d 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/PipAppHelper.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/PipAppHelper.kt
@@ -57,18 +57,16 @@
         obj.click()
     }
 
-    /**
-     * Drags the PIP window to the provided final coordinates without releasing the pointer.
-     */
-    fun dragPipWindowAwayFromEdgeWithoutRelease(
-        wmHelper: WindowManagerStateHelper,
-        steps: Int
-    ) {
+    /** Drags the PIP window to the provided final coordinates without releasing the pointer. */
+    fun dragPipWindowAwayFromEdgeWithoutRelease(wmHelper: WindowManagerStateHelper, steps: Int) {
         val initWindowRect = getWindowRect(wmHelper).clone()
 
         // initial pointer at the center of the window
-        val initialCoord = GestureHelper.Tuple(initWindowRect.centerX().toFloat(),
-                initWindowRect.centerY().toFloat())
+        val initialCoord =
+            GestureHelper.Tuple(
+                initWindowRect.centerX().toFloat(),
+                initWindowRect.centerY().toFloat()
+            )
 
         // the offset to the right (or left) of the window center to drag the window to
         val offset = 50
@@ -76,8 +74,8 @@
         // the actual final x coordinate with the offset included;
         // if the pip window is closer to the right edge of the display the offset is negative
         // otherwise the offset is positive
-        val endX = initWindowRect.centerX() +
-            offset * (if (isCloserToRightEdge(wmHelper)) -1 else 1)
+        val endX =
+            initWindowRect.centerX() + offset * (if (isCloserToRightEdge(wmHelper)) -1 else 1)
         val finalCoord = GestureHelper.Tuple(endX.toFloat(), initWindowRect.centerY().toFloat())
 
         // drag to the final coordinate
@@ -106,7 +104,8 @@
         val startX = initWindowRect.centerX()
         val y = initWindowRect.centerY()
 
-        val displayRect = wmHelper.currentState.wmState.getDefaultDisplay()?.displayRect
+        val displayRect =
+            wmHelper.currentState.wmState.getDefaultDisplay()?.displayRect
                 ?: throw IllegalStateException("Default display is null")
 
         // the offset to the right (or left) of the display center to drag the window to
@@ -129,7 +128,8 @@
     fun isCloserToRightEdge(wmHelper: WindowManagerStateHelper): Boolean {
         val windowRect = getWindowRect(wmHelper)
 
-        val displayRect = wmHelper.currentState.wmState.getDefaultDisplay()?.displayRect
+        val displayRect =
+            wmHelper.currentState.wmState.getDefaultDisplay()?.displayRect
                 ?: throw IllegalStateException("Default display is null")
 
         return windowRect.centerX() > displayRect.centerX()
@@ -301,9 +301,7 @@
         closePipWindow(WindowManagerStateHelper(mInstrumentation))
     }
 
-    /**
-     * Returns the pip window bounds.
-     */
+    /** Returns the pip window bounds. */
     fun getWindowRect(wmHelper: WindowManagerStateHelper): Rect {
         val windowRegion = wmHelper.getWindowRegion(this)
         require(!windowRegion.isEmpty) { "Unable to find a PIP window in the current state" }
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeOnDismissPopupDialogTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeOnDismissPopupDialogTest.kt
index d72f528..34fa921 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeOnDismissPopupDialogTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeOnDismissPopupDialogTest.kt
@@ -66,7 +66,7 @@
         flicker.assertLayers {
             this.isVisible(ComponentNameMatcher.IME)
                 .then()
-                .isVisible(ComponentNameMatcher.IME_SNAPSHOT)
+                .isVisible(ComponentNameMatcher.IME_SNAPSHOT, isOptional = true)
                 .then()
                 .isInvisible(ComponentNameMatcher.IME_SNAPSHOT, isOptional = true)
                 .isInvisible(ComponentNameMatcher.IME)
@@ -88,7 +88,7 @@
                         imeSnapshotLayers
                             .mapNotNull { imeSnapshotLayer -> imeSnapshotLayer.layer.visibleRegion }
                             .toTypedArray()
-                    val imeVisibleRegion = RegionSubject(visibleAreas, this, timestamp)
+                    val imeVisibleRegion = RegionSubject(visibleAreas, timestamp)
                     val appVisibleRegion = it.visibleRegion(imeTestApp)
                     if (imeVisibleRegion.region.isNotEmpty) {
                         imeVisibleRegion.coversAtMost(appVisibleRegion.region)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeOnDismissPopupDialogTestCfArm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeOnDismissPopupDialogTestCfArm.kt
index 432df20..c355e27 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeOnDismissPopupDialogTestCfArm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeOnDismissPopupDialogTestCfArm.kt
@@ -39,4 +39,4 @@
             )
         }
     }
-}
\ No newline at end of file
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartOnGoHomeTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartOnGoHomeTest.kt
index a4e4b6f..df9d33b 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartOnGoHomeTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartOnGoHomeTest.kt
@@ -40,6 +40,7 @@
  *     Don't show if this is not explicitly requested by the user and the input method
  *     is fullscreen. That would be too disruptive.
  * ```
+ *
  * More details on b/190352379
  *
  * To run this test: `atest FlickerTests:CloseImeAutoOpenWindowToHomeTest`
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartToAppOnPressBackTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartToAppOnPressBackTest.kt
index e85da1f..7954dd1 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartToAppOnPressBackTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeShownOnAppStartToAppOnPressBackTest.kt
@@ -40,6 +40,7 @@
  *     Don't show if this is not explicitly requested by the user and the input method
  *     is fullscreen. That would be too disruptive.
  * ```
+ *
  * More details on b/190352379
  *
  * To run this test: `atest FlickerTests:CloseImeAutoOpenWindowToAppTest`
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeToHomeOnFinishActivityTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeToHomeOnFinishActivityTest.kt
index e2d6dbf..d5208e0 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeToHomeOnFinishActivityTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeToHomeOnFinishActivityTest.kt
@@ -20,7 +20,6 @@
 import android.platform.test.annotations.IwTest
 import android.platform.test.annotations.Presubmit
 import android.tools.common.Rotation
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -29,7 +28,6 @@
 import com.android.server.wm.flicker.BaseTest
 import com.android.server.wm.flicker.helpers.ImeAppHelper
 import com.android.server.wm.flicker.helpers.SimpleAppHelper
-import org.junit.Assume
 import org.junit.FixMethodOrder
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -65,17 +63,9 @@
 
     @Presubmit @Test fun imeLayerBecomesInvisible() = flicker.imeLayerBecomesInvisible()
 
-    @Presubmit
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-    }
-
     @FlakyTest(bugId = 246284124)
     @Test
-    fun visibleLayersShownMoreThanOneConsecutiveEntry_shellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
+    override fun visibleLayersShownMoreThanOneConsecutiveEntry() {
         super.visibleLayersShownMoreThanOneConsecutiveEntry()
     }
 
@@ -83,7 +73,16 @@
     @Test
     @IwTest(focusArea = "ime")
     override fun cujCompleted() {
-        super.cujCompleted()
+        runAndIgnoreAssumptionViolation { entireScreenCovered() }
+        runAndIgnoreAssumptionViolation { statusBarLayerIsVisibleAtStartAndEnd() }
+        runAndIgnoreAssumptionViolation { statusBarLayerPositionAtStartAndEnd() }
+        runAndIgnoreAssumptionViolation { statusBarWindowIsAlwaysVisible() }
+        runAndIgnoreAssumptionViolation { visibleWindowsShownMoreThanOneConsecutiveEntry() }
+        runAndIgnoreAssumptionViolation { taskBarLayerIsVisibleAtStartAndEnd() }
+        runAndIgnoreAssumptionViolation { taskBarWindowIsAlwaysVisible() }
+        runAndIgnoreAssumptionViolation { navBarLayerIsVisibleAtStartAndEnd() }
+        runAndIgnoreAssumptionViolation { navBarWindowIsAlwaysVisible() }
+        runAndIgnoreAssumptionViolation { navBarWindowIsVisibleAtStartAndEnd() }
         imeLayerBecomesInvisible()
         imeWindowBecomesInvisible()
     }
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromFixedOrientationTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromFixedOrientationTest.kt
index 1fee20d..a3fb73b 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromFixedOrientationTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromFixedOrientationTest.kt
@@ -16,20 +16,17 @@
 
 package com.android.server.wm.flicker.ime
 
-import android.platform.test.annotations.FlakyTest
 import android.platform.test.annotations.Presubmit
 import android.tools.common.Rotation
-import com.android.server.wm.flicker.helpers.ImeShownOnAppStartHelper
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.BaseTest
+import com.android.server.wm.flicker.helpers.ImeShownOnAppStartHelper
 import com.android.server.wm.flicker.helpers.setRotation
 import com.android.server.wm.flicker.snapshotStartingWindowLayerCoversExactlyOnApp
-import org.junit.Assume
 import org.junit.FixMethodOrder
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -74,17 +71,9 @@
 
     @Presubmit @Test fun imeLayerBecomesVisible() = flicker.imeLayerBecomesVisible()
 
-    @FlakyTest(bugId = 240918620)
-    @Test
-    fun snapshotStartingWindowLayerCoversExactlyOnApp() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        flicker.snapshotStartingWindowLayerCoversExactlyOnApp(imeTestApp)
-    }
-
     @Presubmit
     @Test
-    fun snapshotStartingWindowLayerCoversExactlyOnApp_ShellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
+    fun snapshotStartingWindowLayerCoversExactlyOnApp() {
         flicker.snapshotStartingWindowLayerCoversExactlyOnApp(imeTestApp)
     }
 
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromOverviewTestCfArm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromOverviewTestCfArm.kt
index efda0ff..e1aa418 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromOverviewTestCfArm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromOverviewTestCfArm.kt
@@ -40,4 +40,4 @@
             )
         }
     }
-}
\ No newline at end of file
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromQuickSwitchTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromQuickSwitchTest.kt
index daee332..690ed53 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromQuickSwitchTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppFromQuickSwitchTest.kt
@@ -20,13 +20,13 @@
 import android.tools.common.NavBar
 import android.tools.common.Rotation
 import android.tools.common.datatypes.component.ComponentNameMatcher
-import com.android.server.wm.flicker.helpers.ImeShownOnAppStartHelper
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.BaseTest
+import com.android.server.wm.flicker.helpers.ImeShownOnAppStartHelper
 import com.android.server.wm.flicker.helpers.SimpleAppHelper
 import com.android.server.wm.flicker.helpers.setRotation
 import org.junit.FixMethodOrder
@@ -86,9 +86,7 @@
         }
     }
     /** {@inheritDoc} */
-    @Presubmit
-    @Test
-    override fun entireScreenCovered() = super.entireScreenCovered()
+    @Presubmit @Test override fun entireScreenCovered() = super.entireScreenCovered()
 
     @Presubmit
     @Test
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppTest.kt
index 7514c9b..866e858 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeOnAppStartWhenLaunchingAppTest.kt
@@ -19,14 +19,14 @@
 import android.platform.test.annotations.Presubmit
 import android.tools.common.Rotation
 import android.tools.common.datatypes.component.ComponentNameMatcher
-import com.android.server.wm.flicker.helpers.ImeShownOnAppStartHelper
-import com.android.server.wm.flicker.helpers.ImeStateInitializeHelper
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.BaseTest
+import com.android.server.wm.flicker.helpers.ImeShownOnAppStartHelper
+import com.android.server.wm.flicker.helpers.ImeStateInitializeHelper
 import com.android.server.wm.flicker.helpers.setRotation
 import org.junit.FixMethodOrder
 import org.junit.Test
@@ -44,20 +44,27 @@
  *     Make sure no apps are running on the device
  *     Launch an app [testApp] that automatically displays IME and wait animation to complete
  * ```
+ *
  * To run only the presubmit assertions add: `--
+ *
  * ```
  *      --module-arg FlickerTests:exclude-annotation:androidx.test.filters.FlakyTest
  *      --module-arg FlickerTests:include-annotation:android.platform.test.annotations.Presubmit`
  * ```
+ *
  * To run only the postsubmit assertions add: `--
+ *
  * ```
  *      --module-arg FlickerTests:exclude-annotation:androidx.test.filters.FlakyTest
  *      --module-arg FlickerTests:include-annotation:android.platform.test.annotations.Postsubmit`
  * ```
+ *
  * To run only the flaky assertions add: `--
+ *
  * ```
  *      --module-arg FlickerTests:include-annotation:androidx.test.filters.FlakyTest`
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeWhileDismissingThemedPopupDialogTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeWhileDismissingThemedPopupDialogTest.kt
index a57aa5b..6f22589 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeWhileDismissingThemedPopupDialogTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeWhileDismissingThemedPopupDialogTest.kt
@@ -19,7 +19,6 @@
 import android.platform.test.annotations.Presubmit
 import android.tools.common.Rotation
 import android.tools.common.datatypes.component.ComponentNameMatcher
-import com.android.server.wm.flicker.helpers.ImeShownOnAppStartHelper
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -29,6 +28,7 @@
 import android.view.WindowInsets.Type.statusBars
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.BaseTest
+import com.android.server.wm.flicker.helpers.ImeShownOnAppStartHelper
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
 import org.junit.FixMethodOrder
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeWhileDismissingThemedPopupDialogTestCfArm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeWhileDismissingThemedPopupDialogTestCfArm.kt
index cffc05d..8891d26 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeWhileDismissingThemedPopupDialogTestCfArm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeWhileDismissingThemedPopupDialogTestCfArm.kt
@@ -45,4 +45,4 @@
             )
         }
     }
-}
\ No newline at end of file
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeWhileEnteringOverviewTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeWhileEnteringOverviewTest.kt
index 9ea12a9..231d0d7 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeWhileEnteringOverviewTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ShowImeWhileEnteringOverviewTest.kt
@@ -19,8 +19,6 @@
 import android.platform.test.annotations.Presubmit
 import android.tools.common.datatypes.component.ComponentNameMatcher
 import android.tools.common.traces.ConditionsFactory
-import android.tools.device.flicker.isShellTransitionsEnabled
-import com.android.server.wm.flicker.helpers.ImeShownOnAppStartHelper
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -28,6 +26,7 @@
 import android.tools.device.traces.parsers.WindowManagerStateHelper
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.BaseTest
+import com.android.server.wm.flicker.helpers.ImeShownOnAppStartHelper
 import com.android.server.wm.flicker.navBarLayerIsVisibleAtStartAndEnd
 import com.android.server.wm.flicker.statusBarLayerIsVisibleAtStartAndEnd
 import org.junit.Assume
@@ -101,16 +100,6 @@
         flicker.navBarLayerIsVisibleAtStartAndEnd()
     }
 
-    /** Bars are expected to be hidden while entering overview in landscape (b/227189877) */
-    @Presubmit
-    @Test
-    fun navBarLayerIsVisibleAtStartAndEndGestural() {
-        Assume.assumeFalse(flicker.scenario.isTablet)
-        Assume.assumeTrue(flicker.scenario.isGesturalNavigation)
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        flicker.navBarLayerIsVisibleAtStartAndEnd()
-    }
-
     /**
      * In the legacy transitions, the nav bar is not marked as invisible. In the new transitions
      * this is fixed and the nav bar shows as invisible
@@ -121,7 +110,6 @@
         Assume.assumeFalse(flicker.scenario.isTablet)
         Assume.assumeTrue(flicker.scenario.isLandscapeOrSeascapeAtStart)
         Assume.assumeTrue(flicker.scenario.isGesturalNavigation)
-        Assume.assumeTrue(isShellTransitionsEnabled)
         flicker.assertLayersStart { this.isVisible(ComponentNameMatcher.NAV_BAR) }
         flicker.assertLayersEnd { this.isInvisible(ComponentNameMatcher.NAV_BAR) }
     }
@@ -186,25 +174,15 @@
 
     @Presubmit
     @Test
-    fun statusBarLayerIsInvisibleInLandscapeShell() {
+    fun statusBarLayerIsInvisibleInLandscape() {
         Assume.assumeTrue(flicker.scenario.isLandscapeOrSeascapeAtStart)
         Assume.assumeFalse(flicker.scenario.isTablet)
-        Assume.assumeTrue(isShellTransitionsEnabled)
         flicker.assertLayersStart { this.isVisible(ComponentNameMatcher.STATUS_BAR) }
         flicker.assertLayersEnd { this.isInvisible(ComponentNameMatcher.STATUS_BAR) }
     }
 
     @Presubmit
     @Test
-    fun statusBarLayerIsVisibleInLandscapeLegacy() {
-        Assume.assumeTrue(flicker.scenario.isLandscapeOrSeascapeAtStart)
-        Assume.assumeTrue(flicker.scenario.isTablet)
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        flicker.statusBarLayerIsVisibleAtStartAndEnd()
-    }
-
-    @Presubmit
-    @Test
     fun imeLayerIsVisibleAndAssociatedWithAppWidow() {
         flicker.assertLayersStart {
             isVisible(ComponentNameMatcher.IME)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt
index e8f9aa3..3c577ac 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt
@@ -44,6 +44,7 @@
  *     Launch a secondary activity within the app
  *     Close the secondary activity back to the initial one
  * ```
+ *
  * Notes:
  * ```
  *     1. Part of the test setup occurs automatically via
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppAfterCameraTestCfArm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppAfterCameraTestCfArm.kt
index ac05c76..3289bc6 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppAfterCameraTestCfArm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppAfterCameraTestCfArm.kt
@@ -41,4 +41,4 @@
             return FlickerTestFactory.nonRotationTests()
         }
     }
-}
+}
\ No newline at end of file
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdFromIcon.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdFromIcon.kt
index 05abf9f..360a233 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdFromIcon.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdFromIcon.kt
@@ -39,6 +39,7 @@
  *     Make sure no apps are running on the device
  *     Launch an app [testApp] by clicking it's icon on all apps and wait animation to complete
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdFromIconCfArm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdFromIconCfArm.kt
index 09c17b1..ccbe74f 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdFromIconCfArm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdFromIconCfArm.kt
@@ -18,6 +18,7 @@
 
 import android.platform.test.annotations.FlakyTest
 import android.tools.common.NavBar
+import android.tools.device.flicker.annotation.FlickerServiceCompatible
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
@@ -28,6 +29,7 @@
 import org.junit.runners.Parameterized
 
 /** Some assertions will fail because of b/264415996 */
+@FlickerServiceCompatible
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
index 5cacb04..d0dc42f 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
@@ -18,13 +18,14 @@
 
 import android.platform.test.annotations.Postsubmit
 import android.platform.test.annotations.Presubmit
+import android.tools.device.flicker.annotation.FlickerServiceCompatible
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
-import android.tools.device.flicker.rules.RemoveAllTasksButHomeRule.Companion.removeAllTasksButHome
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.helpers.setRotation
+import android.tools.device.flicker.rules.RemoveAllTasksButHomeRule.Companion.removeAllTasksButHome
 import org.junit.FixMethodOrder
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -41,7 +42,6 @@
  *     Make sure no apps are running on the device
  *     Launch an app [testApp] and wait animation to complete
  * ```
- *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
@@ -53,6 +53,7 @@
  * ```
  */
 @RequiresDevice
+@FlickerServiceCompatible
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTestCfArm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTestCfArm.kt
index f77f968..f75d9ee 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTestCfArm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTestCfArm.kt
@@ -17,6 +17,7 @@
 package com.android.server.wm.flicker.launch
 
 import android.platform.test.annotations.FlakyTest
+import android.tools.device.flicker.annotation.FlickerServiceCompatible
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
@@ -26,6 +27,7 @@
 import org.junit.runners.MethodSorters
 import org.junit.runners.Parameterized
 
+@FlickerServiceCompatible
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
@@ -47,4 +49,4 @@
             return FlickerTestFactory.nonRotationTests()
         }
     }
-}
+}
\ No newline at end of file
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationCold.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationCold.kt
index 63ffee6..12c0874 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationCold.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationCold.kt
@@ -135,14 +135,15 @@
         }
 
         /**
-         * Ensures that posted notifications will be visible on the lockscreen and not
-         * suppressed due to being marked as seen.
+         * Ensures that posted notifications will be visible on the lockscreen and not suppressed
+         * due to being marked as seen.
          */
         @ClassRule
         @JvmField
-        val disableUnseenNotifFilterRule = SettingOverrideRule(
-            Settings.Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS,
-            /* value= */ "0",
-        )
+        val disableUnseenNotifFilterRule =
+            SettingOverrideRule(
+                Settings.Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS,
+                /* value= */ "0",
+            )
     }
 }
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationWarm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationWarm.kt
index a221ef6..222caed 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationWarm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationWarm.kt
@@ -150,14 +150,15 @@
         }
 
         /**
-         * Ensures that posted notifications will be visible on the lockscreen and not
-         * suppressed due to being marked as seen.
+         * Ensures that posted notifications will be visible on the lockscreen and not suppressed
+         * due to being marked as seen.
          */
         @ClassRule
         @JvmField
-        val disableUnseenNotifFilterRule = SettingOverrideRule(
-            Settings.Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS,
-            /* value= */ "0",
-        )
+        val disableUnseenNotifFilterRule =
+            SettingOverrideRule(
+                Settings.Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS,
+                /* value= */ "0",
+            )
     }
 }
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromNotificationColdCfArm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromNotificationColdCfArm.kt
index 8b4a613..4aa78d4 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromNotificationColdCfArm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromNotificationColdCfArm.kt
@@ -44,4 +44,4 @@
             return FlickerTestFactory.nonRotationTests()
         }
     }
-}
+}
\ No newline at end of file
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromNotificationWarmCfArm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromNotificationWarmCfArm.kt
index d90b3ca..43d28fa 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromNotificationWarmCfArm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromNotificationWarmCfArm.kt
@@ -42,4 +42,4 @@
             return FlickerTestFactory.nonRotationTests()
         }
     }
-}
\ No newline at end of file
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
index 66e0f06..00d7544 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
@@ -19,6 +19,7 @@
 import android.platform.test.annotations.FlakyTest
 import android.platform.test.annotations.Presubmit
 import android.tools.common.Rotation
+import android.tools.device.flicker.annotation.FlickerServiceCompatible
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -43,7 +44,6 @@
  *     Relaunch an app [testApp] by selecting it in the overview screen, and wait animation to
  *     complete (only this action is traced)
  * ```
- *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
@@ -55,6 +55,7 @@
  * ```
  */
 @RequiresDevice
+@FlickerServiceCompatible
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTestCfArm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTestCfArm.kt
index 8139e1f..ff24190 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTestCfArm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTestCfArm.kt
@@ -16,6 +16,7 @@
 
 package com.android.server.wm.flicker.launch
 
+import android.tools.device.flicker.annotation.FlickerServiceCompatible
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
@@ -25,6 +26,7 @@
 import org.junit.runners.Parameterized
 
 /** Some assertions will fail because of b/264415996 */
+@FlickerServiceCompatible
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt
index 14df84e..9ab6156 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt
@@ -22,6 +22,7 @@
 import android.tools.common.NavBar
 import android.tools.common.Rotation
 import android.tools.common.datatypes.component.ComponentNameMatcher
+import android.tools.device.flicker.annotation.FlickerServiceCompatible
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
@@ -47,7 +48,6 @@
  *     Lock the device.
  *     Launch an app on top of the lock screen [testApp] and wait animation to complete
  * ```
- *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
@@ -59,6 +59,7 @@
  * ```
  */
 @RequiresDevice
+@FlickerServiceCompatible
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt
index cfc8e46..cdd2d45 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt
@@ -18,6 +18,7 @@
 
 import android.platform.test.annotations.FlakyTest
 import android.platform.test.annotations.Presubmit
+import android.tools.device.flicker.annotation.FlickerServiceCompatible
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -41,7 +42,6 @@
  *     Press home
  *     Relaunch an app [testApp] and wait animation to complete (only this action is traced)
  * ```
- *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
@@ -53,6 +53,7 @@
  * ```
  */
 @RequiresDevice
+@FlickerServiceCompatible
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTestCfArm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTestCfArm.kt
index b47c931..9679059 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTestCfArm.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTestCfArm.kt
@@ -16,6 +16,7 @@
 
 package com.android.server.wm.flicker.launch
 
+import android.tools.device.flicker.annotation.FlickerServiceCompatible
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
@@ -24,6 +25,7 @@
 import org.junit.runners.MethodSorters
 import org.junit.runners.Parameterized
 
+@FlickerServiceCompatible
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
@@ -41,4 +43,4 @@
             return FlickerTestFactory.nonRotationTests()
         }
     }
-}
+}
\ No newline at end of file
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenCameraOnDoubleClickPowerButton.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenCameraOnDoubleClickPowerButton.kt
index e876e57..786bb32 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenCameraOnDoubleClickPowerButton.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenCameraOnDoubleClickPowerButton.kt
@@ -24,10 +24,10 @@
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
-import android.tools.device.flicker.rules.RemoveAllTasksButHomeRule
 import android.view.KeyEvent
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.helpers.setRotation
+import android.tools.device.flicker.rules.RemoveAllTasksButHomeRule
 import org.junit.FixMethodOrder
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -44,7 +44,6 @@
  *     Make sure no apps are running on the device
  *     Launch an app [testApp] and wait animation to complete
  * ```
- *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OverrideTaskTransitionTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OverrideTaskTransitionTest.kt
index 6cbb975..b848e63 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OverrideTaskTransitionTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OverrideTaskTransitionTest.kt
@@ -27,13 +27,13 @@
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
 import android.tools.device.flicker.legacy.FlickerTestFactory
-import android.tools.device.flicker.rules.RemoveAllTasksButHomeRule
-import android.tools.device.helpers.wakeUpAndGoToHomeScreen
 import androidx.test.filters.RequiresDevice
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.server.wm.flicker.R
-import com.android.server.wm.flicker.helpers.SimpleAppHelper
 import com.android.server.wm.flicker.helpers.setRotation
+import android.tools.device.flicker.rules.RemoveAllTasksButHomeRule
+import android.tools.device.helpers.wakeUpAndGoToHomeScreen
+import com.android.server.wm.flicker.helpers.SimpleAppHelper
 import org.junit.FixMethodOrder
 import org.junit.Test
 import org.junit.runner.RunWith
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt
index 3fccd12..6fa65fd 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt
@@ -22,12 +22,10 @@
 import android.platform.test.annotations.FlakyTest
 import android.platform.test.annotations.Presubmit
 import android.tools.common.datatypes.component.ComponentNameMatcher
-import android.tools.common.datatypes.component.ComponentNameMatcher.Companion.DEFAULT_TASK_DISPLAY_AREA
 import android.tools.common.datatypes.component.ComponentNameMatcher.Companion.SPLASH_SCREEN
 import android.tools.common.datatypes.component.ComponentNameMatcher.Companion.WALLPAPER_BBQ_WRAPPER
 import android.tools.common.datatypes.component.ComponentSplashScreenMatcher
 import android.tools.common.datatypes.component.IComponentMatcher
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -38,7 +36,6 @@
 import com.android.server.wm.flicker.BaseTest
 import com.android.server.wm.flicker.helpers.NewTasksAppHelper
 import com.android.server.wm.flicker.helpers.SimpleAppHelper
-import org.junit.Assume
 import org.junit.FixMethodOrder
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -123,22 +120,8 @@
     /** Checks that a color background is visible while the task transition is occurring. */
     @Presubmit
     @Test
-    fun transitionHasColorBackground_legacy() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        transitionHasColorBackground(DEFAULT_TASK_DISPLAY_AREA)
-    }
-
-    /** Checks that a color background is visible while the task transition is occurring. */
-    @Presubmit
-    @Test
-    fun transitionHasColorBackground_shellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
-        transitionHasColorBackground(ComponentNameMatcher("", "Animation Background"))
-    }
-
-    private fun transitionHasColorBackground(backgroundColorLayer: IComponentMatcher) {
-        Assume.assumeTrue(isShellTransitionsEnabled)
-
+    fun transitionHasColorBackground() {
+        val backgroundColorLayer = ComponentNameMatcher("", "Animation Background")
         val displayBounds = WindowUtils.getDisplayBounds(flicker.scenario.startRotation)
         flicker.assertLayers {
             this.invoke("LAUNCH_NEW_TASK_ACTIVITY coversExactly displayBounds") {
@@ -221,9 +204,10 @@
                     .getIdentifier("image_wallpaper_component", "string", "android")
             // frameworks/base/core/res/res/values/config.xml returns package plus class name,
             // but wallpaper layer has only class name
-            val rawComponentMatcher = ComponentNameMatcher.unflattenFromString(
-                instrumentation.targetContext.resources.getString(resourceId)
-            )
+            val rawComponentMatcher =
+                ComponentNameMatcher.unflattenFromString(
+                    instrumentation.targetContext.resources.getString(resourceId)
+                )
 
             return ComponentNameMatcher(rawComponentMatcher.className)
         }
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt
index 63299cb..d49f035 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt
@@ -22,7 +22,6 @@
 import android.tools.common.Rotation
 import android.tools.common.datatypes.Rect
 import android.tools.common.datatypes.component.ComponentNameMatcher
-import android.tools.device.flicker.isShellTransitionsEnabled
 import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
 import android.tools.device.flicker.legacy.FlickerBuilder
 import android.tools.device.flicker.legacy.FlickerTest
@@ -30,7 +29,6 @@
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.BaseTest
 import com.android.server.wm.flicker.helpers.SimpleAppHelper
-import org.junit.Assume
 import org.junit.FixMethodOrder
 import org.junit.Ignore
 import org.junit.Test
@@ -262,17 +260,9 @@
     @Test
     override fun navBarWindowIsAlwaysVisible() = super.navBarWindowIsAlwaysVisible()
 
-    @Presubmit
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() {
-        Assume.assumeFalse(isShellTransitionsEnabled)
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-    }
-
     @FlakyTest(bugId = 246285528)
     @Test
-    fun visibleLayersShownMoreThanOneConsecutiveEntry_shellTransit() {
-        Assume.assumeTrue(isShellTransitionsEnabled)
+    override fun visibleLayersShownMoreThanOneConsecutiveEntry() {
         super.visibleLayersShownMoreThanOneConsecutiveEntry()
     }
 
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
index 4a4180b..fe789a7 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
@@ -39,6 +39,7 @@
  *      0 -> 90 degrees
  *      90 -> 0 degrees
  * ```
+ *
  * Actions:
  * ```
  *     Launch an app (via intent)
@@ -47,22 +48,29 @@
  *     Change device orientation
  *     Stop tracing
  * ```
+ *
  * To run this test: `atest FlickerTests:ChangeAppRotationTest`
  *
  * To run only the presubmit assertions add: `--
+ *
  * ```
  *      --module-arg FlickerTests:exclude-annotation:androidx.test.filters.FlakyTest
  *      --module-arg FlickerTests:include-annotation:android.platform.test.annotations.Presubmit`
  * ```
+ *
  * To run only the postsubmit assertions add: `--
+ *
  * ```
  *      --module-arg FlickerTests:exclude-annotation:androidx.test.filters.FlakyTest
  *      --module-arg FlickerTests:include-annotation:android.platform.test.annotations.Postsubmit`
  * ```
+ *
  * To run only the flaky assertions add: `--
+ *
  * ```
  *      --module-arg FlickerTests:include-annotation:androidx.test.filters.FlakyTest`
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
index 17b3b2b..4d010f3 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
@@ -45,6 +45,7 @@
  *      90 -> 0 degrees
  *      90 -> 0 degrees (with starved UI thread)
  * ```
+ *
  * Actions:
  * ```
  *     Launch an app in fullscreen and supporting seamless rotation (via intent)
@@ -53,22 +54,29 @@
  *     Change device orientation
  *     Stop tracing
  * ```
+ *
  * To run this test: `atest FlickerTests:SeamlessAppRotationTest`
  *
  * To run only the presubmit assertions add: `--
+ *
  * ```
  *      --module-arg FlickerTests:exclude-annotation:androidx.test.filters.FlakyTest
  *      --module-arg FlickerTests:include-annotation:android.platform.test.annotations.Presubmit`
  * ```
+ *
  * To run only the postsubmit assertions add: `--
+ *
  * ```
  *      --module-arg FlickerTests:exclude-annotation:androidx.test.filters.FlakyTest
  *      --module-arg FlickerTests:include-annotation:android.platform.test.annotations.Postsubmit`
  * ```
+ *
  * To run only the flaky assertions add: `--
+ *
  * ```
  *      --module-arg FlickerTests:include-annotation:androidx.test.filters.FlakyTest`
  * ```
+ *
  * Notes:
  * ```
  *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
diff --git a/tests/FlickerTests/test-apps/flickerapp/AndroidManifest.xml b/tests/FlickerTests/test-apps/flickerapp/AndroidManifest.xml
index 5361d73f..1ec9ec9 100644
--- a/tests/FlickerTests/test-apps/flickerapp/AndroidManifest.xml
+++ b/tests/FlickerTests/test-apps/flickerapp/AndroidManifest.xml
@@ -88,6 +88,18 @@
                 <category android:name="android.intent.category.LAUNCHER"/>
             </intent-filter>
         </activity>
+        <activity android:name=".NonResizeablePortraitActivity"
+                  android:theme="@style/CutoutNever"
+                  android:resizeableActivity="false"
+                  android:screenOrientation="portrait"
+                  android:taskAffinity="com.android.server.wm.flicker.testapp.NonResizeablePortraitActivity"
+                  android:label="NonResizeablePortraitActivity"
+                  android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
         <activity android:name=".LaunchNewActivity"
                   android:taskAffinity="com.android.server.wm.flicker.testapp.LaunchNewActivity"
                   android:theme="@style/CutoutShortEdges"
diff --git a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityOptions.java b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityOptions.java
index b61bc0c..9c3226b 100644
--- a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityOptions.java
+++ b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityOptions.java
@@ -67,6 +67,12 @@
                 FLICKER_APP_PACKAGE + ".NonResizeableActivity");
     }
 
+    public static class NonResizeablePortraitActivity {
+        public static final String LABEL = "NonResizeablePortraitActivity";
+        public static final ComponentName COMPONENT = new ComponentName(FLICKER_APP_PACKAGE,
+                FLICKER_APP_PACKAGE + ".NonResizeablePortraitActivity");
+    }
+
     public static class DialogThemedActivity {
         public static final String LABEL = "DialogThemedActivity";
         public static final ComponentName COMPONENT = new ComponentName(FLICKER_APP_PACKAGE,
diff --git a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/NonResizeablePortraitActivity.java b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/NonResizeablePortraitActivity.java
new file mode 100644
index 0000000..4b420dc
--- /dev/null
+++ b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/NonResizeablePortraitActivity.java
@@ -0,0 +1,29 @@
+/*
+ * 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.flicker.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class NonResizeablePortraitActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.activity_non_resizeable);
+    }
+}
diff --git a/tests/Internal/src/com/android/internal/os/TimeoutRecordTest.java b/tests/Internal/src/com/android/internal/os/TimeoutRecordTest.java
index 0f96634..7419ee1 100644
--- a/tests/Internal/src/com/android/internal/os/TimeoutRecordTest.java
+++ b/tests/Internal/src/com/android/internal/os/TimeoutRecordTest.java
@@ -16,15 +16,15 @@
 
 package com.android.internal.os;
 
-import android.content.ComponentName;
-import android.content.Intent;
-import android.platform.test.annotations.Presubmit;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import android.content.ComponentName;
+import android.content.Intent;
+import android.platform.test.annotations.Presubmit;
+
 import androidx.test.filters.SmallTest;
 
 import org.junit.Test;
@@ -40,7 +40,7 @@
     @Test
     public void forBroadcastReceiver_returnsCorrectTimeoutRecord() {
         Intent intent = new Intent(Intent.ACTION_MAIN);
-        intent.setComponent(ComponentName.createRelative("com.example.app", "ExampleClass"));
+        intent.setComponent(new ComponentName("com.example.app", "com.example.app.ExampleClass"));
 
         TimeoutRecord record = TimeoutRecord.forBroadcastReceiver(intent);
 
@@ -48,14 +48,28 @@
         assertEquals(record.mKind, TimeoutRecord.TimeoutKind.BROADCAST_RECEIVER);
         assertEquals(record.mReason,
                 "Broadcast of Intent { act=android.intent.action.MAIN cmp=com.example"
-                        + ".app/ExampleClass }");
+                        + ".app/.ExampleClass }");
+        assertTrue(record.mEndTakenBeforeLocks);
+    }
+
+    @Test
+    public void forBroadcastReceiver_withPackageAndClass_returnsCorrectTimeoutRecord() {
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        TimeoutRecord record = TimeoutRecord.forBroadcastReceiver(intent,
+                "com.example.app", "com.example.app.ExampleClass");
+
+        assertNotNull(record);
+        assertEquals(record.mKind, TimeoutRecord.TimeoutKind.BROADCAST_RECEIVER);
+        assertEquals(record.mReason,
+                "Broadcast of Intent { act=android.intent.action.MAIN cmp=com.example"
+                        + ".app/.ExampleClass }");
         assertTrue(record.mEndTakenBeforeLocks);
     }
 
     @Test
     public void forBroadcastReceiver_withTimeoutDurationMs_returnsCorrectTimeoutRecord() {
         Intent intent = new Intent(Intent.ACTION_MAIN);
-        intent.setComponent(ComponentName.createRelative("com.example.app", "ExampleClass"));
+        intent.setComponent(new ComponentName("com.example.app", "com.example.app.ExampleClass"));
 
         TimeoutRecord record = TimeoutRecord.forBroadcastReceiver(intent, 1000L);
 
@@ -63,7 +77,7 @@
         assertEquals(record.mKind, TimeoutRecord.TimeoutKind.BROADCAST_RECEIVER);
         assertEquals(record.mReason,
                 "Broadcast of Intent { act=android.intent.action.MAIN cmp=com.example"
-                        + ".app/ExampleClass }, waited 1000ms");
+                        + ".app/.ExampleClass }, waited 1000ms");
         assertTrue(record.mEndTakenBeforeLocks);
     }
 
diff --git a/tests/OdmApps/Android.bp b/tests/OdmApps/Android.bp
index de86498..a5c6d65 100644
--- a/tests/OdmApps/Android.bp
+++ b/tests/OdmApps/Android.bp
@@ -26,4 +26,8 @@
     srcs: ["src/**/*.java"],
     libs: ["tradefed"],
     test_suites: ["device-tests"],
+    data: [
+        ":TestOdmApp",
+        ":TestOdmPrivApp",
+    ],
 }
diff --git a/tests/SilkFX/assets/gainmaps/cave.jpg b/tests/SilkFX/assets/gainmaps/cave.jpg
deleted file mode 100644
index fa7d3fc3..0000000
--- a/tests/SilkFX/assets/gainmaps/cave.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/city_night.jpg b/tests/SilkFX/assets/gainmaps/city_night.jpg
new file mode 100644
index 0000000..cdb4311
--- /dev/null
+++ b/tests/SilkFX/assets/gainmaps/city_night.jpg
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/desert_palms.jpg b/tests/SilkFX/assets/gainmaps/desert_palms.jpg
new file mode 100644
index 0000000..c337aad
--- /dev/null
+++ b/tests/SilkFX/assets/gainmaps/desert_palms.jpg
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/desert_sunset.jpg b/tests/SilkFX/assets/gainmaps/desert_sunset.jpg
new file mode 100644
index 0000000..fa15f56
--- /dev/null
+++ b/tests/SilkFX/assets/gainmaps/desert_sunset.jpg
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/desert_wanda.jpg b/tests/SilkFX/assets/gainmaps/desert_wanda.jpg
new file mode 100644
index 0000000..33f69a9
--- /dev/null
+++ b/tests/SilkFX/assets/gainmaps/desert_wanda.jpg
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/fountain_night.jpg b/tests/SilkFX/assets/gainmaps/fountain_night.jpg
new file mode 100644
index 0000000..863127b
--- /dev/null
+++ b/tests/SilkFX/assets/gainmaps/fountain_night.jpg
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/grand_canyon.jpg b/tests/SilkFX/assets/gainmaps/grand_canyon.jpg
new file mode 100644
index 0000000..12cd966
--- /dev/null
+++ b/tests/SilkFX/assets/gainmaps/grand_canyon.jpg
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/granddam.jpg b/tests/SilkFX/assets/gainmaps/granddam.jpg
deleted file mode 100644
index 823f14e..0000000
--- a/tests/SilkFX/assets/gainmaps/granddam.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/lamps.jpg b/tests/SilkFX/assets/gainmaps/lamps.jpg
new file mode 100644
index 0000000..65bda89
--- /dev/null
+++ b/tests/SilkFX/assets/gainmaps/lamps.jpg
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/lightbulb.jpg b/tests/SilkFX/assets/gainmaps/lightbulb.jpg
deleted file mode 100644
index 232c5f0..0000000
--- a/tests/SilkFX/assets/gainmaps/lightbulb.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/mountain_lake.jpg b/tests/SilkFX/assets/gainmaps/mountain_lake.jpg
new file mode 100644
index 0000000..b2b10d2
--- /dev/null
+++ b/tests/SilkFX/assets/gainmaps/mountain_lake.jpg
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/mountains.jpg b/tests/SilkFX/assets/gainmaps/mountains.jpg
new file mode 100644
index 0000000..82acd45
--- /dev/null
+++ b/tests/SilkFX/assets/gainmaps/mountains.jpg
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/porsche911.jpg b/tests/SilkFX/assets/gainmaps/porsche911.jpg
deleted file mode 100644
index 50f4fc8..0000000
--- a/tests/SilkFX/assets/gainmaps/porsche911.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/sunflower.jpg b/tests/SilkFX/assets/gainmaps/sunflower.jpg
new file mode 100644
index 0000000..55b1b14
--- /dev/null
+++ b/tests/SilkFX/assets/gainmaps/sunflower.jpg
Binary files differ
diff --git a/tests/SilkFX/assets/gainmaps/train_station_night.jpg b/tests/SilkFX/assets/gainmaps/train_station_night.jpg
new file mode 100644
index 0000000..45142bb
--- /dev/null
+++ b/tests/SilkFX/assets/gainmaps/train_station_night.jpg
Binary files differ
diff --git a/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapDecodeTest.kt b/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapDecodeTest.kt
index db812ac..a004fb5 100644
--- a/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapDecodeTest.kt
+++ b/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapDecodeTest.kt
@@ -38,7 +38,7 @@
 
     private fun decode(mode: DecodeMode) {
         val source = ImageDecoder.createSource(resources.assets,
-            "gainmaps/cave.jpg")
+                "gainmaps/${context.assets.list("gainmaps")!![0]}")
 
         val sourceInfo = findViewById<TextView>(R.id.source_info)!!
 
diff --git a/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapImage.kt b/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapImage.kt
index e079b6d..78bc4c4 100644
--- a/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapImage.kt
+++ b/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapImage.kt
@@ -92,7 +92,7 @@
             }
         }
 
-        setImage(gainmapImages.indexOf("cave.jpg"))
+        setImage(0)
 
         imageView.apply {
             isClickable = true
diff --git a/tests/SoundTriggerTestApp/OWNERS b/tests/SoundTriggerTestApp/OWNERS
index 9db19a3..a0fcfc5 100644
--- a/tests/SoundTriggerTestApp/OWNERS
+++ b/tests/SoundTriggerTestApp/OWNERS
@@ -1,2 +1,2 @@
-include /core/java/android/media/soundtrigger/OWNERS
+include /media/java/android/media/soundtrigger/OWNERS
 [email protected]
diff --git a/tests/SoundTriggerTests/Android.mk b/tests/SoundTriggerTests/Android.mk
deleted file mode 100644
index cc0fa1c..0000000
--- a/tests/SoundTriggerTests/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# Copyright (C) 2014 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-ifeq ($(SOUND_TRIGGER_USE_STUB_MODULE), 1)
-  LOCAL_SRC_FILES := $(call all-subdir-java-files)
-  LOCAL_PRIVILEGED_MODULE := true
-  LOCAL_CERTIFICATE := platform
-  TARGET_OUT_DATA_APPS_PRIVILEGED := $(TARGET_OUT_DATA)/priv-app
-else
-  LOCAL_SRC_FILES := src/android/hardware/soundtrigger/SoundTriggerTest.java
-endif
-
-LOCAL_STATIC_JAVA_LIBRARIES := mockito-target
-LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base
-
-LOCAL_PACKAGE_NAME := SoundTriggerTests
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../NOTICE
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-include $(BUILD_PACKAGE)
diff --git a/tests/SoundTriggerTests/AndroidManifest.xml b/tests/SoundTriggerTests/AndroidManifest.xml
deleted file mode 100644
index f7454c7..0000000
--- a/tests/SoundTriggerTests/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.hardware.soundtrigger">
-    <uses-permission android:name="android.permission.MANAGE_SOUND_TRIGGER" />
-    <uses-permission android:name="android.permission.INTERNET" />
-    
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
-                     android:targetPackage="android.hardware.soundtrigger"
-                     android:label="Tests for android.hardware.soundtrigger" />
-</manifest>
diff --git a/tests/SoundTriggerTests/OWNERS b/tests/SoundTriggerTests/OWNERS
deleted file mode 100644
index 816bc6b..0000000
--- a/tests/SoundTriggerTests/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-include /core/java/android/media/soundtrigger/OWNERS
diff --git a/tests/SoundTriggerTests/src/android/hardware/soundtrigger/stubhal/GenericSoundModelTest.java b/tests/SoundTriggerTests/src/android/hardware/soundtrigger/stubhal/GenericSoundModelTest.java
deleted file mode 100644
index 2c3592c..0000000
--- a/tests/SoundTriggerTests/src/android/hardware/soundtrigger/stubhal/GenericSoundModelTest.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.soundtrigger;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.timeout;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.hardware.soundtrigger.SoundTrigger.GenericRecognitionEvent;
-import android.hardware.soundtrigger.SoundTrigger.GenericSoundModel;
-import android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionEvent;
-import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig;
-import android.media.soundtrigger.SoundTriggerManager;
-import android.os.ParcelUuid;
-import android.os.ServiceManager;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import com.android.internal.app.ISoundTriggerService;
-
-import org.mockito.MockitoAnnotations;
-
-import java.io.DataOutputStream;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Random;
-import java.util.UUID;
-
-public class GenericSoundModelTest extends AndroidTestCase {
-    static final int MSG_DETECTION_ERROR = -1;
-    static final int MSG_DETECTION_RESUME = 0;
-    static final int MSG_DETECTION_PAUSE = 1;
-    static final int MSG_KEYPHRASE_TRIGGER = 2;
-    static final int MSG_GENERIC_TRIGGER = 4;
-
-    private Random random = new Random();
-    private HashSet<UUID> loadedModelUuids;
-    private ISoundTriggerService soundTriggerService;
-    private SoundTriggerManager soundTriggerManager;
-
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        MockitoAnnotations.initMocks(this);
-
-        Context context = getContext();
-        soundTriggerService = ISoundTriggerService.Stub.asInterface(
-                ServiceManager.getService(Context.SOUND_TRIGGER_SERVICE));
-        soundTriggerManager = (SoundTriggerManager) context.getSystemService(
-                Context.SOUND_TRIGGER_SERVICE);
-
-        loadedModelUuids = new HashSet<UUID>();
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        for (UUID modelUuid : loadedModelUuids) {
-            soundTriggerService.deleteSoundModel(new ParcelUuid(modelUuid));
-        }
-        super.tearDown();
-    }
-
-    GenericSoundModel new_sound_model() {
-        // Create sound model
-        byte[] data = new byte[1024];
-        random.nextBytes(data);
-        UUID modelUuid = UUID.randomUUID();
-        UUID mVendorUuid = UUID.randomUUID();
-        return new GenericSoundModel(modelUuid, mVendorUuid, data);
-    }
-
-    @SmallTest
-    public void testUpdateGenericSoundModel() throws Exception {
-        GenericSoundModel model = new_sound_model();
-
-        // Update sound model
-        soundTriggerService.updateSoundModel(model);
-        loadedModelUuids.add(model.getUuid());
-
-        // Confirm it was updated
-        GenericSoundModel returnedModel =
-                soundTriggerService.getSoundModel(new ParcelUuid(model.getUuid()));
-        assertEquals(model, returnedModel);
-    }
-
-    @SmallTest
-    public void testDeleteGenericSoundModel() throws Exception {
-        GenericSoundModel model = new_sound_model();
-
-        // Update sound model
-        soundTriggerService.updateSoundModel(model);
-        loadedModelUuids.add(model.getUuid());
-
-        // Delete sound model
-        soundTriggerService.deleteSoundModel(new ParcelUuid(model.getUuid()));
-        loadedModelUuids.remove(model.getUuid());
-
-        // Confirm it was deleted
-        GenericSoundModel returnedModel =
-                soundTriggerService.getSoundModel(new ParcelUuid(model.getUuid()));
-        assertEquals(null, returnedModel);
-    }
-
-    @LargeTest
-    public void testStartStopGenericSoundModel() throws Exception {
-        GenericSoundModel model = new_sound_model();
-
-        boolean captureTriggerAudio = true;
-        boolean allowMultipleTriggers = true;
-        RecognitionConfig config = new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers,
-                null, null);
-        TestRecognitionStatusCallback spyCallback = spy(new TestRecognitionStatusCallback());
-
-        // Update and start sound model recognition
-        soundTriggerService.updateSoundModel(model);
-        loadedModelUuids.add(model.getUuid());
-        int r = soundTriggerService.startRecognition(new ParcelUuid(model.getUuid()), spyCallback,
-                config);
-        assertEquals("Could Not Start Recognition with code: " + r,
-                android.hardware.soundtrigger.SoundTrigger.STATUS_OK, r);
-
-        // Stop recognition
-        r = soundTriggerService.stopRecognition(new ParcelUuid(model.getUuid()), spyCallback);
-        assertEquals("Could Not Stop Recognition with code: " + r,
-                android.hardware.soundtrigger.SoundTrigger.STATUS_OK, r);
-    }
-
-    @LargeTest
-    public void testTriggerGenericSoundModel() throws Exception {
-        GenericSoundModel model = new_sound_model();
-
-        boolean captureTriggerAudio = true;
-        boolean allowMultipleTriggers = true;
-        RecognitionConfig config = new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers,
-                null, null);
-        TestRecognitionStatusCallback spyCallback = spy(new TestRecognitionStatusCallback());
-
-        // Update and start sound model
-        soundTriggerService.updateSoundModel(model);
-        loadedModelUuids.add(model.getUuid());
-        soundTriggerService.startRecognition(new ParcelUuid(model.getUuid()), spyCallback, config);
-
-        // Send trigger to stub HAL
-        Socket socket = new Socket(InetAddress.getLocalHost(), 14035);
-        DataOutputStream out = new DataOutputStream(socket.getOutputStream());
-        out.writeBytes("trig " + model.getUuid().toString() + "\r\n");
-        out.flush();
-        socket.close();
-
-        // Verify trigger was received
-        verify(spyCallback, timeout(100)).onGenericSoundTriggerDetected(any());
-    }
-
-    /**
-     * Tests a more complicated pattern of loading, unloading, triggering, starting and stopping
-     * recognition. Intended to find unexpected errors that occur in unexpected states.
-     */
-    @LargeTest
-    public void testFuzzGenericSoundModel() throws Exception {
-        int numModels = 2;
-
-        final int STATUS_UNLOADED = 0;
-        final int STATUS_LOADED = 1;
-        final int STATUS_STARTED = 2;
-
-        class ModelInfo {
-            int status;
-            GenericSoundModel model;
-
-            public ModelInfo(GenericSoundModel model, int status) {
-                this.status = status;
-                this.model = model;
-            }
-        }
-
-        Random predictableRandom = new Random(100);
-
-        ArrayList modelInfos = new ArrayList<ModelInfo>();
-        for(int i=0; i<numModels; i++) {
-            // Create sound model
-            byte[] data = new byte[1024];
-            predictableRandom.nextBytes(data);
-            UUID modelUuid = UUID.randomUUID();
-            UUID mVendorUuid = UUID.randomUUID();
-            GenericSoundModel model = new GenericSoundModel(modelUuid, mVendorUuid, data);
-            ModelInfo modelInfo = new ModelInfo(model, STATUS_UNLOADED);
-            modelInfos.add(modelInfo);
-        }
-
-        boolean captureTriggerAudio = true;
-        boolean allowMultipleTriggers = true;
-        RecognitionConfig config = new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers,
-                null, null);
-        TestRecognitionStatusCallback spyCallback = spy(new TestRecognitionStatusCallback());
-
-
-        int numOperationsToRun = 100;
-        for(int i=0; i<numOperationsToRun; i++) {
-            // Select a random model
-            int modelInfoIndex = predictableRandom.nextInt(modelInfos.size());
-            ModelInfo modelInfo = (ModelInfo) modelInfos.get(modelInfoIndex);
-
-            // Perform a random operation
-            int operation = predictableRandom.nextInt(5);
-
-            if (operation == 0 && modelInfo.status == STATUS_UNLOADED) {
-                // Update and start sound model
-                soundTriggerService.updateSoundModel(modelInfo.model);
-                loadedModelUuids.add(modelInfo.model.getUuid());
-                modelInfo.status = STATUS_LOADED;
-            } else if (operation == 1 && modelInfo.status == STATUS_LOADED) {
-                // Start the sound model
-                int r = soundTriggerService.startRecognition(new ParcelUuid(
-                                modelInfo.model.getUuid()),
-                        spyCallback, config);
-                assertEquals("Could Not Start Recognition with code: " + r,
-                        android.hardware.soundtrigger.SoundTrigger.STATUS_OK, r);
-                modelInfo.status = STATUS_STARTED;
-            } else if (operation == 2 && modelInfo.status == STATUS_STARTED) {
-                // Send trigger to stub HAL
-                Socket socket = new Socket(InetAddress.getLocalHost(), 14035);
-                DataOutputStream out = new DataOutputStream(socket.getOutputStream());
-                out.writeBytes("trig " + modelInfo.model.getUuid() + "\r\n");
-                out.flush();
-                socket.close();
-
-                // Verify trigger was received
-                verify(spyCallback, timeout(100)).onGenericSoundTriggerDetected(any());
-                reset(spyCallback);
-            } else if (operation == 3 && modelInfo.status == STATUS_STARTED) {
-                // Stop recognition
-                int r = soundTriggerService.stopRecognition(new ParcelUuid(
-                                modelInfo.model.getUuid()),
-                        spyCallback);
-                assertEquals("Could Not Stop Recognition with code: " + r,
-                        android.hardware.soundtrigger.SoundTrigger.STATUS_OK, r);
-                modelInfo.status = STATUS_LOADED;
-            } else if (operation == 4 && modelInfo.status != STATUS_UNLOADED) {
-                // Delete sound model
-                soundTriggerService.deleteSoundModel(new ParcelUuid(modelInfo.model.getUuid()));
-                loadedModelUuids.remove(modelInfo.model.getUuid());
-
-                // Confirm it was deleted
-                GenericSoundModel returnedModel = soundTriggerService.getSoundModel(
-                        new ParcelUuid(modelInfo.model.getUuid()));
-                assertEquals(null, returnedModel);
-                modelInfo.status = STATUS_UNLOADED;
-            }
-        }
-    }
-
-    public class TestRecognitionStatusCallback extends IRecognitionStatusCallback.Stub {
-        @Override
-        public void onGenericSoundTriggerDetected(GenericRecognitionEvent recognitionEvent) {
-        }
-
-        @Override
-        public void onKeyphraseDetected(KeyphraseRecognitionEvent recognitionEvent) {
-        }
-
-        @Override
-        public void onError(int status) {
-        }
-
-        @Override
-        public void onRecognitionPaused() {
-        }
-
-        @Override
-        public void onRecognitionResumed() {
-        }
-    }
-}
diff --git a/tests/StagedInstallTest/Android.bp b/tests/StagedInstallTest/Android.bp
index ffde8c7..23efe54 100644
--- a/tests/StagedInstallTest/Android.bp
+++ b/tests/StagedInstallTest/Android.bp
@@ -55,6 +55,7 @@
         "cts-install-lib-host",
     ],
     data: [
+        ":StagedInstallInternalTestApp",
         ":apex.apexd_test",
         ":com.android.apex.apkrollback.test_v1",
         ":com.android.apex.apkrollback.test_v2",
diff --git a/tests/SystemMemoryTest/host/Android.bp b/tests/SystemMemoryTest/host/Android.bp
index 7974462..cc8bc45 100644
--- a/tests/SystemMemoryTest/host/Android.bp
+++ b/tests/SystemMemoryTest/host/Android.bp
@@ -26,4 +26,7 @@
     srcs: ["src/**/*.java"],
     libs: ["tradefed"],
     test_suites: ["general-tests"],
+    data: [
+        ":SystemMemoryTestDevice",
+    ],
 }
diff --git a/tests/utils/testutils/java/android/os/test/FakePermissionEnforcer.java b/tests/utils/testutils/java/android/os/test/FakePermissionEnforcer.java
new file mode 100644
index 0000000..b94bb41
--- /dev/null
+++ b/tests/utils/testutils/java/android/os/test/FakePermissionEnforcer.java
@@ -0,0 +1,64 @@
+/*
+ * 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.os.test;
+
+import static android.permission.PermissionManager.PERMISSION_GRANTED;
+import static android.permission.PermissionManager.PERMISSION_HARD_DENIED;
+
+import android.annotation.NonNull;
+import android.content.AttributionSource;
+import android.os.PermissionEnforcer;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Fake for {@link PermissionEnforcer}. Useful for tests wanting to mock the
+ * permission checks of an AIDL service. FakePermissionEnforcer may be passed
+ * to the constructor of the AIDL-generated Stub class.
+ *
+ */
+public class FakePermissionEnforcer extends PermissionEnforcer {
+    private Set<String> mGranted;
+
+    public FakePermissionEnforcer() {
+        mGranted = new HashSet();
+    }
+
+    public void grant(String permission) {
+        mGranted.add(permission);
+    }
+
+    public void revoke(String permission) {
+        mGranted.remove(permission);
+    }
+
+    private boolean granted(String permission) {
+        return mGranted.contains(permission);
+    }
+
+    @Override
+    protected int checkPermission(@NonNull String permission,
+              @NonNull AttributionSource source) {
+        return granted(permission) ? PERMISSION_GRANTED : PERMISSION_HARD_DENIED;
+    }
+
+    @Override
+    protected int checkPermission(@NonNull String permission, int pid, int uid) {
+        return granted(permission) ? PERMISSION_GRANTED : PERMISSION_HARD_DENIED;
+    }
+}
diff --git a/tests/utils/testutils/java/android/os/test/OWNERS b/tests/utils/testutils/java/android/os/test/OWNERS
new file mode 100644
index 0000000..3a9129e
--- /dev/null
+++ b/tests/utils/testutils/java/android/os/test/OWNERS
@@ -0,0 +1 @@
+per-file FakePermissionEnforcer.java = file:/tests/EnforcePermission/OWNERS
diff --git a/tests/vcn/java/android/net/vcn/VcnConfigTest.java b/tests/vcn/java/android/net/vcn/VcnConfigTest.java
index b313c9f..73a0a61 100644
--- a/tests/vcn/java/android/net/vcn/VcnConfigTest.java
+++ b/tests/vcn/java/android/net/vcn/VcnConfigTest.java
@@ -17,6 +17,7 @@
 package android.net.vcn;
 
 import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_TEST;
 import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
 
 import static org.junit.Assert.assertEquals;
@@ -160,6 +161,37 @@
         assertNotEquals(config, configNotEqual);
     }
 
+    private VcnConfig buildConfigRestrictTransportTest(boolean isTestMode) throws Exception {
+        VcnConfig.Builder builder =
+                new VcnConfig.Builder(mContext)
+                        .setRestrictedUnderlyingNetworkTransports(Set.of(TRANSPORT_TEST));
+        if (isTestMode) {
+            builder.setIsTestModeProfile();
+        }
+
+        for (VcnGatewayConnectionConfig gatewayConnectionConfig : GATEWAY_CONNECTION_CONFIGS) {
+            builder.addGatewayConnectionConfig(gatewayConnectionConfig);
+        }
+
+        return builder.build();
+    }
+
+    @Test
+    public void testRestrictTransportTestInTestModeProfile() throws Exception {
+        final VcnConfig config = buildConfigRestrictTransportTest(true /*  isTestMode */);
+        assertEquals(Set.of(TRANSPORT_TEST), config.getRestrictedUnderlyingNetworkTransports());
+    }
+
+    @Test
+    public void testRestrictTransportTestInNonTestModeProfile() throws Exception {
+        try {
+            buildConfigRestrictTransportTest(false /*  isTestMode */);
+            fail("Expected exception because the config is not a test mode profile");
+        } catch (Exception expected) {
+
+        }
+    }
+
     @Test
     public void testParceling() {
         final VcnConfig config = buildTestConfig(mContext);
diff --git a/tests/vcn/java/com/android/server/vcn/routeselection/NetworkPriorityClassifierTest.java b/tests/vcn/java/com/android/server/vcn/routeselection/NetworkPriorityClassifierTest.java
index 629e988..2266041 100644
--- a/tests/vcn/java/com/android/server/vcn/routeselection/NetworkPriorityClassifierTest.java
+++ b/tests/vcn/java/com/android/server/vcn/routeselection/NetworkPriorityClassifierTest.java
@@ -95,6 +95,7 @@
     private static final NetworkCapabilities WIFI_NETWORK_CAPABILITIES =
             new NetworkCapabilities.Builder()
                     .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+                    .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                     .setSignalStrength(WIFI_RSSI)
                     .setSsid(SSID)
                     .setLinkUpstreamBandwidthKbps(LINK_UPSTREAM_BANDWIDTH_KBPS)
@@ -509,12 +510,14 @@
             VcnCellUnderlyingNetworkTemplate template, boolean expectMatch) {
         assertEquals(
                 expectMatch,
-                checkMatchesCellPriorityRule(
+                checkMatchesPriorityRule(
                         mVcnContext,
                         template,
                         mCellNetworkRecord,
                         SUB_GROUP,
-                        mSubscriptionSnapshot));
+                        mSubscriptionSnapshot,
+                        null /* currentlySelected */,
+                        null /* carrierConfig */));
     }
 
     @Test