Merge "Update spacing for lock icon with udfps" into sc-dev
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index cb60b01..e876a36 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -218,6 +218,7 @@
     field public static final String OPSTR_ACTIVITY_RECOGNITION = "android:activity_recognition";
     field public static final String OPSTR_ACTIVITY_RECOGNITION_SOURCE = "android:activity_recognition_source";
     field public static final String OPSTR_MANAGE_ONGOING_CALLS = "android:manage_ongoing_calls";
+    field public static final String OPSTR_RECORD_AUDIO_HOTWORD = "android:record_audio_hotword";
     field public static final String OPSTR_USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER = "android:use_icc_auth_with_device_identifier";
     field public static final int OP_COARSE_LOCATION = 0; // 0x0
     field public static final int OP_RECORD_AUDIO = 27; // 0x1b
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 00ba55c..3915abe 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -1169,7 +1169,7 @@
         }
 
         public void scheduleApplicationInfoChanged(ApplicationInfo ai) {
-            mResourcesManager.updatePendingAppInfoUpdates(ai);
+            mResourcesManager.appendPendingAppInfoUpdate(new String[]{ai.sourceDir}, ai);
             mH.removeMessages(H.APPLICATION_INFO_CHANGED, ai);
             sendMessage(H.APPLICATION_INFO_CHANGED, ai);
         }
@@ -6001,16 +6001,12 @@
             resApk = ref != null ? ref.get() : null;
         }
 
-        final String[] oldResDirs = new String[2];
-
         if (apk != null) {
-            oldResDirs[0] = apk.getResDir();
             final ArrayList<String> oldPaths = new ArrayList<>();
             LoadedApk.makePaths(this, apk.getApplicationInfo(), oldPaths);
             apk.updateApplicationInfo(ai, oldPaths);
         }
         if (resApk != null) {
-            oldResDirs[1] = resApk.getResDir();
             final ArrayList<String> oldPaths = new ArrayList<>();
             LoadedApk.makePaths(this, resApk.getApplicationInfo(), oldPaths);
             resApk.updateApplicationInfo(ai, oldPaths);
@@ -6018,7 +6014,7 @@
 
         synchronized (mResourcesManager) {
             // Update all affected Resources objects to use new ResourcesImpl
-            mResourcesManager.applyNewResourceDirs(ai, oldResDirs);
+            mResourcesManager.applyAllPendingAppInfoUpdates();
         }
     }
 
@@ -6274,7 +6270,9 @@
 
                                 synchronized (mResourcesManager) {
                                     // Update affected Resources objects to use new ResourcesImpl
-                                    mResourcesManager.applyNewResourceDirs(aInfo, oldResDirs);
+                                    mResourcesManager.appendPendingAppInfoUpdate(oldResDirs,
+                                            aInfo);
+                                    mResourcesManager.applyAllPendingAppInfoUpdates();
                                 }
                             } catch (RemoteException e) {
                             }
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 9bd6c750f..4ddb546 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -742,6 +742,13 @@
     public static final int ATTRIBUTION_FLAG_RECEIVER = 0x4;
 
     /**
+     * Attribution chain flag: Specifies that all attribution sources in the chain were trusted.
+     * Must only be set by system server.
+     * @hide
+     */
+    public static final int ATTRIBUTION_FLAG_TRUSTED = 0x8;
+
+    /**
      * No attribution flags.
      * @hide
      */
@@ -760,7 +767,8 @@
     @IntDef(flag = true, prefix = { "FLAG_" }, value = {
             ATTRIBUTION_FLAG_ACCESSOR,
             ATTRIBUTION_FLAG_INTERMEDIARY,
-            ATTRIBUTION_FLAG_RECEIVER
+            ATTRIBUTION_FLAG_RECEIVER,
+            ATTRIBUTION_FLAG_TRUSTED
     })
     public @interface AttributionFlags {}
 
@@ -1660,6 +1668,7 @@
      *
      * @hide
      */
+    @TestApi
     public static final String OPSTR_RECORD_AUDIO_HOTWORD = "android:record_audio_hotword";
 
     /**
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index dfd1e2b..20afffc 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -42,6 +42,7 @@
 import android.util.ArraySet;
 import android.util.DisplayMetrics;
 import android.util.Log;
+import android.util.Pair;
 import android.util.Slog;
 import android.view.Display;
 import android.view.DisplayAdjustments;
@@ -101,7 +102,7 @@
      * ApplicationInfo changes that need to be applied to Resources when the next configuration
      * change occurs.
      */
-    private ArrayList<ApplicationInfo> mPendingAppInfoUpdates;
+    private ArrayList<Pair<String[], ApplicationInfo>> mPendingAppInfoUpdates;
 
     /**
      * A mapping of ResourceImpls and their configurations. These are heavy weight objects
@@ -1273,19 +1274,33 @@
         return newKey;
     }
 
-    public void updatePendingAppInfoUpdates(@NonNull ApplicationInfo appInfo) {
+    public void appendPendingAppInfoUpdate(@NonNull String[] oldSourceDirs,
+            @NonNull ApplicationInfo appInfo) {
         synchronized (mLock) {
             if (mPendingAppInfoUpdates == null) {
                 mPendingAppInfoUpdates = new ArrayList<>();
             }
-            // Clear previous app info changes for the package to prevent multiple ResourcesImpl
-            // recreations when only the last recreation will be used.
+            // Clear previous app info changes for a package to prevent multiple ResourcesImpl
+            // recreations when the recreation caused by this update completely overrides the
+            // previous pending changes.
             for (int i = mPendingAppInfoUpdates.size() - 1; i >= 0; i--) {
-                if (appInfo.sourceDir.equals(mPendingAppInfoUpdates.get(i).sourceDir)) {
+                if (ArrayUtils.containsAll(oldSourceDirs, mPendingAppInfoUpdates.get(i).first)) {
                     mPendingAppInfoUpdates.remove(i);
                 }
             }
-            mPendingAppInfoUpdates.add(appInfo);
+            mPendingAppInfoUpdates.add(new Pair<>(oldSourceDirs, appInfo));
+        }
+    }
+
+    public final void applyAllPendingAppInfoUpdates() {
+        synchronized (mLock) {
+            if (mPendingAppInfoUpdates != null) {
+                for (int i = 0, n = mPendingAppInfoUpdates.size(); i < n; i++) {
+                    final Pair<String[], ApplicationInfo> appInfo = mPendingAppInfoUpdates.get(i);
+                    applyNewResourceDirsLocked(appInfo.first, appInfo.second);
+                }
+                mPendingAppInfoUpdates = null;
+            }
         }
     }
 
@@ -1302,18 +1317,7 @@
                 Trace.traceBegin(Trace.TRACE_TAG_RESOURCES,
                         "ResourcesManager#applyConfigurationToResources");
 
-                final boolean assetsUpdated = mPendingAppInfoUpdates != null
-                        && config.assetsSeq > mResConfiguration.assetsSeq;
-                if (assetsUpdated) {
-                    for (int i = 0, n = mPendingAppInfoUpdates.size(); i < n; i++) {
-                        final ApplicationInfo appInfo = mPendingAppInfoUpdates.get(i);
-                        applyNewResourceDirs(appInfo, new String[]{appInfo.sourceDir});
-                    }
-                    mPendingAppInfoUpdates = null;
-                }
-
-                if (!assetsUpdated && !mResConfiguration.isOtherSeqNewer(config)
-                        && compat == null) {
+                if (!mResConfiguration.isOtherSeqNewer(config) && compat == null) {
                     if (DEBUG || DEBUG_CONFIGURATION) {
                         Slog.v(TAG, "Skipping new config: curSeq="
                                 + mResConfiguration.seq + ", newSeq=" + config.seq);
@@ -1330,6 +1334,13 @@
                             | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE;
                 }
 
+                // If a application info update was scheduled to occur in this process but has not
+                // occurred yet, apply it now so the resources objects will have updated paths when
+                // the assets sequence changes.
+                if ((changes & ActivityInfo.CONFIG_ASSETS_PATHS) != 0) {
+                    applyAllPendingAppInfoUpdates();
+                }
+
                 DisplayMetrics displayMetrics = getDisplayMetrics();
                 if (adjustments != null) {
                     // Currently the only case where the adjustment takes effect is to simulate
@@ -1353,7 +1364,7 @@
                     }
                 }
 
-                return assetsUpdated || changes != 0;
+                return changes != 0;
             } finally {
                 Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
             }
@@ -1440,61 +1451,58 @@
         }
     }
 
-    // TODO(adamlesinski): Make this accept more than just overlay directories.
-    void applyNewResourceDirs(@NonNull final ApplicationInfo appInfo,
-            @Nullable final String[] oldPaths) {
-        synchronized (mLock) {
-            try {
-                Trace.traceBegin(Trace.TRACE_TAG_RESOURCES,
-                        "ResourcesManager#applyNewResourceDirsLocked");
+    private void applyNewResourceDirsLocked(@Nullable final String[] oldSourceDirs,
+            @NonNull final ApplicationInfo appInfo) {
+        try {
+            Trace.traceBegin(Trace.TRACE_TAG_RESOURCES,
+                    "ResourcesManager#applyNewResourceDirsLocked");
 
-                String baseCodePath = appInfo.getBaseCodePath();
+            String baseCodePath = appInfo.getBaseCodePath();
 
-                final int myUid = Process.myUid();
-                String[] newSplitDirs = appInfo.uid == myUid
-                        ? appInfo.splitSourceDirs
-                        : appInfo.splitPublicSourceDirs;
+            final int myUid = Process.myUid();
+            String[] newSplitDirs = appInfo.uid == myUid
+                    ? appInfo.splitSourceDirs
+                    : appInfo.splitPublicSourceDirs;
 
-                // ApplicationInfo is mutable, so clone the arrays to prevent outside modification
-                String[] copiedSplitDirs = ArrayUtils.cloneOrNull(newSplitDirs);
-                String[] copiedResourceDirs = combinedOverlayPaths(appInfo.resourceDirs,
-                        appInfo.overlayPaths);
+            // ApplicationInfo is mutable, so clone the arrays to prevent outside modification
+            String[] copiedSplitDirs = ArrayUtils.cloneOrNull(newSplitDirs);
+            String[] copiedResourceDirs = combinedOverlayPaths(appInfo.resourceDirs,
+                    appInfo.overlayPaths);
 
-                if (appInfo.uid == myUid) {
-                    addApplicationPathsLocked(baseCodePath, copiedSplitDirs);
-                }
-
-                final ArrayMap<ResourcesImpl, ResourcesKey> updatedResourceKeys = new ArrayMap<>();
-                final int implCount = mResourceImpls.size();
-                for (int i = 0; i < implCount; i++) {
-                    final ResourcesKey key = mResourceImpls.keyAt(i);
-                    final WeakReference<ResourcesImpl> weakImplRef = mResourceImpls.valueAt(i);
-                    final ResourcesImpl impl = weakImplRef != null ? weakImplRef.get() : null;
-
-                    if (impl == null) {
-                        continue;
-                    }
-
-                    if (key.mResDir == null
-                            || key.mResDir.equals(baseCodePath)
-                            || ArrayUtils.contains(oldPaths, key.mResDir)) {
-                        updatedResourceKeys.put(impl, new ResourcesKey(
-                                baseCodePath,
-                                copiedSplitDirs,
-                                copiedResourceDirs,
-                                key.mLibDirs,
-                                key.mDisplayId,
-                                key.mOverrideConfiguration,
-                                key.mCompatInfo,
-                                key.mLoaders
-                        ));
-                    }
-                }
-
-                redirectResourcesToNewImplLocked(updatedResourceKeys);
-            } finally {
-                Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
+            if (appInfo.uid == myUid) {
+                addApplicationPathsLocked(baseCodePath, copiedSplitDirs);
             }
+
+            final ArrayMap<ResourcesImpl, ResourcesKey> updatedResourceKeys = new ArrayMap<>();
+            final int implCount = mResourceImpls.size();
+            for (int i = 0; i < implCount; i++) {
+                final ResourcesKey key = mResourceImpls.keyAt(i);
+                final WeakReference<ResourcesImpl> weakImplRef = mResourceImpls.valueAt(i);
+                final ResourcesImpl impl = weakImplRef != null ? weakImplRef.get() : null;
+
+                if (impl == null) {
+                    continue;
+                }
+
+                if (key.mResDir == null
+                        || key.mResDir.equals(baseCodePath)
+                        || ArrayUtils.contains(oldSourceDirs, key.mResDir)) {
+                    updatedResourceKeys.put(impl, new ResourcesKey(
+                            baseCodePath,
+                            copiedSplitDirs,
+                            copiedResourceDirs,
+                            key.mLibDirs,
+                            key.mDisplayId,
+                            key.mOverrideConfiguration,
+                            key.mCompatInfo,
+                            key.mLoaders
+                    ));
+                }
+            }
+
+            redirectResourcesToNewImplLocked(updatedResourceKeys);
+        } finally {
+            Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
         }
     }
 
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 8284cdd..6bc331d 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -1605,20 +1605,29 @@
             "android.app.extra.PASSWORD_COMPLEXITY";
 
     /**
-     * Constant for {@link #getPasswordComplexity()}: no password.
+     * Constant for {@link #getPasswordComplexity()} and
+     * {@link #setRequiredPasswordComplexity(int)}: no password.
      *
-     * <p>Note that these complexity constants are ordered so that higher values are more complex.
+     * <p> When returned from {@link #getPasswordComplexity()}, the constant represents
+     * the exact complexity band the password is in.
+     * When passed to {@link #setRequiredPasswordComplexity(int), it sets the minimum complexity
+     * band which the password must meet.
      */
     public static final int PASSWORD_COMPLEXITY_NONE = 0;
 
     /**
-     * Constant for {@link #getPasswordComplexity()}: password satisfies one of the following:
+     * Constant for {@link #getPasswordComplexity()} and
+     * {@link #setRequiredPasswordComplexity(int)}.
+     * Define the low password complexity band as:
      * <ul>
      * <li>pattern
      * <li>PIN with repeating (4444) or ordered (1234, 4321, 2468) sequences
      * </ul>
      *
-     * <p>Note that these complexity constants are ordered so that higher values are more complex.
+     * <p> When returned from {@link #getPasswordComplexity()}, the constant represents
+     * the exact complexity band the password is in.
+     * When passed to {@link #setRequiredPasswordComplexity(int), it sets the minimum complexity
+     * band which the password must meet.
      *
      * @see #PASSWORD_QUALITY_SOMETHING
      * @see #PASSWORD_QUALITY_NUMERIC
@@ -1626,7 +1635,9 @@
     public static final int PASSWORD_COMPLEXITY_LOW = 0x10000;
 
     /**
-     * Constant for {@link #getPasswordComplexity()}: password satisfies one of the following:
+     * Constant for {@link #getPasswordComplexity()} and
+     * {@link #setRequiredPasswordComplexity(int)}.
+     * Define the medium password complexity band as:
      * <ul>
      * <li>PIN with <b>no</b> repeating (4444) or ordered (1234, 4321, 2468) sequences, length at
      * least 4
@@ -1634,7 +1645,10 @@
      * <li>alphanumeric, length at least 4
      * </ul>
      *
-     * <p>Note that these complexity constants are ordered so that higher values are more complex.
+     * <p> When returned from {@link #getPasswordComplexity()}, the constant represents
+     * the exact complexity band the password is in.
+     * When passed to {@link #setRequiredPasswordComplexity(int), it sets the minimum complexity
+     * band which the password must meet.
      *
      * @see #PASSWORD_QUALITY_NUMERIC_COMPLEX
      * @see #PASSWORD_QUALITY_ALPHABETIC
@@ -1643,7 +1657,9 @@
     public static final int PASSWORD_COMPLEXITY_MEDIUM = 0x30000;
 
     /**
-     * Constant for {@link #getPasswordComplexity()}: password satisfies one of the following:
+     * Constant for {@link #getPasswordComplexity()} and
+     * {@link #setRequiredPasswordComplexity(int)}.
+     * Define the high password complexity band as:
      * <ul>
      * <li>PIN with <b>no</b> repeating (4444) or ordered (1234, 4321, 2468) sequences, length at
      * least 8
@@ -1651,7 +1667,10 @@
      * <li>alphanumeric, length at least 6
      * </ul>
      *
-     * <p>Note that these complexity constants are ordered so that higher values are more complex.
+     * <p> When returned from {@link #getPasswordComplexity()}, the constant represents
+     * the exact complexity band the password is in.
+     * When passed to {@link #setRequiredPasswordComplexity(int), it sets the minimum complexity
+     * band which the password must meet.
      *
      * @see #PASSWORD_QUALITY_NUMERIC_COMPLEX
      * @see #PASSWORD_QUALITY_ALPHABETIC
@@ -4455,8 +4474,9 @@
     }
 
     /**
-     * Sets a password complexity requirement for the user's screen lock.
-     * The complexity level is one of the pre-defined levels.
+     * Sets a minimum password complexity requirement for the user's screen lock.
+     * The complexity level is one of the pre-defined levels, and the user is unable to set a
+     * password with a lower complexity level.
      *
      * <p>Note that when called on a profile which uses an unified challenge with its parent, the
      * complexity would apply to the unified challenge.
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 5b72b76..421b4de9 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -1799,9 +1799,10 @@
      * <i>discoverable</i> (inquiry scan enabled). Many Bluetooth devices are
      * not discoverable by default, and need to be entered into a special mode.
      * <p>If Bluetooth state is not {@link #STATE_ON}, this API
-     * will return false. After turning on Bluetooth,
-     * wait for {@link #ACTION_STATE_CHANGED} with {@link #STATE_ON}
-     * to get the updated value.
+     * will return false. After turning on Bluetooth, wait for {@link #ACTION_STATE_CHANGED}
+     * with {@link #STATE_ON} to get the updated value.
+     * <p>If a device is currently bonding, this request will be queued and executed once that
+     * device has finished bonding. If a request is already queued, this request will be ignored.
      *
      * @return true on success, false on error
      */
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 21ec918..bbb550f 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -1775,7 +1775,8 @@
      * in getting the SDP records or if the process takes a long time, or the device is bonding and
      * we have its UUIDs cached, {@link #ACTION_UUID} intent is sent with the UUIDs that is
      * currently present in the cache. Clients should use the {@link #getUuids} to get UUIDs
-     * if service discovery is not to be performed.
+     * if service discovery is not to be performed. If there is an ongoing bonding process,
+     * service discovery or device inquiry, the request will be queued.
      *
      * @return False if the check fails, True if the process of initiating an ACL connection
      * to the remote device was started or cached UUIDs will be broadcast.
diff --git a/core/java/android/hardware/camera2/params/MandatoryStreamCombination.java b/core/java/android/hardware/camera2/params/MandatoryStreamCombination.java
index bd8df87..a678921 100644
--- a/core/java/android/hardware/camera2/params/MandatoryStreamCombination.java
+++ b/core/java/android/hardware/camera2/params/MandatoryStreamCombination.java
@@ -345,20 +345,14 @@
         public int mFormat;
         public SizeThreshold mSizeThreshold;
         public boolean mIsInput;
-        public boolean mIsUltraHighResolution;
         public StreamTemplate(int format, SizeThreshold sizeThreshold) {
-            this(format, sizeThreshold, /*isInput*/false, /*ultraHighResolution*/false);
+            this(format, sizeThreshold, /*isInput*/false);
         }
         public StreamTemplate(@Format int format, @NonNull SizeThreshold sizeThreshold,
                 boolean isInput) {
-            this(format, sizeThreshold, isInput, /*ultraHighResolution*/ false);
-        }
-        public StreamTemplate(@Format int format, @NonNull SizeThreshold sizeThreshold,
-                boolean isInput, boolean isUltraHighResolution) {
             mFormat = format;
             mSizeThreshold = sizeThreshold;
             mIsInput = isInput;
-            mIsUltraHighResolution = isUltraHighResolution;
         }
     }
 
@@ -366,6 +360,8 @@
         public StreamTemplate[] mStreamTemplates;
         public String mDescription;
         public ReprocessType mReprocessType;
+        // Substitute MAXIMUM size YUV output stream with JPEG / RAW_SENSOR.
+        public boolean mSubstituteYUV = false;
 
         public StreamCombinationTemplate(@NonNull StreamTemplate[] streamTemplates,
                 @NonNull String description) {
@@ -373,11 +369,22 @@
         }
 
         public StreamCombinationTemplate(@NonNull StreamTemplate[] streamTemplates,
-                @NonNull String description,
-                ReprocessType reprocessType) {
+                @NonNull String description, ReprocessType reprocessType) {
+            this(streamTemplates, description, reprocessType, /*substituteYUV*/ false);
+        }
+
+        public StreamCombinationTemplate(@NonNull StreamTemplate[] streamTemplates,
+                @NonNull String description, boolean substituteYUV) {
+            this(streamTemplates, description, /*reprocessType*/ ReprocessType.NONE,
+                    substituteYUV);
+        }
+
+        public StreamCombinationTemplate(@NonNull StreamTemplate[] streamTemplates,
+                @NonNull String description, ReprocessType reprocessType, boolean substituteYUV) {
             mStreamTemplates = streamTemplates;
             mReprocessType = reprocessType;
             mDescription = description;
+            mSubstituteYUV = substituteYUV;
         }
     }
 
@@ -769,15 +776,160 @@
     };
 
     private static StreamCombinationTemplate sUltraHighResolutionStreamCombinations[] = {
+        // UH res YUV / RAW / JPEG + PRIV preview size stream
         new StreamCombinationTemplate(new StreamTemplate [] {
-                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.FULL_RES) },
-                "Full res YUV image capture"),
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.FULL_RES),
+                 new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW)},
+                "Ultra high resolution YUV image capture with preview"),
         new StreamCombinationTemplate(new StreamTemplate [] {
-                new StreamTemplate(ImageFormat.RAW_SENSOR, SizeThreshold.FULL_RES) },
-                "Full res RAW capture"),
+                new StreamTemplate(ImageFormat.RAW_SENSOR, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW)},
+                "Ultra high resolution RAW_SENSOR image capture with preview"),
         new StreamCombinationTemplate(new StreamTemplate [] {
-                new StreamTemplate(ImageFormat.JPEG, SizeThreshold.FULL_RES) },
-                "Full res JPEG still image capture"),
+                new StreamTemplate(ImageFormat.JPEG, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW)},
+                "Ultra high resolution JPEG image capture with preview"),
+
+        // UH res YUV / RAW / JPEG + YUV preview size stream
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.FULL_RES),
+                 new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW)},
+                "No-viewfinder Ultra high resolution YUV image capture with image analysis"),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.RAW_SENSOR, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW)},
+                "No-viewfinder Ultra high resolution RAW_SENSOR image capture with image analysis"),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.JPEG, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW)},
+                "No-viewfinder Ultra high resolution JPEG image capture with image analysis"),
+
+        // UH res YUV / RAW / JPEG + PRIV preview + PRIV RECORD stream
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.RECORD)},
+                "Ultra high resolution YUV image capture with preview + app-based image analysis"),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.RAW_SENSOR, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.RECORD)},
+                "Ultra high resolution RAW image capture with preview + app-based image analysis"),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.JPEG, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.RECORD)},
+                "Ultra high resolution JPEG image capture with preview + app-based image analysis"),
+
+        // UH res YUV / RAW / JPEG + PRIV preview + YUV RECORD stream
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW),
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.RECORD)},
+                "Ultra high resolution YUV image capture with preview + app-based image analysis"),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.RAW_SENSOR, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW),
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.RECORD)},
+                "Ultra high resolution RAW image capture with preview + app-based image analysis"),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.JPEG, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW),
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.RECORD)},
+                "Ultra high resolution JPEG image capture with preview + app-based image analysis"),
+
+        // UH RES YUV / RAW / JPEG + PRIV preview + YUV / RAW / JPEG Maximum stream
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW),
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.MAXIMUM)},
+                "Ultra high resolution YUV image capture with preview + default",
+                /*substituteYUV*/ true),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.RAW_SENSOR, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW),
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.MAXIMUM)},
+                "Ultra high resolution RAW image capture with preview + default",
+                /*substituteYUV*/ true),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.JPEG, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW),
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.MAXIMUM)},
+                "Ultra high resolution JPEG capture with preview + default",
+                /*substituteYUV*/ true),
+    };
+
+    private static StreamCombinationTemplate sUltraHighResolutionReprocStreamCombinations[] = {
+        // RAW_SENSOR -> RAW_SENSOR + preview size PRIV / YUV
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW)},
+                "In-app RAW remosaic reprocessing with separate preview",
+                /*reprocessType*/ ReprocessType.REMOSAIC),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.PREVIEW)},
+                "In-app RAW remosaic reprocessing with in-app image analysis",
+                /*reprocessType*/ ReprocessType.REMOSAIC),
+
+        // RAW -> JPEG / YUV reprocessing + YUV / PRIV preview size stream
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.JPEG, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW)},
+                "In-app RAW -> JPEG reprocessing with separate preview",
+                /*reprocessType*/ ReprocessType.REMOSAIC),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW)},
+                "In-app RAW -> YUV reprocessing with separate preview",
+                /*reprocessType*/ ReprocessType.REMOSAIC),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.JPEG, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.PREVIEW)},
+                "In-app RAW -> JPEG reprocessing with in-app image analysis",
+                /*reprocessType*/ ReprocessType.REMOSAIC),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.PREVIEW)},
+                "In-app RAW -> YUV reprocessing with in-app image analysis",
+                /*reprocessType*/ ReprocessType.REMOSAIC),
+    };
+
+    private static StreamCombinationTemplate sUltraHighResolutionYUVReprocStreamCombinations[] = {
+        // YUV -> JPEG reprocess + PRIV / YUV preview size stream
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.JPEG, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW)},
+                "Ultra high resolution YUV -> JPEG reprocessing with separate preview",
+                /*reprocessType*/ ReprocessType.YUV),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.JPEG, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.PREVIEW)},
+                "Ultra high resolution YUV -> JPEG reprocessing with in-app image analysis",
+                /*reprocessType*/ ReprocessType.YUV),
+
+        // YUV -> YUV reprocess + PRIV / YUV preview size stream
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW)},
+                "Ultra high resolution YUV -> YUV reprocessing with separate preview",
+                /*reprocessType*/ ReprocessType.YUV),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.PREVIEW)},
+                "Ultra high resolution YUV -> YUV reprocessing with in-app image analysis",
+                /*reprocessType*/ ReprocessType.YUV),
+    };
+
+    private static StreamCombinationTemplate sUltraHighResolutionPRIVReprocStreamCombinations[] = {
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.JPEG, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.PRIVATE, SizeThreshold.PREVIEW)},
+                "Ultra high resolution PRIVATE -> JPEG reprocessing with separate preview",
+                /*reprocessType*/ ReprocessType.PRIVATE),
+        new StreamCombinationTemplate(new StreamTemplate [] {
+                new StreamTemplate(ImageFormat.JPEG, SizeThreshold.FULL_RES),
+                new StreamTemplate(ImageFormat.YUV_420_888, SizeThreshold.PREVIEW)},
+                "Ultra high resolution PRIVATE -> JPEG reprocessing with in-app image analysis",
+                /*reprocessType*/ ReprocessType.PRIVATE),
     };
 
     /**
@@ -903,86 +1055,183 @@
         public @NonNull List<MandatoryStreamCombination>
                 getAvailableMandatoryMaximumResolutionStreamCombinations() {
 
-            ArrayList<StreamCombinationTemplate> chosenStreamCombinations =
+            if (!isColorOutputSupported()) {
+                Log.v(TAG, "Device is not backward compatible!, no mandatory maximum res streams");
+                return null;
+            }
+
+            ArrayList<StreamCombinationTemplate> chosenStreamCombinationTemplates =
                     new ArrayList<StreamCombinationTemplate>();
 
-            chosenStreamCombinations.addAll(Arrays.asList(sUltraHighResolutionStreamCombinations));
+            chosenStreamCombinationTemplates.addAll(
+                    Arrays.asList(sUltraHighResolutionStreamCombinations));
 
             ArrayList<MandatoryStreamCombination> availableStreamCombinations =
                     new ArrayList<MandatoryStreamCombination>();
             boolean addRemosaicReprocessing = isRemosaicReprocessingSupported();
+
             int remosaicSize = 0;
+            Size [] maxResYUVInputSizes =
+                    mStreamConfigMapMaximumResolution.getInputSizes(ImageFormat.YUV_420_888);
+            Size [] maxResPRIVInputSizes =
+                    mStreamConfigMapMaximumResolution.getInputSizes(ImageFormat.PRIVATE);
+
             if (addRemosaicReprocessing) {
-                remosaicSize = 1;
+                remosaicSize += sUltraHighResolutionReprocStreamCombinations.length;
+                chosenStreamCombinationTemplates.addAll(
+                        Arrays.asList(sUltraHighResolutionReprocStreamCombinations));
+            }
+
+            if (maxResYUVInputSizes != null && maxResYUVInputSizes.length != 0) {
+                remosaicSize += sUltraHighResolutionYUVReprocStreamCombinations.length;
+                chosenStreamCombinationTemplates.addAll(
+                        Arrays.asList(sUltraHighResolutionYUVReprocStreamCombinations));
+            }
+
+            if (maxResPRIVInputSizes != null && maxResPRIVInputSizes.length != 0) {
+                remosaicSize += sUltraHighResolutionPRIVReprocStreamCombinations.length;
+                chosenStreamCombinationTemplates.addAll(
+                        Arrays.asList(sUltraHighResolutionPRIVReprocStreamCombinations));
+
             }
             availableStreamCombinations.ensureCapacity(
-                    chosenStreamCombinations.size() + remosaicSize);
-            fillMandatoryOutputStreamCombinations(availableStreamCombinations,
-                    chosenStreamCombinations, mStreamConfigMapMaximumResolution);
-            if (isRemosaicReprocessingSupported()) {
-                // Add reprocess mandatory streams
-                ArrayList<MandatoryStreamInformation> streamsInfo =
-                        new ArrayList<MandatoryStreamInformation>();
+                    chosenStreamCombinationTemplates.size() + remosaicSize);
+            fillUHMandatoryStreamCombinations(availableStreamCombinations,
+                    chosenStreamCombinationTemplates);
 
-                ArrayList<Size> inputSize = new ArrayList<Size>();
-                Size maxRawInputSize = getMaxSize(mStreamConfigMapMaximumResolution.getInputSizes(
-                        ImageFormat.RAW_SENSOR));
-                inputSize.add(maxRawInputSize);
-
-                streamsInfo.add(new MandatoryStreamInformation(inputSize,
-                        ImageFormat.RAW_SENSOR, /*isMaximumSize*/true, /*isInput*/true,
-                        /*ultraHighResolution*/true));
-                streamsInfo.add(new MandatoryStreamInformation(inputSize,
-                        ImageFormat.RAW_SENSOR, /*isMaximumSize*/true, /*isInput*/ false,
-                        /*ultraHighResolution*/true));
-                MandatoryStreamCombination streamCombination;
-                streamCombination = new MandatoryStreamCombination(streamsInfo,
-                        "Remosaic reprocessing", /*isReprocess*/true);
-                availableStreamCombinations.add(streamCombination);
-            }
             return Collections.unmodifiableList(availableStreamCombinations);
         }
 
-        private void fillMandatoryOutputStreamCombinations(
-                ArrayList<MandatoryStreamCombination> availableStreamCombinations,
-                ArrayList<StreamCombinationTemplate> chosenStreamCombinations,
-                StreamConfigurationMap streamConfigMap) {
+        private MandatoryStreamCombination createUHSensorMandatoryStreamCombination(
+                StreamCombinationTemplate combTemplate, int substitutedFormat) {
+            ArrayList<MandatoryStreamInformation> streamsInfo =
+                    new ArrayList<MandatoryStreamInformation>();
+            streamsInfo.ensureCapacity(combTemplate.mStreamTemplates.length);
+            boolean isReprocess = combTemplate.mReprocessType != ReprocessType.NONE;
+            if (isReprocess) {
+                int format = -1;
+                ArrayList<Size> inputSize = new ArrayList<Size>();
+                if (combTemplate.mReprocessType == ReprocessType.PRIVATE) {
+                    inputSize.add(
+                            getMaxSize(mStreamConfigMapMaximumResolution.getInputSizes(
+                                    ImageFormat.PRIVATE)));
+                    format = ImageFormat.PRIVATE;
+                } else if (combTemplate.mReprocessType == ReprocessType.REMOSAIC) {
+                    inputSize.add(
+                            getMaxSize(mStreamConfigMapMaximumResolution.getInputSizes(
+                                    ImageFormat.RAW_SENSOR)));
+                    format = ImageFormat.RAW_SENSOR;
+                } else {
+                    inputSize.add(
+                            getMaxSize(mStreamConfigMapMaximumResolution.getInputSizes(
+                                    ImageFormat.YUV_420_888)));
+                    format = ImageFormat.YUV_420_888;
+                }
+                streamsInfo.add(new MandatoryStreamInformation(inputSize, format,
+                        /*isMaximumSize*/false, /*isInput*/true,
+                        /*isUltraHighResolution*/ true));
+                streamsInfo.add(new MandatoryStreamInformation(inputSize, format,
+                        /*isMaximumSize*/false, /*isInput*/ false,
+                        /*isUltraHighResolution*/true));
+            }
+            HashMap<Pair<SizeThreshold, Integer>, List<Size>> availableDefaultNonRawSizes =
+                    enumerateAvailableSizes();
+            if (availableDefaultNonRawSizes == null) {
+                Log.e(TAG, "Available size enumeration failed");
+                return null;
+            }
+            Size[] defaultRawSizes =
+                    mStreamConfigMap.getOutputSizes(ImageFormat.RAW_SENSOR);
+            ArrayList<Size> availableDefaultRawSizes = new ArrayList<>();
+            if (defaultRawSizes != null) {
+                availableDefaultRawSizes.ensureCapacity(defaultRawSizes.length);
+                availableDefaultRawSizes.addAll(Arrays.asList(defaultRawSizes));
+            }
+            for (StreamTemplate template : combTemplate.mStreamTemplates) {
+                MandatoryStreamInformation streamInfo;
+                List<Size> sizes = new ArrayList<Size>();
+                int formatChosen = template.mFormat;
+                boolean isUltraHighResolution =
+                        (template.mSizeThreshold == SizeThreshold.FULL_RES);
+                StreamConfigurationMap sm =
+                        isUltraHighResolution ?
+                                mStreamConfigMapMaximumResolution : mStreamConfigMap;
+                boolean isMaximumSize = (template.mSizeThreshold == SizeThreshold.MAXIMUM);
 
-            for (StreamCombinationTemplate combTemplate : chosenStreamCombinations) {
-                ArrayList<MandatoryStreamInformation> streamsInfo =
-                        new ArrayList<MandatoryStreamInformation>();
-                streamsInfo.ensureCapacity(combTemplate.mStreamTemplates.length);
-
-                for (StreamTemplate template : combTemplate.mStreamTemplates) {
-                    MandatoryStreamInformation streamInfo;
-                    List<Size> sizes = new ArrayList<Size>();
-                    Size sizeChosen =
-                            getMaxSize(streamConfigMap.getOutputSizes(
-                                    template.mFormat));
-                    boolean isMaximumSize = (template.mSizeThreshold == SizeThreshold.MAXIMUM);
-                    sizes.add(sizeChosen);
-                    try {
-                        streamInfo = new MandatoryStreamInformation(sizes, template.mFormat,
-                                isMaximumSize, /*isInput*/ false, /*ultraHighResolution*/ true);
-                    } catch (IllegalArgumentException e) {
-                        String cause = "No available sizes found for format: " + template.mFormat
-                                + " size threshold: " + template.mSizeThreshold + " combination: "
-                                + combTemplate.mDescription;
-                        throw new RuntimeException(cause, e);
-                    }
-                    streamsInfo.add(streamInfo);
+                if (substitutedFormat != ImageFormat.UNKNOWN && isMaximumSize) {
+                    formatChosen = substitutedFormat;
                 }
 
-                MandatoryStreamCombination streamCombination;
+                if (isUltraHighResolution) {
+                    sizes.add(getMaxSize(sm.getOutputSizes(formatChosen)));
+                } else {
+                    if (formatChosen == ImageFormat.RAW_SENSOR) {
+                        // RAW_SENSOR always has MAXIMUM threshold.
+                        sizes = availableDefaultRawSizes;
+                    } else {
+                        Pair<SizeThreshold, Integer> pair =
+                            new Pair<SizeThreshold, Integer>(template.mSizeThreshold,
+                                    new Integer(formatChosen));
+                        sizes = availableDefaultNonRawSizes.get(pair);
+                    }
+                }
+
                 try {
-                    streamCombination = new MandatoryStreamCombination(streamsInfo,
-                            combTemplate.mDescription, /*isReprocess*/false);
+                    streamInfo = new MandatoryStreamInformation(sizes, formatChosen,
+                            isMaximumSize, /*isInput*/ false, isUltraHighResolution);
                 } catch (IllegalArgumentException e) {
-                    String cause =  "No stream information for mandatory combination: "
+                    String cause = "No available sizes found for format: " + template.mFormat
+                            + " size threshold: " + template.mSizeThreshold + " combination: "
                             + combTemplate.mDescription;
                     throw new RuntimeException(cause, e);
                 }
+                streamsInfo.add(streamInfo);
+            }
+
+            String formatString = null;
+            switch (substitutedFormat) {
+                case ImageFormat.RAW_SENSOR :
+                    formatString = "RAW_SENSOR";
+                    break;
+                case ImageFormat.JPEG :
+                    formatString = "JPEG";
+                    break;
+                default:
+                    formatString = "YUV";
+            }
+
+            MandatoryStreamCombination streamCombination;
+            try {
+                streamCombination = new MandatoryStreamCombination(streamsInfo,
+                        combTemplate.mDescription + " " + formatString + " still-capture",
+                        isReprocess);
+            } catch (IllegalArgumentException e) {
+                String cause =  "No stream information for mandatory combination: "
+                        + combTemplate.mDescription;
+                throw new RuntimeException(cause, e);
+            }
+            return streamCombination;
+        }
+
+        private void fillUHMandatoryStreamCombinations(
+                ArrayList<MandatoryStreamCombination> availableStreamCombinations,
+                ArrayList<StreamCombinationTemplate> chosenTemplates) {
+
+            for (StreamCombinationTemplate combTemplate : chosenTemplates) {
+                MandatoryStreamCombination streamCombination =
+                        createUHSensorMandatoryStreamCombination(combTemplate,
+                                  ImageFormat.UNKNOWN);
                 availableStreamCombinations.add(streamCombination);
+                if (combTemplate.mSubstituteYUV) {
+                     streamCombination =
+                            createUHSensorMandatoryStreamCombination(combTemplate,
+                                    ImageFormat.RAW_SENSOR);
+                    availableStreamCombinations.add(streamCombination);
+                    streamCombination =
+                            createUHSensorMandatoryStreamCombination(combTemplate,
+                                    ImageFormat.JPEG);
+                    availableStreamCombinations.add(streamCombination);
+                }
             }
         }
 
@@ -1135,6 +1384,7 @@
                         inputSize.add(maxPrivateInputSize);
                         format = ImageFormat.PRIVATE;
                     } else {
+                        // Default mandatory streams only have PRIVATE / YUV reprocessing.
                         inputSize.add(maxYUVInputSize);
                         format = ImageFormat.YUV_420_888;
                     }
diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java
index 6ccbab7..288b06e 100644
--- a/core/java/android/net/NetworkStats.java
+++ b/core/java/android/net/NetworkStats.java
@@ -24,6 +24,7 @@
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.os.Process;
 import android.os.SystemClock;
 import android.util.SparseBooleanArray;
 
@@ -1487,8 +1488,31 @@
                 continue;
             }
 
-            if (recycle.uid == tunUid) {
-                // Add up traffic through tunUid's underlying interfaces.
+            if (tunUid == Process.SYSTEM_UID) {
+                // Kernel-based VPN or VCN, traffic sent by apps on the VPN/VCN network
+                //
+                // Since the data is not UID-accounted on underlying networks, just use VPN/VCN
+                // network usage as ground truth. Encrypted traffic on the underlying networks will
+                // never be processed here because encrypted traffic on the underlying interfaces
+                // is not present in UID stats, and this method is only called on UID stats.
+                if (tunIface.equals(recycle.iface)) {
+                    tunIfaceTotal.add(recycle);
+                    underlyingIfacesTotal.add(recycle);
+
+                    // In steady state, there should always be one network, but edge cases may
+                    // result in the network being null (network lost), and thus no underlying
+                    // ifaces is possible.
+                    if (perInterfaceTotal.length > 0) {
+                        // While platform VPNs and VCNs have exactly one underlying network, that
+                        // network may have multiple interfaces (eg for 464xlat). This layer does
+                        // not have the required information to identify which of the interfaces
+                        // were used. Select "any" of the interfaces. Since overhead is already
+                        // lost, this number is an approximation anyways.
+                        perInterfaceTotal[0].add(recycle);
+                    }
+                }
+            } else if (recycle.uid == tunUid) {
+                // VpnService VPN, traffic sent by the VPN app over underlying networks
                 for (int j = 0; j < underlyingIfaces.size(); j++) {
                     if (Objects.equals(underlyingIfaces.get(j), recycle.iface)) {
                         perInterfaceTotal[j].add(recycle);
@@ -1497,7 +1521,7 @@
                     }
                 }
             } else if (tunIface.equals(recycle.iface)) {
-                // Add up all tunIface traffic excluding traffic from the vpn app itself.
+                // VpnService VPN; traffic sent by apps on the VPN network
                 tunIfaceTotal.add(recycle);
             }
         }
@@ -1532,9 +1556,13 @@
                 // Consider only entries that go onto the VPN interface.
                 continue;
             }
-            if (uid[i] == tunUid) {
+
+            if (uid[i] == tunUid && tunUid != Process.SYSTEM_UID) {
                 // Exclude VPN app from the redistribution, as it can choose to create packet
                 // streams by writing to itself.
+                //
+                // However, for platform VPNs, do not exclude the system's usage of the VPN network,
+                // since it is never local-only, and never double counted
                 continue;
             }
             tmpEntry.uid = uid[i];
@@ -1641,6 +1669,12 @@
             int tunUid,
             @NonNull List<String> underlyingIfaces,
             @NonNull Entry[] moved) {
+        if (tunUid == Process.SYSTEM_UID) {
+            // No traffic recorded on a per-UID basis for in-kernel VPN/VCNs over underlying
+            // networks; thus no traffic to deduct.
+            return;
+        }
+
         for (int i = 0; i < underlyingIfaces.size(); i++) {
             moved[i].uid = tunUid;
             // Add debug info
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 4c8297a..fb99118 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -16,7 +16,6 @@
 
 package android.os;
 
-import static android.app.ActivityManager.PROCESS_STATE_BOUND_TOP;
 import static android.os.BatteryStatsManager.NUM_WIFI_STATES;
 import static android.os.BatteryStatsManager.NUM_WIFI_SUPPL_STATES;
 
@@ -903,9 +902,9 @@
          * is not attributed to any non-critical process states.
          */
         public static final int[] CRITICAL_PROC_STATES = {
-                PROCESS_STATE_TOP,
-                PROCESS_STATE_BOUND_TOP, PROCESS_STATE_FOREGROUND_SERVICE,
-                PROCESS_STATE_FOREGROUND
+                Uid.PROCESS_STATE_TOP,
+                Uid.PROCESS_STATE_FOREGROUND_SERVICE,
+                Uid.PROCESS_STATE_FOREGROUND
         };
 
         public abstract long getProcessStateTime(int state, long elapsedRealtimeUs, int which);
diff --git a/core/java/android/permission/PermissionUsageHelper.java b/core/java/android/permission/PermissionUsageHelper.java
index 791764b..03f94c5 100644
--- a/core/java/android/permission/PermissionUsageHelper.java
+++ b/core/java/android/permission/PermissionUsageHelper.java
@@ -19,9 +19,11 @@
 import static android.Manifest.permission_group.CAMERA;
 import static android.Manifest.permission_group.LOCATION;
 import static android.Manifest.permission_group.MICROPHONE;
+import static android.app.AppOpsManager.ATTRIBUTION_CHAIN_ID_NONE;
 import static android.app.AppOpsManager.ATTRIBUTION_FLAGS_NONE;
 import static android.app.AppOpsManager.ATTRIBUTION_FLAG_ACCESSOR;
 import static android.app.AppOpsManager.ATTRIBUTION_FLAG_RECEIVER;
+import static android.app.AppOpsManager.ATTRIBUTION_FLAG_TRUSTED;
 import static android.app.AppOpsManager.AttributionFlags;
 import static android.app.AppOpsManager.OPSTR_CAMERA;
 import static android.app.AppOpsManager.OPSTR_COARSE_LOCATION;
@@ -180,7 +182,10 @@
     public void onOpActiveChanged(@NonNull String op, int uid, @NonNull String packageName,
             @Nullable String attributionTag, boolean active, @AttributionFlags int attributionFlags,
             int attributionChainId) {
-        if ((attributionFlags & ATTRIBUTION_FLAGS_NONE) != 0) {
+        if (attributionChainId == ATTRIBUTION_CHAIN_ID_NONE
+                || attributionFlags == ATTRIBUTION_FLAGS_NONE
+                || (attributionFlags & ATTRIBUTION_FLAG_TRUSTED) == 0) {
+            // If this is not a chain, or it is untrusted, return
             return;
         }
 
diff --git a/core/java/android/service/voice/HotwordDetectionService.java b/core/java/android/service/voice/HotwordDetectionService.java
index 567ee2f..a435239 100644
--- a/core/java/android/service/voice/HotwordDetectionService.java
+++ b/core/java/android/service/voice/HotwordDetectionService.java
@@ -201,6 +201,11 @@
         }
 
         @Override
+        public void ping(IRemoteCallback callback) throws RemoteException {
+            callback.sendResult(null);
+        }
+
+        @Override
         public void stopDetection() {
             HotwordDetectionService.this.onStopDetection();
         }
diff --git a/core/java/android/service/voice/IHotwordDetectionService.aidl b/core/java/android/service/voice/IHotwordDetectionService.aidl
index d7ed678..f2a93f1 100644
--- a/core/java/android/service/voice/IHotwordDetectionService.aidl
+++ b/core/java/android/service/voice/IHotwordDetectionService.aidl
@@ -57,5 +57,11 @@
         in IContentCaptureManager contentCaptureManager,
         in ContentCaptureOptions options);
 
+    /**
+     * Simply requests the service to trigger the callback, so that the system can check its
+     * identity.
+     */
+    void ping(in IRemoteCallback callback);
+
     void stopDetection();
 }
diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java
index b4964c3..a6ec399 100644
--- a/core/java/android/speech/RecognitionService.java
+++ b/core/java/android/speech/RecognitionService.java
@@ -115,14 +115,28 @@
             @NonNull AttributionSource attributionSource) {
         try {
             if (mCurrentCallback == null) {
-                if (DBG) {
-                    Log.d(TAG, "created new mCurrentCallback, listener = " + listener.asBinder());
+                Context attributionContext = createContext(new ContextParams.Builder()
+                        .setNextAttributionSource(attributionSource)
+                        .build());
+                boolean preflightPermissionCheckPassed = checkPermissionForPreflight(
+                        attributionContext.getAttributionSource());
+                if (preflightPermissionCheckPassed) {
+                    if (DBG) {
+                        Log.d(TAG, "created new mCurrentCallback, listener = "
+                                + listener.asBinder());
+                    }
+                    mCurrentCallback = new Callback(listener, attributionSource,
+                            attributionContext);
+                    RecognitionService.this.onStartListening(intent, mCurrentCallback);
                 }
-                mCurrentCallback = new Callback(listener, attributionSource);
 
-                RecognitionService.this.onStartListening(intent, mCurrentCallback);
-                if (!checkPermissionAndStartDataDelivery()) {
+                if (!preflightPermissionCheckPassed || !checkPermissionAndStartDataDelivery()) {
                     listener.onError(SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS);
+                    if (preflightPermissionCheckPassed) {
+                        // If we attempted to start listening, cancel the callback
+                        RecognitionService.this.onCancel(mCurrentCallback);
+                        dispatchClearCallback();
+                    }
                     Log.i(TAG, "caller doesn't have permission:"
                             + Manifest.permission.RECORD_AUDIO);
                 }
@@ -279,8 +293,15 @@
 
         private Callback(IRecognitionListener listener,
                 @NonNull AttributionSource attributionSource) {
+            this(listener, attributionSource, null);
+        }
+
+        private Callback(IRecognitionListener listener,
+                @NonNull AttributionSource attributionSource,
+                @Nullable Context attributionContext) {
             mListener = listener;
             mCallingAttributionSource = attributionSource;
+            mAttributionContext = attributionContext;
         }
 
         /**
@@ -460,6 +481,12 @@
         return mStartedDataDelivery;
     }
 
+    private boolean checkPermissionForPreflight(AttributionSource attributionSource) {
+        return PermissionChecker.checkPermissionForPreflight(RecognitionService.this,
+                Manifest.permission.RECORD_AUDIO, attributionSource)
+                == PermissionChecker.PERMISSION_GRANTED;
+    }
+
     void finishDataDelivery() {
         if (mStartedDataDelivery) {
             mStartedDataDelivery = false;
diff --git a/core/java/android/util/imetracing/ImeTracing.java b/core/java/android/util/imetracing/ImeTracing.java
index 2fcaec9..4696ae3 100644
--- a/core/java/android/util/imetracing/ImeTracing.java
+++ b/core/java/android/util/imetracing/ImeTracing.java
@@ -27,8 +27,6 @@
 import android.util.proto.ProtoOutputStream;
 import android.view.inputmethod.InputMethodManager;
 
-import com.android.internal.inputmethod.Completable;
-import com.android.internal.inputmethod.ResultCallbacks;
 import com.android.internal.view.IInputMethodManager;
 
 import java.io.PrintWriter;
@@ -92,9 +90,7 @@
      * @param where
      */
     public void sendToService(byte[] protoDump, int source, String where) throws RemoteException {
-        final Completable.Void value = Completable.createVoid();
-        mService.startProtoDump(protoDump, source, where, ResultCallbacks.of(value));
-        Completable.getResult(value);
+        mService.startProtoDump(protoDump, source, where);
     }
 
     /**
diff --git a/core/java/android/util/imetracing/ImeTracingClientImpl.java b/core/java/android/util/imetracing/ImeTracingClientImpl.java
index 17cdc46..5a57a6a 100644
--- a/core/java/android/util/imetracing/ImeTracingClientImpl.java
+++ b/core/java/android/util/imetracing/ImeTracingClientImpl.java
@@ -24,9 +24,6 @@
 import android.util.proto.ProtoOutputStream;
 import android.view.inputmethod.InputMethodManager;
 
-import com.android.internal.inputmethod.Completable;
-import com.android.internal.inputmethod.ResultCallbacks;
-
 import java.io.PrintWriter;
 
 /**
@@ -34,9 +31,7 @@
  */
 class ImeTracingClientImpl extends ImeTracing {
     ImeTracingClientImpl() throws ServiceNotFoundException, RemoteException {
-        final Completable.Boolean value = Completable.createBoolean();
-        mService.isImeTraceEnabled(ResultCallbacks.of(value));
-        sEnabled = Completable.getResult(value);
+        sEnabled = mService.isImeTraceEnabled();
     }
 
     @Override
diff --git a/core/java/android/view/ScrollCaptureTarget.java b/core/java/android/view/ScrollCaptureTarget.java
index 44017ed..a8bb037 100644
--- a/core/java/android/view/ScrollCaptureTarget.java
+++ b/core/java/android/view/ScrollCaptureTarget.java
@@ -21,13 +21,10 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UiThread;
-import android.graphics.Matrix;
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.os.CancellationSignal;
 
-import com.android.internal.util.FastMath;
-
 import java.io.PrintWriter;
 import java.util.function.Consumer;
 
@@ -43,8 +40,7 @@
     private final int mHint;
     private Rect mScrollBounds;
 
-    private final float[] mTmpFloatArr = new float[2];
-    private final Matrix mMatrixViewLocalToWindow = new Matrix();
+    private final int[] mTmpIntArr = new int[2];
 
     public ScrollCaptureTarget(@NonNull View scrollTarget, @NonNull Rect localVisibleRect,
             @NonNull Point positionInWindow, @NonNull ScrollCaptureCallback callback) {
@@ -117,28 +113,15 @@
         }
     }
 
-    private static void zero(float[] pointArray) {
-        pointArray[0] = 0;
-        pointArray[1] = 0;
-    }
-
-    private static void roundIntoPoint(Point pointObj, float[] pointArray) {
-        pointObj.x = FastMath.round(pointArray[0]);
-        pointObj.y = FastMath.round(pointArray[1]);
-    }
-
     /**
-     * Refresh the local visible bounds and it's offset within the window, based on the current
+     * Refresh the local visible bounds and its offset within the window, based on the current
      * state of the {@code containing view}.
      */
     @UiThread
     public void updatePositionInWindow() {
-        mMatrixViewLocalToWindow.reset();
-        mContainingView.transformMatrixToGlobal(mMatrixViewLocalToWindow);
-
-        zero(mTmpFloatArr);
-        mMatrixViewLocalToWindow.mapPoints(mTmpFloatArr);
-        roundIntoPoint(mPositionInWindow, mTmpFloatArr);
+        mContainingView.getLocationInWindow(mTmpIntArr);
+        mPositionInWindow.x = mTmpIntArr[0];
+        mPositionInWindow.y = mTmpIntArr[1];
     }
 
     public String toString() {
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
index 272dfac..dd81dd9 100644
--- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java
+++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
@@ -137,7 +137,7 @@
     /**
      * @return The client for the current thread.
      */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+    @UnsupportedAppUsage()
     public static AccessibilityInteractionClient getInstance() {
         final long threadId = Thread.currentThread().getId();
         return getInstanceForThread(threadId);
@@ -837,7 +837,10 @@
         return false;
     }
 
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+    /**
+     * Clears the accessibility cache.
+     */
+    @UnsupportedAppUsage()
     public void clearCache() {
         sAccessibilityCache.clear();
     }
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index b572d08..42d77cd 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -88,10 +88,8 @@
 import android.view.autofill.AutofillManager;
 
 import com.android.internal.annotations.GuardedBy;
-import com.android.internal.inputmethod.Completable;
 import com.android.internal.inputmethod.InputMethodDebug;
 import com.android.internal.inputmethod.InputMethodPrivilegedOperationsRegistry;
-import com.android.internal.inputmethod.ResultCallbacks;
 import com.android.internal.inputmethod.SoftInputShowHideReason;
 import com.android.internal.inputmethod.StartInputFlags;
 import com.android.internal.inputmethod.StartInputReason;
@@ -266,14 +264,6 @@
     private static final int NOT_A_SUBTYPE_ID = -1;
 
     /**
-     * {@code true} to try to avoid blocking apps' UI thread by sending
-     * {@link StartInputReason#WINDOW_FOCUS_GAIN_REPORT_WITH_CONNECTION} and
-     * {@link StartInputReason#WINDOW_FOCUS_GAIN_REPORT_WITHOUT_CONNECTION} in a truly asynchronous
-     * way. {@code false} to go back to the previous synchronous semantics.
-     */
-    private static final boolean USE_REPORT_WINDOW_GAINED_FOCUS_ASYNC = true;
-
-    /**
      * A constant that represents Voice IME.
      *
      * @see InputMethodSubtype#getMode()
@@ -686,28 +676,18 @@
                                 + ", nextFocusIsServedView=" + nextFocusHasConnection);
                     }
 
-                    if (USE_REPORT_WINDOW_GAINED_FOCUS_ASYNC) {
-                        mService.reportWindowGainedFocusAsync(
-                                nextFocusHasConnection, mClient, focusedView.getWindowToken(),
-                                startInputFlags, softInputMode, windowFlags,
-                                mCurRootView.mContext.getApplicationInfo().targetSdkVersion);
-                    } else {
-                        final int startInputReason = nextFocusHasConnection
-                                ? WINDOW_FOCUS_GAIN_REPORT_WITH_CONNECTION
-                                : WINDOW_FOCUS_GAIN_REPORT_WITHOUT_CONNECTION;
-                        final Completable.InputBindResult value =
-                                Completable.createInputBindResult();
-                        mService.startInputOrWindowGainedFocus(
-                                startInputReason, mClient,
-                                focusedView.getWindowToken(), startInputFlags, softInputMode,
-                                windowFlags,
-                                null,
-                                null,
-                                0 /* missingMethodFlags */,
-                                mCurRootView.mContext.getApplicationInfo().targetSdkVersion,
-                                ResultCallbacks.of(value));
-                        Completable.getResult(value); // ignore the result
-                    }
+                    final int startInputReason = nextFocusHasConnection
+                            ? WINDOW_FOCUS_GAIN_REPORT_WITH_CONNECTION
+                            : WINDOW_FOCUS_GAIN_REPORT_WITHOUT_CONNECTION;
+                    // ignore the result
+                    mService.startInputOrWindowGainedFocus(
+                            startInputReason, mClient,
+                            focusedView.getWindowToken(), startInputFlags, softInputMode,
+                            windowFlags,
+                            null,
+                            null,
+                            0 /* missingMethodFlags */,
+                            mCurRootView.mContext.getApplicationInfo().targetSdkVersion);
                 } catch (RemoteException e) {
                     throw e.rethrowFromSystemServer();
                 }
@@ -1249,9 +1229,7 @@
             // We intentionally do not use UserHandle.getCallingUserId() here because for system
             // services InputMethodManagerInternal.getInputMethodListAsUser() should be used
             // instead.
-            final Completable.InputMethodInfoList value = Completable.createInputMethodInfoList();
-            mService.getInputMethodList(UserHandle.myUserId(), ResultCallbacks.of(value));
-            return Completable.getResult(value);
+            return mService.getInputMethodList(UserHandle.myUserId());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -1269,9 +1247,7 @@
     @NonNull
     public List<InputMethodInfo> getInputMethodListAsUser(@UserIdInt int userId) {
         try {
-            final Completable.InputMethodInfoList value = Completable.createInputMethodInfoList();
-            mService.getInputMethodList(userId,  ResultCallbacks.of(value));
-            return Completable.getResult(value);
+            return mService.getInputMethodList(userId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -1289,9 +1265,7 @@
             // We intentionally do not use UserHandle.getCallingUserId() here because for system
             // services InputMethodManagerInternal.getEnabledInputMethodListAsUser() should be used
             // instead.
-            final Completable.InputMethodInfoList value = Completable.createInputMethodInfoList();
-            mService.getEnabledInputMethodList(UserHandle.myUserId(), ResultCallbacks.of(value));
-            return Completable.getResult(value);
+            return mService.getEnabledInputMethodList(UserHandle.myUserId());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -1307,9 +1281,7 @@
     @RequiresPermission(INTERACT_ACROSS_USERS_FULL)
     public List<InputMethodInfo> getEnabledInputMethodListAsUser(@UserIdInt int userId) {
         try {
-            final Completable.InputMethodInfoList value = Completable.createInputMethodInfoList();
-            mService.getEnabledInputMethodList(userId, ResultCallbacks.of(value));
-            return Completable.getResult(value);
+            return mService.getEnabledInputMethodList(userId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -1328,13 +1300,9 @@
     public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi,
             boolean allowsImplicitlySelectedSubtypes) {
         try {
-            final Completable.InputMethodSubtypeList value =
-                    Completable.createInputMethodSubtypeList();
-            mService.getEnabledInputMethodSubtypeList(
+            return mService.getEnabledInputMethodSubtypeList(
                     imi == null ? null : imi.getId(),
-                    allowsImplicitlySelectedSubtypes,
-                    ResultCallbacks.of(value));
-            return Completable.getResult(value);
+                    allowsImplicitlySelectedSubtypes);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -1669,15 +1637,12 @@
             try {
                 Log.d(TAG, "showSoftInput() view=" + view + " flags=" + flags + " reason="
                         + InputMethodDebug.softInputDisplayReasonToString(reason));
-                final Completable.Boolean value = Completable.createBoolean();
-                mService.showSoftInput(
+                return mService.showSoftInput(
                         mClient,
                         view.getWindowToken(),
                         flags,
                         resultReceiver,
-                        reason,
-                        ResultCallbacks.of(value));
-                return Completable.getResult(value);
+                        reason);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -1704,15 +1669,12 @@
                     Log.w(TAG, "No current root view, ignoring showSoftInputUnchecked()");
                     return;
                 }
-                final Completable.Boolean value = Completable.createBoolean();
                 mService.showSoftInput(
                         mClient,
                         mCurRootView.getView().getWindowToken(),
                         flags,
                         resultReceiver,
-                        SoftInputShowHideReason.SHOW_SOFT_INPUT,
-                        ResultCallbacks.of(value));
-                Completable.getResult(value); // ignore the result
+                        SoftInputShowHideReason.SHOW_SOFT_INPUT);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -1791,10 +1753,7 @@
             }
 
             try {
-                final Completable.Boolean value = Completable.createBoolean();
-                mService.hideSoftInput(mClient, windowToken, flags, resultReceiver, reason,
-                        ResultCallbacks.of(value));
-                return Completable.getResult(value);
+                return mService.hideSoftInput(mClient, windowToken, flags, resultReceiver, reason);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -2030,13 +1989,10 @@
                         + InputMethodDebug.startInputFlagsToString(startInputFlags));
             }
             try {
-                final Completable.InputBindResult value = Completable.createInputBindResult();
-                mService.startInputOrWindowGainedFocus(
+                res = mService.startInputOrWindowGainedFocus(
                         startInputReason, mClient, windowGainingFocus, startInputFlags,
                         softInputMode, windowFlags, tba, servedContext, missingMethodFlags,
-                        view.getContext().getApplicationInfo().targetSdkVersion,
-                        ResultCallbacks.of(value));
-                res = Completable.getResult(value);
+                        view.getContext().getApplicationInfo().targetSdkVersion);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -2144,15 +2100,12 @@
                 return;
             }
             try {
-                final Completable.Boolean value = Completable.createBoolean();
                 mService.hideSoftInput(
                         mClient,
                         mCurRootView.getView().getWindowToken(),
                         HIDE_NOT_ALWAYS,
                         null,
-                        SoftInputShowHideReason.HIDE_SOFT_INPUT,
-                        ResultCallbacks.of(value));
-                Completable.getResult(value); // ignore the result
+                        SoftInputShowHideReason.HIDE_SOFT_INPUT);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -2832,10 +2785,7 @@
                 ? SHOW_IM_PICKER_MODE_INCLUDE_AUXILIARY_SUBTYPES
                 : SHOW_IM_PICKER_MODE_EXCLUDE_AUXILIARY_SUBTYPES;
         try {
-            final Completable.Void value = Completable.createVoid();
-            mService.showInputMethodPickerFromSystem(
-                    mClient, mode, displayId, ResultCallbacks.of(value));
-            Completable.getResult(value);
+            mService.showInputMethodPickerFromSystem(mClient, mode, displayId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -2843,10 +2793,7 @@
 
     private void showInputMethodPickerLocked() {
         try {
-            final Completable.Void value = Completable.createVoid();
-            mService.showInputMethodPickerFromClient(
-                    mClient, SHOW_IM_PICKER_MODE_AUTO, ResultCallbacks.of(value));
-            Completable.getResult(value);
+            mService.showInputMethodPickerFromClient(mClient, SHOW_IM_PICKER_MODE_AUTO);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -2866,9 +2813,7 @@
     @TestApi
     public boolean isInputMethodPickerShown() {
         try {
-            final Completable.Boolean value = Completable.createBoolean();
-            mService.isInputMethodPickerShownForTest(ResultCallbacks.of(value));
-            return Completable.getResult(value);
+            return mService.isInputMethodPickerShownForTest();
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -2882,10 +2827,7 @@
      */
     public void showInputMethodAndSubtypeEnabler(String imiId) {
         try {
-            final Completable.Void value = Completable.createVoid();
-            mService.showInputMethodAndSubtypeEnablerFromClient(
-                    mClient, imiId, ResultCallbacks.of(value));
-            Completable.getResult(value);
+            mService.showInputMethodAndSubtypeEnablerFromClient(mClient, imiId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -2898,9 +2840,7 @@
      */
     public InputMethodSubtype getCurrentInputMethodSubtype() {
         try {
-            final Completable.InputMethodSubtype value = Completable.createInputMethodSubtype();
-            mService.getCurrentInputMethodSubtype(ResultCallbacks.of(value));
-            return Completable.getResult(value);
+            return mService.getCurrentInputMethodSubtype();
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -2949,11 +2889,7 @@
         }
         final List<InputMethodSubtype> enabledSubtypes;
         try {
-            final Completable.InputMethodSubtypeList value =
-                    Completable.createInputMethodSubtypeList();
-            mService.getEnabledInputMethodSubtypeList(
-                    imeId, true, ResultCallbacks.of(value));
-            enabledSubtypes = Completable.getResult(value);
+            enabledSubtypes = mService.getEnabledInputMethodSubtypeList(imeId, true);
         } catch (RemoteException e) {
             return false;
         }
@@ -3021,9 +2957,7 @@
     @UnsupportedAppUsage
     public int getInputMethodWindowVisibleHeight() {
         try {
-            final Completable.Int value = Completable.createInt();
-            mService.getInputMethodWindowVisibleHeight(ResultCallbacks.of(value));
-            return Completable.getIntResult(value);
+            return mService.getInputMethodWindowVisibleHeight();
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -3118,9 +3052,7 @@
     @Deprecated
     public void setAdditionalInputMethodSubtypes(String imiId, InputMethodSubtype[] subtypes) {
         try {
-            final Completable.Void value = Completable.createVoid();
-            mService.setAdditionalInputMethodSubtypes(imiId, subtypes, ResultCallbacks.of(value));
-            Completable.getResult(value);
+            mService.setAdditionalInputMethodSubtypes(imiId, subtypes);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -3128,9 +3060,7 @@
 
     public InputMethodSubtype getLastInputMethodSubtype() {
         try {
-            final Completable.InputMethodSubtype value = Completable.createInputMethodSubtype();
-            mService.getLastInputMethodSubtype(ResultCallbacks.of(value));
-            return Completable.getResult(value);
+            return mService.getLastInputMethodSubtype();
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 87301dc..ca6e735 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -11854,23 +11854,28 @@
 
                 // Get the text and trim it to the range we are reporting.
                 CharSequence text = getText();
-                if (expandedTopChar > 0 || expandedBottomChar < text.length()) {
-                    text = text.subSequence(expandedTopChar, expandedBottomChar);
-                }
 
-                if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) {
-                    structure.setText(text);
-                } else {
-                    structure.setText(text, selStart - expandedTopChar, selEnd - expandedTopChar);
-
-                    final int[] lineOffsets = new int[bottomLine - topLine + 1];
-                    final int[] lineBaselines = new int[bottomLine - topLine + 1];
-                    final int baselineOffset = getBaselineOffset();
-                    for (int i = topLine; i <= bottomLine; i++) {
-                        lineOffsets[i - topLine] = layout.getLineStart(i);
-                        lineBaselines[i - topLine] = layout.getLineBaseline(i) + baselineOffset;
+                if (text != null) {
+                    if (expandedTopChar > 0 || expandedBottomChar < text.length()) {
+                        text = text.subSequence(expandedTopChar, expandedBottomChar);
                     }
-                    structure.setTextLines(lineOffsets, lineBaselines);
+
+                    if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) {
+                        structure.setText(text);
+                    } else {
+                        structure.setText(text,
+                                selStart - expandedTopChar,
+                                selEnd - expandedTopChar);
+
+                        final int[] lineOffsets = new int[bottomLine - topLine + 1];
+                        final int[] lineBaselines = new int[bottomLine - topLine + 1];
+                        final int baselineOffset = getBaselineOffset();
+                        for (int i = topLine; i <= bottomLine; i++) {
+                            lineOffsets[i - topLine] = layout.getLineStart(i);
+                            lineBaselines[i - topLine] = layout.getLineBaseline(i) + baselineOffset;
+                        }
+                        structure.setTextLines(lineOffsets, lineBaselines);
+                    }
                 }
             }
 
diff --git a/core/java/android/window/SplashScreenView.java b/core/java/android/window/SplashScreenView.java
index 148986a..1efd2e3 100644
--- a/core/java/android/window/SplashScreenView.java
+++ b/core/java/android/window/SplashScreenView.java
@@ -133,6 +133,8 @@
         private @ColorInt int mIconBackground;
         private Bitmap mParceledIconBitmap;
         private Drawable mIconDrawable;
+        // It is only set for legacy splash screen which won't be sent across processes.
+        private Drawable mOverlayDrawable;
         private SurfaceControlViewHost.SurfacePackage mSurfacePackage;
         private RemoteCallback mClientCallback;
         private int mBrandingImageWidth;
@@ -193,6 +195,14 @@
         }
 
         /**
+         * Set the Drawable object to fill entire view
+         */
+        public Builder setOverlayDrawable(@Nullable Drawable drawable) {
+            mOverlayDrawable = drawable;
+            return this;
+        }
+
+        /**
          * Set the Drawable object to fill the center view.
          */
         public Builder setCenterViewDrawable(@Nullable Drawable drawable) {
@@ -236,7 +246,11 @@
                     layoutInflater.inflate(R.layout.splash_screen_view, null, false);
             view.mInitBackgroundColor = mBackgroundColor;
             view.mInitIconBackgroundColor = mIconBackground;
-            view.setBackgroundColor(mBackgroundColor);
+            if (mOverlayDrawable != null) {
+                view.setBackground(mOverlayDrawable);
+            } else {
+                view.setBackgroundColor(mBackgroundColor);
+            }
             view.mClientCallback = mClientCallback;
 
             view.mBrandingImageView = view.findViewById(R.id.splashscreen_branding_view);
@@ -261,6 +275,9 @@
                     }
                 }
             }
+            if (mOverlayDrawable != null || mIconDrawable == null) {
+                view.setNotCopyable();
+            }
 
             if (mParceledIconBitmap != null) {
                 view.mParceledIconBitmap = mParceledIconBitmap;
diff --git a/core/java/android/window/StartingWindowInfo.java b/core/java/android/window/StartingWindowInfo.java
index 8bc2177..566f154 100644
--- a/core/java/android/window/StartingWindowInfo.java
+++ b/core/java/android/window/StartingWindowInfo.java
@@ -55,6 +55,9 @@
      */
     public static final int STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN = 3;
 
+    /** @hide **/
+    public static final int STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN = 4;
+
     /**
      * @hide
      */
@@ -62,7 +65,8 @@
             STARTING_WINDOW_TYPE_NONE,
             STARTING_WINDOW_TYPE_SPLASH_SCREEN,
             STARTING_WINDOW_TYPE_SNAPSHOT,
-            STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN
+            STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN,
+            STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN
     })
     public @interface StartingWindowType {}
 
@@ -103,7 +107,8 @@
             TYPE_PARAMETER_PROCESS_RUNNING,
             TYPE_PARAMETER_ALLOW_TASK_SNAPSHOT,
             TYPE_PARAMETER_ACTIVITY_CREATED,
-            TYPE_PARAMETER_USE_EMPTY_SPLASH_SCREEN
+            TYPE_PARAMETER_USE_EMPTY_SPLASH_SCREEN,
+            TYPE_PARAMETER_LEGACY_SPLASH_SCREEN
     })
     public @interface StartingTypeParams {}
 
@@ -122,6 +127,11 @@
     public static final int TYPE_PARAMETER_ACTIVITY_CREATED = 0x00000010;
     /** @hide */
     public static final int TYPE_PARAMETER_USE_EMPTY_SPLASH_SCREEN = 0x00000020;
+    /**
+     * Application is allowed to use the legacy splash screen
+     * @hide
+     */
+    public static final int TYPE_PARAMETER_LEGACY_SPLASH_SCREEN = 0x80000000;
 
     /**
      * The parameters which effect the starting window type.
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index a6bf3cf..eeceafa 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -2120,10 +2120,10 @@
                     + " resultList.size()=" + resultList.size()
                     + " appTargets.size()=" + appTargets.size());
         }
-
+        Context selectedProfileContext = createContextAsUser(userHandle, 0 /* flags */);
         for (int i = resultList.size() - 1; i >= 0; i--) {
             final String packageName = resultList.get(i).getTargetComponent().getPackageName();
-            if (!isPackageEnabled(packageName)) {
+            if (!isPackageEnabled(selectedProfileContext, packageName)) {
                 resultList.remove(i);
                 if (appTargets != null) {
                     appTargets.remove(i);
@@ -2175,13 +2175,13 @@
         mChooserHandler.sendMessage(msg);
     }
 
-    private boolean isPackageEnabled(String packageName) {
+    private boolean isPackageEnabled(Context context, String packageName) {
         if (TextUtils.isEmpty(packageName)) {
             return false;
         }
         ApplicationInfo appInfo;
         try {
-            appInfo = getPackageManager().getApplicationInfo(packageName, 0);
+            appInfo = context.getPackageManager().getApplicationInfo(packageName, 0);
         } catch (NameNotFoundException e) {
             return false;
         }
diff --git a/core/java/com/android/internal/display/BrightnessSynchronizer.java b/core/java/com/android/internal/display/BrightnessSynchronizer.java
index 19183b8..c9a9e51 100644
--- a/core/java/com/android/internal/display/BrightnessSynchronizer.java
+++ b/core/java/com/android/internal/display/BrightnessSynchronizer.java
@@ -154,10 +154,20 @@
         }
     }
 
+    /**
+     * Gets the stored screen brightness float value from the display brightness setting.
+     * @return brightness
+     */
     private float getScreenBrightnessFloat() {
         return mDisplayManager.getBrightness(Display.DEFAULT_DISPLAY);
     }
 
+    /**
+     * Gets the stored screen brightness int from the system settings.
+     * @param context for accessing settings
+     *
+     * @return brightness
+     */
     private static int getScreenBrightnessInt(Context context) {
         return Settings.System.getIntForUser(context.getContentResolver(),
                 Settings.System.SCREEN_BRIGHTNESS, PowerManager.BRIGHTNESS_INVALID,
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index be059a1..a68a007 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -275,7 +275,7 @@
     private int mNumAllUidCpuTimeReads;
 
     /** Container for Resource Power Manager stats. Updated by updateRpmStatsLocked. */
-    private final RpmStats mTmpRpmStats = new RpmStats();
+    private RpmStats mTmpRpmStats = null;
     /** The soonest the RPM stats can be updated after it was last updated. */
     private static final long RPM_STATS_UPDATE_FREQ_MS = 1000;
     /** Last time that RPM stats were updated by updateRpmStatsLocked. */
@@ -12387,19 +12387,34 @@
 
         mLastBluetoothActivityInfo.set(info);
     }
-
     /**
-     * Read and record Resource Power Manager (RPM) state and voter times.
+     * Read Resource Power Manager (RPM) state and voter times.
      * If RPM stats were fetched more recently than RPM_STATS_UPDATE_FREQ_MS ago, uses the old data
      * instead of fetching it anew.
+     *
+     * Note: This should be called without synchronizing this BatteryStatsImpl object
      */
-    public void updateRpmStatsLocked(long elapsedRealtimeUs) {
+    public void fillLowPowerStats() {
         if (mPlatformIdleStateCallback == null) return;
+
+        RpmStats rpmStats = new RpmStats();
         long now = SystemClock.elapsedRealtime();
         if (now - mLastRpmStatsUpdateTimeMs >= RPM_STATS_UPDATE_FREQ_MS) {
-            mPlatformIdleStateCallback.fillLowPowerStats(mTmpRpmStats);
-            mLastRpmStatsUpdateTimeMs = now;
+            mPlatformIdleStateCallback.fillLowPowerStats(rpmStats);
+            synchronized (this) {
+                mTmpRpmStats = rpmStats;
+                mLastRpmStatsUpdateTimeMs = now;
+            }
         }
+    }
+
+    /**
+     * Record Resource Power Manager (RPM) state and voter times.
+     * TODO(b/185252376): Remove this logging. PowerStatsService logs the same data more
+     * efficiently.
+     */
+    public void updateRpmStatsLocked(long elapsedRealtimeUs) {
+        if (mTmpRpmStats == null) return;
 
         for (Map.Entry<String, RpmStats.PowerStatePlatformSleepState> pstate
                 : mTmpRpmStats.mPlatformLowPowerStats.entrySet()) {
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index 4891ce9..d40c064 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -24,13 +24,6 @@
 import com.android.internal.view.InputBindResult;
 import com.android.internal.view.IInputContext;
 import com.android.internal.view.IInputMethodClient;
-import com.android.internal.inputmethod.IBooleanResultCallback;
-import com.android.internal.inputmethod.IInputBindResultResultCallback;
-import com.android.internal.inputmethod.IInputMethodInfoListResultCallback;
-import com.android.internal.inputmethod.IInputMethodSubtypeResultCallback;
-import com.android.internal.inputmethod.IInputMethodSubtypeListResultCallback;
-import com.android.internal.inputmethod.IIntResultCallback;
-import com.android.internal.inputmethod.IVoidResultCallback;
 
 /**
  * Public interface to the global input method manager, used by all client
@@ -41,64 +34,51 @@
             int untrustedDisplayId);
 
     // TODO: Use ParceledListSlice instead
-    oneway void getInputMethodList(int userId,
-            in IInputMethodInfoListResultCallback resultCallback);
+    List<InputMethodInfo> getInputMethodList(int userId);
     // TODO: Use ParceledListSlice instead
-    oneway void getEnabledInputMethodList(int userId,
-            in IInputMethodInfoListResultCallback resultCallback);
-    oneway void getEnabledInputMethodSubtypeList(in String imiId,
-            boolean allowsImplicitlySelectedSubtypes,
-            in IInputMethodSubtypeListResultCallback resultCallback);
-    oneway void getLastInputMethodSubtype(in IInputMethodSubtypeResultCallback resultCallback);
+    List<InputMethodInfo> getEnabledInputMethodList(int userId);
+    List<InputMethodSubtype> getEnabledInputMethodSubtypeList(in String imiId,
+            boolean allowsImplicitlySelectedSubtypes);
+    InputMethodSubtype getLastInputMethodSubtype();
 
-    oneway void showSoftInput(in IInputMethodClient client, IBinder windowToken, int flags,
-            in ResultReceiver resultReceiver, int reason, in IBooleanResultCallback resultCallback);
-    oneway void hideSoftInput(in IInputMethodClient client, IBinder windowToken, int flags,
-            in ResultReceiver resultReceiver, int reason, in IBooleanResultCallback resultCallback);
+    boolean showSoftInput(in IInputMethodClient client, IBinder windowToken, int flags,
+            in ResultReceiver resultReceiver, int reason);
+    boolean hideSoftInput(in IInputMethodClient client, IBinder windowToken, int flags,
+            in ResultReceiver resultReceiver, int reason);
     // If windowToken is null, this just does startInput().  Otherwise this reports that a window
     // has gained focus, and if 'attribute' is non-null then also does startInput.
     // @NonNull
-    oneway void startInputOrWindowGainedFocus(
+    InputBindResult startInputOrWindowGainedFocus(
             /* @StartInputReason */ int startInputReason,
             in IInputMethodClient client, in IBinder windowToken,
             /* @StartInputFlags */ int startInputFlags,
             /* @android.view.WindowManager.LayoutParams.SoftInputModeFlags */ int softInputMode,
             int windowFlags, in EditorInfo attribute, IInputContext inputContext,
             /* @InputConnectionInspector.MissingMethodFlags */ int missingMethodFlags,
-            int unverifiedTargetSdkVersion,
-            in IInputBindResultResultCallback inputBindResult);
+            int unverifiedTargetSdkVersion);
 
-    oneway void reportWindowGainedFocusAsync(
-            boolean nextFocusHasConnection, in IInputMethodClient client, in IBinder windowToken,
-            /* @StartInputFlags */ int startInputFlags,
-            /* @android.view.WindowManager.LayoutParams.SoftInputModeFlags */ int softInputMode,
-            int windowFlags, int unverifiedTargetSdkVersion);
-
-    oneway void showInputMethodPickerFromClient(in IInputMethodClient client,
-            int auxiliarySubtypeMode, in IVoidResultCallback resultCallback);
-    oneway void showInputMethodPickerFromSystem(in IInputMethodClient client,
-            int auxiliarySubtypeMode, int displayId, in IVoidResultCallback resultCallback);
-    oneway void showInputMethodAndSubtypeEnablerFromClient(in IInputMethodClient client,
-            String topId, in IVoidResultCallback resultCallback);
-    oneway void isInputMethodPickerShownForTest(in IBooleanResultCallback resultCallback);
-    oneway void getCurrentInputMethodSubtype(in IInputMethodSubtypeResultCallback resultCallback);
-    oneway void setAdditionalInputMethodSubtypes(String id, in InputMethodSubtype[] subtypes,
-            in IVoidResultCallback resultCallback);
+    void showInputMethodPickerFromClient(in IInputMethodClient client,
+            int auxiliarySubtypeMode);
+    void showInputMethodPickerFromSystem(in IInputMethodClient client,
+            int auxiliarySubtypeMode, int displayId);
+    void showInputMethodAndSubtypeEnablerFromClient(in IInputMethodClient client, String topId);
+    boolean isInputMethodPickerShownForTest();
+    InputMethodSubtype getCurrentInputMethodSubtype();
+    void setAdditionalInputMethodSubtypes(String id, in InputMethodSubtype[] subtypes);
     // This is kept due to @UnsupportedAppUsage.
     // TODO(Bug 113914148): Consider removing this.
-    oneway void getInputMethodWindowVisibleHeight(IIntResultCallback resultCallback);
+    int getInputMethodWindowVisibleHeight();
 
     oneway void reportPerceptibleAsync(in IBinder windowToken, boolean perceptible);
     /** Remove the IME surface. Requires INTERNAL_SYSTEM_WINDOW permission. */
-    oneway void removeImeSurface(in IVoidResultCallback resultCallback);
+    void removeImeSurface();
     /** Remove the IME surface. Requires passing the currently focused window. */
     oneway void removeImeSurfaceFromWindowAsync(in IBinder windowToken);
-    oneway void startProtoDump(in byte[] protoDump, int source, String where,
-            in IVoidResultCallback resultCallback);
-    oneway void isImeTraceEnabled(in IBooleanResultCallback resultCallback);
+    void startProtoDump(in byte[] protoDump, int source, String where);
+    boolean isImeTraceEnabled();
 
     // Starts an ime trace.
-    oneway void startImeTrace(in IVoidResultCallback resultCallback);
+    void startImeTrace();
     // Stops an ime trace.
-    oneway void stopImeTrace(in IVoidResultCallback resultCallback);
+    void stopImeTrace();
 }
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 443bfce..406ccde 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -690,6 +690,7 @@
     char methodTraceFileBuf[sizeof("-Xmethod-trace-file:") + PROPERTY_VALUE_MAX];
     char methodTraceFileSizeBuf[sizeof("-Xmethod-trace-file-size:") + PROPERTY_VALUE_MAX];
     std::string fingerprintBuf;
+    char javaZygoteForkLoopBuf[sizeof("-XX:ForceJavaZygoteForkLoop=") + PROPERTY_VALUE_MAX];
     char jdwpProviderBuf[sizeof("-XjdwpProvider:") - 1 + PROPERTY_VALUE_MAX];
     char opaqueJniIds[sizeof("-Xopaque-jni-ids:") - 1 + PROPERTY_VALUE_MAX];
     char bootImageBuf[sizeof("-Ximage:") - 1 + PROPERTY_VALUE_MAX];
@@ -752,6 +753,11 @@
         //addOption("-verbose:jni");
     }
 
+    const bool odsignVerificationSuccess = GetBoolProperty("odsign.verification.success", false);
+    if (!odsignVerificationSuccess) {
+        addOption("-Xdeny-art-apex-data-files");
+    }
+
     property_get("dalvik.vm.execution-mode", propBuf, "");
     if (strcmp(propBuf, "int:portable") == 0) {
         executionMode = kEMIntPortable;
@@ -908,6 +914,13 @@
     parseRuntimeOption("dalvik.vm.backgroundgctype", backgroundgcOptsBuf, "-XX:BackgroundGC=");
 
     /*
+     * Enable/disable zygote native fork loop.
+     */
+    parseRuntimeOption("dalvik.vm.force-java-zygote-fork-loop",
+                       javaZygoteForkLoopBuf,
+                       "-XX:ForceJavaZygoteForkLoop=");
+
+    /*
      * Enable debugging only for apps forked from zygote.
      */
     if (zygote) {
diff --git a/core/jni/android_content_res_ApkAssets.cpp b/core/jni/android_content_res_ApkAssets.cpp
index 1be8428..fc12e17 100644
--- a/core/jni/android_content_res_ApkAssets.cpp
+++ b/core/jni/android_content_res_ApkAssets.cpp
@@ -377,61 +377,8 @@
   return CreateGuardedApkAssets(std::move(apk_assets));
 }
 
-// STOPSHIP (b/159041693): Revert signal handler when reason for issue is found.
-static thread_local std::stringstream destroy_info;
-static struct sigaction old_handler_action;
-
-static void DestroyErrorHandler(int sig, siginfo_t* info, void* ucontext) {
-  if (sig != SIGSEGV) {
-    return;
-  }
-
-  LOG(ERROR) << "(b/159041693) - Failed to destroy ApkAssets " << destroy_info.str();
-  if (old_handler_action.sa_handler == SIG_DFL) {
-      // reset the action to default and re-raise the signal. It will kill the process
-      signal(sig, SIG_DFL);
-      raise(sig);
-      return;
-  }
-  if (old_handler_action.sa_handler == SIG_IGN) {
-      // ignoring SIGBUS won't help us much, as we'll get back right here after retrying.
-      return;
-  }
-  if (old_handler_action.sa_flags & SA_SIGINFO) {
-      old_handler_action.sa_sigaction(sig, info, ucontext);
-  } else {
-      old_handler_action.sa_handler(sig);
-  }
-}
-
 static void NativeDestroy(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr) {
-    {
-        auto scoped_apk_assets = ScopedLock(ApkAssetsFromLong(ptr));
-        auto apk_assets = scoped_apk_assets->get();
-        destroy_info << "{ptr=" << apk_assets;
-        if (apk_assets != nullptr) {
-            destroy_info << ", name='" << apk_assets->GetDebugName() << "'"
-                         << ", idmap=" << apk_assets->GetLoadedIdmap()
-                         << ", {arsc=" << apk_assets->GetLoadedArsc();
-            if (auto arsc = apk_assets->GetLoadedArsc()) {
-                destroy_info << ", strings=" << arsc->GetStringPool()
-                             << ", packages=" << &arsc->GetPackages() << " [";
-                for (auto& package : arsc->GetPackages()) {
-                    destroy_info << "{unique_ptr=" << &package << ", package=" << package.get()
-                                 << "},";
-                }
-                destroy_info << "]";
-            }
-            destroy_info << "}";
-        }
-        destroy_info << "}";
-    }
-
     DeleteGuardedApkAssets(ApkAssetsFromLong(ptr));
-
-    // Deleting the apk assets did not lead to a crash.
-    destroy_info.str("");
-    destroy_info.clear();
 }
 
 static jstring NativeGetAssetPath(JNIEnv* env, jclass /*clazz*/, jlong ptr) {
@@ -591,18 +538,6 @@
 
   jclass parcelFd = FindClassOrDie(env, "android/os/ParcelFileDescriptor");
   gParcelFileDescriptorOffsets.detachFd = GetMethodIDOrDie(env, parcelFd, "detachFd", "()I");
-
-  // STOPSHIP (b/159041693): Revert signal handler when reason for issue is found.
-  sigset_t allowed;
-  sigemptyset(&allowed);
-  sigaddset(&allowed, SIGSEGV);
-  pthread_sigmask(SIG_UNBLOCK, &allowed, nullptr);
-  struct sigaction action = {
-          .sa_flags = SA_SIGINFO,
-          .sa_sigaction = &DestroyErrorHandler,
-  };
-  sigaction(SIGSEGV, &action, &old_handler_action);
-
   return RegisterMethodsOrDie(env, "android/content/res/ApkAssets", gApkAssetsMethods,
                               arraysize(gApkAssetsMethods));
 }
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index bf60d15..6946b3c 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Weier"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Toestemming versoek"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Toestemming versoek\nvir rekening <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Toestemming versoek deur <xliff:g id="APP">%1$s</xliff:g>\nvir rekening <xliff:g id="ACCOUNT">%2$s</xliff:g>"</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Jy gebruik hierdie program buite jou werkprofiel"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Jy gebruik tans hierdie program in jou werkprofiel"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Invoermetode"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 59c4524..9ab2f19 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"ያስተባብሉ"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"ፈቃድ ተጠይቋል"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">\n" ለ<xliff:g id="ACCOUNT">%s</xliff:g> መለያ ፈቃድ ተጠይቋል"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"ለመለያ <xliff:g id="ACCOUNT">%2$s</xliff:g>\nበ<xliff:g id="APP">%1$s</xliff:g> የተጠየቀ ፈቃድ።"</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"ከስራ መገለጫዎ ውጪ ሆነው መተግበሪያ እየተጠቀሙ ነው"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"ይህን መተግበሪያ በእርስዎ የስራ መገለጫ ላይ እየተጠቀሙበት ነው"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"ግቤት ስልት"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index de22332..cf2f677 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1562,8 +1562,7 @@
     <string name="deny" msgid="6632259981847676572">"رفض"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"الإذن مطلوب"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"الإذن مطلوب\nللحساب <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"طلب تطبيق <xliff:g id="APP">%1$s</xliff:g> الإذن بالدخول\nإلى حساب <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"أنت تستخدم هذا التطبيق خارج ملفك الشخصي للعمل"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"أنت تستخدم هذا التطبيق في ملفك الشخصي للعمل"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"طريقة الإرسال"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 6f04b0d..6fcef4f 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"প্ৰত্যাখ্যান কৰক"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"অনুমতি বিচাৰি অনুৰোধ কৰা হৈছে"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> একাউণ্টৰ বাবে\nঅনুমতি বিচাৰি অনুৰোধ কৰা হৈছে।"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g>এ <xliff:g id="ACCOUNT">%2$s</xliff:g> একাউণ্টটো এক্সেছৰ \nঅনুমতি বিচাৰি অনুৰোধ জনাইছে।"</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"আপুনি আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ বাহিৰত এই এপটো ব্যৱহাৰ কৰি আছে"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"আপুনি আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ ভিতৰত এই এপটো ব্যৱহাৰ কৰি আছে"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"ইনপুট পদ্ধতি"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index b780f97..bab05ad 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Rədd et"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"İcazə tələb olunur"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">\n" hesabı üçün<xliff:g id="ACCOUNT">%s</xliff:g> icazə sorğusu göndərildi."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g>\ntərəfindən <xliff:g id="ACCOUNT">%2$s</xliff:g> hesabı üçün icazə tələb edilib."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Bu tətbiqi iş profilinizdən kənarda istifadə edirsiniz"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Bu tətbiqi iş profilinizdə istifadə edirsiniz"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Daxiletmə metodu"</string>
@@ -2095,12 +2094,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Bu bildiriş Səssiz rejimə keçirilib. Rəy bildirmək üçün toxunun."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Bu bildiriş yuxarı sıraya keçirilib. Rəy bildirmək üçün toxunun."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Bu bildiriş aşağı sıraya keçirilib. Rəy bildirmək üçün toxunun."</string>
-    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Genişləndirilmiş bildirişlər"</string>
-    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Təklif olunan əməliyyatlar və cavablar artıq genişləndirilmiş bildirişlər tərəfindən təmin olunur. Android Adaptiv Bildirişləri artıq dəstəklənmir."</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Qabaqcıl bildirişlər"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Cəld cavablar və əməliyyatlar qabaqcıl bildirişlərə artıq daxildir. Android adaptiv bildirişləri daha dəstəklənmir."</string>
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Deaktiv edin"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Ətraflı məlumat"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Genişləndirilmiş bildirişlər Android 12-də Android Adaptiv Bildirişləri əvəz etdi. Bu funksiya təklif olunan əməliyyatları və cavabları göstərir və bildirişlərinizi təşkil edir.\n\nGenişləndirilmiş bildirişlər, kontakt adları və mesajlar kimi şəxsi məlumatlar daxil olmaqla bütün bildiriş məzmununa giriş edə bilər. Bu funksiya telefon zənglərinə cavab vermək və Narahat Etməyin rejimini idarə etmək kimi bildirişləri qapada və ya cavablandıra bilər."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12-də qabaqcıl bildirişlər var. Bu funksiya bütün bildirişləri qaydaya salır, cavab və əməliyyatlara dair tövsiyə verir.\n\nFunksiyanın kontaktlar, mesajlar və şəxsi məlumatlar daxil olmaqla bütün bildirişlərə girişi var. Zənglərə cavab verə, \"Narahat etməyin\" rejimini idarə edə, bildirişləri qapada və cavablaya bilər."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rejim üçün məlumat bildirişi"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batareya həmişəki vaxtdan əvvəl bitə bilər"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Enerjiyə Qənaət rejimi batareya istifadəsinin müddətini artırmaq üçün aktiv edilir"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index fa4a82e..4179ab0 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -1502,8 +1502,7 @@
     <string name="deny" msgid="6632259981847676572">"Odbij"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Zatražena je dozvola"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Zatražena je dozvola\nza nalog <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> traži dozvolu \nza nalog <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Koristite ovu aplikaciju izvan poslovnog profila"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Koristite ovu aplikaciju na poslovnom profilu"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Metod unosa"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 571f558..3968822 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -1522,8 +1522,7 @@
     <string name="deny" msgid="6632259981847676572">"Адмовіць"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Дазвол запытаны"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Запытаны дазвол\nдля ўліковага запісу <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Праграма \"<xliff:g id="APP">%1$s</xliff:g>\" запытвае дазвол\nдля ўліковага запісу <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Вы выкарыстоўваеце гэту праграму па-за межамі свайго працоўнага профілю"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Вы выкарыстоўваеце гэту праграму ў сваім працоўным профілі"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Метад уводу"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 9b7cbed..3ebb7cc 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -1502,7 +1502,7 @@
     <string name="deny" msgid="6632259981847676572">"Odbij"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Upućen zahtjev za odobrenje"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Upućen zahtjev za dozvolu\nza račun <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> zatražila je dopuštenje\nza račun <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Odobrenje je zatražila aplikacija <xliff:g id="APP">%1$s</xliff:g>\nza račun <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Aplikaciju koristite van poslovnog profila"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Aplikaciju koristite u poslovnom profilu"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Način unosa"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 0994041..880ad180 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -2095,7 +2095,7 @@
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Aquesta notificació s\'ha classificat amb un nivell superior. Toca per proporcionar suggeriments."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Aquesta notificació s\'ha classificat amb un nivell inferior. Toca per proporcionar suggeriments."</string>
     <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificacions millorades"</string>
-    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Ara, les accions i respostes suggerides les proporcionen les notificacions millorades. Les notificacions adaptatives d\'Android ja no s\'admeten."</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Ara les accions i respostes suggerides es proporcionen mitjançant les notificacions millorades. Les notificacions adaptatives d\'Android ja no s\'admeten."</string>
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"D\'acord"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desactiva"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Més informació"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 5f12c31..61fb471 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1522,8 +1522,7 @@
     <string name="deny" msgid="6632259981847676572">"Odepřít"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Požadováno oprávnění"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Požadováno oprávnění\npro účet <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Aplikace <xliff:g id="APP">%1$s</xliff:g> požádala o přístup\nk účtu <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Tuto aplikaci používáte mimo svůj pracovní profil."</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Tuto aplikaci používáte v pracovním profilu"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Metoda zadávání dat"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 3a1022d..45f02e3 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Afvis"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Der er anmodet om tilladelse"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Der er anmodet om tilladelse\nfor kontoen <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> har anmodet om tilladelse\nfor kontoen <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Du bruger denne app uden for din arbejdsprofil"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Du bruger denne app i din arbejdsprofil"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Inputmetode"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 394f074..088495e 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -648,7 +648,7 @@
     <string name="face_error_canceled" msgid="2164434737103802131">"Gesichtserkennung abgebrochen."</string>
     <string name="face_error_user_canceled" msgid="5766472033202928373">"Entsperrung per Gesichtserkennung vom Nutzer abgebrochen"</string>
     <string name="face_error_lockout" msgid="7864408714994529437">"Zu viele Versuche, bitte später noch einmal versuchen"</string>
-    <string name="face_error_lockout_permanent" msgid="3277134834042995260">"Zu viele Versuche. Entsperrung per Gesichtserkennung wurde deaktiviert."</string>
+    <string name="face_error_lockout_permanent" msgid="3277134834042995260">"Zu viele Versuche. Die Entsperrung per Gesichtserkennung wurde deaktiviert."</string>
     <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Zu viele Versuche. Verwende stattdessen die Displaysperre."</string>
     <string name="face_error_unable_to_process" msgid="5723292697366130070">"Gesichtsprüfung nicht möglich. Noch mal versuchen."</string>
     <string name="face_error_not_enrolled" msgid="1134739108536328412">"Entsperrung per Gesichtserkennung ist nicht eingerichtet"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 593a13f..93c7bc1 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -617,7 +617,7 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloquea el teléfono con solo mirarlo"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura más formas de desbloqueo"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca para añadir una huella digital"</string>
-    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueo con Huella Digital"</string>
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueo con huella digital"</string>
     <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"No se puede usar el sensor de huellas digitales"</string>
     <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visita un proveedor de reparaciones."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Datos faciales no reconocidos. Vuelve a intentarlo."</string>
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Denegar"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Permiso solicitado"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Permiso solicitado\npara la cuenta <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Permiso solicitado por <xliff:g id="APP">%1$s</xliff:g>\npara acceder a la cuenta<xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Estás usando esta aplicación fuera del perfil de trabajo"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Estás usando esta aplicación en tu perfil de trabajo"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Método de introducción de texto"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index d54fd6d..baa8da0 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Ukatu"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Baimena eskatu da"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Baimena eskatu da \n<xliff:g id="ACCOUNT">%s</xliff:g> konturako."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> aplikazioak <xliff:g id="ACCOUNT">%2$s</xliff:g> kontua atzitzeko baimena\neskatu du."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Laneko profiletik kanpo ari zara aplikazioa erabiltzen"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Laneko profilean ari zara aplikazioa erabiltzen"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Idazketa-metodoa"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index fb6569f..1b5e4b9 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"مجاز نبودن"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"مجوز درخواست شد"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"مجوز\nبرای حساب <xliff:g id="ACCOUNT">%s</xliff:g> درخواست شد."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> برای دسترسی به حساب <xliff:g id="ACCOUNT">%2$s</xliff:g>\nدرخواست اجازه کرد."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"شما از این برنامه در خارج از نمایه کاری‌تان استفاده می‌کنید"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"از این برنامه در نمایه کاری‌تان استفاده می‌کنید"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"روش ورودی"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 49da162..5998269 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Kiellä"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Lupa pyydetty"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Pyydetään lupaa\ntilille <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> pyytänyt pääsyä\ntilille <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Käytät sovellusta muulla kuin työprofiililla"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Käytät sovellusta työprofiililla"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Syöttötapa"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 590cbe2..ea160bc 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Refuser"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Autorisation demandée"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Autorisation demandée\npour le compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\""</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Autorisation demandée par <xliff:g id="APP">%1$s</xliff:g>\npour le compte <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Vous utilisez cette application en dehors de votre profil professionnel"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Vous utilisez cette application dans votre profil professionnel"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Mode de saisie"</string>
@@ -2100,7 +2099,7 @@
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Désactiver"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"En savoir plus"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Les notifications améliorées ont remplacé les notifications adaptatives Android sous Android 12. Cette fonctionnalité vous présente des suggestions d\'actions et de réponse, et organise vos notifications.\n\nLes notifications améliorées peuvent accéder au contenu de toutes les notifications, y compris les renseignements personnels comme le nom des contacts et les messages. Cette fonctionnalité peut aussi fermer des notifications ou interagir avec elles, comme répondre aux appels téléphoniques et gérer le mode Ne pas déranger."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Les notifications améliorées ont remplacé les notifications adaptatives Android sous Android 12. Cette fonctionnalité vous présente des suggestions d\'actions et de réponses, et organise vos notifications.\n\nLes notifications améliorées peuvent accéder au contenu de toutes les notifications, y compris les renseignements personnels comme le nom des contacts et les messages. Cette fonctionnalité peut aussi fermer des notifications ou interagir avec elles, comme répondre aux appels téléphoniques et gérer le mode Ne pas déranger."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notification d\'information du mode Routine"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"La pile pourrait s\'épuiser avant la charge habituelle"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Le mode Économiseur de pile est activé afin de prolonger l\'autonomie"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 487d964..e71c249 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Refuser"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Autorisation demandée"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Autorisation demandée\npour le compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\""</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Autorisation demandée par <xliff:g id="APP">%1$s</xliff:g>\npour le compte <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Vous utilisez cette application en dehors de votre profil professionnel."</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Vous utilisez cette application dans votre profil professionnel."</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Mode de saisie"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 7b7512c..141da9c 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Rexeitar"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Permiso solicitado"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Permiso solicitado\npara a conta <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> solicitou permiso\npara acceder á conta <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Estás usando esta aplicación fóra do teu perfil de traballo"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Estás usando esta aplicación no teu perfil de traballo"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Método de introdución de texto"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 1dcf8cb..dcf357b 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"अस्वीकारें"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"अनुमति अनुरोधित"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> खाते के लिए अनुमति\nका अनुरोध किया गया."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> ने <xliff:g id="ACCOUNT">%2$s</xliff:g> खाते को ऐक्सेस\nकरने की अनुमति का अनुरोध किया है."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"आप इस ऐप्स का उपयोग अपनी वर्क प्रोफ़ाइल से बाहर कर रहे हैं"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"आप इस ऐप्स का उपयोग अपनी वर्क प्रोफ़ाइल में कर रहे हैं"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"इनपुट विधि"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index d9da85c..a7992f9 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Մերժել"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Թույլտվության հարցում է արված"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Թույլտվության հարցում է արված\n<xliff:g id="ACCOUNT">%s</xliff:g> հաշվի համար:"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Հայցվում է թույլտվություն <xliff:g id="APP">%1$s</xliff:g> հավելվածի կողմից\n<xliff:g id="ACCOUNT">%2$s</xliff:g> հաշվի համար"</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Դուք օգտագործում եք այս հավելվածը ձեր աշխատանքային պրոֆիլից դուրս"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Դուք օգտագործում եք այս հավելվածը ձեր աշխատանքային պրոֆիլում"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Ներածման եղանակը"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index c3cb6e0..c86b8cd 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Tolak"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Izin dimintakan"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Izin dimintakan\nuntuk akun <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> meminta izin\nuntuk akun <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Anda menggunakan aplikasi ini di luar profil kerja"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Anda menggunakan aplikasi ini di profil kerja"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Metode masukan"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 5c328ed..667dd9c 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Hafna"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Beðið um heimild"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Beðið um heimild\nfyrir reikninginn <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Beiðni um heimild frá <xliff:g id="APP">%1$s</xliff:g>\nfyrir reikninginn <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Þú ert að nota þetta forrit utan vinnusniðsins"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Þú ert að nota þetta forrit á vinnusniðinu þínu"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Innsláttaraðferð"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 5b5a90b..cd8cb90 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1522,8 +1522,7 @@
     <string name="deny" msgid="6632259981847676572">"עדיף שלא"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"בקשת הרשאה"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"נדרשת הרשאה\nלחשבון <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"התבקשה הרשאה על ידי <xliff:g id="APP">%1$s</xliff:g>\nלחשבון <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"בחרת להשתמש באפליקציה הזאת מחוץ לפרופיל העבודה שלך"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"נעשה שימוש באפליקציה הזו בפרופיל העבודה שלך"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"שיטת קלט"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 94c6af0..8765659 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"აკრძალვა"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"მოთხოვნილია ნებართვა"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"მოთხოვნილია ნებრათვა \nანგარიშისთვის: <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"ნებართვა მოთხოვნილია <xliff:g id="APP">%1$s</xliff:g>-ის მიერ\nანგარიშისთვის <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"იყენებთ ამ აპს თქვენს სამუშაო პროფილს მიღმა"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"ამ აპს თქვენს სამუშაო პროფილში იყენებთ"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"შეყვანის მეთოდი"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 1e07050..3243a8d35 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Тыйым салу"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Рұқсат өтінілді"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Рұқсат \nесептік жазба үшін <xliff:g id="ACCOUNT">%s</xliff:g> өтінілді."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="ACCOUNT">%2$s</xliff:g> есептік жазбасы үшін <xliff:g id="APP">%1$s</xliff:g>\nқолданбасы арқылы рұқсат сұралды."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Осы қолданбаны жұмыс профиліңізден тыс пайдаланып жатырсыз"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Осы қолданбаны жұмыс профиліңізде пайдаланып жатырсыз"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Енгізу әдісі"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index c610d25..a7d6ae0 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"ನಿರಾಕರಿಸಿ"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"ಅನುಮತಿ ವಿನಂತಿಸಲಾಗಿದೆ"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> ಖಾತೆಗಾಗಿ\n ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="ACCOUNT">%2$s</xliff:g> ಖಾತೆಗಾಗಿ \n <xliff:g id="APP">%1$s</xliff:g> ನಿಂದ ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನ ಹೊರಗೆ ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"ಇನ್‌ಪುಟ್ ವಿಧಾನ"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 3a44e02..8fddef0 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -1254,7 +1254,7 @@
     <string name="android_start_title" product="tablet" msgid="4429767260263190344">"Планшет күйгүзүлүүдө…"</string>
     <string name="android_start_title" product="device" msgid="6967413819673299309">"Түзмөк күйүгүзүлүүдө…"</string>
     <string name="android_upgrading_fstrim" msgid="3259087575528515329">"Сактагыч ыңгайлаштырылууда."</string>
-    <string name="android_upgrading_notification_title" product="default" msgid="3509927005342279257">"Тутумду жаңыртуу аяктоодо…"</string>
+    <string name="android_upgrading_notification_title" product="default" msgid="3509927005342279257">"Система жаңырып бүтөйүн деп калды…"</string>
     <string name="app_upgrading_toast" msgid="1016267296049455585">"<xliff:g id="APPLICATION">%1$s</xliff:g> жаңыртылууда..."</string>
     <string name="android_upgrading_apk" msgid="1339564803894466737">"<xliff:g id="NUMBER_1">%2$d</xliff:g> ичинен <xliff:g id="NUMBER_0">%1$d</xliff:g> колдонмо оптималдаштырылууда."</string>
     <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> даярдалууда."</string>
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Уруксат берилбейт"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Уруксат талап кылуу"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Кийинки эсепке\nуруксат талап кылынууда: <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> колдонмосу\n <xliff:g id="ACCOUNT">%2$s</xliff:g> аккаунтуна кирүүгө уруксат сурады."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Бул колдонмо жумуш профилиңиздин сыртында колдонулуп жатат"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Бул колдонмону жумуш профилиңизде пайдаланып жатасыз"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Киргизүү ыкмасы"</string>
@@ -2096,7 +2095,7 @@
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Бул билдирменин маанилүүлүгү жогорулатылды. Пикир билдирүү үчүн таптап коюңуз."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Бул билдирменин маанилүүлүгү төмөндөтүлдү. Пикир билдирүү үчүн таптап коюңуз."</string>
     <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Жакшыртылган билдирмелер"</string>
-    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Жакшыртылган билдирмелерде эми ыкчам аракеттер жана жооптор сунушталат. Android\'дин ыңгайлаштырылуучу билдирмелери колдоого алынбай калды."</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Жакшыртылган билдирмелерде эми ыкчам аракеттер жана жооптор сунушталат. Android\'дин ыңгайлаштырылуучу билдирмелерин мындан ары көрбөйсүз."</string>
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Макул"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Өчүрүү"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Кененирээк"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 86529e9..1879dcc 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1522,8 +1522,7 @@
     <string name="deny" msgid="6632259981847676572">"Atmesti"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Pateikta užklausa dėl leidimo"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Pateikta leidimo užklausa\ndėl <xliff:g id="ACCOUNT">%s</xliff:g> paskyros"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Programai „<xliff:g id="APP">%1$s</xliff:g>“ reikalingas leidimas\n, susijęs su paskyra <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Šią programą naudojate ne darbo profilyje"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Šią programą naudojate darbo profilyje"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Įvesties būdas"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 1c47978..15eda96 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1502,8 +1502,7 @@
     <string name="deny" msgid="6632259981847676572">"Noraidīt"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Atļauja ir pieprasīta."</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Atļauja kontam <xliff:g id="ACCOUNT">%s</xliff:g>\nir pieprasīta."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Lietotne <xliff:g id="APP">%1$s</xliff:g> pieprasīja atļauju piekļūt \nkontam <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Šo lietotni izmantojat ārpus sava darba profila"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Jūs izmantojat šo lietotni no sava darba profila."</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Ievades metode"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 53badf6..31d0762 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Одбиј"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Побарана е дозвола"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Побарана е дозвола\nза сметка <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> побара дозвола\nза сметката <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Ја користите апликацијата надвор од работниот профил"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Ја користите апликацијата во работниот профил"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Метод на внес"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index b9a1b7e..c64160c7 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"നിരസിക്കുക"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"അനുമതി ആവശ്യമാണ്"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> എന്ന അക്കൗണ്ടിനായി\nഅനുമതി അഭ്യർത്ഥിച്ചു."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="ACCOUNT">%2$s</xliff:g> അക്കൗണ്ട് ആക്സസ് ചെയ്യാൻ \n<xliff:g id="APP">%1$s</xliff:g> അനുമതി അഭ്യർത്ഥിച്ചു."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിന് പുറത്ത് ഈ അപ്ലിക്കേഷൻ ഉപയോഗിക്കുന്നു"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിൽ ഈ അപ്ലിക്കേഷൻ ഉപയോഗിക്കുന്നു"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"ടൈപ്പുചെയ്യൽ രീതി"</string>
@@ -2096,7 +2095,7 @@
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ഈ അറിയിപ്പിന് ഉയർന്ന റാങ്ക് നൽകി. ഫീഡ്ബാക്ക് നൽകാൻ ടാപ്പ് ചെയ്യുക."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ഈ അറിയിപ്പിന് താഴ്‌ന്ന റാങ്ക് നൽകി. ഫീഡ്ബാക്ക് നൽകാൻ ടാപ്പ് ചെയ്യുക."</string>
     <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"മെച്ചപ്പെടുത്തിയ അറിയിപ്പുകൾ"</string>
-    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"നിർദ്ദേശിക്കുന്ന പ്രവർത്തനങ്ങളും മറുപടികളും, \'മെച്ചപ്പെടുത്തിയ അറിയിപ്പുകൾ\' ഫീച്ചറാണ് ഇപ്പോൾ നൽകുന്നത്. Android അഡാപ്റ്റീവ് അറിയിപ്പുകൾക്ക് ഇനി പിന്തുണയില്ല."</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"നിർദ്ദേശിക്കുന്ന പ്രവർത്തനങ്ങളും മറുപടികളും ഇപ്പോൾ നൽകുന്നത് മെച്ചപ്പെടുത്തിയ അറിയിപ്പുകൾ എന്ന ഫീച്ചറാണ്. Android അഡാപ്റ്റീവ് അറിയിപ്പുകൾക്ക് ഇനി പിന്തുണയില്ല."</string>
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ശരി"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ഓഫാക്കുക"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"കൂടുതലറിയുക"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 7b22de7..4244015 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -2095,7 +2095,7 @@
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Энэ мэдэгдлийг дээгүүр зэрэглэсэн байна. Санал хүсэлт өгөхийн тулд товшино уу."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Энэ мэдэгдлийг доогуур зэрэглэсэн байна. Санал хүсэлт өгөхийн тулд товшино уу."</string>
     <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Сайжруулсан мэдэгдэл"</string>
-    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Санал болгосон үйлдлүүд болон хариунуудыг одоо сайржуулсан мэдэгдлээр олгоно. Android-н Орчинтой тохирсон мэдэгдлийг цаашид дэмжихээ больсон."</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Санал болгосон үйлдэл, хариултыг одоо сайржуулсан мэдэгдлээр олгоно. Android-н Орчинтой тохирсон мэдэгдлийг цаашид дэмжихээ больсон."</string>
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Унтраах"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Нэмэлт мэдээлэл авах"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index d41c562..28522d7 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -652,7 +652,7 @@
     <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"बरेच प्रयत्न. त्याऐवजी स्क्रीन लॉक वापरा."</string>
     <string name="face_error_unable_to_process" msgid="5723292697366130070">"चेहरा पडताळणी करू शकत नाही. पुन्हा प्रयत्न करा."</string>
     <string name="face_error_not_enrolled" msgid="1134739108536328412">"तुम्ही फेस अनलॉक सेट केले नाही"</string>
-    <string name="face_error_hw_not_present" msgid="7940978724978763011">"फेस अनलॉक या डिव्हाइसवर सपोर्ट करत नाही"</string>
+    <string name="face_error_hw_not_present" msgid="7940978724978763011">"या डिव्हाइसवर फेस अनलॉकला सपोर्ट नाही"</string>
     <string name="face_error_security_update_required" msgid="5076017208528750161">"सेन्सर तात्पुरता बंद केला आहे."</string>
     <string name="face_name_template" msgid="3877037340223318119">"चेहरा <xliff:g id="FACEID">%d</xliff:g>"</string>
     <string name="face_app_setting_name" msgid="5854024256907828015">"फेस अनलॉक वापरा"</string>
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"नकार द्या"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"परवानगीची विनंती केली"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> खात्यासाठी\nपरवानगीची विनंती केली."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> ने तुमचे \n<xliff:g id="ACCOUNT">%2$s</xliff:g> खाते ॲक्सेस करण्यासाठी परवानगीची विनंती केली आहे."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"तुम्ही हा अ‍ॅप आपल्‍या कार्य प्रोफाईलच्या बाहेर वापरत आहात"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"तुम्ही हा अ‍ॅप आपल्या कार्य प्रोफाईलमध्‍ये वापरत आहात"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"इनपुट पद्धत"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 648208e..c156c6a 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Nafi"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Kebenaran diminta"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Kebenaran diminta\nuntuk akaun <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Kebenaran diminta oleh <xliff:g id="APP">%1$s</xliff:g>\nuntuk akaun <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Anda menggunakan apl ini di luar profil kerja anda"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Anda menggunakan apl ini dalam profil kerja anda"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Kaedah input"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 40160a2..d046447 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Avslå"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Tillatelse forespurt"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Tillatelse forespurt\nfor kontoen <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Tillatelse forespurt av <xliff:g id="APP">%1$s</xliff:g>\nfor kontoen <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Du bruker denne appen utenfor jobbprofilen"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Du bruker denne appen i jobbprofilen din"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Inndatametode"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 9bf2b95..36af211 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -914,13 +914,13 @@
     <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="3118353451602377380">"तपाईंले गलत तरिकाले आफ्नो पासवर्ड <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक टाइप गर्नुभयो। \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> सेकेन्डमा फेरि प्रयास गर्नुहोस्।"</string>
     <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="2874278239714821984">"तपाईँले गलत तरिकाले तपाईँको PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक टाइप गर्नु भएको छ। \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> सेकेन्डमा फेरि प्रयास गर्नुहोस्।"</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="3069635524964070596">"तपाईँले तपाईँको अनलक प्याटर्न गलत तरिकाले <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक खिच्नु भएको छ। पछि <xliff:g id="NUMBER_1">%2$d</xliff:g> थप असफल कोसिसहरू, तपाईँको Google साइन इन प्रयोग गरी तपाईँको ट्याब्लेट अनलक गर्न भनिने छ।\n\n  <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकेन्डमा फरि प्रयास गर्नुहोस्।"</string>
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"तपाईंले आफ्नो अनलक शैली <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक गलत तरिकाले कोर्नुभएको छ। थप <xliff:g id="NUMBER_1">%2$d</xliff:g> प्रयासहरू असफल भएपछि तपाईंलाई आफ्नो Google खाता मार्फत साइन इन गरेर आफ्नो Android टिभी डिभाइस अनलक गर्न अनुरोध गरिनेछ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकेन्डपछि फेरि प्रयास गर्नुहोस्।"</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"तपाईंले आफ्नो अनलक शैली <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक गलत तरिकाले कोर्नुभएको छ। थप <xliff:g id="NUMBER_1">%2$d</xliff:g> प्रयासहरू असफल भएपछि तपाईंलाई आफ्नो Google खाता मार्फत साइन इन गरेर आफ्नो Android टिभी डिभाइस अनलक गर्न अनुरोध गरिने छ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकेन्डपछि फेरि प्रयास गर्नुहोस्।"</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="5691623136957148335">"तपाईँले <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक गलत तरिकाले तपाईँको अनलक ढाँचालाई कोर्नु भएको छ। पछि <xliff:g id="NUMBER_1">%2$d</xliff:g> अरू धेरै असफल कोसिसहरूपछि, तपाईँलाई तपाईँको फोन Google साइन इन प्रयोग गरेर अनलक गर्नको लागि सोधिने छ। \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकेन्डमा पुनः प्रयास गर्नुहोस्।"</string>
     <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="7914445759242151426">"तपाईँले <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक ट्याब्लेटलाई अनलक गर्नको लागि गलत तरिकाले कोशिस गर्नुभएको छ। <xliff:g id="NUMBER_1">%2$d</xliff:g> अरू धेरै असफल कोसिसहरूपछि, ट्याब्लेट फ्याट्रि पूर्वनिर्धारितमा रिसेट हुने छ र सबै प्रयोगकर्ता डेटा हराउने छन्।"</string>
     <string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="4275591249631864248">"तपाईंले आफ्नो Android टिभी यन्त्र <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक गलत तरिकाले अनलक गर्ने प्रयास गर्नुभएको छ। थप <xliff:g id="NUMBER_1">%2$d</xliff:g> प्रयासहरू असफल भएपछि तपाईंको Android टिभी यन्त्रलाई रिसेट गरेर डिफल्ट फ्याक्ट्री सेटिङ लागू गरिने छ र प्रयोगकर्ताको सम्पूर्ण डेटा गुम्ने छ।"</string>
     <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="1166532464798446579">"तपाईंले गलत तरिकाले <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक फोन अनलक गर्ने प्रयत्न गर्नुभयो। <xliff:g id="NUMBER_1">%2$d</xliff:g> बढी असफल प्रयत्नहरू पछि, फोन फ्याक्ट्रि पूर्वनिर्धारितमा रिसेट हुने छ र सबै प्रयोगकर्ता डेटा हराउने छन्।"</string>
     <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="8682445539263683414">"तपाईँले ट्यब्लेटलाई अनलक गर्न गलत तरिकाले <xliff:g id="NUMBER">%d</xliff:g> पटक प्रयास गर्नु भएको छ। अब ट्याब्लेटलाई डिफल्ट कार्यशालामा रिसेट गरिने छ।"</string>
-    <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="2205435033340091883">"तपाईंले आफ्नो Android टिभी यन्त्र <xliff:g id="NUMBER">%d</xliff:g> पटक गलत तरिकाले अनलक गर्ने प्रयास गर्नुभएको छ। अब तपाईंको Android टिभी यन्त्रलाई रिसेट गरेर डिफल्ट फ्याक्ट्री सेटिङ लागू गरिनेछ।"</string>
+    <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="2205435033340091883">"तपाईंले आफ्नो Android टिभी यन्त्र <xliff:g id="NUMBER">%d</xliff:g> पटक गलत तरिकाले अनलक गर्ने प्रयास गर्नुभएको छ। अब तपाईंको Android टिभी यन्त्रलाई रिसेट गरेर डिफल्ट फ्याक्ट्री सेटिङ लागू गरिने छ।"</string>
     <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="2203704707679895487">"तपाईंले गलत तरिकाले फोन <xliff:g id="NUMBER">%d</xliff:g> पटक अनलक गर्ने प्रयत्न गर्नुभयो। अब फोन फ्याक्ट्रि पूर्वनिर्धारितमा रिसेट हुने छ।"</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6807200118164539589">"<xliff:g id="NUMBER">%d</xliff:g> सेकेन्डमा फेरि प्रयास गर्नुहोस्।"</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="8362442730606839031">"ढाँचा बिर्सनु भयो?"</string>
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"अस्वीकार गर्नुहोस्"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"अनुरोध गरिएको अनुमति"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">\n"खाता <xliff:g id="ACCOUNT">%s</xliff:g>को लागि अनुरोध गरिएको अनुमति।"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> ले <xliff:g id="ACCOUNT">%2$s</xliff:g> खाता चलाउने\nअनुमति मागेको छ।"</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"तपाईं तपाईंको कार्य प्रोफाइल बाहिर यो एप प्रयोग गरिरहनु भएको छ"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"तपाईं आफ्नो कार्य प्रोफाइलमा यो एप प्रयोग गरिरहनु भएको छ"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"इनपुट विधि"</string>
@@ -1680,10 +1679,10 @@
     <string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="9064457748587850217">"तपाईंले आफ्नो Android टिभी यन्त्र <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक गलत तरिकाले अनलक गर्ने प्रयास गर्नुभएको छ। थप <xliff:g id="NUMBER_1">%2$d</xliff:g> प्रयासहरू असफल भएपछि तपाईंको Android टिभी यन्त्रलाई रिसेट गरेर डिफल्ट फ्याक्ट्री सेटिङ लागू गरिने छ र प्रयोगकर्ताको सम्पूर्ण डेटा गुम्ने छ।"</string>
     <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="5955398963754432548">"तपाईँले गलतसँग फोनलाई अनलक गर्न <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक कोसिस गर्नु भयो। <xliff:g id="NUMBER_1">%2$d</xliff:g> पछि थप असफल कोसिसहरू, फोनलाई डिफल्ट कार्यशालामा रिसेट गरिने छ र सबै प्रयोग डेटा हराउने छ।"</string>
     <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2299099385175083308">"तपाईँले ट्यब्लेटलाई अनलक गर्न गलत तरिकाले <xliff:g id="NUMBER">%d</xliff:g> पटक प्रयास गर्नु भएको छ। अब ट्याब्लेटलाई डिफल्ट कार्यशालामा रिसेट गरिने छ।"</string>
-    <string name="kg_failed_attempts_now_wiping" product="tv" msgid="5045460916106267585">"तपाईंले आफ्नो Android टिभी यन्त्र <xliff:g id="NUMBER">%d</xliff:g> पटक गलत तरिकाले अनलक गर्ने प्रयास गर्नुभएको छ। अब तपाईंको Android टिभी यन्त्रलाई रिसेट गरेर डिफल्ट फ्याक्ट्री सेटिङ लागू गरिनेछ।"</string>
+    <string name="kg_failed_attempts_now_wiping" product="tv" msgid="5045460916106267585">"तपाईंले आफ्नो Android टिभी यन्त्र <xliff:g id="NUMBER">%d</xliff:g> पटक गलत तरिकाले अनलक गर्ने प्रयास गर्नुभएको छ। अब तपाईंको Android टिभी यन्त्रलाई रिसेट गरेर डिफल्ट फ्याक्ट्री सेटिङ लागू गरिने छ।"</string>
     <string name="kg_failed_attempts_now_wiping" product="default" msgid="5043730590446071189">"तपाईंले गलत तरिकाले फोन <xliff:g id="NUMBER">%d</xliff:g> पटक अनलक गर्ने प्रयत्न गर्नुभयो। अब फोन फ्याक्ट्रि पूर्वनिर्धारितमा रिसेट हुने छ।"</string>
     <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="7086799295109717623">"तपाईंले गलत तरिकाले आफ्नो अनलक प्याटर्न <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक कोर्नुभयो। <xliff:g id="NUMBER_1">%2$d</xliff:g> विफल प्रयत्नहरू पछि, तपाईंलाई आफ्नो ट्याब्लेट इमेल खाता प्रयोग गरेर अनलक गर्न सोधिने छ।\n\n फेरि प्रयास गर्नुहोस् <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकेन्डहरूमा।"</string>
-    <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4670840383567106114">"तपाईंले आफ्नो अनलक शैली <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक गलत तरिकाले कोर्नुभएको छ। थप <xliff:g id="NUMBER_1">%2$d</xliff:g> प्रयासहरू असफल भएपछि तपाईंलाई आफ्नो इमेल खाता प्रयोग गरेर आफ्नो Android टिभी डिभाइस अनलक गर्न अनुरोध गरिनेछ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकेन्डपछि फेरि प्रयास गर्नुहोस्।"</string>
+    <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4670840383567106114">"तपाईंले आफ्नो अनलक शैली <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक गलत तरिकाले कोर्नुभएको छ। थप <xliff:g id="NUMBER_1">%2$d</xliff:g> प्रयासहरू असफल भएपछि तपाईंलाई आफ्नो इमेल खाता प्रयोग गरेर आफ्नो Android टिभी डिभाइस अनलक गर्न अनुरोध गरिने छ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकेन्डपछि फेरि प्रयास गर्नुहोस्।"</string>
     <string name="kg_failed_attempts_almost_at_login" product="default" msgid="5270861875006378092">"तपाईँले आफ्नो अनलक प्याटर्न गलत रूपमा <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक तान्नु भएको छ। <xliff:g id="NUMBER_1">%2$d</xliff:g> धेरै असफल प्रयासहरूपछि, तपाईँलाई एउटा इमेल खाताको प्रयोग गरेर तपाईँको फोन अनलक गर्न सोधिने छ।\n\n फेरि <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकेन्डमा प्रयास गर्नुहोस्।"</string>
     <string name="kg_text_message_separator" product="default" msgid="4503708889934976866">" — "</string>
     <string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"हटाउनुहोस्"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 6d73295..a76852f 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"ଅଗ୍ରାହ୍ୟ କରନ୍ତୁ"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"ଅନୁମତି ଅନୁରୋଧ କରାଯାଇଛି"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> ଆକାଉଣ୍ଟ ପାଇଁ ଅନୁମତି\n ଅନୁରୋଧ କରାଯାଇଛି।"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="ACCOUNT">%2$s</xliff:g> ଆକାଉଣ୍ଟକୁ ଆକ୍ସେସ୍ ପାଇଁ\n<xliff:g id="APP">%1$s</xliff:g> ଦ୍ୱାରା ଅନୁମତି ନିମନ୍ତେ ଅନୁରୋଧ କରାଯାଇଛି।"</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"ଆପଣ ନିଜର ୱର୍କ ପ୍ରୋଫାଇଲ୍‌ ବାହାରେ ଏହି ଆପ୍‌ର ପ୍ରୟୋଗ କରୁଛନ୍ତି"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"ଆପଣ ନିଜ ୱର୍କ ପ୍ରୋଫାଇଲ୍‌ରେ ଏହି ଆପ୍‌ର ବ୍ୟବହାର କରୁଛନ୍ତି"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"ଇନପୁଟ୍ ପଦ୍ଧତି"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 027101d..209c6a1 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"ਅਸਵੀਕਾਰ ਕਰੋ"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"ਅਨੁਮਤੀ ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> ਖਾਤੇ ਲਈ ਅਨੁਮਤੀ ਦੀ ਬੇਨਤੀ ਕੀਤੀ\n।"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> ਨੇ <xliff:g id="ACCOUNT">%2$s</xliff:g> ਖਾਤੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ\nਦੀ ਇਜਾਜ਼ਤ ਲਈ ਬੇਨਤੀ ਕੀਤੀ।"</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"ਤੁਸੀਂ ਇਹ ਐਪ ਆਪਣੀ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਦੇ ਬਾਹਰ ਵਰਤ ਰਹੇ ਹੋ"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"ਤੁਸੀਂ ਇਹ ਐਪ ਆਪਣੀ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਵਰਤ ਰਹੇ ਹੋ"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"ਇਨਪੁੱਟ ਵਿਧੀ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index f00e684..a9423619 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1522,8 +1522,7 @@
     <string name="deny" msgid="6632259981847676572">"Odmów"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Prośba o pozwolenie"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Prośba o pozwolenie\ndotyczące konta <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Aplikacja <xliff:g id="APP">%1$s</xliff:g> prosi o uprawnienia\ndotyczące konta <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Używasz tej aplikacji poza profilem służbowym"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Używasz tej aplikacji w swoim profilu służbowym"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Sposób wprowadzania tekstu"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index e9997f8..ae0a629 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1502,8 +1502,7 @@
     <string name="deny" msgid="6632259981847676572">"Refuzați"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Permisiune solicitată"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Permisiune solicitată\npentru contul <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Permisiune solicitată de <xliff:g id="APP">%1$s</xliff:g>\npentru contul <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Utilizați această aplicație în afara profilului de serviciu"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Utilizați această aplicație în profilul de serviciu"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Metodă de intrare"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 488ab4f..8d3edf1 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1522,8 +1522,7 @@
     <string name="deny" msgid="6632259981847676572">"Отклонить"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Разрешение запрошено"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Требуется разрешение\nдля аккаунта <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Разрешение запрошено приложением \"<xliff:g id="APP">%1$s</xliff:g>\"\nдля аккаунта <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Это приложение используется в личном профиле"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Вы перешли в рабочий профиль"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Способ ввода"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 4812cda..89494f2 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"ප්‍රතික්ෂේප කරන්න"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"අවසර ඉල්ලා සිටී"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> ගිණුම සඳහා\nඅවසර ඉල්ලන ලදි."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="ACCOUNT">%2$s</xliff:g> ගිණුම සඳහා <xliff:g id="APP">%1$s</xliff:g>\n විසින් ඉල්ලූ අවසරය"</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"මෙම යෙදුම ඔබගේ කාර්යාල පැතිකඩින් පිට දී ඔබ භාවිතා කරයි"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"මෙම යෙදුම ඔබගේ පුද්ගලික කොටසේ ඔබ භාවිතා කරයි"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"ආදාන ක්‍රමය"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index a29e9e8..3d731e7 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1522,8 +1522,7 @@
     <string name="deny" msgid="6632259981847676572">"Zamietnuť"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Vyžaduje sa povolenie"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Vyžaduje sa oprávnenie\npre účet <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Povolenia, ktoré aplikácia <xliff:g id="APP">%1$s</xliff:g> požaduje\npre účet <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Túto aplikáciu používate mimo svojho pracovného profilu"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Túto aplikáciu používate vo svojom pracovnom profile"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Metóda vstupu"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 52f01e2..f7e81c7 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Moho"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Kërkohet leje"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Kërkohet leje\npër llogarinë <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Kërkohet leja nga <xliff:g id="APP">%1$s</xliff:g>\npër llogarinë <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Po e përdor këtë aplikacion jashtë profilit tënd të punës"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Këtë aplikacion po e përdor në profilin tënd të punës"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Metoda e hyrjeve"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index f17ec3f..cd03394 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1502,8 +1502,7 @@
     <string name="deny" msgid="6632259981847676572">"Одбиј"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Затражена је дозвола"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Затражена је дозвола\nза налог <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> тражи дозволу \nза налог <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Користите ову апликацију изван пословног профила"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Користите ову апликацију на пословном профилу"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Метод уноса"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index b76afe8..cb0b420 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Neka"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Begärd behörighet"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Begärd behörighet\nför kontot <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Behörighet har begärts av <xliff:g id="APP">%1$s</xliff:g>\nför kontot <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Du använder den här appen i din jobbprofil"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Du använder den här appen i din jobbprofil"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Indatametod"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 29e4a71..fbee2c3 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -610,10 +610,10 @@
   <string-array name="fingerprint_error_vendor">
   </string-array>
     <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Aikoni ya alama ya kidole"</string>
-    <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Kufungua kwa uso"</string>
-    <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Hitilafu imetokea kwenye kipengele cha Kufungua kwa uso"</string>
+    <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Kufungua kwa Uso"</string>
+    <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Hitilafu imetokea kwenye kipengele cha Kufungua kwa Uso"</string>
     <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Gusa ili ufute muundo wa uso wako, kisha uweke uso wako tena"</string>
-    <string name="face_setup_notification_title" msgid="8843461561970741790">"Weka mipangilio ya Kufungua kwa uso"</string>
+    <string name="face_setup_notification_title" msgid="8843461561970741790">"Weka mipangilio ya Kufungua kwa Uso"</string>
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Fungua simu yako kwa kuiangalia"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Weka mipangilio ya mbinu zaidi za kufungua"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Gusa ili uweke alama ya kidole"</string>
@@ -643,19 +643,19 @@
   <string-array name="face_acquired_vendor">
   </string-array>
     <string name="face_error_hw_not_available" msgid="5085202213036026288">"Imeshindwa kuthibitisha uso. Maunzi hayapatikani."</string>
-    <string name="face_error_timeout" msgid="2598544068593889762">"Jaribu Kufungua kwa uso tena"</string>
+    <string name="face_error_timeout" msgid="2598544068593889762">"Jaribu Kufungua kwa Uso tena"</string>
     <string name="face_error_no_space" msgid="5649264057026021723">"Imeshindwa kuhifadhi data ya uso mpya. Futa wa kale kwanza."</string>
     <string name="face_error_canceled" msgid="2164434737103802131">"Utendaji wa kitambulisho umeghairiwa."</string>
-    <string name="face_error_user_canceled" msgid="5766472033202928373">"Hatua ya Kufungua kwa uso imeghairiwa na mtumiaji"</string>
+    <string name="face_error_user_canceled" msgid="5766472033202928373">"Hatua ya Kufungua kwa Uso imeghairiwa na mtumiaji"</string>
     <string name="face_error_lockout" msgid="7864408714994529437">"Umejaribu mara nyingi mno. Jaribu tena baadaye."</string>
-    <string name="face_error_lockout_permanent" msgid="3277134834042995260">"Umejaribu mara nyingi mno. Umezima kipengele cha Kufungua kwa uso."</string>
+    <string name="face_error_lockout_permanent" msgid="3277134834042995260">"Umejaribu mara nyingi mno. Umezima kipengele cha Kufungua kwa Uso."</string>
     <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Umejaribu mara nyingi mno. Weka mbinu ya kufunga skrini badala yake."</string>
     <string name="face_error_unable_to_process" msgid="5723292697366130070">"Imeshindwa kuthibitisha uso. Jaribu tena."</string>
-    <string name="face_error_not_enrolled" msgid="1134739108536328412">"Hujaweka mipangilio ya kipengele cha Kufungua kwa uso"</string>
-    <string name="face_error_hw_not_present" msgid="7940978724978763011">"Kipengele cha Kufungua kwa uso hakitumiki kwenye kifaa hiki"</string>
+    <string name="face_error_not_enrolled" msgid="1134739108536328412">"Hujaweka mipangilio ya kipengele cha Kufungua kwa Uso"</string>
+    <string name="face_error_hw_not_present" msgid="7940978724978763011">"Kipengele cha Kufungua kwa Uso hakitumiki kwenye kifaa hiki"</string>
     <string name="face_error_security_update_required" msgid="5076017208528750161">"Kitambuzi kimezimwa kwa muda."</string>
     <string name="face_name_template" msgid="3877037340223318119">"Uso wa <xliff:g id="FACEID">%d</xliff:g>"</string>
-    <string name="face_app_setting_name" msgid="5854024256907828015">"Tumia kipengele cha Kufungua kwa uso"</string>
+    <string name="face_app_setting_name" msgid="5854024256907828015">"Tumia kipengele cha Kufungua kwa Uso"</string>
     <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Tumia uso au mbinu ya kufunga skrini"</string>
     <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Tumia uso wako ili uendelee"</string>
     <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Tumia uso au mbinu yako ya kufunga skrini ili uendelee"</string>
@@ -958,7 +958,7 @@
     <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Panua eneo la kufungua."</string>
     <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Kufungua slaidi."</string>
     <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Kufungua kwa ruwaza."</string>
-    <string name="keyguard_accessibility_face_unlock" msgid="4533832120787386728">"Kufungua kwa uso."</string>
+    <string name="keyguard_accessibility_face_unlock" msgid="4533832120787386728">"Kufungua kwa Uso."</string>
     <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Kufungua kwa PIN."</string>
     <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Kufungua Pin ya Sim."</string>
     <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Kufungua Puk ya Sim."</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 63e4b60..fcce9b4 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"நிராகரி"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"அனுமதிக் கோரப்பட்டது"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> கணக்கிற்கான அனுமதி\nகோரப்பட்டது."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> ஆப்ஸ்\n<xliff:g id="ACCOUNT">%2$s</xliff:g> கணக்கிற்கான அனுமதியைக் கோருகிறது."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"இந்தப் பயன்பாட்டைப் பணிக் கணக்கிற்கு வெளியே பயன்படுத்துகிறீர்கள்"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"பணிக் கணக்கில் பயன்பாட்டைப் பயன்படுத்துகிறீர்கள்"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"உள்ளீட்டு முறை"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 2e981ac..3568871 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"తిరస్కరించండి"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"అనుమతి అభ్యర్థించబడింది"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"ఖాతా <xliff:g id="ACCOUNT">%s</xliff:g> కోసం\nఅనుమతి అభ్యర్థించబడింది."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> ద్వారా అనుమతి రిక్వెస్ట్ చేయబడింది\nఖాతా <xliff:g id="ACCOUNT">%2$s</xliff:g> కోసం."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"మీరు మీ కార్యాలయ ప్రొఫైల్‌కు వెలుపల ఈ యాప్‌ను ఉపయోగిస్తున్నారు"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"మీరు మీ కార్యాలయ ప్రొఫైల్‌లో ఈ యాప్‌ను ఉపయోగిస్తున్నారు"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"ఇన్‌పుట్ పద్ధతి"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 98e23b0..ed7ae5b 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"ปฏิเสธ"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"การอนุญาตที่ขอ"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"การอนุญาตที่ขอ\nสำหรับบัญชี <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"สิทธิ์ที่ <xliff:g id="APP">%1$s</xliff:g> ขอ\nสำหรับบัญชี <xliff:g id="ACCOUNT">%2$s</xliff:g>"</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"คุณกำลังใช้แอปนี้นอกโปรไฟล์งานของคุณ"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"คุณกำลังใช้แอปนี้ในโปรไฟล์งานของคุณ"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"วิธีป้อนข้อมูล"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index cda24e9..bc1c664 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Reddet"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"İzin istendi"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> hesabı için\nizin isteğinde bulunuldu."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="APP">%1$s</xliff:g> uygulaması, <xliff:g id="ACCOUNT">%2$s</xliff:g> hesabı\niçin izin istedi"</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Bu uygulamayı iş profilinizin dışında kullanıyorsunuz"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Bu uygulamayı iş profilinizde kullanıyorsunuz"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Giriş yöntemi"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 70a4fc1..c57210e 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1522,8 +1522,7 @@
     <string name="deny" msgid="6632259981847676572">"Забор."</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Потрібен дозвіл"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Запитано дозвіл\nдля облікового запису <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Дозвіл, який додаток <xliff:g id="APP">%1$s</xliff:g> запитує\nна доступ до облікового запису <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Ви використовуєте цей додаток за межами робочого профілю"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Ви використовуєте цей додаток у своєму робочому профілі"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Метод введення"</string>
@@ -2162,7 +2161,7 @@
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Важливість цього сповіщення підвищено. Натисніть, щоб надіслати відгук."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Важливість цього сповіщення знижено. Натисніть, щоб надіслати відгук."</string>
     <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Покращені сповіщення"</string>
-    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Тепер пропоновані дії та відповіді можна знайти в покращених сповіщеннях. Адаптивні сповіщення Android більше не підтримуються."</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Тепер пропоновані дії та відповіді відображаються в покращених сповіщеннях. Адаптивні сповіщення Android більше не підтримуються."</string>
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Вимкнути"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Докладніше"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 47fabd6..3f9cee1 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"مسترد کریں"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"اجازت طلب کی گئی"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"اکاؤنٹ <xliff:g id="ACCOUNT">%s</xliff:g> کیلئے\nاجازت طلب کی گئی۔"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"<xliff:g id="ACCOUNT">%2$s</xliff:g> اکاؤنٹ کیلئے\n<xliff:g id="APP">%1$s</xliff:g> نے اجازت کی درخواست کی۔"</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"آپ اس ایپ کا استعمال اپنے دفتری پروفائل کے باہر کر رہے ہیں"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"آپ اس ایپ کو اپنے دفتری پروفائل میں استعمال کر رہے ہیں"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"اندراج کا طریقہ"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 11f168f..df7d467 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Rad etish"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Ruxsat so‘raldi"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"<xliff:g id="ACCOUNT">%s</xliff:g> hisobi uchun\nruxsat so‘raldi"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Ruxsat <xliff:g id="APP">%1$s</xliff:g> ilovasi tomonidan \n<xliff:g id="ACCOUNT">%2$s</xliff:g> hisobi uchun soʻralgan."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Siz ushbu ilovadan ishchi profilingizdan tashqarida foydalanmoqdasiz"</string>
     <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>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index d5a0625..259696d 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Từ chối"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Đã yêu cầu quyền"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Đã yêu cầu quyền\ncho tài khoản <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Quyền do <xliff:g id="APP">%1$s</xliff:g>\nyêu cầu cho tài khoản <xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Bạn đang sử dụng ứng dụng này bên ngoài hồ sơ công việc của mình"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Bạn đang sử dụng ứng dụng này trong hồ sơ công việc của mình"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Phương thức nhập"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index cf92987..794f50e 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"拒绝"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"权限请求"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"应用对帐号 <xliff:g id="ACCOUNT">%s</xliff:g>\n 提出权限请求。"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"“<xliff:g id="APP">%1$s</xliff:g>”请求获得以下帐号的访问权限:\n<xliff:g id="ACCOUNT">%2$s</xliff:g>。"</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"您目前是在工作资料之外使用此应用"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"您目前是在工作资料内使用此应用"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"输入法"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 4a50973..fa2fee5 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -658,7 +658,7 @@
     <string name="face_app_setting_name" msgid="5854024256907828015">"使用「面孔解鎖」"</string>
     <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"使用臉孔或螢幕鎖定"</string>
     <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"如要繼續操作,請使用您的面孔驗證身分"</string>
-    <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"請使用臉孔解鎖或螢幕鎖定功能驗證身分,才能繼續操作"</string>
+    <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"請使用面孔解鎖或螢幕鎖定功能驗證身分,才能繼續操作"</string>
   <string-array name="face_error_vendor">
   </string-array>
     <string name="face_icon_content_description" msgid="465030547475916280">"臉孔圖示"</string>
@@ -888,7 +888,7 @@
     <string name="lockscreen_pattern_wrong" msgid="2940138714468358458">"再試一次"</string>
     <string name="lockscreen_password_wrong" msgid="8605355913868947490">"再試一次"</string>
     <string name="lockscreen_storage_locked" msgid="634993789186443380">"解鎖即可使用所有功能和資料"</string>
-    <string name="faceunlock_multiple_failures" msgid="681991538434031708">"已超過臉孔解鎖嘗試次數上限"</string>
+    <string name="faceunlock_multiple_failures" msgid="681991538434031708">"已超過面孔解鎖嘗試次數上限"</string>
     <string name="lockscreen_missing_sim_message_short" msgid="1248431165144893792">"找不到 SIM 卡"</string>
     <string name="lockscreen_missing_sim_message" product="tablet" msgid="8596805728510570760">"平板電腦中沒有 SIM 卡。"</string>
     <string name="lockscreen_missing_sim_message" product="tv" msgid="2582768023352171073">"Android TV 裝置中沒有 SIM 卡。"</string>
@@ -2094,12 +2094,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"此通知的重要性已降低為「靜音」。輕按即可提供意見。"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"此通知的重要性已提升。輕按即可提供意見。"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"此通知的重要性已降級。輕按即可提供意見。"</string>
-    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"強化通知"</string>
-    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"建議的操作和回覆目前由強化通知功能提供。系統已不再支援 Android 自動調整通知功能。"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"加強版通知"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"現在由加強版通知建議操作和回覆。系統已不再支援 Android 自動調整通知功能。"</string>
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"確定"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"關閉"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"瞭解詳情"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"強化通知在 Android 12 取代了 Android 自動調整通知。此功能會顯示建議的操作和回覆,更可為您整理通知。\n\n強化通知功能可存取您的通知內容 (包括聯絡人姓名和訊息等個人資料),亦可以關閉或回應通知,例如接聽來電和控制「請勿騷擾」功能。"</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"加強版通知在 Android 12 取代了 Android 自動調整通知。此功能會顯示建議的操作和回覆,更可為您整理通知。\n\n加強版通知功能可存取您的通知內容 (包括聯絡人姓名和訊息等個人資料),亦可以關閉或回應通知,例如接聽來電和控制「請勿騷擾」功能。"</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"「日常安排模式」資料通知"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"電量可能會在日常充電前耗盡"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"「省電模式」已啟用,以便延長電池壽命"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 4cef56c..f93b844 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1482,8 +1482,7 @@
     <string name="deny" msgid="6632259981847676572">"Yala"</string>
     <string name="permission_request_notification_title" msgid="1810025922441048273">"Imvume Iceliwe"</string>
     <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Imvume Iceliwe \n ye-akhawunti <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
-    <!-- no translation found for permission_request_notification_for_app_with_subtitle (1298704005732851350) -->
-    <skip />
+    <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"Imvume ecelwe yi-<xliff:g id="APP">%1$s</xliff:g>\nye-akhawunti ye-<xliff:g id="ACCOUNT">%2$s</xliff:g>."</string>
     <string name="forward_intent_to_owner" msgid="4620359037192871015">"Usebenzisa lolu hlelo lokusebenza ngaphandle kwephrofayela yakho yomsebenzi"</string>
     <string name="forward_intent_to_work" msgid="3620262405636021151">"Usebenzisa lolu hlelo lokusebenza kuphrofayela yakho yomsebenzi"</string>
     <string name="input_method_binding_label" msgid="1166731601721983656">"Indlela yokufakwayo"</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 8dfbdcc..2770cbe 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -3370,8 +3370,7 @@
     <integer name="config_vibrationWaveformRampStepDuration">5</integer>
 
     <!-- The duration (in milliseconds) that should be applied to waveform vibrations that ends in
-         non-zero amplitudes, . The waveform will
-         be played as a PWLE instead of on/off calls if this value is set. -->
+         non-zero amplitudes, to bring the vibrator amplitude down to zero using this timing. -->
     <integer name="config_vibrationWaveformRampDownDuration">0</integer>
 
     <!-- Number of retries Cell Data should attempt for a given error code before
diff --git a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
index 1fc3a21..4ef45e2 100644
--- a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
@@ -584,7 +584,7 @@
                 actualCpuTimeMs += cpuTimesMs[i];
             }
             assertApproximateValue("Incorrect total cpu time, " + msgCpuTimes,
-                    2 * WORK_DURATION_MS, actualCpuTimeMs);
+                    WORK_DURATION_MS, actualCpuTimeMs);
 
             batteryOffScreenOn();
         } finally {
@@ -656,8 +656,14 @@
         }
     }
 
-    private void assertApproximateValue(String errorPrefix, long expectedValue, long actualValue) {
-        assertValueRange(errorPrefix, actualValue, expectedValue * 0.5, expectedValue * 1.5);
+    private void assertApproximateValue(String errorPrefix, long expectedValueMs,
+            long actualValueMs) {
+        // Allow the actual value to be 1 second smaller than the expected.
+        // Also allow it to be up to 5 seconds larger, to accommodate the arbitrary
+        // latency introduced by BatteryExternalStatsWorker.scheduleReadProcStateCpuTimes
+        assertValueRange(errorPrefix, actualValueMs,
+                expectedValueMs - 1000,
+                expectedValueMs + 5000);
     }
 
     private void assertValueRange(String errorPrefix,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java
index f565724..a7996f05 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java
@@ -42,8 +42,6 @@
 import androidx.annotation.BinderThread;
 import androidx.annotation.VisibleForTesting;
 
-import com.android.internal.inputmethod.Completable;
-import com.android.internal.inputmethod.ResultCallbacks;
 import com.android.internal.view.IInputMethodManager;
 
 import java.util.ArrayList;
@@ -540,9 +538,7 @@
             try {
                 // Remove the IME surface to make the insets invisible for
                 // non-client controlled insets.
-                final Completable.Void value = Completable.createVoid();
-                imms.removeImeSurface(ResultCallbacks.of(value));
-                Completable.getResult(value);
+                imms.removeImeSurface();
             } catch (RemoteException e) {
                 Slog.e(TAG, "Failed to remove IME surface.", e);
             }
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 7098019..a2e9b64 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
@@ -279,7 +279,7 @@
     private void checkIfPinnedTaskAppeared() {
         final TaskInfo pinnedTask = getPinnedTaskInfo();
         if (DEBUG) Log.d(TAG, "checkIfPinnedTaskAppeared(), task=" + pinnedTask);
-        if (pinnedTask == null) return;
+        if (pinnedTask == null || pinnedTask.topActivity == null) return;
         mPinnedTaskId = pinnedTask.taskId;
         setState(STATE_PIP);
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
index b09d0d8..75dd561 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
@@ -18,6 +18,9 @@
 
 import static android.os.Process.THREAD_PRIORITY_TOP_APP_BOOST;
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN;
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN;
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SPLASH_SCREEN;
 
 import android.annotation.ColorInt;
 import android.annotation.NonNull;
@@ -47,6 +50,7 @@
 import android.view.SurfaceControl;
 import android.view.View;
 import android.window.SplashScreenView;
+import android.window.StartingWindowInfo.StartingWindowType;
 
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
@@ -122,17 +126,17 @@
      * view on background thread so the view and the drawable can be create and pre-draw in
      * parallel.
      *
-     * @param emptyView Create a splash screen view without icon on it.
+     * @param suggestType Suggest type to create the splash screen view.
      * @param consumer Receiving the SplashScreenView object, which will also be executed
      *                 on splash screen thread. Note that the view can be null if failed.
      */
-    void createContentView(Context context, boolean emptyView, ActivityInfo info, int taskId,
-            Consumer<SplashScreenView> consumer) {
+    void createContentView(Context context, @StartingWindowType int suggestType, ActivityInfo info,
+            int taskId, Consumer<SplashScreenView> consumer) {
         mSplashscreenWorkerHandler.post(() -> {
             SplashScreenView contentView;
             try {
                 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "makeSplashScreenContentView");
-                contentView = makeSplashScreenContentView(context, info, emptyView);
+                contentView = makeSplashScreenContentView(context, info, suggestType);
                 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
             } catch (RuntimeException e) {
                 Slog.w(TAG, "failed creating starting window content at taskId: "
@@ -199,22 +203,45 @@
         }
     }
 
+    private static Drawable peekLegacySplashscreenContent(Context context,
+            SplashScreenWindowAttrs attrs) {
+        final TypedArray a = context.obtainStyledAttributes(R.styleable.Window);
+        final int resId = safeReturnAttrDefault((def) ->
+                a.getResourceId(R.styleable.Window_windowSplashscreenContent, def), 0);
+        a.recycle();
+        if (resId != 0) {
+            return context.getDrawable(resId);
+        }
+        if (attrs.mWindowBgResId != 0) {
+            return context.getDrawable(attrs.mWindowBgResId);
+        }
+        return null;
+    }
+
     private SplashScreenView makeSplashScreenContentView(Context context, ActivityInfo ai,
-            boolean emptyView) {
+            @StartingWindowType int suggestType) {
         updateDensity();
 
         getWindowAttrs(context, mTmpAttrs);
         mLastPackageContextConfigHash = context.getResources().getConfiguration().hashCode();
-        final int themeBGColor = mColorCache.getWindowColor(ai.packageName,
-                mLastPackageContextConfigHash, mTmpAttrs.mWindowBgColor, mTmpAttrs.mWindowBgResId,
-                () -> peekWindowBGColor(context, mTmpAttrs)).mBgColor;
-        // TODO (b/173975965) Tracking the performance on improved splash screen.
+
+        final Drawable legacyDrawable = suggestType == STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN
+                ? peekLegacySplashscreenContent(context, mTmpAttrs) : null;
+        final int themeBGColor = legacyDrawable != null
+                ? getBGColorFromCache(ai, () -> estimateWindowBGColor(legacyDrawable))
+                : getBGColorFromCache(ai, () -> peekWindowBGColor(context, mTmpAttrs));
         return new StartingWindowViewBuilder(context, ai)
                 .setWindowBGColor(themeBGColor)
-                .makeEmptyView(emptyView)
+                .overlayDrawable(legacyDrawable)
+                .chooseStyle(suggestType)
                 .build();
     }
 
+    private int getBGColorFromCache(ActivityInfo ai, IntSupplier windowBgColorSupplier) {
+        return mColorCache.getWindowColor(ai.packageName, mLastPackageContextConfigHash,
+                mTmpAttrs.mWindowBgColor, mTmpAttrs.mWindowBgResId, windowBgColorSupplier).mBgColor;
+    }
+
     private static <T> T safeReturnAttrDefault(UnaryOperator<T> getMethod, T def) {
         try {
             return getMethod.apply(def);
@@ -267,7 +294,8 @@
         private final Context mContext;
         private final ActivityInfo mActivityInfo;
 
-        private boolean mEmptyView;
+        private Drawable mOverlayDrawable;
+        private int mSuggestType;
         private int mThemeColor;
         private Drawable mFinalIconDrawable;
         private int mFinalIconSize = mIconSize;
@@ -282,16 +310,22 @@
             return this;
         }
 
-        StartingWindowViewBuilder makeEmptyView(boolean empty) {
-            mEmptyView = empty;
+        StartingWindowViewBuilder overlayDrawable(Drawable overlay) {
+            mOverlayDrawable = overlay;
+            return this;
+        }
+
+        StartingWindowViewBuilder chooseStyle(int suggestType) {
+            mSuggestType = suggestType;
             return this;
         }
 
         SplashScreenView build() {
             Drawable iconDrawable;
             final int animationDuration;
-            if (mEmptyView) {
-                // empty splash screen case
+            if (mSuggestType == STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN
+                    || mSuggestType == STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) {
+                // empty or legacy splash screen case
                 animationDuration = 0;
                 mFinalIconSize = 0;
             } else if (mTmpAttrs.mSplashScreenIcon != null) {
@@ -403,13 +437,15 @@
             Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "fillViewWithIcon");
             final SplashScreenView.Builder builder = new SplashScreenView.Builder(mContext);
             builder.setBackgroundColor(mThemeColor);
+            builder.setOverlayDrawable(mOverlayDrawable);
             if (iconDrawable != null) {
                 builder.setIconSize(iconSize)
                         .setIconBackground(mTmpAttrs.mIconBgColor)
                         .setCenterViewDrawable(iconDrawable)
                         .setAnimationDurationMillis(animationDuration);
             }
-            if (mTmpAttrs.mBrandingImage != null) {
+            if (mSuggestType == STARTING_WINDOW_TYPE_SPLASH_SCREEN
+                    && mTmpAttrs.mBrandingImage != null) {
                 builder.setBrandingDrawable(mTmpAttrs.mBrandingImage, mBrandingImageWidth,
                         mBrandingImageHeight);
             }
@@ -417,20 +453,22 @@
             if (DEBUG) {
                 Slog.d(TAG, "fillViewWithIcon surfaceWindowView " + splashScreenView);
             }
-            if (mEmptyView) {
-                splashScreenView.setNotCopyable();
-            }
-            splashScreenView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
-                @Override
-                public void onViewAttachedToWindow(View v) {
-                    SplashScreenView.applySystemBarsContrastColor(v.getWindowInsetsController(),
-                            splashScreenView.getInitBackgroundColor());
-                }
+            if (mSuggestType != STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) {
+                splashScreenView.addOnAttachStateChangeListener(
+                        new View.OnAttachStateChangeListener() {
+                            @Override
+                            public void onViewAttachedToWindow(View v) {
+                                SplashScreenView.applySystemBarsContrastColor(
+                                        v.getWindowInsetsController(),
+                                        splashScreenView.getInitBackgroundColor());
+                            }
 
-                @Override
-                public void onViewDetachedFromWindow(View v) {
-                }
-            });
+                            @Override
+                            public void onViewDetachedFromWindow(View v) {
+                            }
+                        });
+            }
+
             Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
             return splashScreenView;
         }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
index 670af96..4dc5447 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
@@ -20,6 +20,8 @@
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
 import static android.view.Choreographer.CALLBACK_INSETS_ANIMATION;
 import static android.view.Display.DEFAULT_DISPLAY;
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN;
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SNAPSHOT;
 
 import android.annotation.Nullable;
 import android.app.ActivityManager.RunningTaskInfo;
@@ -32,7 +34,6 @@
 import android.content.res.TypedArray;
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
-import android.graphics.drawable.ColorDrawable;
 import android.hardware.display.DisplayManager;
 import android.os.IBinder;
 import android.os.RemoteCallback;
@@ -50,6 +51,7 @@
 import android.window.SplashScreenView;
 import android.window.SplashScreenView.SplashScreenViewParcelable;
 import android.window.StartingWindowInfo;
+import android.window.StartingWindowInfo.StartingWindowType;
 import android.window.TaskSnapshot;
 
 import com.android.internal.R;
@@ -149,10 +151,11 @@
 
     /**
      * Called when a task need a splash screen starting window.
-     * @param emptyView Whether drawing an empty frame without anything on it.
+     *
+     * @param suggestType The suggestion type to draw the splash screen.
      */
     void addSplashScreenStartingWindow(StartingWindowInfo windowInfo, IBinder appToken,
-            boolean emptyView) {
+            @StartingWindowType int suggestType) {
         final RunningTaskInfo taskInfo = windowInfo.taskInfo;
         final ActivityInfo activityInfo = taskInfo.topActivityInfo;
         if (activityInfo == null) {
@@ -173,7 +176,8 @@
                         : com.android.internal.R.style.Theme_DeviceDefault_DayNight;
         if (DEBUG_SPLASH_SCREEN) {
             Slog.d(TAG, "addSplashScreen " + activityInfo.packageName
-                    + " theme=" + Integer.toHexString(theme) + " task= " + taskInfo.taskId);
+                    + " theme=" + Integer.toHexString(theme) + " task=" + taskInfo.taskId
+                    + " suggestType=" + suggestType);
         }
 
         // Obtain proper context to launch on the right display.
@@ -231,13 +235,19 @@
         params.setFitInsetsTypes(0);
         params.format = PixelFormat.TRANSLUCENT;
         int windowFlags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
-                | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
                 | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                 | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
         final TypedArray a = context.obtainStyledAttributes(R.styleable.Window);
         if (a.getBoolean(R.styleable.Window_windowShowWallpaper, false)) {
             windowFlags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
         }
+        if (suggestType == STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) {
+            if (a.getBoolean(R.styleable.Window_windowDrawsSystemBarBackgrounds, false)) {
+                windowFlags |= WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
+            }
+        } else {
+            windowFlags |= WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
+        }
         params.layoutInDisplayCutoutMode = a.getInt(
                 R.styleable.Window_windowLayoutInDisplayCutoutMode,
                 params.layoutInDisplayCutoutMode);
@@ -289,6 +299,7 @@
         final SplashScreenViewSupplier viewSupplier = new SplashScreenViewSupplier();
         final FrameLayout rootLayout = new FrameLayout(context);
         rootLayout.setPadding(0, 0, 0, 0);
+        rootLayout.setFitsSystemWindows(false);
         final Runnable setViewSynchronized = () -> {
             Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "addSplashScreenView");
             // waiting for setContentView before relayoutWindow
@@ -311,12 +322,12 @@
             }
             Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
         };
-        mSplashscreenContentDrawer.createContentView(context, emptyView, activityInfo, taskId,
+        mSplashscreenContentDrawer.createContentView(context, suggestType, activityInfo, taskId,
                 viewSupplier::setView);
 
         try {
             final WindowManager wm = context.getSystemService(WindowManager.class);
-            if (addWindow(taskId, appToken, rootLayout, wm, params)) {
+            if (addWindow(taskId, appToken, rootLayout, wm, params, suggestType)) {
                 // We use the splash screen worker thread to create SplashScreenView while adding
                 // the window, as otherwise Choreographer#doFrame might be delayed on this thread.
                 // And since Choreographer#doFrame won't happen immediately after adding the window,
@@ -336,8 +347,10 @@
 
     int getStartingWindowBackgroundColorForTask(int taskId) {
         StartingWindowRecord startingWindowRecord = mStartingWindowRecords.get(taskId);
-        if (startingWindowRecord == null || startingWindowRecord.mContentView == null) return 0;
-        return ((ColorDrawable) startingWindowRecord.mContentView.getBackground()).getColor();
+        if (startingWindowRecord == null || startingWindowRecord.mContentView == null) {
+            return 0;
+        }
+        return startingWindowRecord.mContentView.getInitBackgroundColor();
     }
 
     private static class SplashScreenViewSupplier implements Supplier<SplashScreenView> {
@@ -379,7 +392,7 @@
             return;
         }
         final StartingWindowRecord tView = new StartingWindowRecord(appToken,
-                null/* decorView */, surface);
+                null/* decorView */, surface, STARTING_WINDOW_TYPE_SNAPSHOT);
         mStartingWindowRecords.put(taskId, tView);
     }
 
@@ -449,7 +462,7 @@
     }
 
     protected boolean addWindow(int taskId, IBinder appToken, View view, WindowManager wm,
-            WindowManager.LayoutParams params) {
+            WindowManager.LayoutParams params, @StartingWindowType int suggestType) {
         boolean shouldSaveView = true;
         try {
             Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "addRootView");
@@ -469,14 +482,15 @@
         }
         if (shouldSaveView) {
             removeWindowNoAnimate(taskId);
-            saveSplashScreenRecord(appToken, taskId, view);
+            saveSplashScreenRecord(appToken, taskId, view, suggestType);
         }
         return shouldSaveView;
     }
 
-    private void saveSplashScreenRecord(IBinder appToken, int taskId, View view) {
+    private void saveSplashScreenRecord(IBinder appToken, int taskId, View view,
+            @StartingWindowType int suggestType) {
         final StartingWindowRecord tView = new StartingWindowRecord(appToken, view,
-                null/* TaskSnapshotWindow */);
+                null/* TaskSnapshotWindow */, suggestType);
         mStartingWindowRecords.put(taskId, tView);
     }
 
@@ -493,14 +507,18 @@
                     Slog.v(TAG, "Removing splash screen window for task: " + taskId);
                 }
                 if (record.mContentView != null) {
-                    if (playRevealAnimation) {
-                        mSplashscreenContentDrawer.applyExitAnimation(record.mContentView,
-                                leash, frame,
-                                () -> removeWindowInner(record.mDecorView, true));
+                    if (record.mSuggestType == STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) {
+                        removeWindowInner(record.mDecorView, false);
                     } else {
-                        // the SplashScreenView has been copied to client, hide the view to skip
-                        // default exit animation
-                        removeWindowInner(record.mDecorView, true);
+                        if (playRevealAnimation) {
+                            mSplashscreenContentDrawer.applyExitAnimation(record.mContentView,
+                                    leash, frame,
+                                    () -> removeWindowInner(record.mDecorView, true));
+                        } else {
+                            // the SplashScreenView has been copied to client, hide the view to skip
+                            // default exit animation
+                            removeWindowInner(record.mDecorView, true);
+                        }
                     }
                 } else {
                     // shouldn't happen
@@ -537,6 +555,7 @@
         private final TaskSnapshotWindow mTaskSnapshotWindow;
         private SplashScreenView mContentView;
         private boolean mSetSplashScreen;
+        private @StartingWindowType int mSuggestType;
 
         StartingWindowRecord(IBinder appToken, View decorView,
                 TaskSnapshotWindow taskSnapshotWindow) {
@@ -545,6 +564,14 @@
             mTaskSnapshotWindow = taskSnapshotWindow;
         }
 
+        StartingWindowRecord(IBinder appToken, View decorView,
+                TaskSnapshotWindow taskSnapshotWindow, @StartingWindowType int suggestType) {
+            mAppToken = appToken;
+            mDecorView = decorView;
+            mTaskSnapshotWindow = taskSnapshotWindow;
+            mSuggestType = suggestType;
+        }
+
         private void setSplashScreenView(SplashScreenView splashScreenView) {
             if (mSetSplashScreen) {
                 return;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java
index 9c1dde9..eaa89d8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java
@@ -17,6 +17,7 @@
 
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
 import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN;
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN;
 import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SNAPSHOT;
 import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SPLASH_SCREEN;
 
@@ -31,6 +32,7 @@
 import android.util.Slog;
 import android.view.SurfaceControl;
 import android.window.StartingWindowInfo;
+import android.window.StartingWindowInfo.StartingWindowType;
 import android.window.TaskOrganizer;
 import android.window.TaskSnapshot;
 
@@ -106,10 +108,6 @@
         mTaskLaunchingCallback = listener;
     }
 
-    private boolean shouldSendToListener(int suggestionType) {
-        return suggestionType != STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN;
-    }
-
     /**
      * Called when a task need a starting window.
      */
@@ -120,12 +118,9 @@
             final int suggestionType = mStartingWindowTypeAlgorithm.getSuggestedWindowType(
                     windowInfo);
             final RunningTaskInfo runningTaskInfo = windowInfo.taskInfo;
-            if (suggestionType == STARTING_WINDOW_TYPE_SPLASH_SCREEN) {
+            if (isSplashScreenType(suggestionType)) {
                 mStartingSurfaceDrawer.addSplashScreenStartingWindow(windowInfo, appToken,
-                        false /* emptyView */);
-            } else if (suggestionType == STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN) {
-                mStartingSurfaceDrawer.addSplashScreenStartingWindow(windowInfo, appToken,
-                        true /* emptyView */);
+                        suggestionType);
             } else if (suggestionType == STARTING_WINDOW_TYPE_SNAPSHOT) {
                 final TaskSnapshot snapshot = windowInfo.mTaskSnapshot;
                 mStartingSurfaceDrawer.makeTaskSnapshotWindow(windowInfo, appToken,
@@ -133,7 +128,7 @@
             } else /* suggestionType == STARTING_WINDOW_TYPE_NONE */ {
                 // Don't add a staring window.
             }
-            if (mTaskLaunchingCallback != null && shouldSendToListener(suggestionType)) {
+            if (mTaskLaunchingCallback != null && isSplashScreenType(suggestionType)) {
                 int taskId = runningTaskInfo.taskId;
                 int color = mStartingSurfaceDrawer.getStartingWindowBackgroundColorForTask(taskId);
                 mTaskLaunchingCallback.accept(taskId, suggestionType, color);
@@ -143,6 +138,12 @@
         });
     }
 
+    private static boolean isSplashScreenType(@StartingWindowType int suggestionType) {
+        return suggestionType == STARTING_WINDOW_TYPE_SPLASH_SCREEN
+                || suggestionType == STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN
+                || suggestionType == STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN;
+    }
+
     public void copySplashScreenView(int taskId) {
         mSplashScreenExecutor.execute(() -> {
             mStartingSurfaceDrawer.copySplashScreenView(taskId);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/phone/PhoneStartingWindowTypeAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/phone/PhoneStartingWindowTypeAlgorithm.java
index 5a134b8..848eff4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/phone/PhoneStartingWindowTypeAlgorithm.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/phone/PhoneStartingWindowTypeAlgorithm.java
@@ -18,11 +18,13 @@
 
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
 import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN;
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN;
 import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_NONE;
 import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SNAPSHOT;
 import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SPLASH_SCREEN;
 import static android.window.StartingWindowInfo.TYPE_PARAMETER_ACTIVITY_CREATED;
 import static android.window.StartingWindowInfo.TYPE_PARAMETER_ALLOW_TASK_SNAPSHOT;
+import static android.window.StartingWindowInfo.TYPE_PARAMETER_LEGACY_SPLASH_SCREEN;
 import static android.window.StartingWindowInfo.TYPE_PARAMETER_NEW_TASK;
 import static android.window.StartingWindowInfo.TYPE_PARAMETER_PROCESS_RUNNING;
 import static android.window.StartingWindowInfo.TYPE_PARAMETER_TASK_SWITCH;
@@ -54,30 +56,38 @@
         final boolean activityCreated = (parameter & TYPE_PARAMETER_ACTIVITY_CREATED) != 0;
         final boolean useEmptySplashScreen =
                 (parameter & TYPE_PARAMETER_USE_EMPTY_SPLASH_SCREEN) != 0;
+        final boolean legacySplashScreen =
+                ((parameter & TYPE_PARAMETER_LEGACY_SPLASH_SCREEN) != 0);
         final boolean topIsHome = windowInfo.taskInfo.topActivityType == ACTIVITY_TYPE_HOME;
 
         if (DEBUG_SPLASH_SCREEN || DEBUG_TASK_SNAPSHOT) {
-            Slog.d(TAG, "preferredStartingWindowType newTask " + newTask
-                    + " taskSwitch " + taskSwitch
-                    + " processRunning " + processRunning
-                    + " allowTaskSnapshot " + allowTaskSnapshot
-                    + " activityCreated " + activityCreated
-                    + " useEmptySplashScreen " + useEmptySplashScreen
-                    + " topIsHome " + topIsHome);
+            Slog.d(TAG, "preferredStartingWindowType newTask:" + newTask
+                    + " taskSwitch:" + taskSwitch
+                    + " processRunning:" + processRunning
+                    + " allowTaskSnapshot:" + allowTaskSnapshot
+                    + " activityCreated:" + activityCreated
+                    + " useEmptySplashScreen:" + useEmptySplashScreen
+                    + " legacySplashScreen:" + legacySplashScreen
+                    + " topIsHome:" + topIsHome);
         }
+
+        final int visibleSplashScreenType = legacySplashScreen
+                ? STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN
+                : STARTING_WINDOW_TYPE_SPLASH_SCREEN;
+
         if (!topIsHome) {
             if (!processRunning) {
                 return useEmptySplashScreen
                         ? STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN
-                        : STARTING_WINDOW_TYPE_SPLASH_SCREEN;
+                        : visibleSplashScreenType;
             }
             if (newTask) {
                 return useEmptySplashScreen
                         ? STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN
-                        : STARTING_WINDOW_TYPE_SPLASH_SCREEN;
+                        : visibleSplashScreenType;
             }
             if (taskSwitch && !activityCreated) {
-                return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
+                return visibleSplashScreenType;
             }
         }
         if (taskSwitch && allowTaskSnapshot) {
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
index 903e63a..5061b23 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
@@ -15,6 +15,8 @@
  */
 package com.android.wm.shell.startingsurface;
 
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SPLASH_SCREEN;
+
 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.spy;
@@ -91,7 +93,7 @@
 
         @Override
         protected boolean addWindow(int taskId, IBinder appToken,
-                View view, WindowManager wm, WindowManager.LayoutParams params) {
+                View view, WindowManager wm, WindowManager.LayoutParams params, int suggestType) {
             // listen for addView
             mAddWindowForTask = taskId;
             mViewThemeResId = view.getContext().getThemeResId();
@@ -145,9 +147,11 @@
         final int taskId = 1;
         final StartingWindowInfo windowInfo =
                 createWindowInfo(taskId, android.R.style.Theme);
-        mStartingSurfaceDrawer.addSplashScreenStartingWindow(windowInfo, mBinder, false);
+        mStartingSurfaceDrawer.addSplashScreenStartingWindow(windowInfo, mBinder,
+                STARTING_WINDOW_TYPE_SPLASH_SCREEN);
         waitHandlerIdle(mTestHandler);
-        verify(mStartingSurfaceDrawer).addWindow(eq(taskId), eq(mBinder), any(), any(), any());
+        verify(mStartingSurfaceDrawer).addWindow(eq(taskId), eq(mBinder), any(), any(), any(),
+                eq(STARTING_WINDOW_TYPE_SPLASH_SCREEN));
         assertEquals(mStartingSurfaceDrawer.mAddWindowForTask, taskId);
 
         mStartingSurfaceDrawer.removeStartingWindow(windowInfo.taskInfo.taskId, null, null, false);
@@ -161,9 +165,11 @@
         final int taskId = 1;
         final StartingWindowInfo windowInfo =
                 createWindowInfo(taskId, 0);
-        mStartingSurfaceDrawer.addSplashScreenStartingWindow(windowInfo, mBinder, false);
+        mStartingSurfaceDrawer.addSplashScreenStartingWindow(windowInfo, mBinder,
+                STARTING_WINDOW_TYPE_SPLASH_SCREEN);
         waitHandlerIdle(mTestHandler);
-        verify(mStartingSurfaceDrawer).addWindow(eq(taskId), eq(mBinder), any(), any(), any());
+        verify(mStartingSurfaceDrawer).addWindow(eq(taskId), eq(mBinder), any(), any(), any(),
+                eq(STARTING_WINDOW_TYPE_SPLASH_SCREEN));
         assertNotEquals(mStartingSurfaceDrawer.mViewThemeResId, 0);
     }
 
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index b7ea14e..09ebb40 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -103,6 +103,8 @@
     private static final AudioVolumeGroupChangeHandler sAudioAudioVolumeGroupChangedHandler =
             new AudioVolumeGroupChangeHandler();
 
+    private static Context sContext;
+
     /**
      * Broadcast intent, a hint for applications that audio is about to become
      * 'noisy' due to a change in audio outputs. For example, this intent may
@@ -798,6 +800,7 @@
         } else {
             mOriginalContext = context;
         }
+        sContext = context;
     }
 
     @UnsupportedAppUsage
@@ -7220,15 +7223,56 @@
 
     /**
      * Return if an asset contains haptic channels or not.
+     *
+     * @param context the {@link Context} to resolve the uri.
      * @param uri the {@link Uri} of the asset.
      * @return true if the assert contains haptic channels.
      * @hide
      */
-    public static boolean hasHapticChannels(Uri uri) {
+    public static boolean hasHapticChannelsImpl(@NonNull Context context, @NonNull Uri uri) {
+        MediaExtractor extractor = new MediaExtractor();
         try {
-            return getService().hasHapticChannels(uri);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
+            extractor.setDataSource(context, uri, null);
+            for (int i = 0; i < extractor.getTrackCount(); i++) {
+                MediaFormat format = extractor.getTrackFormat(i);
+                if (format.containsKey(MediaFormat.KEY_HAPTIC_CHANNEL_COUNT)
+                        && format.getInteger(MediaFormat.KEY_HAPTIC_CHANNEL_COUNT) > 0) {
+                    return true;
+                }
+            }
+        } catch (IOException e) {
+            Log.e(TAG, "hasHapticChannels failure:" + e);
+        }
+        return false;
+    }
+
+    /**
+     * Return if an asset contains haptic channels or not.
+     *
+     * @param context the {@link Context} to resolve the uri.
+     * @param uri the {@link Uri} of the asset.
+     * @return true if the assert contains haptic channels.
+     * @hide
+     */
+    public static boolean hasHapticChannels(@Nullable Context context, @NonNull Uri uri) {
+        Objects.requireNonNull(uri);
+        if (context != null) {
+            return hasHapticChannelsImpl(context, uri);
+        } else if (sContext != null) {
+            if (DEBUG) {
+                Log.d(TAG, "Try to use static context to query if having haptic channels");
+            }
+            return hasHapticChannelsImpl(sContext, uri);
+        } else {
+            // Try with audio service context, this may fail to get correct result.
+            if (DEBUG) {
+                Log.d(TAG, "Try to use audio service context to query if having haptic channels");
+            }
+            try {
+                return getService().hasHapticChannels(uri);
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
         }
     }
 
diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java
index f8297bc..3cf0341 100644
--- a/media/java/android/media/Ringtone.java
+++ b/media/java/android/media/Ringtone.java
@@ -407,7 +407,7 @@
         if (mLocalPlayer != null) {
             // Play ringtones if stream volume is over 0 or if it is a haptic-only ringtone
             // (typically because ringer mode is vibrate).
-            boolean isHapticOnly = AudioManager.hasHapticChannels(mUri)
+            boolean isHapticOnly = AudioManager.hasHapticChannels(mContext, mUri)
                     && !mAudioAttributes.areHapticChannelsMuted() && mVolume == 0;
             if (isHapticOnly || mAudioManager.getStreamVolume(
                     AudioAttributes.toLegacyStreamType(mAudioAttributes)) != 0) {
diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java
index be6ff1b..4ec79b7 100644
--- a/media/java/android/media/RingtoneManager.java
+++ b/media/java/android/media/RingtoneManager.java
@@ -1082,18 +1082,21 @@
      * @return true if the ringtone contains haptic channels.
      */
     public boolean hasHapticChannels(int position) {
-        return hasHapticChannels(getRingtoneUri(position));
+        return AudioManager.hasHapticChannels(mContext, getRingtoneUri(position));
     }
 
     /**
      * Returns if the {@link Ringtone} from a given sound URI contains
-     * haptic channels or not.
+     * haptic channels or not. As this function doesn't has a context
+     * to resolve the uri, the result may be wrong if the uri cannot be
+     * resolved correctly.
+     * Use {@link #hasHapticChannels(int)} instead when possible.
      *
      * @param ringtoneUri The {@link Uri} of a sound or ringtone.
      * @return true if the ringtone contains haptic channels.
      */
     public static boolean hasHapticChannels(@NonNull Uri ringtoneUri) {
-        return AudioManager.hasHapticChannels(ringtoneUri);
+        return AudioManager.hasHapticChannels(null, ringtoneUri);
     }
 
     /**
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml
index 6acd9ff..5950656 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml
@@ -36,13 +36,15 @@
         <com.google.android.material.appbar.CollapsingToolbarLayout
             android:id="@+id/collapsing_toolbar"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/toolbar_one_line_height"
+            android:layout_height="@dimen/settingslib_toolbar_layout_height"
             android:clipToPadding="false"
+            app:forceApplySystemWindowInsetTop="true"
+            app:extraMultilineHeightEnabled="true"
             app:contentScrim="?androidprv:attr/colorSurfaceHeader"
             app:maxLines="3"
             app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
             app:scrimAnimationDuration="50"
-            app:scrimVisibleHeightTrigger="@dimen/scrim_visible_height_trigger"
+            app:scrimVisibleHeightTrigger="@dimen/settingslib_scrim_visible_height_trigger"
             app:statusBarScrim="@null"
             app:titleCollapseMode="fade"
             app:collapsedTitleTextAppearance="@style/CollapsingToolbarTitle.Collapsed"
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/dimens.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/dimens.xml
index 626fd3a..15c1abb 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/dimens.xml
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/dimens.xml
@@ -16,12 +16,8 @@
 -->
 <resources>
     <!-- Collapsing toolbar layout dimensions -->
-    <dimen name="toolbar_one_line_height">216dp</dimen>
-    <dimen name="toolbar_two_lines_height">260dp</dimen>
-    <dimen name="toolbar_three_lines_height">304dp</dimen>
-    <dimen name="scrim_visible_height_trigger">174dp</dimen>
-    <dimen name="scrim_visible_height_trigger_two_lines">218dp</dimen>
-    <dimen name="scrim_visible_height_trigger_three_lines">262dp</dimen>
+    <dimen name="settingslib_toolbar_layout_height">179dp</dimen>
+    <dimen name="settingslib_scrim_visible_height_trigger">137dp</dimen>
     <dimen name="expanded_title_margin_start">24dp</dimen>
     <dimen name="expanded_title_margin_end">24dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
index 8b1e397..a1cd3718 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
@@ -36,19 +36,14 @@
  * A base Activity that has a collapsing toolbar layout is used for the activities intending to
  * enable the collapsing toolbar function.
  */
-public class CollapsingToolbarBaseActivity extends FragmentActivity implements
-        AppBarLayout.OnOffsetChangedListener {
+public class CollapsingToolbarBaseActivity extends FragmentActivity {
 
-    private static final int TOOLBAR_MAX_LINE_NUMBER = 2;
-    private static final int FULLY_EXPANDED_OFFSET = 0;
     private static final float TOOLBAR_LINE_SPACING_MULTIPLIER = 1.1f;
-    private static final String KEY_IS_TOOLBAR_COLLAPSED = "is_toolbar_collapsed";
 
     @Nullable
     private CollapsingToolbarLayout mCollapsingToolbarLayout;
     @Nullable
     private AppBarLayout mAppBarLayout;
-    private boolean mIsToolbarCollapsed;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -58,14 +53,9 @@
         super.setContentView(R.layout.collapsing_toolbar_base_layout);
         mCollapsingToolbarLayout = findViewById(R.id.collapsing_toolbar);
         mAppBarLayout = findViewById(R.id.app_bar);
-        if (mAppBarLayout != null) {
-            mAppBarLayout.addOnOffsetChangedListener(this);
+        if (mCollapsingToolbarLayout != null) {
+            mCollapsingToolbarLayout.setLineSpacingMultiplier(TOOLBAR_LINE_SPACING_MULTIPLIER);
         }
-        if (savedInstanceState != null) {
-            mIsToolbarCollapsed = savedInstanceState.getBoolean(KEY_IS_TOOLBAR_COLLAPSED);
-        }
-
-        initCollapsingToolbar();
         disableCollapsingToolbarLayoutScrollingBehavior();
 
         final Toolbar toolbar = findViewById(R.id.action_bar);
@@ -125,23 +115,6 @@
         return true;
     }
 
-    @Override
-    public void onOffsetChanged(AppBarLayout appBarLayout, int offset) {
-        if (offset == FULLY_EXPANDED_OFFSET) {
-            mIsToolbarCollapsed = false;
-        } else {
-            mIsToolbarCollapsed = true;
-        }
-    }
-
-    @Override
-    protected void onSaveInstanceState(@NonNull Bundle outState) {
-        super.onSaveInstanceState(outState);
-        if (isChangingConfigurations()) {
-            outState.putBoolean(KEY_IS_TOOLBAR_COLLAPSED, mIsToolbarCollapsed);
-        }
-    }
-
     /**
      * Returns an instance of collapsing toolbar.
      */
@@ -174,43 +147,4 @@
                 });
         params.setBehavior(behavior);
     }
-
-    @SuppressWarnings("RestrictTo")
-    private void initCollapsingToolbar() {
-        if (mCollapsingToolbarLayout == null || mAppBarLayout == null) {
-            return;
-        }
-        mCollapsingToolbarLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
-            @Override
-            public void onLayoutChange(View v, int left, int top, int right, int bottom,
-                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
-                v.removeOnLayoutChangeListener(this);
-                if (mIsToolbarCollapsed) {
-                    return;
-                }
-                final int count = mCollapsingToolbarLayout.getLineCount();
-                if (count > TOOLBAR_MAX_LINE_NUMBER) {
-                    final ViewGroup.LayoutParams lp = mCollapsingToolbarLayout.getLayoutParams();
-                    lp.height = getResources()
-                            .getDimensionPixelSize(R.dimen.toolbar_three_lines_height);
-                    mCollapsingToolbarLayout.setScrimVisibleHeightTrigger(
-                            getResources().getDimensionPixelSize(
-                                    R.dimen.scrim_visible_height_trigger_three_lines));
-                    mCollapsingToolbarLayout.setLayoutParams(lp);
-                    mCollapsingToolbarLayout
-                            .setLineSpacingMultiplier(TOOLBAR_LINE_SPACING_MULTIPLIER);
-                } else if (count == TOOLBAR_MAX_LINE_NUMBER) {
-                    final ViewGroup.LayoutParams lp = mCollapsingToolbarLayout.getLayoutParams();
-                    lp.height = getResources()
-                            .getDimensionPixelSize(R.dimen.toolbar_two_lines_height);
-                    mCollapsingToolbarLayout.setScrimVisibleHeightTrigger(
-                            getResources().getDimensionPixelSize(
-                                    R.dimen.scrim_visible_height_trigger_two_lines));
-                    mCollapsingToolbarLayout.setLayoutParams(lp);
-                    mCollapsingToolbarLayout
-                            .setLineSpacingMultiplier(TOOLBAR_LINE_SPACING_MULTIPLIER);
-                }
-            }
-        });
-    }
 }
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseFragment.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseFragment.java
index e702668..cfb12bc 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseFragment.java
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseFragment.java
@@ -34,12 +34,9 @@
 /**
  * A base fragment that has a collapsing toolbar layout for enabling the collapsing toolbar design.
  */
-public abstract class CollapsingToolbarBaseFragment extends Fragment implements
-        AppBarLayout.OnOffsetChangedListener {
+public abstract class CollapsingToolbarBaseFragment extends Fragment {
 
-    private static final int TOOLBAR_MAX_LINE_NUMBER = 2;
-    private static final int FULLY_EXPANDED_OFFSET = 0;
-    private static final String KEY_IS_TOOLBAR_COLLAPSED = "is_toolbar_collapsed";
+    private static final float TOOLBAR_LINE_SPACING_MULTIPLIER = 1.1f;
 
     @Nullable
     private CoordinatorLayout mCoordinatorLayout;
@@ -51,7 +48,6 @@
     private Toolbar mToolbar;
     @NonNull
     private FrameLayout mContentFrameLayout;
-    private boolean mIsToolbarCollapsed;
 
     @Nullable
     @Override
@@ -62,13 +58,9 @@
         mCoordinatorLayout = view.findViewById(R.id.content_parent);
         mCollapsingToolbarLayout = view.findViewById(R.id.collapsing_toolbar);
         mAppBarLayout = view.findViewById(R.id.app_bar);
-        if (mAppBarLayout != null) {
-            mAppBarLayout.addOnOffsetChangedListener(this);
+        if (mCollapsingToolbarLayout != null) {
+            mCollapsingToolbarLayout.setLineSpacingMultiplier(TOOLBAR_LINE_SPACING_MULTIPLIER);
         }
-        if (savedInstanceState != null) {
-            mIsToolbarCollapsed = savedInstanceState.getBoolean(KEY_IS_TOOLBAR_COLLAPSED);
-        }
-        initCollapsingToolbar();
         disableCollapsingToolbarLayoutScrollingBehavior();
         mToolbar = view.findViewById(R.id.action_bar);
         mContentFrameLayout = view.findViewById(R.id.content_frame);
@@ -82,23 +74,6 @@
         requireActivity().setActionBar(mToolbar);
     }
 
-    @Override
-    public void onSaveInstanceState(@NonNull Bundle outState) {
-        super.onSaveInstanceState(outState);
-        if (getActivity().isChangingConfigurations()) {
-            outState.putBoolean(KEY_IS_TOOLBAR_COLLAPSED, mIsToolbarCollapsed);
-        }
-    }
-
-    @Override
-    public void onOffsetChanged(AppBarLayout appBarLayout, int offset) {
-        if (offset == FULLY_EXPANDED_OFFSET) {
-            mIsToolbarCollapsed = false;
-        } else {
-            mIsToolbarCollapsed = true;
-        }
-    }
-
     /**
      * Return an instance of CoordinatorLayout.
      */
@@ -147,39 +122,4 @@
                 });
         params.setBehavior(behavior);
     }
-
-    @SuppressWarnings("RestrictTo")
-    private void initCollapsingToolbar() {
-        if (mCollapsingToolbarLayout == null || mAppBarLayout == null) {
-            return;
-        }
-        mCollapsingToolbarLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
-            @Override
-            public void onLayoutChange(View v, int left, int top, int right, int bottom,
-                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
-                v.removeOnLayoutChangeListener(this);
-                if (mIsToolbarCollapsed) {
-                    return;
-                }
-                final int count = mCollapsingToolbarLayout.getLineCount();
-                if (count > TOOLBAR_MAX_LINE_NUMBER) {
-                    final ViewGroup.LayoutParams lp = mCollapsingToolbarLayout.getLayoutParams();
-                    lp.height = getResources()
-                            .getDimensionPixelSize(R.dimen.toolbar_three_lines_height);
-                    mCollapsingToolbarLayout.setScrimVisibleHeightTrigger(
-                            getResources().getDimensionPixelSize(
-                                    R.dimen.scrim_visible_height_trigger_three_lines));
-                    mCollapsingToolbarLayout.setLayoutParams(lp);
-                } else if (count == TOOLBAR_MAX_LINE_NUMBER) {
-                    final ViewGroup.LayoutParams lp = mCollapsingToolbarLayout.getLayoutParams();
-                    lp.height = getResources()
-                            .getDimensionPixelSize(R.dimen.toolbar_two_lines_height);
-                    mCollapsingToolbarLayout.setScrimVisibleHeightTrigger(
-                            getResources().getDimensionPixelSize(
-                                    R.dimen.scrim_visible_height_trigger_two_lines));
-                    mCollapsingToolbarLayout.setLayoutParams(lp);
-                }
-            }
-        });
-    }
 }
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 42d9eba..6d314ce 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"እንግዳን አስወግድ"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"እንግዳን ዳግም አስጀምር"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"እንግዳ"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"እንግዳ ዳግም ይጀምር?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"ዳግም አስጀምር"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"እንግዳን ዳግም በማስጀመር ላይ…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ፎቶ አንሳ"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"ምስል ይምረጡ"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ፎቶ ይምረጡ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 2df9ba7..881b76b 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -572,12 +572,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"إزالة جلسة الضيف"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"إعادة ضبط جلسة الضيف"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"ضيف"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"هل تريد إعادة ضبط جلسة الضيف؟"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"إعادة الضبط"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"جارٍ إعادة ضبط جلسة الضيف…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"التقاط صورة"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"اختيار صورة"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"اختيار صورة"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index f14dd0b..1ae3452 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"অতিথি আঁতৰাওক"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"অতিথিৰ ছেশ্বন ৰিছেট কৰক"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"অতিথি"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"অতিথিৰ ছেশ্বন ৰিছেট কৰিবনে?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"ৰিছেট কৰক"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"অতিথিৰ ছেশ্বন ৰিছেট কৰি থকা হৈছে…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"এখন ফট’ তোলক"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"এখন প্ৰতিচ্ছবি বাছনি কৰক"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ফট’ বাছনি কৰক"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 2f75514..c991912 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Qonağı silin"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Qonaq sessiyasını sıfırlayın"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Qonaq"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Qonaq məlumatı sıfırlansın?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Sıfırlayın"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Qonaq məlumatı sıfırlanır…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Foto çəkin"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Şəkil seçin"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Foto seçin"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index b633841..710ca32 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -570,12 +570,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Выдаліць госця"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Скінуць гасцявы сеанс"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Госць"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Скінуць гасцявы сеанс?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Скінуць"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Ідзе скід гасцявога сеанса…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Зрабіць фота"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Выбраць відарыс"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Выбраць фота"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index eca40f9..6e26ed4 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"অতিথি সরান"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"অতিথি সেশন রিসেট করুন"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"অতিথি"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"গেস্ট সেশন রিসেট করবেন?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"রিসেট করুন"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"গেস্ট সেশন রিসেট করা হচ্ছে..."</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ফটো তুলুন"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"একটি ইমেজ বেছে নিন"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ফটো বেছে নিন"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 47b95a5..261face 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Suprimeix el convidat"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Restableix el convidat"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Convidat"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Vols restablir el convidat?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Restableix"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"S\'està restablint el convidat…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Fes una foto"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Tria una imatge"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Selecciona una foto"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 8a16ae6..f589533 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -570,12 +570,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Odstranit hosta"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Resetovat hosta"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Host"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Resetovat hosta?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Resetovat"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Resetování hosta…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Pořídit fotku"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Vybrat obrázek"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Vybrat fotku"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 30bf200..67bc849 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Fjern gæsten"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Nulstil gæstesession"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Gæst"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Vil du nulstille gæsten?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Nulstil"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Nulstiller gæst…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Tag et billede"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Vælg et billede"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Vælg billede"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 103d23b..5e026e5 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Gast entfernen"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Gast zurücksetzen"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Gast"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Gast zurücksetzen?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Zurücksetzen"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Gast wird zurückgesetzt…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Foto machen"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Bild auswählen"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Foto auswählen"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 08f4fe5..a7f5eac5 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Kendu gonbidatua"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Berrezarri gonbidatuentzako saioa"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Gonbidatua"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Gonbidatuentzako saioa berrezarri nahi duzu?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Berrezarri"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Gonbidatuentzako saioa berrezartzen…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Atera argazki bat"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Aukeratu irudi bat"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Hautatu argazki bat"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 313031b..39aacfd 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"حذف مهمان"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"بازنشانی مهمان"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"مهمان"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"جلسه مهمان بازنشانی شود؟"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"بازنشانی"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"درحال بازنشانی مهمان…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"عکس گرفتن"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"انتخاب تصویر"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"انتخاب عکس"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 40a3d21..ca299f0 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Poista vieras"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Nollaa vieras"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Vieras"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Nollataanko vieras?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Nollaa"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Nollataan vierasta…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Ota kuva"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Valitse kuva"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Valitse kuva"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index e877557..b503fdb 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Supprimer l\'invité"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Réinitialiser la session Invité"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Invité"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Réinitialiser la session Invité?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Réinitialiser"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Réinitialisation de la session Invité en cours…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Prendre une photo"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Sélectionner une image"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Sélectionnez une photo"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 0b0ee65..921caba 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Supprimer l\'invité"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Réinitialiser la session Invité"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Invité"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Réinitialiser la session Invité ?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Réinitialiser"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Réinitialisation de la session Invité…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Prendre une photo"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Choisir une image"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Sélectionner une photo"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 5cb0d2a..015f256 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Quitar convidado"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Restablecer sesión de convidado"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Convidado"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Queres restablecer a sesión de convidado?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Restablecer"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Restablecendo sesión de convidado…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Tirar foto"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Escoller imaxe"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Seleccionar foto"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index d09a8e6..8052e2a 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"અતિથિને કાઢી નાખો"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"અતિથિને રીસેટ કરો"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"અતિથિ"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"અતિથિને રીસેટ કરીએ?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"રીસેટ કરો"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"અતિથિને રીસેટ કરી રહ્યાં છીએ…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ફોટો લો"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"છબી પસંદ કરો"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ફોટો પસંદ કરો"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 36cf9f2..bf9b72e 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"मेहमान हटाएं"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"मेहमान के तौर पर ब्राउज़ करने का सेशन रीसेट करें"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"मेहमान"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"क्या आप मेहमान के तौर पर ब्राउज़ करने का सेशन रीसेट करना चाहते हैं?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"रीसेट करें"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"मेहमान के तौर पर ब्राउज़ करने का सेशन रीसेट किया जा रहा है…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"फ़ोटो खींचें"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"कोई इमेज चुनें"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"फ़ोटो चुनें"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index fc4592d..8fc854c 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Vendég munkamenet eltávolítása"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Vendég munkamenet visszaállítása"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Vendég"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Visszaállítja a vendég munkamenetet?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Visszaállítás"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Vendég munkamenet visszaállítása…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Fotó készítése"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Kép kiválasztása"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Fotó kiválasztása"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index b9b5dcb..4b37650 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -156,7 +156,7 @@
     <string name="launch_defaults_some" msgid="3631650616557252926">"Beberapa setelan default"</string>
     <string name="launch_defaults_none" msgid="8049374306261262709">"Tidak ada setelan default"</string>
     <string name="tts_settings" msgid="8130616705989351312">"Setelan text-to-speech"</string>
-    <string name="tts_settings_title" msgid="7602210956640483039">"Ouput text-to-speech"</string>
+    <string name="tts_settings_title" msgid="7602210956640483039">"Output text-to-speech"</string>
     <string name="tts_default_rate_title" msgid="3964187817364304022">"Kecepatan ucapan"</string>
     <string name="tts_default_rate_summary" msgid="3781937042151716987">"Kecepatan teks diucapkan"</string>
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"Tinggi nada"</string>
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Hapus tamu"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Reset tamu"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Tamu"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Reset tamu?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Reset"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Mereset tamu …"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Ambil foto"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Pilih gambar"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Pilih foto"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 0b5a44a..9b08303 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Fjarlægja gest"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Endurstilla gestastillingu"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Gestur"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Endurstilla gestastillingu?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Endurstilla"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Endurstillir gest…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Taka mynd"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Velja mynd"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Velja mynd"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index c07b510..b3bdf89 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Rimuovi ospite"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Reimposta sessione Ospite"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Ospite"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Reimpostare sessione Ospite?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Reimposta"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Reimpostazione sessione Ospite in corso…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Scatta una foto"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Scegli un\'immagine"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Seleziona la foto"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 11613aa..71cc9a0 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -570,12 +570,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"הסרת אורח/ת"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"איפוס הגלישה כאורח"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"אורח"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"לאפס את הגלישה כאורח?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"איפוס"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"מתבצע איפוס של הגלישה כאורח…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"צילום תמונה"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"לבחירת תמונה"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"בחירת תמונה"</string>
@@ -585,7 +582,7 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"צריך להפעיל מחדש את המכשיר כדי להחיל את השינוי. יש להפעיל מחדש עכשיו או לבטל."</string>
     <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"אוזניות חוטיות"</string>
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"פועלת"</string>
-    <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"כבויה"</string>
+    <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"מצב כבוי"</string>
     <string name="carrier_network_change_mode" msgid="4257621815706644026">"רשת ספק משתנה"</string>
     <string name="data_connection_3g" msgid="931852552688157407">"3G"</string>
     <string name="data_connection_edge" msgid="4625509456544797637">"EDGE"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 821c98a..6f023e9 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"სტუმრის ამოშლა"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"სტუმრის სესიის გადაყენება"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"სტუმარი"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"გადაყენდეს სტუმარი?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"გადაყენება"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"მიმდინარეობს სტუმრის გადაყენება…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ფოტოს გადაღება"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"აირჩიეთ სურათი"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ფოტოს არჩევა"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 89556da..2fbe33e 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -240,7 +240,7 @@
     <string name="keep_screen_on" msgid="1187161672348797558">"Ояу тұру"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"Зарядтау кезінде экран өшпейді."</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Bluetooth HCI қадағалау журналын қосу"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Bluetooth пакеттерін алу (осы параметрді өзгерткен соң, Bluetooth-ды қосыңыз немесе өшіріңіз)"</string>
+    <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Bluetooth пакеттерін алу (осы параметрді өзгерткен соң, Bluetooth-ты қосыңыз немесе өшіріңіз)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM құлып ашу функциясы"</string>
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Операциялық жүйені жүктеу құралының құлпыy ашуға рұқсат ету"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"OEM бекітпесін ашуға рұқсат ету керек пе?"</string>
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Қонақты жою"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Қонақ сеансын әдепкі күйге қайтару"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Қонақ"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Қонақ сеансы бастапқы күйге қайтарылсын ба?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Бастапқы күйге қайтару"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Қонақ сеансы бастапқы күйге қайтарылуда…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Фотосуретке түсіру"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Сурет таңдау"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Фотосурет таңдау"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 33902be..3814ed5 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -456,11 +456,11 @@
     <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - នៅសល់ <xliff:g id="TIME">%2$s</xliff:g> ទៀតទើបពេញ"</string>
     <string name="power_charging_limited" msgid="7956120998372505295">"<xliff:g id="LEVEL">%1$s</xliff:g> - បានដាក់កម្រិត​ការសាកថ្ម​ជាបណ្ដោះអាសន្ន"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"មិន​ស្គាល់"</string>
-    <string name="battery_info_status_charging" msgid="4279958015430387405">"កំពុងបញ្ចូល​ថ្ម"</string>
+    <string name="battery_info_status_charging" msgid="4279958015430387405">"កំពុងសាក​ថ្ម"</string>
     <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"កំពុងសាកថ្មយ៉ាងឆាប់រហ័ស"</string>
     <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"កំពុង​សាកថ្មយឺត"</string>
     <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"កំពុង​សាកថ្ម​ឥតខ្សែ"</string>
-    <string name="battery_info_status_discharging" msgid="6962689305413556485">"មិនកំពុង​បញ្ចូល​ថ្ម"</string>
+    <string name="battery_info_status_discharging" msgid="6962689305413556485">"មិនកំពុង​សាក​ថ្ម"</string>
     <string name="battery_info_status_not_charging" msgid="3371084153747234837">"បានភ្ជាប់ មិនកំពុង​សាកថ្ម"</string>
     <string name="battery_info_status_full" msgid="1339002294876531312">"បាន​សាក​ថ្មពេញ"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"គ្រប់គ្រងដោយអ្នកគ្រប់គ្រង"</string>
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"ដកភ្ញៀវចេញ"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"កំណត់​ភ្ញៀវឡើង​វិញ"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"ភ្ញៀវ"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"កំណត់​ភ្ញៀវឡើង​វិញឬ?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"កំណត់​ឡើងវិញ"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"កំពុងកំណត់​ភ្ញៀវឡើងវិញ…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ថតរូប"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"ជ្រើសរើស​រូបភាព"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ជ្រើសរើស​​រូបថត"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 78a67f4..54d0176 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"ಅತಿಥಿಯನ್ನು ಮರುಹೊಂದಿಸಿ"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"ಅತಿಥಿ"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"ಅತಿಥಿ ಬಳಕೆದಾರರನ್ನು ರೀಸೆಟ್ ಮಾಡಬೇಕೆ?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"ರೀಸೆಟ್ ಮಾಡಿ"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"ಅತಿಥಿ ಬಳಕೆದಾರರ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ರೀಸೆಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ಫೋಟೋ ತೆಗೆದುಕೊಳ್ಳಿ"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"ಚಿತ್ರವನ್ನು ಆರಿಸಿ"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ಫೋಟೋ ಆಯ್ಕೆಮಾಡಿ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 68fe196..4933f4a 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"게스트 삭제"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"게스트 재설정"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"게스트"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"게스트를 재설정하시겠습니까?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"재설정"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"게스트 재설정 중…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"사진 찍기"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"이미지 선택"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"사진 선택"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 3fcedb0..b1aee50 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -211,7 +211,7 @@
     <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi‑Fi\'га туташканда, мүчүлүштүктөрдү аныктоо режими иштейт оңдоо режими"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"Ката"</string>
     <string name="adb_wireless_settings" msgid="2295017847215680229">"Мүчүлүштүктөрдү Wi-Fi аркылуу аныктоо"</string>
-    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Жеткиликтүү түзмөктөрдү көрүү үчүн, мүчүлүштүктөрдү Wi-Fi аркылуу аныктоону күйгүзүңүз"</string>
+    <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Жеткиликтүү түзмөктөрдү көрүү үчүн мүчүлүштүктөрдү Wi-Fi аркылуу аныктоону күйгүзүңүз"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Түзмөктү QR коду аркылуу жупташтыруу"</string>
     <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR кодунун сканерин колдонуп, жаңы түзмөктөрдү жупташтырыңыз"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Түзмөктү атайын код аркылуу жупташтыруу"</string>
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Конокту өчүрүү"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Конок сеансын баштапкы абалга келтирүү"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Конок"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Конок сеансын баштапкы абалга келтиресизби?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Баштапкы абалга келтирүү"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Конок сеансы баштапкы абалга келтирилүүдө…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Сүрөткө тартуу"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Сүрөт тандаңыз"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Сүрөт тандаңыз"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index d7d5f24..491a082 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -570,12 +570,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Pašalinti svečią"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Iš naujo nustatyti svečią"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Svečias"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Nustatyti svečią iš naujo?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Nustatyti iš naujo"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Svečias nustatomas iš naujo…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Fotografuoti"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Pasirinkti vaizdą"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Pasirinkti nuotrauką"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 8f9ac01..9fcc749 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -569,12 +569,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Noņemt viesi"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Atiestatīt viesa sesiju"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Viesis"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Vai atiestatīt viesa sesiju?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Atiestatīt"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Notiek viesa sesijas atiestatīšana…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Uzņemt fotoattēlu"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Izvēlēties attēlu"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Atlasīt fotoattēlu"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 134ac9b..bf241c3 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"അതിഥിയെ നീക്കം ചെയ്യുക"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"അതിഥിയെ റീസെറ്റ് ചെയ്യുക"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"അതിഥി"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"അതിഥിയെ റീസെറ്റ് ചെയ്യണോ?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"റീസെറ്റ് ചെയ്യുക"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"അതിഥിയെ റീസെറ്റ് ചെയ്യുന്നു…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ഒരു ഫോട്ടോ എടുക്കുക"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"ഒരു ചിത്രം തിരഞ്ഞെടുക്കുക"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ഫോട്ടോ തിരഞ്ഞെടുക്കുക"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 34f6343..06525e4 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Alih keluar tetamu"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Tetapkan semula tetamu"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Tetamu"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Tetapkan semula tetamu?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Tetapkan semula"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Menetapkan semula tetamu…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Ambil foto"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Pilih imej"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Pilih foto"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 22415ad..2f57106 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"ဧည့်သည်ကို ဖယ်ထုတ်ရန်"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"ဧည့်သည်ကို ပြင်ဆင်သတ်မှတ်ရန်"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"ဧည့်သည်"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"ဧည့်သည်ကို ပြင်ဆင်သတ်မှတ်မလား။"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"ပြင်ဆင်သတ်မှတ်ရန်"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"ဧည့်သည်ကို ပြင်ဆင်သတ်မှတ်နေသည်…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ဓာတ်ပုံရိုက်ရန်"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"ပုံရွေးရန်"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ဓာတ်ပုံရွေးရန်"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index e6fc707..0397eb8 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"अतिथि हटाउनुहोस्"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"अतिथि सत्र रिसेट गर्नुहोस्"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"अतिथि"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"अतिथिका रूपमा ब्राउज गर्ने सेसन रिसेट गर्ने हो?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"रिसेट गर्नुहोस्"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"अतिथिका रूपमा ब्राउज गर्ने सेसन रिसेट गरिँदै छ…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"फोटो खिच्नुहोस्"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"कुनै फोटो छनौट गर्नुहोस्"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"फोटो चयन गर्नुहोस्"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index a211fd4..c885c16 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"ଅତିଥିଙ୍କୁ କାଢ଼ି ଦିଅନ୍ତୁ"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"ଅତିଥି ସେସନକୁ ରିସେଟ୍ କରନ୍ତୁ"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"ଅତିଥି"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"ଅତିଥି ସେସନକୁ ରିସେଟ୍ କରିବେ?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"ରିସେଟ୍ କରନ୍ତୁ"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"ଅତିଥି ସେସନକୁ ରିସେଟ୍ କରାଯାଉଛି…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ଗୋଟିଏ ଫଟୋ ଉଠାନ୍ତୁ"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"ଏକ ଛବି ବାଛନ୍ତୁ"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ଫଟୋ ବାଛନ୍ତୁ"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 969e34d..127f571 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -456,7 +456,7 @@
     <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - ਬੈਟਰੀ ਪੂਰੀ ਚਾਰਜ ਹੋਣ ਵਿੱਚ <xliff:g id="TIME">%2$s</xliff:g> ਬਾਕੀ"</string>
     <string name="power_charging_limited" msgid="7956120998372505295">"<xliff:g id="LEVEL">%1$s</xliff:g> - ਚਾਰਜਿੰਗ ਕੁਝ ਸਮੇਂ ਲਈ ਰੋਕੀ ਗਈ"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"ਅਗਿਆਤ"</string>
-    <string name="battery_info_status_charging" msgid="4279958015430387405">"ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
+    <string name="battery_info_status_charging" msgid="4279958015430387405">"ਚਾਰਜ ਹੋ ਰਹੀ ਹੈ"</string>
     <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"ਤੇਜ਼ ਚਾਰਜ ਹੋ ਰਹੀ ਹੈ"</string>
     <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"ਹੌਲੀ ਚਾਰਜ ਹੋ ਰਹੀ ਹੈ"</string>
     <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"ਬਿਨਾਂ ਤਾਰ ਤੋਂ ਚਾਰਜ ਹੋ ਰਹੀ ਹੈ"</string>
@@ -566,14 +566,11 @@
     <string name="user_nickname" msgid="262624187455825083">"ਉਪਨਾਮ"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"ਮਹਿਮਾਨ ਸ਼ਾਮਲ ਕਰੋ"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"ਮਹਿਮਾਨ ਹਟਾਓ"</string>
-    <string name="guest_reset_guest" msgid="6110013010356013758">"ਗੈਸਟ ਰੀਸੈੱਟ ਕਰੋ"</string>
+    <string name="guest_reset_guest" msgid="6110013010356013758">"ਮਹਿਮਾਨ ਸੈਸ਼ਨ ਨੂੰ ਰੀਸੈੱਟ ਕਰੋ"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"ਮਹਿਮਾਨ"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"ਕੀ ਮਹਿਮਾਨ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨਾ ਹੈ?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"ਰੀਸੈੱਟ ਕਰੋ"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"ਮਹਿਮਾਨ ਨੂੰ ਰੀਸੈੱਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ਇੱਕ ਫ਼ੋਟੋ ਖਿੱਚੋ"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"ਕੋਈ ਚਿੱਤਰ ਚੁਣੋ"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ਫ਼ੋਟੋ ਚੁਣੋ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 9b25f63..49dd07e 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -570,12 +570,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Usuń gościa"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Resetuj sesję gościa"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Gość"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Zresetować sesję gościa?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Resetuj"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Resetuję sesję gościa…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Zrób zdjęcie"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Wybierz obraz"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Wybierz zdjęcie"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index f8eab0ca..4136ec2 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Redefinir sessão de visitante"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Convidado"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Redefinir visitante?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Redefinir"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Redefinindo visitante…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Tirar uma foto"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Escolher uma imagem"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Selecionar foto"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 4f8c6d2..5abbc248 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Repor convidado"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Convidado"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Pretende repor o convidado?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Repor"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"A repor o convidado…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Tirar uma foto"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Escolher uma imagem"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Selecionar foto"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index f8eab0ca..4136ec2 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Redefinir sessão de visitante"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Convidado"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Redefinir visitante?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Redefinir"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Redefinindo visitante…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Tirar uma foto"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Escolher uma imagem"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Selecionar foto"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 75bf3aa..84064e6 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -569,12 +569,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Ștergeți invitatul"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Resetați sesiunea pentru invitați"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Invitat"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Resetați invitatul?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Resetați"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Se resetează invitatul…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Faceți o fotografie"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Alegeți o imagine"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Selectați fotografia"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index b416b06..ff799e0 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -570,12 +570,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Удалить аккаунт гостя"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Сбросить гостевой сеанс"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Гость"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Сбросить гостевой сеанс?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Сбросить"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Сброс гостевого сеанса…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Сделать снимок"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Выбрать фото"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Выбрать фотографию"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 9c68851..5343543 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -251,7 +251,7 @@
     <string name="debug_networking_category" msgid="6829757985772659599">"Siete"</string>
     <string name="wifi_display_certification" msgid="1805579519992520381">"Certifikácia bezdrôtového zobrazenia"</string>
     <string name="wifi_verbose_logging" msgid="1785910450009679371">"Podrobné denníky Wi‑Fi"</string>
-    <string name="wifi_scan_throttling" msgid="2985624788509913617">"Pribrzdenie vyhľadávania sietí Wi‑Fi"</string>
+    <string name="wifi_scan_throttling" msgid="2985624788509913617">"Pribrzdiť vyhľadávanie sietí Wi‑Fi"</string>
     <string name="wifi_enhanced_mac_randomization" msgid="882650208573834301">"Randomizácia dočasnej adresy MAC siete Wi‑Fi"</string>
     <string name="mobile_data_always_on" msgid="8275958101875563572">"Mobilné dáta ponechať vždy aktívne"</string>
     <string name="tethering_hardware_offload" msgid="4116053719006939161">"Hardvérová akcelerácia tetheringu"</string>
@@ -361,7 +361,7 @@
     <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Povoliť vrstvy ladenia grafického procesora"</string>
     <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Povoliť načítanie vrstiev ladenia grafického procesora na ladenie aplikácií"</string>
     <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Aktivovať podr. zapis. dodáv. do denníka"</string>
-    <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Zahŕňať do hlásení chýb ďalšie denníky dodávateľa pre konkrétne zariadenie, ktoré môžu obsahovať osobné údaje, zvýšiť spotrebu batérie alebo zabrať viac ukladacieho priestoru."</string>
+    <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Zahŕňať do hlásení chýb ďalšie denníky dodávateľa pre konkrétne zariadenie, ktoré môžu obsahovať osobné údaje, zvýšiť spotrebu batérie alebo zabrať viac ukladacieho priestoru"</string>
     <string name="window_animation_scale_title" msgid="5236381298376812508">"Mierka animácie okna"</string>
     <string name="transition_animation_scale_title" msgid="1278477690695439337">"Mierka animácie premeny"</string>
     <string name="animator_duration_scale_title" msgid="7082913931326085176">"Mierka dĺžky animácie"</string>
@@ -570,12 +570,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Odobrať hosťa"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Obnoviť reláciu hosťa"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Hosť"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Chcete resetovať reláciu hosťa?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Resetovať"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Relácia hosťa sa resetuje…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Odfotiť"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Vybrať obrázok"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Vybrať fotku"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index d38c361..78b35aa 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Hiq të ftuarin"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Rivendos vizitorin"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"I ftuar"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Të rivendoset vizitori?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Rivendos"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Vizitori po rivendoset…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Bëj një fotografi"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Zgjidh një imazh"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Zgjidh një fotografi"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 124c0e7..5517325 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Ta bort gäst"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Återställ gästsession"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Gäst"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Vill du återställa gästsessionen?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Återställ"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Gästsessionen återställs …"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Ta ett foto"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Välj en bild"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Välj foto"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 96e0890..be4479f 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Ondoa mgeni"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Badilisha kipindi cha mgeni"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Mgeni"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Ungependa kubadilisha kipindi cha mgeni?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Badilisha"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Inabadilisha kipindi cha mgeni…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Piga picha"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Chagua picha"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Chagua picha"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 69a0945..6255d41 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -490,7 +490,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"சாதன மொழிகளைப் பயன்படுத்து"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> க்கான அமைப்புகளைத் திறப்பதில் தோல்வி"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"இந்த உள்ளீட்டு முறையானது, கடவுச்சொற்கள் மற்றும் கிரெடிட் கார்டு எண்கள் போன்ற தனிப்பட்ட தகவல் உள்பட நீங்கள் உள்ளிடும் எல்லா உரையையும் சேகரிக்கக்கூடும். இது <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> பயன்பாட்டிலிருந்து வந்துள்ளது. இந்த உள்ளீட்டு முறையைப் பயன்படுத்தவா?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"குறிப்பு: மறுதொடக்கம் செய்த பிறகு, மொபைலைத் திறக்கும் வரை இந்த ஆப்ஸால் தொடங்க முடியாது"</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"குறிப்பு: மறுதொடக்கம் செய்த பிறகு, மொபைலை அன்லாக் செய்யும் வரை இந்த ஆப்ஸால் தொடங்க முடியாது"</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"IMS பதிவின் நிலை"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"பதிவு செய்யப்பட்டது"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"பதிவு செய்யப்படவில்லை"</string>
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"கெஸ்ட்டை அகற்று"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"கெஸ்ட் அமர்வை மீட்டமை"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"கெஸ்ட்"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"கெஸ்ட்டை மீட்டமைக்கவா?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"மீட்டமை"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"கெஸ்ட்டை மீட்டமைக்கிறது…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"படமெடுங்கள்"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"படத்தைத் தேர்வுசெய்யுங்கள்"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"படத்தைத் தேர்ந்தெடுங்கள்"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index d8da8da..a870026 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"గెస్ట్‌ను తీసివేయండి"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"గెస్ట్ సెషన్‌ను రీసెట్ చేయండి"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"గెస్ట్"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"గెస్ట్ సెషన్‌ను రీసెట్ చేయాలా?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"రీసెట్ చేయండి"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"గెస్ట్ సెషన్‌ను రీసెట్ చేస్తోంది…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ఒక ఫోటో తీయండి"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"ఇమేజ్‌ను ఎంచుకోండి"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ఫోటోను ఎంచుకోండి"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index ca0e376..25fe87f 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"นำผู้ใช้ชั่วคราวออก"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"รีเซ็ตผู้เข้าร่วม"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"ผู้ใช้ชั่วคราว"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"รีเซ็ตผู้เข้าร่วมไหม"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"รีเซ็ต"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"กำลังรีเซ็ตผู้เข้าร่วม…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ถ่ายรูป"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"เลือกรูปภาพ"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"เลือกรูปภาพ"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 1c5092f..a219b5a 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Alisin ang bisita"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"I-reset ang bisita"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Bisita"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"I-reset ang session ng bisita?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"I-reset"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Nire-reset ang bisita…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Kumuha ng larawan"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Pumili ng larawan"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Pumili ng larawan"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 42e7c5e..ad8cb8e 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Misafir oturumunu kaldır"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Misafir oturumunu sıfırla"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Misafir"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Misafir oturumu sıfırlansın mı?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Sıfırla"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Misafir oturumu sıfırlanıyor…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Fotoğraf çek"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Resim seç"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Fotoğraf seç"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index ba7a678..4d0d9b6 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -570,12 +570,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Видалити гостя"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Скинути сеанс у режимі \"Гість\""</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Гість"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Скинути сеанс у режимі \"Гість\"?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Скинути"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Скидання сеансу в режимі \"Гість\"…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Зробити фотографію"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Вибрати зображення"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Вибрати фотографію"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index d0cc6de..aecfd62 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"مہمان کو ہٹائیں"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"مہمان کو ری سیٹ کریں"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"مہمان"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"مہمان کو ری سیٹ کریں؟"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"ری سیٹ کریں"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"مہمان کو ری سیٹ کرنا…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"ایک تصویر لیں"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"ایک تصویر منتخب کریں"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"تصویر منتخب کریں"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index c433c95..34ef0d6 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Mehmonni olib tashlash"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Mehmon seansini tiklash"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Mehmon"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Mehmon seansi tiklansinmi?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Tiklash"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Mehmon seansi tiklanmoqda…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Suratga olish"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Rasm tanlash"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Surat tanlash"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index f200467..a67ea6a 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Xóa phiên khách"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Đặt lại phiên khách"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Khách"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Đặt lại phiên khách?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Đặt lại"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Đang đặt lại phiên khách…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Chụp ảnh"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Chọn một hình ảnh"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Chọn ảnh"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 9e7c410..ac49b99 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"移除访客"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"重置访客会话"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"访客"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"要重置访客会话吗?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"重置"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"正在重置访客会话…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"拍摄照片"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"选择图片"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"选择照片"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 7c10c2c..c3caa6d 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -457,7 +457,7 @@
     <string name="power_charging_limited" msgid="7956120998372505295">"<xliff:g id="LEVEL">%1$s</xliff:g> - 充電暫時受限"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"未知"</string>
     <string name="battery_info_status_charging" msgid="4279958015430387405">"充電中"</string>
-    <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"正在快速充電"</string>
+    <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"快速充電中"</string>
     <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"正在慢速充電"</string>
     <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"無線充電中"</string>
     <string name="battery_info_status_discharging" msgid="6962689305413556485">"非充電中"</string>
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"移除訪客"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"重設訪客"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"訪客"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"要重設訪客嗎?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"重設"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"正在重設訪客…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"拍照"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"選擇圖片"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"揀相"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 583bf18..53be010 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"移除訪客"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"重設訪客"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"訪客"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"要重設訪客嗎?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"重設"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"正在重設訪客…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"拍照"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"選擇圖片"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"選取相片"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 8d1feda..9daa41c 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -568,12 +568,9 @@
     <string name="guest_exit_guest" msgid="5908239569510734136">"Susa isihambeli"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Setha kabusha isivakashi"</string>
     <string name="guest_nickname" msgid="6332276931583337261">"Isihambeli"</string>
-    <!-- no translation found for guest_reset_guest_dialog_title (8047270010895437534) -->
-    <skip />
-    <!-- no translation found for guest_reset_guest_confirm_button (2989915693215617237) -->
-    <skip />
-    <!-- no translation found for guest_resetting (7822120170191509566) -->
-    <skip />
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Setha kabusha isimenywa?"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Setha kabusha"</string>
+    <string name="guest_resetting" msgid="7822120170191509566">"Ukusetha kabusha isimenywa…"</string>
     <string name="user_image_take_photo" msgid="467512954561638530">"Thatha isithombe"</string>
     <string name="user_image_choose_photo" msgid="1363820919146782908">"Khetha isithombe"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Khetha isithombe"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
index 0696916..72fa25f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
@@ -32,7 +32,6 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.provider.Settings;
-import android.util.FeatureFlagUtils;
 
 import com.android.settingslib.R;
 import com.android.settingslib.Utils;
@@ -158,7 +157,7 @@
     private Network mDefaultNetwork = null;
     private NetworkCapabilities mDefaultNetworkCapabilities = null;
     private final Runnable mCallback;
-    private final boolean mProviderModel;
+    private final boolean mSupportMergedUi;
 
     private WifiInfo mWifiInfo;
     public boolean enabled;
@@ -182,8 +181,7 @@
         mNetworkScoreManager = networkScoreManager;
         mConnectivityManager = connectivityManager;
         mCallback = callback;
-        mProviderModel = FeatureFlagUtils.isEnabled(
-                mContext, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL);
+        mSupportMergedUi = false;
     }
 
     public void setListening(boolean listening) {
@@ -225,7 +223,7 @@
                 } else {
                     ssid = getValidSsid(mWifiInfo);
                 }
-                if (mProviderModel) {
+                if (mSupportMergedUi) {
                     isCarrierMerged = mWifiInfo.isCarrierMerged();
                     subId = mWifiInfo.getSubscriptionId();
                 }
@@ -257,7 +255,7 @@
             } else {
                 ssid = getValidSsid(mWifiInfo);
             }
-            if (mProviderModel) {
+            if (mSupportMergedUi) {
                 isCarrierMerged = mWifiInfo.isCarrierMerged();
                 subId = mWifiInfo.getSubscriptionId();
             }
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index c1657cd..1e4b33c 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -34,7 +34,7 @@
     <string name="keyguard_password_wrong_pin_code" msgid="3514267777289393046">"Le code est incorrect."</string>
     <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> • Recharge sans fil"</string>
+    <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • En charge sans fil"</string>
     <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Recharge…"</string>
     <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Recharge rapide…"</string>
     <string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Recharge lente…"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index 937ad06..adec7fe 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -27,7 +27,7 @@
     <string name="keyguard_password_enter_pin_prompt" msgid="2304037870481240781">"புதிய சிம் பின் குறியீடு"</string>
     <string name="keyguard_password_entry_touch_hint" msgid="6180028658339706333"><font size="17">"கடவுச்சொல்லை உள்ளிட, தொடவும்"</font></string>
     <string name="keyguard_password_enter_password_code" msgid="7393393239623946777">"அன்லாக் செய்ய கடவுச்சொல்லை உள்ளிடவும்"</string>
-    <string name="keyguard_password_enter_pin_password_code" msgid="3692259677395250509">"திறக்க, பின்னை உள்ளிடவும்"</string>
+    <string name="keyguard_password_enter_pin_password_code" msgid="3692259677395250509">"அன்லாக் செய்ய, பின்னை உள்ளிடவும்"</string>
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"பின்னை உள்ளிடுக"</string>
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"பேட்டர்னை உள்ளிடுக"</string>
     <string name="keyguard_enter_your_password" msgid="7225626204122735501">"கடவுச்சொல்லை உள்ளிடுக"</string>
diff --git a/packages/SystemUI/res-product/values-ta/strings.xml b/packages/SystemUI/res-product/values-ta/strings.xml
index 9819e7c..b537549 100644
--- a/packages/SystemUI/res-product/values-ta/strings.xml
+++ b/packages/SystemUI/res-product/values-ta/strings.xml
@@ -26,20 +26,20 @@
     <string name="keyguard_missing_sim_message" product="tablet" msgid="5018086454277963787">"டேப்லெட்டில் சிம் கார்டு இல்லை."</string>
     <string name="keyguard_missing_sim_message" product="default" msgid="7053347843877341391">"மொபைலில் சிம் கார்டு இல்லை."</string>
     <string name="kg_invalid_confirm_pin_hint" product="default" msgid="6278551068943958651">"பின் குறியீடுகள் பொருந்தவில்லை"</string>
-    <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="302165994845009232">"டேப்லெட்டைத் திறக்க, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக முயன்றால், இந்த டேப்லெட் மீட்டமைக்கப்படும். இதனால் அதிலுள்ள அனைத்துத் தரவும் நீக்கப்படும்."</string>
-    <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="2594813176164266847">"மொபைலைத் திறக்க <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக முயன்றால், இந்த மொபைல் மீட்டமைக்கப்படும். இதனால் அதிலுள்ள அனைத்துத் தரவும் நீக்கப்படும்."</string>
-    <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="8710104080409538587">"டேப்லெட்டைத் திறக்க <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இந்த டேப்லெட் மீட்டமைக்கப்படும் இதனால் அதிலுள்ள அனைத்துத் தரவும் நீக்கப்படும்."</string>
-    <string name="kg_failed_attempts_now_wiping" product="default" msgid="6381835450014881813">"மொபைலைத் திறக்க, <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டதனால் இந்த மொபைல் மீட்டமைக்கப்படும். இதனால் அதிலுள்ள அனைத்துத் தரவும் நீக்கப்படும்."</string>
-    <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="7325071812832605911">"டேப்லெட்டைத் திறக்க, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக முயன்றால், இந்தப் பயனர் அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துப் பயனர் தரவும் நீக்கப்படும்."</string>
-    <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="8110939900089863103">"மொபைலைத் திறக்க <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக முயன்றால், இந்தப் பயனர் அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துப் பயனர் தரவும் நீக்கப்படும்."</string>
-    <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="8509811676952707883">"டேப்லெட்டைத் திறக்க, <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இந்தப் பயனர் அகற்றப்படும் இதனால் அதிலுள்ள அனைத்துப் பயனர் தரவும் நீக்கப்படும்."</string>
-    <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="3051962486994265014">"மொபைலைத் திறக்க <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டதனால் இந்தப் பயனர் அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துப் பயனர் தரவும் நீக்கப்படும்."</string>
-    <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="1049523640263353830">"டேப்லெட்டைத் திறக்க, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக முயன்றால், பணிக் கணக்கு அகற்றப்படும். இதனால் அதிலுள்ள அனைத்து சுயவிவரத் தரவும் நீக்கப்படும்."</string>
-    <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="3280816298678433681">"மொபைலைத் திறக்க, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக முயன்றால், பணிக் கணக்கு அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துச் சுயவிவரத் தரவும் நீக்கப்படும்."</string>
-    <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4417100487251371559">"டேப்லெட்டைத் திறக்க <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டதனால் பணிக் கணக்கு அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துச் சுயவிவரத் தரவும் நீக்கப்படும்."</string>
-    <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"மொபைலைத் திறக்க, <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டதனால் பணிக் கணக்கு அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துச் சுயவிவரத் தரவும் நீக்கப்படும்."</string>
-    <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"திறப்பதற்கான பேட்டர்னை, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், மின்னஞ்சல் கணக்கைப் பயன்படுத்தி டேப்லெட்டைத் திறக்கும்படி கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
-    <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"திறப்பதற்கான பேட்டர்னை, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், மின்னஞ்சல் கணக்கைப் பயன்படுத்தி மொபைலைத் திறக்கும்படி கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
+    <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="302165994845009232">"டேப்லெட்டை அன்லாக் செய்ய, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக முயன்றால், இந்த டேப்லெட் மீட்டமைக்கப்படும். இதனால் அதிலுள்ள அனைத்துத் தரவும் நீக்கப்படும்."</string>
+    <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="2594813176164266847">"மொபைலை அன்லாக் செய்ய <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக முயன்றால், இந்த மொபைல் மீட்டமைக்கப்படும். இதனால் அதிலுள்ள அனைத்துத் தரவும் நீக்கப்படும்."</string>
+    <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="8710104080409538587">"டேப்லெட்டை அன்லாக் செய்ய <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இந்த டேப்லெட் மீட்டமைக்கப்படும் இதனால் அதிலுள்ள அனைத்துத் தரவும் நீக்கப்படும்."</string>
+    <string name="kg_failed_attempts_now_wiping" product="default" msgid="6381835450014881813">"மொபைலை அன்லாக் செய்ய, <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டதனால் இந்த மொபைல் மீட்டமைக்கப்படும். இதனால் அதிலுள்ள அனைத்துத் தரவும் நீக்கப்படும்."</string>
+    <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="7325071812832605911">"டேப்லெட்டை அன்லாக் செய்ய, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக முயன்றால், இந்தப் பயனர் அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துப் பயனர் தரவும் நீக்கப்படும்."</string>
+    <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="8110939900089863103">"மொபைலை அன்லாக் செய்ய <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக முயன்றால், இந்தப் பயனர் அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துப் பயனர் தரவும் நீக்கப்படும்."</string>
+    <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="8509811676952707883">"டேப்லெட்டை அன்லாக் செய்ய, <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இந்தப் பயனர் அகற்றப்படும் இதனால் அதிலுள்ள அனைத்துப் பயனர் தரவும் நீக்கப்படும்."</string>
+    <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="3051962486994265014">"மொபைலை அன்லாக் செய்ய <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டதனால் இந்தப் பயனர் அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துப் பயனர் தரவும் நீக்கப்படும்."</string>
+    <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="1049523640263353830">"டேப்லெட்டை அன்லாக் செய்ய, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக முயன்றால், பணிக் கணக்கு அகற்றப்படும். இதனால் அதிலுள்ள அனைத்து சுயவிவரத் தரவும் நீக்கப்படும்."</string>
+    <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="3280816298678433681">"மொபைலை அன்லாக் செய்ய, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயன்றுவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக முயன்றால், பணிக் கணக்கு அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துச் சுயவிவரத் தரவும் நீக்கப்படும்."</string>
+    <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4417100487251371559">"டேப்லெட்டை அன்லாக் செய்ய <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டதனால் பணிக் கணக்கு அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துச் சுயவிவரத் தரவும் நீக்கப்படும்."</string>
+    <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"மொபைலை அன்லாக் செய்ய, <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டதனால் பணிக் கணக்கு அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துச் சுயவிவரத் தரவும் நீக்கப்படும்."</string>
+    <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"அன்லாக் பேட்டர்னை, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், மின்னஞ்சல் கணக்கைப் பயன்படுத்தி டேப்லெட்டை அன்லாக் செய்யும்படி கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
+    <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"அன்லாக் பேட்டர்னை, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், மின்னஞ்சல் கணக்கைப் பயன்படுத்தி மொபைலை அன்லாக் செய்யும்படி கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
     <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"மேலும் விருப்பங்களுக்கு மொபைலை அன்லாக் செய்யவும்"</string>
     <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"மேலும் விருப்பங்களுக்கு டேப்லெட்டை அன்லாக் செய்யவும்"</string>
     <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"மேலும் விருப்பங்களுக்குச் சாதனத்தை அன்லாக் செய்யவும்"</string>
diff --git a/packages/SystemUI/res/layout/global_screenshot_static.xml b/packages/SystemUI/res/layout/global_screenshot_static.xml
index 665d4a0..e4a9694 100644
--- a/packages/SystemUI/res/layout/global_screenshot_static.xml
+++ b/packages/SystemUI/res/layout/global_screenshot_static.xml
@@ -131,4 +131,13 @@
         app:layout_constraintStart_toStartOf="@id/global_screenshot_preview"
         app:layout_constraintTop_toTopOf="@id/global_screenshot_preview"
         android:elevation="@dimen/screenshot_preview_elevation"/>
+    <View
+        android:id="@+id/screenshot_transition_view"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:visibility="invisible"
+        app:layout_constraintStart_toStartOf="@id/global_screenshot_preview"
+        app:layout_constraintTop_toTopOf="@id/global_screenshot_preview"
+        app:layout_constraintEnd_toEndOf="@id/global_screenshot_preview"
+        app:layout_constraintBottom_toBottomOf="@id/global_screenshot_preview"/>
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/packages/SystemUI/res/layout/long_screenshot.xml b/packages/SystemUI/res/layout/long_screenshot.xml
index 8a2c8f0..8a3a39f 100644
--- a/packages/SystemUI/res/layout/long_screenshot.xml
+++ b/packages/SystemUI/res/layout/long_screenshot.xml
@@ -38,20 +38,21 @@
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintBottom_toTopOf="@id/preview" />
 
-    <Button
-        android:id="@+id/cancel"
-        style="@android:style/Widget.DeviceDefault.Button.Colored"
-        android:layout_width="wrap_content"
-        android:layout_height="40dp"
-        android:text="@android:string/cancel"
-        android:layout_marginStart="6dp"
+    <ImageButton
+        android:id="@+id/delete"
+        style="@android:style/Widget.Material.Button.Borderless"
+        android:tint="?android:textColorPrimary"
+        android:layout_width="48dp"
+        android:layout_height="48dp"
         android:layout_marginTop="4dp"
-        android:background="@drawable/screenshot_button_background"
-        android:textColor="?android:textColorSecondary"
-        app:layout_constraintStart_toEndOf="@id/save"
+        android:padding="12dp"
+        android:src="@drawable/ic_screenshot_delete"
+        android:scaleType="fitCenter"
+        android:contentDescription="@*android:string/delete"
+        android:tooltipText="@*android:string/delete"
+        app:layout_constraintEnd_toStartOf="@id/share"
         app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toTopOf="@id/preview"
-    />
+        app:layout_constraintBottom_toTopOf="@id/preview" />
 
     <ImageButton
         android:id="@+id/share"
@@ -159,7 +160,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:layout_constraintTop_toTopOf="@id/preview"
-        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
         android:scaleType="centerCrop"
         android:visibility="invisible"
         />
diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml b/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml
index 51cab0a..bff93a9 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml
@@ -26,7 +26,6 @@
     android:layout_gravity="top"
     android:orientation="horizontal"
     android:clickable="true"
-    android:paddingTop="@dimen/status_bar_padding_top"
     android:minHeight="48dp">
 
     <FrameLayout
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index bb48ad5..7fc978b 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Sien onlangse boodskappe, gemiste oproepe en statusopdaterings"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Gesprek"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Onderbreek deur Moenie Steur nie"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> het \'n boodskap gestuur: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> het \'n prent gestuur"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> het \'n statusopdatering: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Kon nie jou batterymeter lees nie"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tik vir meer inligting"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Geen wekker nie"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 10371c4..6b9e40d 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"በስልክዎ በመጠቀም ፈጣን እና የበለጠ ደህንነቱ በተጠበቀ መንገድ ግዢዎችን ለመፈጸም ዝግጁ ይሁኑ"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"ሁሉንም አሳይ"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"ለመክፈል ይክፈቱ"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"ካርድ አክል"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"በማዘመን ላይ"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ለማየት ይክፈቱ"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"የእርስዎን ካርዶች ማግኘት ላይ ችግር ነበር፣ እባክዎ ቆይተው እንደገና ይሞክሩ"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"የገጽ መቆለፊያ ቅንብሮች"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"የቅርብ ጊዜ መልዕክቶችን፣ ያመለጡ ጥሪዎች እና፣ የሁኔታ ዝመናዎችን ይመልከቱ"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"ውይይት"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"በአትረብሽ ባለበት ቆሟል"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> መልዕክት ልከዋል፦ <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ምስል ልኳል"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> የሁኔታ ዝማኔ አለው፦ <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"የባትሪ መለኪያዎን የማንበብ ችግር"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ለበለጠ መረጃ መታ ያድርጉ"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ምንም ማንቂያ አልተቀናበረም"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 3360546..fe91b68 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -681,10 +681,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"يمكنك إعداد طريقة دفع لإجراء عمليات شراء بسرعة وأمان أكبر باستخدام هاتفك."</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"عرض الكل"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"فتح القفل للدفع"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"إضافة بطاقة"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"جارٍ تحديث تطبيق المحفظة"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"فتح القفل للاستخدام"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"حدثت مشكلة أثناء الحصول على البطاقات، يُرجى إعادة المحاولة لاحقًا."</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"إعدادات شاشة القفل"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index dd09dde..ba6d3f4 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"আপোনাৰ ফ’নটোৰে দ্ৰুত তথা অধিক সুৰক্ষিত ক্ৰয় কৰিবলৈ ছেট আপ পাওক"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"আটাইবোৰ দেখুৱাওক"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"পৰিশোধ কৰিবলৈ আনলক কৰক"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"এখন কাৰ্ড যোগ দিয়ক"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"আপডে’ট কৰি থকা হৈছে"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ব্যৱহাৰ কৰিবলৈ আনলক কৰক"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"আপোনাৰ কাৰ্ড লাভ কৰোঁতে এটা সমস্যা হৈছে, অনুগ্ৰহ কৰি পাছত পুনৰ চেষ্টা কৰক"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"লক স্ক্ৰীনৰ ছেটিং"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 035df7c..5cb4422 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Telefonunuzla daha sürətli və təhlükəsiz satınalmalar etmək üçün ayarlayın"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Hamısını göstər"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Ödəmək üçün kiliddən çıxarın"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Kart əlavə edin"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Güncəllənir"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"İstifadə etmək üçün kiliddən çıxarın"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Kartların əldə edilməsində problem oldu, sonra yenidən cəhd edin"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Kilid ekranı ayarları"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 80652c7..a179b93 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -1152,11 +1152,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Pogledajte nedavne poruke, propuštene pozive i ažuriranja statusa"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Konverzacija"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Pauzirano režimom Ne uznemiravaj"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> je poslao/la poruku: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> šalje sliku"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ima ažuriranje statusa: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem sa očitavanjem merača baterije"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dodirnite za više informacija"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Alarm nije podešen"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index b2a463b..704c19c 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -675,10 +675,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Наладзьце картку, каб рабіць больш хуткія і бяспечныя куплі з дапамогай тэлефона"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Паказаць усе"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Разблакіраваць для аплаты"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Дадаць карту"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Ідзе абнаўленне"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Разблакіраваць для выкарыстання"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Узнікла праблема з загрузкай вашых карт. Паўтарыце спробу пазней"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Налады экрана блакіроўкі"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index f6d3975..04a734d 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -671,8 +671,7 @@
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"পেমেন্ট করতে ডিভাইস আনলক করুন"</string>
     <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
     <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"আপডেট হচ্ছে"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ব্যবহার করতে আনলক করুন"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"আপনার কার্ড সংক্রান্ত তথ্য পেতে সমস্যা হয়েছে, পরে আবার চেষ্টা করুন"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"লক স্ক্রিন সেটিংস"</string>
diff --git a/packages/SystemUI/res/values-bn/tiles_states_strings.xml b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
new file mode 100644
index 0000000..631446d
--- /dev/null
+++ b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (C) 2021 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<!--  This resources set the default subtitle for tiles. This way, each tile can be translated
+     separately.
+     The indices in the array correspond to the state values in QSTile:
+      * STATE_UNAVAILABLE
+      * STATE_INACTIVE
+      * STATE_ACTIVE
+     This subtitle is shown when the tile is in that particular state but does not set its own
+     subtitle, so some of these may never appear on screen. They should still be translated as if
+     they could appear.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for tile_states_default:0 (4578901299524323311) -->
+    <!-- no translation found for tile_states_default:1 (7086813178962737808) -->
+    <!-- no translation found for tile_states_default:2 (9192445505551219506) -->
+  <string-array name="tile_states_internet">
+    <item msgid="5499482407653291407">"উপলভ্য নেই"</item>
+    <item msgid="3048856902433862868">"বন্ধ আছে"</item>
+    <item msgid="6877982264300789870">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_wifi">
+    <item msgid="8054147400538405410">"উপলভ্য নেই"</item>
+    <item msgid="4293012229142257455">"বন্ধ আছে"</item>
+    <item msgid="6221288736127914861">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_cell">
+    <item msgid="1235899788959500719">"উপলভ্য নেই"</item>
+    <item msgid="2074416252859094119">"বন্ধ আছে"</item>
+    <item msgid="287997784730044767">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_battery">
+    <item msgid="6311253873330062961">"উপলভ্য নেই"</item>
+    <item msgid="7838121007534579872">"বন্ধ আছে"</item>
+    <item msgid="1578872232501319194">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_dnd">
+    <item msgid="467587075903158357">"উপলভ্য নেই"</item>
+    <item msgid="5376619709702103243">"বন্ধ আছে"</item>
+    <item msgid="4875147066469902392">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_flashlight">
+    <item msgid="3465257127433353857">"উপলভ্য নেই"</item>
+    <item msgid="5044688398303285224">"বন্ধ আছে"</item>
+    <item msgid="8527389108867454098">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_rotation">
+    <item msgid="4578491772376121579">"উপলভ্য নেই"</item>
+    <item msgid="5776427577477729185">"বন্ধ আছে"</item>
+    <item msgid="7105052717007227415">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_bt">
+    <item msgid="5330252067413512277">"উপলভ্য নেই"</item>
+    <item msgid="5315121904534729843">"বন্ধ আছে"</item>
+    <item msgid="503679232285959074">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_airplane">
+    <item msgid="1985366811411407764">"উপলভ্য নেই"</item>
+    <item msgid="4801037224991420996">"বন্ধ আছে"</item>
+    <item msgid="1982293347302546665">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_location">
+    <item msgid="3316542218706374405">"উপলভ্য নেই"</item>
+    <item msgid="4813655083852587017">"বন্ধ আছে"</item>
+    <item msgid="6744077414775180687">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_hotspot">
+    <item msgid="3145597331197351214">"উপলভ্য নেই"</item>
+    <item msgid="5715725170633593906">"বন্ধ আছে"</item>
+    <item msgid="2075645297847971154">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_inversion">
+    <item msgid="3638187931191394628">"উপলভ্য নেই"</item>
+    <item msgid="9103697205127645916">"বন্ধ আছে"</item>
+    <item msgid="8067744885820618230">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_saver">
+    <item msgid="39714521631367660">"উপলভ্য নেই"</item>
+    <item msgid="6983679487661600728">"বন্ধ আছে"</item>
+    <item msgid="7520663805910678476">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_dark">
+    <item msgid="2762596907080603047">"উপলভ্য নেই"</item>
+    <item msgid="400477985171353">"বন্ধ আছে"</item>
+    <item msgid="630890598801118771">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_work">
+    <item msgid="389523503690414094">"উপলভ্য নেই"</item>
+    <item msgid="8045580926543311193">"বন্ধ আছে"</item>
+    <item msgid="4913460972266982499">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_cast">
+    <item msgid="6032026038702435350">"উপলভ্য নেই"</item>
+    <item msgid="1488620600954313499">"বন্ধ আছে"</item>
+    <item msgid="588467578853244035">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_night">
+    <item msgid="7857498964264855466">"উপলভ্য নেই"</item>
+    <item msgid="2744885441164350155">"বন্ধ আছে"</item>
+    <item msgid="151121227514952197">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_screenrecord">
+    <item msgid="1085836626613341403">"উপলভ্য নেই"</item>
+    <item msgid="8259411607272330225">"বন্ধ আছে"</item>
+    <item msgid="578444932039713369">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_reverse">
+    <item msgid="3574611556622963971">"উপলভ্য নেই"</item>
+    <item msgid="8707481475312432575">"বন্ধ আছে"</item>
+    <item msgid="8031106212477483874">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_reduce_brightness">
+    <item msgid="1839836132729571766">"উপলভ্য নেই"</item>
+    <item msgid="4572245614982283078">"বন্ধ আছে"</item>
+    <item msgid="6536448410252185664">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_cameratoggle">
+    <item msgid="6680671247180519913">"উপলভ্য নেই"</item>
+    <item msgid="4765607635752003190">"বন্ধ আছে"</item>
+    <item msgid="1697460731949649844">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_mictoggle">
+    <item msgid="6895831614067195493">"উপলভ্য নেই"</item>
+    <item msgid="3296179158646568218">"বন্ধ আছে"</item>
+    <item msgid="8998632451221157987">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_controls">
+    <item msgid="8199009425335668294">"উপলভ্য নেই"</item>
+    <item msgid="4544919905196727508">"বন্ধ আছে"</item>
+    <item msgid="3422023746567004609">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_wallet">
+    <item msgid="4177615438710836341">"উপলভ্য নেই"</item>
+    <item msgid="7571394439974244289">"বন্ধ আছে"</item>
+    <item msgid="6866424167599381915">"চালু আছে"</item>
+  </string-array>
+  <string-array name="tile_states_alarm">
+    <item msgid="4936533380177298776">"উপলভ্য নেই"</item>
+    <item msgid="2710157085538036590">"বন্ধ আছে"</item>
+    <item msgid="7809470840976856149">"চালু আছে"</item>
+  </string-array>
+</resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 27ddcaf..47d0773 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -672,7 +672,7 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Postavite aplikaciju za brže i sigurnije kupovine putem telefona"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Prikaži sve"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Otključaj za plaćanje"</string>
-    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Dodaj karticu"</string>
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Dodajte karticu"</string>
     <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Ažuriranje"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Otključajte da koristite"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Došlo je do problema prilikom preuzimanja vaših kartica. Pokušajte ponovo kasnije"</string>
@@ -1152,11 +1152,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Pregledajte nedavne poruke, propuštene pozive i ažuriranja statusa"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Razgovor"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Pauzirala je funkcija Ne ometaj"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> je poslao/la poruku: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> je poslao/la sliku"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> je ažurirao/la status: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Došlo je do problema prilikom očitavanja mjerača stanja baterije"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dodirnite za više informacija"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nije postavljen alarm"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 1d77e0d..abcefec 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Consulta els missatges recents, les trucades perdudes i les actualitzacions d\'estat"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Posat en pausa pel mode No molestis"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ha enviat un missatge: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ha enviat una imatge"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> té una actualització d\'estat: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Hi ha hagut un problema en llegir el mesurador de la bateria"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toca per obtenir més informació"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Cap alarma configurada"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index a3f7a95..bac30d8 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -520,7 +520,7 @@
     <string name="manage_notifications_text" msgid="6885645344647733116">"Spravovat"</string>
     <string name="manage_notifications_history_text" msgid="57055985396576230">"Historie"</string>
     <string name="notification_section_header_incoming" msgid="850925217908095197">"Nové"</string>
-    <string name="notification_section_header_gentle" msgid="6804099527336337197">"Tiché"</string>
+    <string name="notification_section_header_gentle" msgid="6804099527336337197">"Tichá oznámení"</string>
     <string name="notification_section_header_alerting" msgid="5581175033680477651">"Oznámení"</string>
     <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzace"</string>
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vymazat všechna tichá oznámení"</string>
@@ -675,10 +675,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Nastavte si rychlejší a bezpečnější platby pomocí telefonu"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Zobrazit vše"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Odemknout a zaplatit"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Přidat kartu"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Aktualizace"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Odemknout a použít"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Při načítání karet došlo k problému, zkuste to později"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Nastavení obrazovky uzamčení"</string>
@@ -737,7 +735,7 @@
     <string name="inline_silent_button_keep_alerting" msgid="6577845442184724992">"Dál upozorňovat"</string>
     <string name="inline_turn_off_notifications" msgid="8543989584403106071">"Vypnout oznámení"</string>
     <string name="inline_keep_showing_app" msgid="4393429060390649757">"Mají se oznámení z této aplikace nadále zobrazovat?"</string>
-    <string name="notification_silence_title" msgid="8608090968400832335">"Ticho"</string>
+    <string name="notification_silence_title" msgid="8608090968400832335">"Tiché"</string>
     <string name="notification_alert_title" msgid="3656229781017543655">"Výchozí"</string>
     <string name="notification_automatic_title" msgid="3745465364578762652">"Automaticky"</string>
     <string name="notification_channel_summary_low" msgid="4860617986908931158">"Žádný zvuk ani vibrace"</string>
@@ -750,10 +748,10 @@
     <string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"&lt;b&gt;Stav:&lt;/b&gt; priorita snížena na Tiché"</string>
     <string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"&lt;b&gt;Stav:&lt;/b&gt; zařazeno výše"</string>
     <string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Stav:&lt;/b&gt; zařazeno níže"</string>
-    <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Zobrazuje se v horní části oznámení konverzace a jako profilový obrázek na obrazovce uzamčení"</string>
-    <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Zobrazuje se v horní části oznámení konverzace a jako profilový obrázek na obrazovce uzamčení, má podobu bubliny"</string>
-    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Zobrazuje se v horní části oznámení konverzace a jako profilový obrázek na obrazovce uzamčení, deaktivuje režim Nerušit"</string>
-    <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Zobrazuje se v horní části oznámení konverzace a jako profilový obrázek na obrazovce uzamčení, má podobu bubliny a deaktivuje režim Nerušit"</string>
+    <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Zobrazuje se v horní části sekce konverzací a na obrazovce uzamčení se objevuje jako profilová fotka"</string>
+    <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Zobrazuje se v horní části sekce konverzací a na obrazovce uzamčení se objevuje jako profilová fotka, má podobu bubliny"</string>
+    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Zobrazuje se v horní části sekce konverzací a na obrazovce uzamčení se objevuje jako profilová fotka, deaktivuje režim Nerušit"</string>
+    <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Zobrazuje se v horní části sekce konverzací a na obrazovce uzamčení se objevuje jako profilová fotka, má podobu bubliny a deaktivuje režim Nerušit"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavení"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> funkce konverzace nepodporuje"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 9e69a00..cb06aa7 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Bliv klar til at foretage hurtigere og mere sikre køb med din telefon"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Vis alle"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Lås op for at betale"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Tilføj et kort"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Opdaterer"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Lås op for at bruge"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Dine kort kunne ikke hentes. Prøv igen senere."</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Lås skærmindstillinger"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Se dine seneste beskeder, mistede opkald og statusopdateringer"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Samtale"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Sat på pause af Forstyr ikke"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> har sendt en besked: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> har sendt et billede"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> har opdateret sin status: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Der er problemer med at aflæse dit batteriniveau"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tryk for at få flere oplysninger"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ingen alarm er indstillet"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 461c257..36e837e 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Letzte Nachrichten, verpasste Anrufe und Statusaktualisierungen ansehen"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Unterhaltung"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Durch „Bitte nicht stören“ pausiert"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> hat eine Nachricht gesendet: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> hat ein Bild gesendet"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> hat den Status aktualisiert: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem beim Lesen des Akkustands"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Für weitere Informationen tippen"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Kein Wecker gestellt"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 98692fa..04e69f1 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Δείτε πρόσφατα μηνύματα, αναπάντητες κλήσεις και ενημερώσεις κατάστασης"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Συνομιλία"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Σε παύση από τη λειτουργία Μην ενοχλείτε"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"Ο χρήστης <xliff:g id="NAME">%1$s</xliff:g> έστειλε ένα μήνυμα: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"Ο χρήστης <xliff:g id="NAME">%1$s</xliff:g> έστειλε μια εικόνα"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"Ο χρήστης <xliff:g id="NAME">%1$s</xliff:g> έχει μια ενημέρωση κατάστασης: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Υπάρχει κάποιο πρόβλημα με την ανάγνωση του μετρητή μπαταρίας"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Πατήστε για περισσότερες πληροφορίες."</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Δεν ορίστηκε ξυπνητ."</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index a200eae..043c374 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls and status updates"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Paused by Do Not Disturb"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> sent a message: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> has a status update: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem reading your battery meter"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tap for more information"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No alarm set"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 023d533..514747a 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls and status updates"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Paused by Do Not Disturb"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> sent a message: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> has a status update: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem reading your battery meter"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tap for more information"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No alarm set"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index a200eae..043c374 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls and status updates"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Paused by Do Not Disturb"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> sent a message: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> has a status update: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem reading your battery meter"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tap for more information"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No alarm set"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index a200eae..043c374 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls and status updates"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Paused by Do Not Disturb"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> sent a message: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> has a status update: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem reading your battery meter"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tap for more information"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No alarm set"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 8a1ce13..2c73966 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎‏‎‎‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎See recent messages, missed calls, and status updates‎‏‎‎‏‎"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎Conversation‎‏‎‎‏‎"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‎‏‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎Paused by Do Not Disturb‎‏‎‎‏‎"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‏‎‎‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ sent a message: ‎‏‎‎‏‏‎<xliff:g id="NOTIFICATION">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ sent an image‎‏‎‎‏‎"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ has a status update: ‎‏‎‎‏‏‎<xliff:g id="STATUS">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎Problem reading your battery meter‎‏‎‎‏‎"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‎‎‏‏‎Tap for more information‎‏‎‎‏‎"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎No alarm set‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index fa19aab..0e1d014 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -1034,7 +1034,7 @@
     <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">"Botón"</string>
-    <string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"El botón de accesibilidad reemplaza el gesto de accesibilidad\n\n"<annotation id="link">"Ver configuración"</annotation></string>
+    <string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"El botón de accesibilidad ha reemplazado el gesto de accesibilidad\n\n"<annotation id="link">"Ver configuración"</annotation></string>
     <string name="accessibility_floating_button_switch_migration_tooltip" msgid="6248529129221218770">"Puedes cambiar de un gesto a un botón de accesibilidad\n\n"<annotation id="link">"Configuración"</annotation></string>
     <string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Mueve el botón hacia el borde para ocultarlo temporalmente"</string>
     <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Mover arriba a la izquierda"</string>
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Consulta mensajes recientes, llamadas perdidas y actualizaciones de estado"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversación"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Se detuvo por el modo No interrumpir"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> envió un mensaje: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> envió una imagen"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> actualizó su estado: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problema al leer el medidor de batería"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Presiona para obtener más información"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"No se estableció alarma"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
index 6e6c148..5634f79 100644
--- a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
@@ -33,127 +33,127 @@
     <!-- no translation found for tile_states_default:2 (9192445505551219506) -->
   <string-array name="tile_states_internet">
     <item msgid="5499482407653291407">"No disponible"</item>
-    <item msgid="3048856902433862868">"No"</item>
-    <item msgid="6877982264300789870">"Sí"</item>
+    <item msgid="3048856902433862868">"Desactivado"</item>
+    <item msgid="6877982264300789870">"Activado"</item>
   </string-array>
   <string-array name="tile_states_wifi">
     <item msgid="8054147400538405410">"No disponible"</item>
-    <item msgid="4293012229142257455">"No"</item>
-    <item msgid="6221288736127914861">"Sí"</item>
+    <item msgid="4293012229142257455">"Desactivado"</item>
+    <item msgid="6221288736127914861">"Activado"</item>
   </string-array>
   <string-array name="tile_states_cell">
     <item msgid="1235899788959500719">"No disponible"</item>
-    <item msgid="2074416252859094119">"No"</item>
-    <item msgid="287997784730044767">"Sí"</item>
+    <item msgid="2074416252859094119">"Desactivado"</item>
+    <item msgid="287997784730044767">"Activado"</item>
   </string-array>
   <string-array name="tile_states_battery">
     <item msgid="6311253873330062961">"No disponible"</item>
-    <item msgid="7838121007534579872">"No"</item>
-    <item msgid="1578872232501319194">"Sí"</item>
+    <item msgid="7838121007534579872">"Desactivado"</item>
+    <item msgid="1578872232501319194">"Activado"</item>
   </string-array>
   <string-array name="tile_states_dnd">
     <item msgid="467587075903158357">"No disponible"</item>
-    <item msgid="5376619709702103243">"No"</item>
-    <item msgid="4875147066469902392">"Sí"</item>
+    <item msgid="5376619709702103243">"Desactivado"</item>
+    <item msgid="4875147066469902392">"Activado"</item>
   </string-array>
   <string-array name="tile_states_flashlight">
     <item msgid="3465257127433353857">"No disponible"</item>
-    <item msgid="5044688398303285224">"No"</item>
-    <item msgid="8527389108867454098">"Sí"</item>
+    <item msgid="5044688398303285224">"Desactivado"</item>
+    <item msgid="8527389108867454098">"Activado"</item>
   </string-array>
   <string-array name="tile_states_rotation">
     <item msgid="4578491772376121579">"No disponible"</item>
-    <item msgid="5776427577477729185">"No"</item>
-    <item msgid="7105052717007227415">"Sí"</item>
+    <item msgid="5776427577477729185">"Desactivado"</item>
+    <item msgid="7105052717007227415">"Activado"</item>
   </string-array>
   <string-array name="tile_states_bt">
     <item msgid="5330252067413512277">"No disponible"</item>
-    <item msgid="5315121904534729843">"No"</item>
-    <item msgid="503679232285959074">"Sí"</item>
+    <item msgid="5315121904534729843">"Desactivado"</item>
+    <item msgid="503679232285959074">"Activado"</item>
   </string-array>
   <string-array name="tile_states_airplane">
     <item msgid="1985366811411407764">"No disponible"</item>
-    <item msgid="4801037224991420996">"No"</item>
-    <item msgid="1982293347302546665">"Sí"</item>
+    <item msgid="4801037224991420996">"Desactivado"</item>
+    <item msgid="1982293347302546665">"Activado"</item>
   </string-array>
   <string-array name="tile_states_location">
     <item msgid="3316542218706374405">"No disponible"</item>
-    <item msgid="4813655083852587017">"No"</item>
-    <item msgid="6744077414775180687">"Sí"</item>
+    <item msgid="4813655083852587017">"Desactivado"</item>
+    <item msgid="6744077414775180687">"Activado"</item>
   </string-array>
   <string-array name="tile_states_hotspot">
     <item msgid="3145597331197351214">"No disponible"</item>
-    <item msgid="5715725170633593906">"No"</item>
-    <item msgid="2075645297847971154">"Sí"</item>
+    <item msgid="5715725170633593906">"Desactivado"</item>
+    <item msgid="2075645297847971154">"Activado"</item>
   </string-array>
   <string-array name="tile_states_inversion">
     <item msgid="3638187931191394628">"No disponible"</item>
-    <item msgid="9103697205127645916">"No"</item>
-    <item msgid="8067744885820618230">"Sí"</item>
+    <item msgid="9103697205127645916">"Desactivado"</item>
+    <item msgid="8067744885820618230">"Activado"</item>
   </string-array>
   <string-array name="tile_states_saver">
     <item msgid="39714521631367660">"No disponible"</item>
-    <item msgid="6983679487661600728">"No"</item>
-    <item msgid="7520663805910678476">"Sí"</item>
+    <item msgid="6983679487661600728">"Desactivado"</item>
+    <item msgid="7520663805910678476">"Activado"</item>
   </string-array>
   <string-array name="tile_states_dark">
     <item msgid="2762596907080603047">"No disponible"</item>
-    <item msgid="400477985171353">"No"</item>
-    <item msgid="630890598801118771">"Sí"</item>
+    <item msgid="400477985171353">"Desactivado"</item>
+    <item msgid="630890598801118771">"Activado"</item>
   </string-array>
   <string-array name="tile_states_work">
     <item msgid="389523503690414094">"No disponible"</item>
-    <item msgid="8045580926543311193">"No"</item>
-    <item msgid="4913460972266982499">"Sí"</item>
+    <item msgid="8045580926543311193">"Desactivado"</item>
+    <item msgid="4913460972266982499">"Activado"</item>
   </string-array>
   <string-array name="tile_states_cast">
     <item msgid="6032026038702435350">"No disponible"</item>
-    <item msgid="1488620600954313499">"No"</item>
-    <item msgid="588467578853244035">"Sí"</item>
+    <item msgid="1488620600954313499">"Desactivado"</item>
+    <item msgid="588467578853244035">"Activado"</item>
   </string-array>
   <string-array name="tile_states_night">
     <item msgid="7857498964264855466">"No disponible"</item>
-    <item msgid="2744885441164350155">"No"</item>
-    <item msgid="151121227514952197">"Sí"</item>
+    <item msgid="2744885441164350155">"Desactivada"</item>
+    <item msgid="151121227514952197">"Activada"</item>
   </string-array>
   <string-array name="tile_states_screenrecord">
     <item msgid="1085836626613341403">"No disponible"</item>
-    <item msgid="8259411607272330225">"No"</item>
-    <item msgid="578444932039713369">"Sí"</item>
+    <item msgid="8259411607272330225">"Desactivado"</item>
+    <item msgid="578444932039713369">"Activado"</item>
   </string-array>
   <string-array name="tile_states_reverse">
     <item msgid="3574611556622963971">"No disponible"</item>
-    <item msgid="8707481475312432575">"No"</item>
-    <item msgid="8031106212477483874">"Sí"</item>
+    <item msgid="8707481475312432575">"Desactivado"</item>
+    <item msgid="8031106212477483874">"Activado"</item>
   </string-array>
   <string-array name="tile_states_reduce_brightness">
     <item msgid="1839836132729571766">"No disponible"</item>
-    <item msgid="4572245614982283078">"No"</item>
-    <item msgid="6536448410252185664">"Sí"</item>
+    <item msgid="4572245614982283078">"Desactivado"</item>
+    <item msgid="6536448410252185664">"Activado"</item>
   </string-array>
   <string-array name="tile_states_cameratoggle">
     <item msgid="6680671247180519913">"No disponible"</item>
-    <item msgid="4765607635752003190">"No"</item>
-    <item msgid="1697460731949649844">"Sí"</item>
+    <item msgid="4765607635752003190">"Desactivado"</item>
+    <item msgid="1697460731949649844">"Activado"</item>
   </string-array>
   <string-array name="tile_states_mictoggle">
     <item msgid="6895831614067195493">"No disponible"</item>
-    <item msgid="3296179158646568218">"No"</item>
-    <item msgid="8998632451221157987">"Sí"</item>
+    <item msgid="3296179158646568218">"Desactivado"</item>
+    <item msgid="8998632451221157987">"Activado"</item>
   </string-array>
   <string-array name="tile_states_controls">
     <item msgid="8199009425335668294">"No disponible"</item>
-    <item msgid="4544919905196727508">"No"</item>
-    <item msgid="3422023746567004609">"Sí"</item>
+    <item msgid="4544919905196727508">"Desactivado"</item>
+    <item msgid="3422023746567004609">"Activado"</item>
   </string-array>
   <string-array name="tile_states_wallet">
     <item msgid="4177615438710836341">"No disponible"</item>
-    <item msgid="7571394439974244289">"No"</item>
-    <item msgid="6866424167599381915">"Sí"</item>
+    <item msgid="7571394439974244289">"Desactivado"</item>
+    <item msgid="6866424167599381915">"Activado"</item>
   </string-array>
   <string-array name="tile_states_alarm">
     <item msgid="4936533380177298776">"No disponible"</item>
-    <item msgid="2710157085538036590">"No"</item>
-    <item msgid="7809470840976856149">"Sí"</item>
+    <item msgid="2710157085538036590">"Desactivado"</item>
+    <item msgid="7809470840976856149">"Activado"</item>
   </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index c117733..6f23634 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Consulta los mensajes recientes, las llamadas perdidas y los cambios de estado"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversación"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Pausado por No molestar"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ha enviado un mensaje: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ha enviado una imagen"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ha cambiado su estado: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"No se ha podido leer el indicador de batería"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toca la pantalla para consultar más información"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ninguna alarma puesta"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 6c3f37a..734fb3e 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Konfiguratu erosketa bizkorrago eta seguruagoak egiteko telefonoarekin"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Erakutsi guztiak"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Desblokeatu ordaintzeko"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Gehitu txartel bat"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Eguneratzen"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Desblokeatu erabiltzeko"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Arazo bat izan da txartelak eskuratzean. Saiatu berriro geroago."</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Pantaila blokeatuaren ezarpenak"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Ikusi azken mezuak, dei galduak eta egoerari buruzko informazio eguneratua"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Elkarrizketa"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Ez molestatzeko moduak pausatu du"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzaileak mezu bat bidali du: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzaileak irudi bat bidali du"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzaileak egoera eguneratu du: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Arazo bat gertatu da bateria-neurgailua irakurtzean"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Informazio gehiago lortzeko, sakatu hau"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ez da ezarri alarmarik"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 7b4e236..e85dba2 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"برای خرید سریع‌تر و امن‌تر با تلفن، راه‌اندازی کنید"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"نمایش همه"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"باز کردن قفل برای پرداخت"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"افزودن کارت"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"درحال به‌روزرسانی"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"برای استفاده، قفل را باز کنید"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"هنگام دریافت کارت‌ها مشکلی پیش آمد، لطفاً بعداً دوباره امتحان کنید"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"تنظیمات صفحه قفل"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 0f63288..98b9953 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Lisää maksutapa, niin voit maksaa nopeasti ja turvallisesti puhelimella"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Näytä kaikki"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Avaa lukitus ja maksa"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Lisää kortti"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Päivitetään"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Avaa lukitus ja käytä"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Korttien noutamisessa oli ongelma, yritä myöhemmin uudelleen"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Lukitusnäytön asetukset"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Katso viimeaikaiset viestit, vastaamattomat puhelut ja tilapäivitykset"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Keskustelu"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Älä häiritse ‑tilan keskeyttämä"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> lähetti viestin: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> lähetti kuvan"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> on päivittänyt tilansa: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Ongelma akkumittarin lukemisessa"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Saat lisätietoja napauttamalla"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ei herätyksiä"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 6ec3542..358d448 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Préparez-vous à faire des achats plus rapidement et de façon plus sûre avec votre téléphone"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Tout afficher"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Déverrouiller pour payer"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Ajouter une carte"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Mise à jour en cours…"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Déverrouiller pour utiliser"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Un problème est survenu lors de la récupération de vos cartes, veuillez réessayer plus tard"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Paramètres de l\'écran de verrouillage"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
new file mode 100644
index 0000000..30870dd
--- /dev/null
+++ b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (C) 2021 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<!--  This resources set the default subtitle for tiles. This way, each tile can be translated
+     separately.
+     The indices in the array correspond to the state values in QSTile:
+      * STATE_UNAVAILABLE
+      * STATE_INACTIVE
+      * STATE_ACTIVE
+     This subtitle is shown when the tile is in that particular state but does not set its own
+     subtitle, so some of these may never appear on screen. They should still be translated as if
+     they could appear.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for tile_states_default:0 (4578901299524323311) -->
+    <!-- no translation found for tile_states_default:1 (7086813178962737808) -->
+    <!-- no translation found for tile_states_default:2 (9192445505551219506) -->
+  <string-array name="tile_states_internet">
+    <item msgid="5499482407653291407">"Non disponible"</item>
+    <item msgid="3048856902433862868">"Désactivé"</item>
+    <item msgid="6877982264300789870">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_wifi">
+    <item msgid="8054147400538405410">"Non disponible"</item>
+    <item msgid="4293012229142257455">"Désactivé"</item>
+    <item msgid="6221288736127914861">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_cell">
+    <item msgid="1235899788959500719">"Non disponible"</item>
+    <item msgid="2074416252859094119">"Désactivées"</item>
+    <item msgid="287997784730044767">"Activées"</item>
+  </string-array>
+  <string-array name="tile_states_battery">
+    <item msgid="6311253873330062961">"Non disponible"</item>
+    <item msgid="7838121007534579872">"Désactivé"</item>
+    <item msgid="1578872232501319194">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_dnd">
+    <item msgid="467587075903158357">"Non disponible"</item>
+    <item msgid="5376619709702103243">"Désactivé"</item>
+    <item msgid="4875147066469902392">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_flashlight">
+    <item msgid="3465257127433353857">"Non disponible"</item>
+    <item msgid="5044688398303285224">"Désactivée"</item>
+    <item msgid="8527389108867454098">"Activée"</item>
+  </string-array>
+  <string-array name="tile_states_rotation">
+    <item msgid="4578491772376121579">"Non disponible"</item>
+    <item msgid="5776427577477729185">"Désactivée"</item>
+    <item msgid="7105052717007227415">"Activée"</item>
+  </string-array>
+  <string-array name="tile_states_bt">
+    <item msgid="5330252067413512277">"Non disponible"</item>
+    <item msgid="5315121904534729843">"Désactivé"</item>
+    <item msgid="503679232285959074">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_airplane">
+    <item msgid="1985366811411407764">"Non disponible"</item>
+    <item msgid="4801037224991420996">"Désactivé"</item>
+    <item msgid="1982293347302546665">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_location">
+    <item msgid="3316542218706374405">"Non disponible"</item>
+    <item msgid="4813655083852587017">"Désactivée"</item>
+    <item msgid="6744077414775180687">"Activée"</item>
+  </string-array>
+  <string-array name="tile_states_hotspot">
+    <item msgid="3145597331197351214">"Non disponible"</item>
+    <item msgid="5715725170633593906">"Désactivé"</item>
+    <item msgid="2075645297847971154">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_inversion">
+    <item msgid="3638187931191394628">"Non disponible"</item>
+    <item msgid="9103697205127645916">"Désactivée"</item>
+    <item msgid="8067744885820618230">"Activée"</item>
+  </string-array>
+  <string-array name="tile_states_saver">
+    <item msgid="39714521631367660">"Non disponible"</item>
+    <item msgid="6983679487661600728">"Désactivé"</item>
+    <item msgid="7520663805910678476">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_dark">
+    <item msgid="2762596907080603047">"Non disponible"</item>
+    <item msgid="400477985171353">"Désactivé"</item>
+    <item msgid="630890598801118771">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_work">
+    <item msgid="389523503690414094">"Non disponible"</item>
+    <item msgid="8045580926543311193">"Désactivé"</item>
+    <item msgid="4913460972266982499">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_cast">
+    <item msgid="6032026038702435350">"Non disponible"</item>
+    <item msgid="1488620600954313499">"Désactivée"</item>
+    <item msgid="588467578853244035">"Activée"</item>
+  </string-array>
+  <string-array name="tile_states_night">
+    <item msgid="7857498964264855466">"Non disponible"</item>
+    <item msgid="2744885441164350155">"Désactivé"</item>
+    <item msgid="151121227514952197">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_screenrecord">
+    <item msgid="1085836626613341403">"Non disponible"</item>
+    <item msgid="8259411607272330225">"Désactivé"</item>
+    <item msgid="578444932039713369">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_reverse">
+    <item msgid="3574611556622963971">"Non disponible"</item>
+    <item msgid="8707481475312432575">"Désactivé"</item>
+    <item msgid="8031106212477483874">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_reduce_brightness">
+    <item msgid="1839836132729571766">"Non disponible"</item>
+    <item msgid="4572245614982283078">"Désactivée"</item>
+    <item msgid="6536448410252185664">"Activée"</item>
+  </string-array>
+  <string-array name="tile_states_cameratoggle">
+    <item msgid="6680671247180519913">"Non disponible"</item>
+    <item msgid="4765607635752003190">"Désactivé"</item>
+    <item msgid="1697460731949649844">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_mictoggle">
+    <item msgid="6895831614067195493">"Non disponible"</item>
+    <item msgid="3296179158646568218">"Désactivé"</item>
+    <item msgid="8998632451221157987">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_controls">
+    <item msgid="8199009425335668294">"Non disponible"</item>
+    <item msgid="4544919905196727508">"Désactivées"</item>
+    <item msgid="3422023746567004609">"Activées"</item>
+  </string-array>
+  <string-array name="tile_states_wallet">
+    <item msgid="4177615438710836341">"Non disponible"</item>
+    <item msgid="7571394439974244289">"Désactivé"</item>
+    <item msgid="6866424167599381915">"Activé"</item>
+  </string-array>
+  <string-array name="tile_states_alarm">
+    <item msgid="4936533380177298776">"Non disponible"</item>
+    <item msgid="2710157085538036590">"Désactivée"</item>
+    <item msgid="7809470840976856149">"Activée"</item>
+  </string-array>
+</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 63a909f..6a0fc64 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Configurez pour régler vos achats de façon sûre et rapide via votre téléphone"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Tout afficher"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Déverrouiller pour payer"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Ajouter une carte"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Mise à jour…"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Déverrouiller pour utiliser"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Problème de récupération de vos cartes. Réessayez plus tard"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Paramètres de l\'écran de verrouillage"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Voir les messages récents, les appels manqués et les notifications d\'état"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Mise en pause par Ne pas déranger"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> a envoyé un message : <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> a envoyé une image"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> a mis à jour son statut : <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Un problème est survenu au niveau de la lecture de votre outil de mesure de batterie"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Appuyer pour en savoir plus"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Pas d\'alarme définie"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index c9d5ddc..94fa675 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Configura un método de pago para comprar de xeito máis rápido e seguro co teléfono"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Amosar todo"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Desbloquear para pagar"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Engadir tarxeta"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Actualizando"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Desbloquear para usar"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Produciuse un problema ao obter as tarxetas. Téntao de novo máis tarde"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Configuración da pantalla de bloqueo"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Consulta as mensaxes recentes, as chamadas perdidas e as actualizacións dos estados"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Púxose en pausa debido ao modo Non molestar"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> enviou unha mensaxe: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> enviou unha imaxe"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> cambiou de estado: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Produciuse un problema ao ler o medidor da batería"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toca para obter máis información"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Sen alarmas postas"</string>
diff --git a/packages/SystemUI/res/values-gu/tiles_states_strings.xml b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
new file mode 100644
index 0000000..67dfb34
--- /dev/null
+++ b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (C) 2021 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<!--  This resources set the default subtitle for tiles. This way, each tile can be translated
+     separately.
+     The indices in the array correspond to the state values in QSTile:
+      * STATE_UNAVAILABLE
+      * STATE_INACTIVE
+      * STATE_ACTIVE
+     This subtitle is shown when the tile is in that particular state but does not set its own
+     subtitle, so some of these may never appear on screen. They should still be translated as if
+     they could appear.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for tile_states_default:0 (4578901299524323311) -->
+    <!-- no translation found for tile_states_default:1 (7086813178962737808) -->
+    <!-- no translation found for tile_states_default:2 (9192445505551219506) -->
+  <string-array name="tile_states_internet">
+    <item msgid="5499482407653291407">"ઉપલબ્ધ નથી"</item>
+    <item msgid="3048856902433862868">"બંધ છે"</item>
+    <item msgid="6877982264300789870">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_wifi">
+    <item msgid="8054147400538405410">"ઉપલબ્ધ નથી"</item>
+    <item msgid="4293012229142257455">"બંધ છે"</item>
+    <item msgid="6221288736127914861">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_cell">
+    <item msgid="1235899788959500719">"ઉપલબ્ધ નથી"</item>
+    <item msgid="2074416252859094119">"બંધ છે"</item>
+    <item msgid="287997784730044767">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_battery">
+    <item msgid="6311253873330062961">"ઉપલબ્ધ નથી"</item>
+    <item msgid="7838121007534579872">"બંધ છે"</item>
+    <item msgid="1578872232501319194">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_dnd">
+    <item msgid="467587075903158357">"ઉપલબ્ધ નથી"</item>
+    <item msgid="5376619709702103243">"બંધ છે"</item>
+    <item msgid="4875147066469902392">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_flashlight">
+    <item msgid="3465257127433353857">"ઉપલબ્ધ નથી"</item>
+    <item msgid="5044688398303285224">"બંધ છે"</item>
+    <item msgid="8527389108867454098">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_rotation">
+    <item msgid="4578491772376121579">"ઉપલબ્ધ નથી"</item>
+    <item msgid="5776427577477729185">"બંધ છે"</item>
+    <item msgid="7105052717007227415">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_bt">
+    <item msgid="5330252067413512277">"ઉપલબ્ધ નથી"</item>
+    <item msgid="5315121904534729843">"બંધ છે"</item>
+    <item msgid="503679232285959074">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_airplane">
+    <item msgid="1985366811411407764">"ઉપલબ્ધ નથી"</item>
+    <item msgid="4801037224991420996">"બંધ છે"</item>
+    <item msgid="1982293347302546665">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_location">
+    <item msgid="3316542218706374405">"ઉપલબ્ધ નથી"</item>
+    <item msgid="4813655083852587017">"બંધ છે"</item>
+    <item msgid="6744077414775180687">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_hotspot">
+    <item msgid="3145597331197351214">"ઉપલબ્ધ નથી"</item>
+    <item msgid="5715725170633593906">"બંધ છે"</item>
+    <item msgid="2075645297847971154">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_inversion">
+    <item msgid="3638187931191394628">"ઉપલબ્ધ નથી"</item>
+    <item msgid="9103697205127645916">"બંધ છે"</item>
+    <item msgid="8067744885820618230">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_saver">
+    <item msgid="39714521631367660">"ઉપલબ્ધ નથી"</item>
+    <item msgid="6983679487661600728">"બંધ છે"</item>
+    <item msgid="7520663805910678476">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_dark">
+    <item msgid="2762596907080603047">"ઉપલબ્ધ નથી"</item>
+    <item msgid="400477985171353">"બંધ છે"</item>
+    <item msgid="630890598801118771">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_work">
+    <item msgid="389523503690414094">"ઉપલબ્ધ નથી"</item>
+    <item msgid="8045580926543311193">"બંધ છે"</item>
+    <item msgid="4913460972266982499">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_cast">
+    <item msgid="6032026038702435350">"ઉપલબ્ધ નથી"</item>
+    <item msgid="1488620600954313499">"બંધ છે"</item>
+    <item msgid="588467578853244035">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_night">
+    <item msgid="7857498964264855466">"ઉપલબ્ધ નથી"</item>
+    <item msgid="2744885441164350155">"બંધ છે"</item>
+    <item msgid="151121227514952197">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_screenrecord">
+    <item msgid="1085836626613341403">"ઉપલબ્ધ નથી"</item>
+    <item msgid="8259411607272330225">"બંધ છે"</item>
+    <item msgid="578444932039713369">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_reverse">
+    <item msgid="3574611556622963971">"ઉપલબ્ધ નથી"</item>
+    <item msgid="8707481475312432575">"બંધ છે"</item>
+    <item msgid="8031106212477483874">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_reduce_brightness">
+    <item msgid="1839836132729571766">"ઉપલબ્ધ નથી"</item>
+    <item msgid="4572245614982283078">"બંધ છે"</item>
+    <item msgid="6536448410252185664">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_cameratoggle">
+    <item msgid="6680671247180519913">"ઉપલબ્ધ નથી"</item>
+    <item msgid="4765607635752003190">"બંધ છે"</item>
+    <item msgid="1697460731949649844">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_mictoggle">
+    <item msgid="6895831614067195493">"ઉપલબ્ધ નથી"</item>
+    <item msgid="3296179158646568218">"બંધ છે"</item>
+    <item msgid="8998632451221157987">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_controls">
+    <item msgid="8199009425335668294">"ઉપલબ્ધ નથી"</item>
+    <item msgid="4544919905196727508">"બંધ છે"</item>
+    <item msgid="3422023746567004609">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_wallet">
+    <item msgid="4177615438710836341">"ઉપલબ્ધ નથી"</item>
+    <item msgid="7571394439974244289">"બંધ છે"</item>
+    <item msgid="6866424167599381915">"ચાલુ છે"</item>
+  </string-array>
+  <string-array name="tile_states_alarm">
+    <item msgid="4936533380177298776">"ઉપલબ્ધ નથી"</item>
+    <item msgid="2710157085538036590">"બંધ છે"</item>
+    <item msgid="7809470840976856149">"ચાલુ છે"</item>
+  </string-array>
+</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index e90fd7d..ff68699 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"फ़ोन के ज़रिए तेज़ी से और सुरक्षित तरीके से खरीदारी करने के लिए सेट अप करें"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"सभी दिखाएं"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"पैसे चुकाने के लिए, डिवाइस अनलॉक करें"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"कार्ड जोड़ें"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"अपडेट हो रहा है"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"इस्तेमाल करने के लिए, डिवाइस अनलॉक करें"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"आपके कार्ड की जानकारी पाने में कोई समस्या हुई है. कृपया बाद में कोशिश करें"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"लॉक स्क्रीन की सेटिंग"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"हाल के मैसेज, मिस्ड कॉल, और स्टेटस अपडेट देखें"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"बातचीत"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"\'परेशान न करें\' की वजह से सूचनाएं नहीं दिख रहीं"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ने एक मैसेज भेजा है: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ने एक इमेज भेजी है"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ने स्टेटस अपडेट किया है: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"आपके डिवाइस के बैटरी मीटर की रीडिंग लेने में समस्या आ रही है"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ज़्यादा जानकारी के लिए टैप करें"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"कोई अलार्म सेट नहीं है"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 9933646..a87790d 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -672,7 +672,7 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Postavite aplikaciju za bržu i sigurniju kupnju telefonom"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Prikaži sve"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Otključajte da biste platili"</string>
-    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Dodaj karticu"</string>
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Dodajte karticu"</string>
     <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Ažuriranje"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Otključajte da biste koristili"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Pojavio se problem prilikom dohvaćanja kartica, pokušajte ponovo kasnije"</string>
@@ -1152,11 +1152,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Pogledajte nedavne poruke, propuštene pozive i ažuriranja statusa"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Razgovor"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Pauzirala značajka Ne uznemiravaj"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> šalje poruku: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"Korisnik <xliff:g id="NAME">%1$s</xliff:g> poslao je sliku"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ima ažuriranje statusa: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem s očitavanjem mjerača baterije"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dodirnite za više informacija"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nema nijednog alarma"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index a7ee0d8..f954f24 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Megtekintheti a legutóbbi üzeneteket, a nem fogadott hívásokat és az állapotfrissítéseket."</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Beszélgetés"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"A Ne zavarjanak mód által szüneteltetve"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> üzenetet küldött: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> képet küldött"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> frissítette állapotát: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Probléma merült fel az akkumulátor-töltésmérő olvasásakor"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Koppintással további információkat érhet el."</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nincs ébresztés"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 5760e13b..fd81c4f 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Վճարեք հեռախոսով՝ ավելի արագ և ապահով"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Ցույց տալ բոլորը"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Ապակողպել՝ վճարելու համար"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Ավելացնել քարտ"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Թարմացվում է"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Ապակողպել՝ օգտագործելու համար"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Չհաջողվեց բեռնել քարտերը։ Նորից փորձեք։"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Կողպէկրանի կարգավորումներ"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Տեսեք վերջին հաղորդագրությունները, բաց թողնված զանգերը և կարգավիճակի մասին թարմացումները"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Զրույց"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Դադարեցվել է «Չանհանգստացնել» գործառույթի կողմից"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> օգտատերը հաղորդագրություն է ուղարկել. «<xliff:g id="NOTIFICATION">%2$s</xliff:g>»"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> օգտատերը պատկեր է ուղարկել"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> օգտատերը նոր կարգավիճակ է հրապարակել. «<xliff:g id="STATUS">%2$s</xliff:g>»"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Մարտկոցի ցուցիչի ցուցմունքը կարդալու հետ կապված խնդիր կա"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Հպեք՝ ավելին իմանալու համար"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Զարթուցիչ դրված չէ"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index dc4f8b2..220656f 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -670,7 +670,7 @@
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Tampilkan semua"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Buka kunci untuk membayar"</string>
     <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Tambahkan kartu"</string>
-    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Mengupdate"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Memperbarui"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Buka kunci untuk menggunakan"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Terjadi masalah saat mendapatkan kartu Anda, coba lagi nanti"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Setelan layar kunci"</string>
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Lihat pesan terbaru, panggilan tak terjawab, dan pembaruan status"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Percakapan"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Dijeda oleh fitur Jangan Ganggu"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> mengirim pesan: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> mengirim gambar"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> memposting pembaruan status: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Terjadi masalah saat membaca indikator baterai"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Ketuk untuk informasi selengkapnya"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Alarm tidak disetel"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 2fef80d..a0df4b9 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Stilltu hlutina þannig að þú getir verslað með símanum á hraðari og öruggari hátt"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Sýna allt"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Taka úr lás til að greiða"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Bæta korti við"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Uppfærir"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Taktu úr lás til að nota"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Vandamál kom upp við að sækja kortin þín. Reyndu aftur síðar"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Stillingar fyrir læstan skjá"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Sjá nýleg skilboð, ósvöruð símtöl og stöðuuppfærslur"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Samtal"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Sett í bið af „Ónáðið ekki“"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> sendi skilaboð: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sendi mynd"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> er með stöðuuppfærslu: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Vandamál við að lesa stöðu rafhlöðu"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Ýttu til að fá frekari upplýsingar"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Enginn vekjari"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index c5c9289..871a97c 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Visualizza messaggi recenti, chiamate senza risposta e aggiornamenti dello stato"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversazione"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"In pausa in base alla modalità Non disturbare"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ha inviato un messaggio: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ha inviato un\'immagine"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ha aggiornato lo stato: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problema durante la lettura dell\'indicatore di livello della batteria"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tocca per ulteriori informazioni"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nessuna sveglia"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index ad923c2..a23594c 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -675,10 +675,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"מגדירים אמצעי תשלום ונהנים מביצוע מהיר ומאובטח יותר של רכישות באמצעות הטלפון"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"הצגת הכול"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"לביטול הנעילה ולתשלום"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"הוספת כרטיס"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"מתבצע עדכון"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"יש לבטל את הנעילה כדי להשתמש"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"הייתה בעיה בקבלת הכרטיסים שלך. כדאי לנסות שוב מאוחר יותר"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"הגדרות מסך הנעילה"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index bd425f8..9e3c616 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"最近のメッセージ、不在着信、最新のステータスが表示されます"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"会話"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"サイレント モードにより一時停止"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> さんからのメッセージ: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> さんが画像を送信しました"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> さんの近況: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"バッテリー残量の読み込み中に問題が発生しました"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"タップすると詳細が表示されます"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"アラーム未設定"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index e952d78..c4545d4 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"დააყენეთ შესყიდვების თქვენი ტელეფონით უფრო სწრაფად და უსაფრთხოდ შესასრულებლად"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"ყველას ჩვენება"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"გადასახდელად განბლოკვა"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"ბარათის დამატება"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"მიმდინარეობს განახლება"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"გამოსაყენებლად განბლოკვა"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"თქვენი ბარათების მიღებისას პრობლემა წარმოიშვა. ცადეთ ხელახლა მოგვიანებით"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"ჩაკეტილი ეკრანის პარამეტრები"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 4ecba36..445483d 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Телефоныңызбен бұрынғыдан да жылдам әрі қауіпсіз сатып алу үшін параметрлерді орнатыңыз."</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Барлығын көрсету"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Төлеу үшін құлыпты ашу"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Карта қосу"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Жаңартылуда"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Пайдалану үшін құлыпты ашу"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Карталарыңыз алынбады, кейінірек қайталап көріңіз."</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Экран құлпының параметрлері"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index bcf31e8..8962ff4 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"ನಿಮ್ಮ ಫೋನ್ ಮೂಲಕ ವೇಗವಾದ, ಹೆಚ್ಚು ಸುರಕ್ಷಿತ ಖರೀದಿಗಳನ್ನು ಮಾಡಲು ಸೆಟಪ್ ಮಾಡಿಕೊಳ್ಳಿ"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"ಎಲ್ಲವನ್ನೂ ತೋರಿಸಿ"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"ಪಾವತಿಸಲು ಅನ್‌ಲಾಕ್ ಮಾಡಿ"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"ಕಾರ್ಡ್ ಅನ್ನು ಸೇರಿಸಿ"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ಬಳಸಲು ಅನ್‌ಲಾಕ್ ಮಾಡಿ"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"ನಿಮ್ಮ ಕಾರ್ಡ್‌ಗಳನ್ನು ಪಡೆಯುವಾಗ ಸಮಸ್ಯೆ ಉಂಟಾಗಿದೆ, ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"ಲಾಕ್ ಸ್ಕ್ರ್ರೀನ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
@@ -999,7 +997,7 @@
     <string name="slice_permission_deny" msgid="6870256451658176895">"ನಿರಾಕರಿಸಿ"</string>
     <string name="auto_saver_title" msgid="6873691178754086596">"ಬ್ಯಾಟರಿ ಸೇವರ್‌ ಅನ್ನು ನಿಗದಿಗೊಳಿಸಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ"</string>
     <string name="auto_saver_text" msgid="3214960308353838764">"ಬ್ಯಾಟರಿ ಖಾಲಿಯಾಗುವ ಸಾಧ್ಯತೆ ಇದ್ದಾಗ ಆನ್ ಮಾಡಿ"</string>
-    <string name="no_auto_saver_action" msgid="7467924389609773835">"ಬೇಡ ಧನ್ಯವಾದಗಳು"</string>
+    <string name="no_auto_saver_action" msgid="7467924389609773835">"ಬೇಡ"</string>
     <string name="auto_saver_enabled_title" msgid="4294726198280286333">"ಬ್ಯಾಟರಿ ಸೇವರ್ ನಿಗದಿಯನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ"</string>
     <string name="auto_saver_enabled_text" msgid="7889491183116752719">"ಬ್ಯಾಟರಿ <xliff:g id="PERCENTAGE">%d</xliff:g>%% ಗಿಂತ ಕಡಿಮೆ ಆದಾಗ ಬ್ಯಾಟರಿ ಸೇವರ್‌ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆನ್‌ ಆಗುತ್ತದೆ."</string>
     <string name="open_saver_setting_action" msgid="2111461909782935190">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
diff --git a/packages/SystemUI/res/values-kn/tiles_states_strings.xml b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
new file mode 100644
index 0000000..ae8f5a2
--- /dev/null
+++ b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (C) 2021 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<!--  This resources set the default subtitle for tiles. This way, each tile can be translated
+     separately.
+     The indices in the array correspond to the state values in QSTile:
+      * STATE_UNAVAILABLE
+      * STATE_INACTIVE
+      * STATE_ACTIVE
+     This subtitle is shown when the tile is in that particular state but does not set its own
+     subtitle, so some of these may never appear on screen. They should still be translated as if
+     they could appear.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for tile_states_default:0 (4578901299524323311) -->
+    <!-- no translation found for tile_states_default:1 (7086813178962737808) -->
+    <!-- no translation found for tile_states_default:2 (9192445505551219506) -->
+  <string-array name="tile_states_internet">
+    <item msgid="5499482407653291407">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="3048856902433862868">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="6877982264300789870">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_wifi">
+    <item msgid="8054147400538405410">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="4293012229142257455">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="6221288736127914861">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_cell">
+    <item msgid="1235899788959500719">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="2074416252859094119">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="287997784730044767">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_battery">
+    <item msgid="6311253873330062961">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="7838121007534579872">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="1578872232501319194">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_dnd">
+    <item msgid="467587075903158357">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="5376619709702103243">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="4875147066469902392">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_flashlight">
+    <item msgid="3465257127433353857">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="5044688398303285224">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="8527389108867454098">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_rotation">
+    <item msgid="4578491772376121579">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="5776427577477729185">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="7105052717007227415">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_bt">
+    <item msgid="5330252067413512277">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="5315121904534729843">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="503679232285959074">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_airplane">
+    <item msgid="1985366811411407764">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="4801037224991420996">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="1982293347302546665">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_location">
+    <item msgid="3316542218706374405">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="4813655083852587017">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="6744077414775180687">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_hotspot">
+    <item msgid="3145597331197351214">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="5715725170633593906">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="2075645297847971154">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_inversion">
+    <item msgid="3638187931191394628">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="9103697205127645916">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="8067744885820618230">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_saver">
+    <item msgid="39714521631367660">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="6983679487661600728">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="7520663805910678476">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_dark">
+    <item msgid="2762596907080603047">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="400477985171353">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="630890598801118771">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_work">
+    <item msgid="389523503690414094">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="8045580926543311193">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="4913460972266982499">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_cast">
+    <item msgid="6032026038702435350">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="1488620600954313499">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="588467578853244035">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_night">
+    <item msgid="7857498964264855466">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="2744885441164350155">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="151121227514952197">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_screenrecord">
+    <item msgid="1085836626613341403">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="8259411607272330225">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="578444932039713369">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_reverse">
+    <item msgid="3574611556622963971">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="8707481475312432575">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="8031106212477483874">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_reduce_brightness">
+    <item msgid="1839836132729571766">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="4572245614982283078">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="6536448410252185664">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_cameratoggle">
+    <item msgid="6680671247180519913">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="4765607635752003190">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="1697460731949649844">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_mictoggle">
+    <item msgid="6895831614067195493">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="3296179158646568218">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="8998632451221157987">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_controls">
+    <item msgid="8199009425335668294">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="4544919905196727508">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="3422023746567004609">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_wallet">
+    <item msgid="4177615438710836341">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="7571394439974244289">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="6866424167599381915">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+  <string-array name="tile_states_alarm">
+    <item msgid="4936533380177298776">"ಲಭ್ಯವಿಲ್ಲ"</item>
+    <item msgid="2710157085538036590">"ಆಫ್ ಮಾಡಿ"</item>
+    <item msgid="7809470840976856149">"ಆನ್ ಮಾಡಿ"</item>
+  </string-array>
+</resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index eb1150d..c0c42c3 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Телефонуңуз менен тез жана коопсуз сатып алуу үчүн жөндөңүз"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Баарын көрсөтүү"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Төлөө үчүн кулпусун ачыңыз"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Картаны кошуу"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Жаңыртылууда"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Колдонуу үчүн кулпусун ачыңыз"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Кыйытмаларды алууда ката кетти. Бир аздан кийин кайталап көрүңүз."</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Кулпуланган экран жөндөөлөрү"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 3275d28..f47b8e8 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"ເບິ່ງຂໍ້ຄວາມຫຼ້າສຸດ, ສາຍບໍ່ໄດ້ຮັບ ແລະ ອັບເດດສະຖານະ"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"ການສົນທະນາ"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"ຢຸດຊົ່ວຄາວແລ້ວໂດຍໂໝດຫ້າມລົບກວນ"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ສົ່ງຂໍ້ຄວາມ: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ສົ່ງຮູບພາບແລ້ວ"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ອັບເດດສະຖານະ: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ເກີດບັນຫາໃນການອ່ານຕົວວັດແທກແບັດເຕີຣີຂອງທ່ານ"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ບໍ່ໄດ້ຕັ້ງໂມງປຸກ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 284d1fa..e12afb55 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -675,10 +675,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Nustatykite, kad galėtumėte greičiau ir saugiau pirkti telefonu"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Rodyti viską"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Atrakinti, kad būtų galima mokėti"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Pridėti kortelę"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Atnaujinama"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Atrakinti, kad būtų galima naudoti"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Gaunant korteles kilo problema, bandykite dar kartą vėliau"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Užrakinimo ekrano nustatymai"</string>
@@ -1160,11 +1158,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Peržiūrėkite naujausius pranešimus, praleistus skambučius ir būsenos atnaujinimus"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Pokalbis"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Pristabdyta dėl netrukdymo režimo"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> išsiuntė pranešimą: „<xliff:g id="NOTIFICATION">%2$s</xliff:g>“"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> išsiuntė vaizdą"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> atnaujino būseną: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Nuskaitant akumuliatoriaus skaitiklį iškilo problema"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Palieskite, kad sužinotumėte daugiau informacijos"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenustatyta signalų"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 8770a1f..1d0b0ff 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -672,10 +672,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Iestatiet, lai ātrāk un drošāk veiktu pirkumus, izmantojot tālruni"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Rādīt visu"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Lai maksātu, atbloķējiet ekrānu"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Pievienojiet karti"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Notiek atjaunināšana"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Lai izmantotu, atbloķējiet ekrānu"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Ienesot jūsu kartes, radās problēma. Lūdzu, vēlāk mēģiniet vēlreiz."</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Bloķēšanas ekrāna iestatījumi"</string>
@@ -1154,11 +1152,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Skatiet jaunākos ziņojumus, neatbildētos zvanus un statusa atjauninājumus."</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Saruna"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Rādīšana pārtraukta režīma Netraucēt dēļ"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> nosūtīja ziņojumu: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> nosūtīja attēlu"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> atjaunināja statusu: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Nevar iegūt informāciju par akumulatora uzlādes līmeni."</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Pieskarieties, lai iegūtu plašāku informāciju."</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nav iestatīts signāls"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index b7c7023..a18780b 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"നിങ്ങളുടെ ഫോൺ ഉപയോഗിച്ച് വാങ്ങലുകൾ വേഗത്തിലും സുരക്ഷിതമായും നടത്താനുള്ള സജ്ജീകരണം നടത്തുക"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"എല്ലാം കാണിക്കുക"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"പണമടയ്‌ക്കാൻ അൺലോക്ക് ചെയ്യുക"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"കാർഡ് ചേർക്കുക"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"അപ്‌ഡേറ്റ് ചെയ്യുന്നു"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ഉപയോഗിക്കാൻ അൺലോക്ക് ചെയ്യുക"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"നിങ്ങളുടെ കാർഡുകൾ ലഭ്യമാക്കുന്നതിൽ ഒരു പ്രശ്‌നമുണ്ടായി, പിന്നീട് വീണ്ടും ശ്രമിക്കുക"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"ലോക്ക് സ്ക്രീൻ ക്രമീകരണം"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 7e8d0cb..9fe4d0a 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Саяхны мессеж, аваагүй дуудлага болон төлөвийн шинэчлэлтийг харах"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Харилцан яриа"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Бүү саад бол горимоор түр зогсоосон"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> мессеж илгээсэн: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> зураг илгээсэн"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> төлөвийн шинэчлэлт хийсэн байна: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Таны батарей хэмжигчийг уншихад асуудал гарлаа"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Нэмэлт мэдээлэл авахын тулд товшино уу"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Сэрүүлэг тавиагүй"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 3aacd40..5a4039e 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -669,8 +669,7 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"तुमचा फोन वापरून जलदरीत्या, अधिक सुरक्षित खरेदी करण्यासाठी सेट करा"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"सर्व दाखवा"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"पैसे देण्यासाठी अनलॉक करा"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"कार्ड जोडा"</string>
     <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"अपडेट करत आहे"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"वापरण्यासाठी अनलॉक करा"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"तुमची कार्ड मिळवताना समस्या आली, कृपया नंतर पुन्हा प्रयत्न करा"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index c6a64d5..51c800f 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"မကြာသေးမီက မက်ဆေ့ဂျ်၊ လွတ်သွားသောခေါ်ဆိုမှုနှင့် အခြေအနေအပ်ဒိတ်များကို ကြည့်နိုင်သည်"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"စကားဝိုင်း"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"‘မနှောင့်ယှက်ရ’ ဖြင့် ခဏရပ်ထားသည်"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> က မက်ဆေ့ဂျ်ပို့လိုက်သည်- <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> က ပုံပို့လိုက်သည်"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> က အခြေအနေ အပ်ဒိတ်လုပ်လိုက်သည်- <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"သင်၏ ဘက်ထရီမီတာကို ဖတ်ရာတွင် ပြဿနာရှိနေသည်"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"နောက်ထပ်အချက်အလက်များအတွက် တို့ပါ"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"နှိုးစက်ပေးမထားပါ"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 2c0eaf77..69d636d 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Legg til en betalingsmåte for å gjennomføre kjøp raskere og sikrere med telefonen"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Vis alle"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Lås opp for å betale"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Legg til et kort"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Oppdaterer"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Lås opp for å bruke"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Det oppsto et problem med henting av kortene. Prøv igjen senere"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Innstillinger for låseskjermen"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Se nylige meldinger, tapte anrop og statusoppdateringer"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Samtale"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Satt på pause av «Ikke forstyrr»"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> har sendt en melding: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> har sendt et bilde"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> har en statusoppdatering: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Kunne ikke lese batterimåleren"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Trykk for å få mer informasjon"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ingen alarm angitt"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 31b7a70..8bb7d86 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"फोनमार्फत अझ छिटो र थप सुरक्षित तरिकाले खरिद गर्न भुक्तानी विधि सेटअप गर्नुहोस्"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"सबै देखाइयोस्"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"भुक्तानी गर्न अनलक गर्नुहोस्"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"कार्ड हाल्नुहोस्"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"अपडेट गरिँदै छ"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"यो वालेट प्रयोग गर्न डिभाइस अनलक गर्नुहोस्"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"तपाईंका कार्डहरू प्राप्त गर्ने क्रममा समस्या भयो, कृपया पछि फेरि प्रयास गर्नुहोस्"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"लक स्क्रिनसम्बन्धी सेटिङ"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"हालसालैका म्यासेज, मिस कल र स्ट्याटस अपडेट हेर्नुहोस्"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"वार्तालाप"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"\'बाधा नपुऱ्याउनुहोस्\' ले पज गरेको छ"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ले एउटा म्यासेज पठाउनुभएको छ: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ले एउटा फोटो पठाउनुभयो"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ले स्ट्याटस अपडेट गर्नुभएको छ: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"डिभाइसको ब्याट्रीको मिटर रिडिङ क्रममा समस्या भयो"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"थप जानकारी प्राप्त गर्न ट्याप गर्नुहोस्"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"अलार्म राखिएको छैन"</string>
diff --git a/packages/SystemUI/res/values-ne/tiles_states_strings.xml b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
new file mode 100644
index 0000000..a1cf9ac
--- /dev/null
+++ b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (C) 2021 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<!--  This resources set the default subtitle for tiles. This way, each tile can be translated
+     separately.
+     The indices in the array correspond to the state values in QSTile:
+      * STATE_UNAVAILABLE
+      * STATE_INACTIVE
+      * STATE_ACTIVE
+     This subtitle is shown when the tile is in that particular state but does not set its own
+     subtitle, so some of these may never appear on screen. They should still be translated as if
+     they could appear.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for tile_states_default:0 (4578901299524323311) -->
+    <!-- no translation found for tile_states_default:1 (7086813178962737808) -->
+    <!-- no translation found for tile_states_default:2 (9192445505551219506) -->
+  <string-array name="tile_states_internet">
+    <item msgid="5499482407653291407">"उपलब्ध छैन"</item>
+    <item msgid="3048856902433862868">"अफ छ"</item>
+    <item msgid="6877982264300789870">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_wifi">
+    <item msgid="8054147400538405410">"उपलब्ध छैन"</item>
+    <item msgid="4293012229142257455">"अफ छ"</item>
+    <item msgid="6221288736127914861">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_cell">
+    <item msgid="1235899788959500719">"उपलब्ध छैन"</item>
+    <item msgid="2074416252859094119">"अफ छ"</item>
+    <item msgid="287997784730044767">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_battery">
+    <item msgid="6311253873330062961">"उपलब्ध छैन"</item>
+    <item msgid="7838121007534579872">"अफ छ"</item>
+    <item msgid="1578872232501319194">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_dnd">
+    <item msgid="467587075903158357">"उपलब्ध छैन"</item>
+    <item msgid="5376619709702103243">"अफ छ"</item>
+    <item msgid="4875147066469902392">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_flashlight">
+    <item msgid="3465257127433353857">"उपलब्ध छैन"</item>
+    <item msgid="5044688398303285224">"अफ छ"</item>
+    <item msgid="8527389108867454098">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_rotation">
+    <item msgid="4578491772376121579">"उपलब्ध छैन"</item>
+    <item msgid="5776427577477729185">"अफ छ"</item>
+    <item msgid="7105052717007227415">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_bt">
+    <item msgid="5330252067413512277">"उपलब्ध छैन"</item>
+    <item msgid="5315121904534729843">"अफ छ"</item>
+    <item msgid="503679232285959074">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_airplane">
+    <item msgid="1985366811411407764">"उपलब्ध छैन"</item>
+    <item msgid="4801037224991420996">"अफ छ"</item>
+    <item msgid="1982293347302546665">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_location">
+    <item msgid="3316542218706374405">"उपलब्ध छैन"</item>
+    <item msgid="4813655083852587017">"अफ छ"</item>
+    <item msgid="6744077414775180687">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_hotspot">
+    <item msgid="3145597331197351214">"उपलब्ध छैन"</item>
+    <item msgid="5715725170633593906">"अफ छ"</item>
+    <item msgid="2075645297847971154">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_inversion">
+    <item msgid="3638187931191394628">"उपलब्ध छैन"</item>
+    <item msgid="9103697205127645916">"अफ छ"</item>
+    <item msgid="8067744885820618230">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_saver">
+    <item msgid="39714521631367660">"उपलब्ध छैन"</item>
+    <item msgid="6983679487661600728">"अफ छ"</item>
+    <item msgid="7520663805910678476">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_dark">
+    <item msgid="2762596907080603047">"उपलब्ध छैन"</item>
+    <item msgid="400477985171353">"अफ छ"</item>
+    <item msgid="630890598801118771">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_work">
+    <item msgid="389523503690414094">"उपलब्ध छैन"</item>
+    <item msgid="8045580926543311193">"अफ छ"</item>
+    <item msgid="4913460972266982499">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_cast">
+    <item msgid="6032026038702435350">"उपलब्ध छैन"</item>
+    <item msgid="1488620600954313499">"अफ छ"</item>
+    <item msgid="588467578853244035">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_night">
+    <item msgid="7857498964264855466">"उपलब्ध छैन"</item>
+    <item msgid="2744885441164350155">"अफ छ"</item>
+    <item msgid="151121227514952197">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_screenrecord">
+    <item msgid="1085836626613341403">"उपलब्ध छैन"</item>
+    <item msgid="8259411607272330225">"अफ छ"</item>
+    <item msgid="578444932039713369">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_reverse">
+    <item msgid="3574611556622963971">"उपलब्ध छैन"</item>
+    <item msgid="8707481475312432575">"अफ छ"</item>
+    <item msgid="8031106212477483874">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_reduce_brightness">
+    <item msgid="1839836132729571766">"उपलब्ध छैन"</item>
+    <item msgid="4572245614982283078">"अफ छ"</item>
+    <item msgid="6536448410252185664">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_cameratoggle">
+    <item msgid="6680671247180519913">"उपलब्ध छैन"</item>
+    <item msgid="4765607635752003190">"अफ छ"</item>
+    <item msgid="1697460731949649844">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_mictoggle">
+    <item msgid="6895831614067195493">"उपलब्ध छैन"</item>
+    <item msgid="3296179158646568218">"अफ छ"</item>
+    <item msgid="8998632451221157987">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_controls">
+    <item msgid="8199009425335668294">"उपलब्ध छैन"</item>
+    <item msgid="4544919905196727508">"अफ छ"</item>
+    <item msgid="3422023746567004609">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_wallet">
+    <item msgid="4177615438710836341">"उपलब्ध छैन"</item>
+    <item msgid="7571394439974244289">"अफ छ"</item>
+    <item msgid="6866424167599381915">"अन छ"</item>
+  </string-array>
+  <string-array name="tile_states_alarm">
+    <item msgid="4936533380177298776">"उपलब्ध छैन"</item>
+    <item msgid="2710157085538036590">"अफ छ"</item>
+    <item msgid="7809470840976856149">"अन छ"</item>
+  </string-array>
+</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 3626c8e..c9e869d 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Bekijk recente berichten, gemiste gesprekken en statusupdates"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Gesprek"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Onderbroken door Niet storen"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> heeft een bericht gestuurd: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> heeft een afbeelding gestuurd"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> heeft een statusupdate: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Probleem bij het lezen van je batterijmeter"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tik hier voor meer informatie"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Geen wekker gezet"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index b7098df..a209581 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"ଆପଣଙ୍କ ଫୋନ୍ ମାଧ୍ୟମରେ ଆହୁରି ଶୀଘ୍ର, ଅଧିକ ସୁରକ୍ଷିତ କ୍ରୟ କରିବା ପାଇଁ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"ସବୁ ଦେଖାନ୍ତୁ"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"ପେମେଣ୍ଟ କରିବାକୁ ଅନଲକ୍ କରନ୍ତୁ"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"ଏକ କାର୍ଡ ଯୋଗ କରନ୍ତୁ"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"ଅପଡେଟ୍ ହେଉଛି"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ବ୍ୟବହାର କରିବାକୁ ଅନଲକ୍ କରନ୍ତୁ"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"ଆପଣଙ୍କ କାର୍ଡଗୁଡ଼ିକ ପାଇବାରେ ଏକ ସମସ୍ୟା ହୋଇଥିଲା। ଦୟାକରି ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"ସ୍କ୍ରିନ୍ ଲକ୍ ସେଟିଂସ୍"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"ବର୍ତ୍ତମାନର ମେସେଜ୍, ମିସ୍ଡ କଲ୍ ଏବଂ ସ୍ଥିତି ଅପଡେଟଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"ବାର୍ତ୍ତାଳାପ"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଦ୍ୱାରା ବିରତ କରାଯାଇଛି"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ଏକ ମେସେଜ୍ ପଠାଇଛନ୍ତି: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ଏକ ଛବି ପଠାଇଛନ୍ତି"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ଏକ ସ୍ଥିତି ଅପଡେଟ୍ କରିଛନ୍ତି: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ଆପଣଙ୍କ ବ୍ୟାଟେରୀ ମିଟର୍ ପଢ଼ିବାରେ ସମସ୍ୟା ହେଉଛି"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ଅଧିକ ସୂଚନା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ଆଲାରାମ ସେଟ୍ ହୋଇନାହିଁ"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 699fd8f..49b1f9a 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -669,9 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"ਆਪਣੇ ਫ਼ੋਨ ਨਾਲ ਜ਼ਿਆਦਾ ਤੇਜ਼ ਅਤੇ ਜ਼ਿਆਦਾ ਸੁਰੱਖਿਅਤ ਖਰੀਦਾਂ ਕਰਨ ਲਈ ਸੈੱਟਅੱਪ ਕਰੋ"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"ਸਭ ਦਿਖਾਓ"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"ਭੁਗਤਾਨ ਕਰਨ ਲਈ ਅਣਲਾਕ ਕਰੋ"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"ਅੱਪਡੇਟ ਹੋ ਰਿਹਾ ਹੈ"</string>
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"ਕੋਈ ਕਾਰਡ ਸ਼ਾਮਲ ਕਰੋ"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ਵਰਤਣ ਲਈ ਅਣਲਾਕ ਕਰੋ"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"ਤੁਹਾਡੇ ਕਾਰਡ ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਕੋਈ ਸਮੱਸਿਆ ਆਈ, ਕਿਰਪਾ ਕਰਕੇ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"ਲਾਕ ਸਕ੍ਰੀਨ ਸੈਟਿੰਗਾਂ"</string>
diff --git a/packages/SystemUI/res/values-pa/tiles_states_strings.xml b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
new file mode 100644
index 0000000..fbb3888
--- /dev/null
+++ b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  ~ Copyright (C) 2021 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+   -->
+
+<!--  This resources set the default subtitle for tiles. This way, each tile can be translated
+     separately.
+     The indices in the array correspond to the state values in QSTile:
+      * STATE_UNAVAILABLE
+      * STATE_INACTIVE
+      * STATE_ACTIVE
+     This subtitle is shown when the tile is in that particular state but does not set its own
+     subtitle, so some of these may never appear on screen. They should still be translated as if
+     they could appear.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for tile_states_default:0 (4578901299524323311) -->
+    <!-- no translation found for tile_states_default:1 (7086813178962737808) -->
+    <!-- no translation found for tile_states_default:2 (9192445505551219506) -->
+  <string-array name="tile_states_internet">
+    <item msgid="5499482407653291407">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="3048856902433862868">"ਬੰਦ ਹੈ"</item>
+    <item msgid="6877982264300789870">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_wifi">
+    <item msgid="8054147400538405410">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="4293012229142257455">"ਬੰਦ ਹੈ"</item>
+    <item msgid="6221288736127914861">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_cell">
+    <item msgid="1235899788959500719">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="2074416252859094119">"ਬੰਦ ਹੈ"</item>
+    <item msgid="287997784730044767">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_battery">
+    <item msgid="6311253873330062961">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="7838121007534579872">"ਬੰਦ ਹੈ"</item>
+    <item msgid="1578872232501319194">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_dnd">
+    <item msgid="467587075903158357">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="5376619709702103243">"ਬੰਦ ਹੈ"</item>
+    <item msgid="4875147066469902392">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_flashlight">
+    <item msgid="3465257127433353857">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="5044688398303285224">"ਬੰਦ ਹੈ"</item>
+    <item msgid="8527389108867454098">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_rotation">
+    <item msgid="4578491772376121579">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="5776427577477729185">"ਬੰਦ ਹੈ"</item>
+    <item msgid="7105052717007227415">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_bt">
+    <item msgid="5330252067413512277">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="5315121904534729843">"ਬੰਦ ਹੈ"</item>
+    <item msgid="503679232285959074">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_airplane">
+    <item msgid="1985366811411407764">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="4801037224991420996">"ਬੰਦ ਹੈ"</item>
+    <item msgid="1982293347302546665">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_location">
+    <item msgid="3316542218706374405">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="4813655083852587017">"ਬੰਦ ਹੈ"</item>
+    <item msgid="6744077414775180687">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_hotspot">
+    <item msgid="3145597331197351214">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="5715725170633593906">"ਬੰਦ ਹੈ"</item>
+    <item msgid="2075645297847971154">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_inversion">
+    <item msgid="3638187931191394628">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="9103697205127645916">"ਬੰਦ ਹੈ"</item>
+    <item msgid="8067744885820618230">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_saver">
+    <item msgid="39714521631367660">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="6983679487661600728">"ਬੰਦ ਹੈ"</item>
+    <item msgid="7520663805910678476">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_dark">
+    <item msgid="2762596907080603047">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="400477985171353">"ਬੰਦ ਹੈ"</item>
+    <item msgid="630890598801118771">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_work">
+    <item msgid="389523503690414094">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="8045580926543311193">"ਬੰਦ ਹੈ"</item>
+    <item msgid="4913460972266982499">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_cast">
+    <item msgid="6032026038702435350">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="1488620600954313499">"ਬੰਦ ਹੈ"</item>
+    <item msgid="588467578853244035">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_night">
+    <item msgid="7857498964264855466">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="2744885441164350155">"ਬੰਦ ਹੈ"</item>
+    <item msgid="151121227514952197">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_screenrecord">
+    <item msgid="1085836626613341403">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="8259411607272330225">"ਬੰਦ ਹੈ"</item>
+    <item msgid="578444932039713369">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_reverse">
+    <item msgid="3574611556622963971">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="8707481475312432575">"ਬੰਦ ਹੈ"</item>
+    <item msgid="8031106212477483874">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_reduce_brightness">
+    <item msgid="1839836132729571766">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="4572245614982283078">"ਬੰਦ ਹੈ"</item>
+    <item msgid="6536448410252185664">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_cameratoggle">
+    <item msgid="6680671247180519913">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="4765607635752003190">"ਬੰਦ ਹੈ"</item>
+    <item msgid="1697460731949649844">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_mictoggle">
+    <item msgid="6895831614067195493">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="3296179158646568218">"ਬੰਦ ਹੈ"</item>
+    <item msgid="8998632451221157987">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_controls">
+    <item msgid="8199009425335668294">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="4544919905196727508">"ਬੰਦ ਹੈ"</item>
+    <item msgid="3422023746567004609">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_wallet">
+    <item msgid="4177615438710836341">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="7571394439974244289">"ਬੰਦ ਹੈ"</item>
+    <item msgid="6866424167599381915">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+  <string-array name="tile_states_alarm">
+    <item msgid="4936533380177298776">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="2710157085538036590">"ਬੰਦ ਹੈ"</item>
+    <item msgid="7809470840976856149">"ਚਾਲੂ ਹੈ"</item>
+  </string-array>
+</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 0458765..fb433c5 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -675,10 +675,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Skonfiguruj formę płatności, aby szybciej i bezpieczniej płacić telefonem za zakupy"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Pokaż wszystko"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Odblokuj, aby zapłacić"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Dodaj kartę"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Aktualizuję"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Odblokuj, aby użyć"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Podczas pobierania kart wystąpił problem. Spróbuj ponownie później."</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Ustawienia ekranu blokady"</string>
@@ -1019,8 +1017,8 @@
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8341216022442383954">"Aplikacje używają: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
     <string name="ongoing_privacy_dialog_separator" msgid="1866222499727706187">", "</string>
     <string name="ongoing_privacy_dialog_last_separator" msgid="5615876114268009767">" i "</string>
-    <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"Używa tego aplikacja <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string>
-    <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"Ostatnio używała tego aplikacja <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string>
+    <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"Używane przez aplikację <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string>
+    <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"Ostatnio używane przez aplikację <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_enterprise" msgid="3003314125311966061">"(praca)"</string>
     <string name="ongoing_privacy_dialog_phonecall" msgid="4487370562589839298">"Rozmowa telefoniczna"</string>
     <string name="ongoing_privacy_dialog_attribution_text" msgid="4738795925380373994">"(przez: <xliff:g id="APPLICATION_NAME_S_">%s</xliff:g>)"</string>
@@ -1160,11 +1158,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Zobacz ostatnie wiadomości, nieodebrane połączenia i stany"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Rozmowa"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Wstrzymane przez tryb Nie przeszkadzać"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> wysyła wiadomość: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> wysyła zdjęcie"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ma nowy stan: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem z odczytaniem pomiaru wykorzystania baterii"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Kliknij, aby uzyskać więcej informacji"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nie ustawiono alarmu"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index e3bd8c7..e33c106 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Veja mensagens recentes, chamadas perdidas e atualizações de status"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Pausado pelo Não perturbe"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma mensagem: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma imagem"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> atualizou o status: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problema para ler seu medidor de bateria"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toque para mais informações"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme definido"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index b560c95..2965cb7 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Veja mensagens recentes, chamadas não atendidas e atualizações de estado"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Colocado em pausa pelo modo Não incomodar"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma mensagem: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma imagem"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> tem uma atualização de estado: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Ocorreu um problema ao ler o medidor da bateria"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toque para obter mais informações"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme defin."</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index e3bd8c7..e33c106 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Veja mensagens recentes, chamadas perdidas e atualizações de status"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Pausado pelo Não perturbe"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma mensagem: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma imagem"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> atualizou o status: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problema para ler seu medidor de bateria"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toque para mais informações"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme definido"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index de0b19c..622d330 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -672,10 +672,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Configurați pentru a face achiziții mai rapide și mai sigure cu telefonul dvs."</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Afișați-le pe toate"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Deblocați pentru a plăti"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Adăugați un card"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Se actualizează"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Deblocați pentru a folosi"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"A apărut o problemă la preluarea cardurilor. Încercați din nou mai târziu"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Setările ecranului de blocare"</string>
diff --git a/packages/SystemUI/res/values-ro/tiles_states_strings.xml b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
index 3201c3e..3f56424 100644
--- a/packages/SystemUI/res/values-ro/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
@@ -32,14 +32,14 @@
     <!-- no translation found for tile_states_default:1 (7086813178962737808) -->
     <!-- no translation found for tile_states_default:2 (9192445505551219506) -->
   <string-array name="tile_states_internet">
-    <item msgid="5499482407653291407">"Indisponibilă"</item>
-    <item msgid="3048856902433862868">"Dezactivată"</item>
-    <item msgid="6877982264300789870">"Activată"</item>
+    <item msgid="5499482407653291407">"Indisponibil"</item>
+    <item msgid="3048856902433862868">"Dezactivat"</item>
+    <item msgid="6877982264300789870">"Activat"</item>
   </string-array>
   <string-array name="tile_states_wifi">
-    <item msgid="8054147400538405410">"Indisponibilă"</item>
-    <item msgid="4293012229142257455">"Dezactivată"</item>
-    <item msgid="6221288736127914861">"Activată"</item>
+    <item msgid="8054147400538405410">"Indisponibil"</item>
+    <item msgid="4293012229142257455">"Dezactivat"</item>
+    <item msgid="6221288736127914861">"Activat"</item>
   </string-array>
   <string-array name="tile_states_cell">
     <item msgid="1235899788959500719">"Indisponibilă"</item>
@@ -67,14 +67,14 @@
     <item msgid="7105052717007227415">"Activată"</item>
   </string-array>
   <string-array name="tile_states_bt">
-    <item msgid="5330252067413512277">"Indisponibilă"</item>
-    <item msgid="5315121904534729843">"Dezactivată"</item>
-    <item msgid="503679232285959074">"Activată"</item>
+    <item msgid="5330252067413512277">"Indisponibil"</item>
+    <item msgid="5315121904534729843">"Dezactivat"</item>
+    <item msgid="503679232285959074">"Activat"</item>
   </string-array>
   <string-array name="tile_states_airplane">
-    <item msgid="1985366811411407764">"Indisponibilă"</item>
-    <item msgid="4801037224991420996">"Dezactivată"</item>
-    <item msgid="1982293347302546665">"Activată"</item>
+    <item msgid="1985366811411407764">"Indisponibil"</item>
+    <item msgid="4801037224991420996">"Dezactivat"</item>
+    <item msgid="1982293347302546665">"Activat"</item>
   </string-array>
   <string-array name="tile_states_location">
     <item msgid="3316542218706374405">"Indisponibilă"</item>
@@ -82,9 +82,9 @@
     <item msgid="6744077414775180687">"Activată"</item>
   </string-array>
   <string-array name="tile_states_hotspot">
-    <item msgid="3145597331197351214">"Indisponibilă"</item>
-    <item msgid="5715725170633593906">"Dezactivată"</item>
-    <item msgid="2075645297847971154">"Activată"</item>
+    <item msgid="3145597331197351214">"Indisponibil"</item>
+    <item msgid="5715725170633593906">"Dezactivat"</item>
+    <item msgid="2075645297847971154">"Activat"</item>
   </string-array>
   <string-array name="tile_states_inversion">
     <item msgid="3638187931191394628">"Indisponibilă"</item>
@@ -97,14 +97,14 @@
     <item msgid="7520663805910678476">"Activată"</item>
   </string-array>
   <string-array name="tile_states_dark">
-    <item msgid="2762596907080603047">"Indisponibilă"</item>
-    <item msgid="400477985171353">"Dezactivată"</item>
-    <item msgid="630890598801118771">"Activată"</item>
+    <item msgid="2762596907080603047">"Indisponibil"</item>
+    <item msgid="400477985171353">"Dezactivat"</item>
+    <item msgid="630890598801118771">"Activat"</item>
   </string-array>
   <string-array name="tile_states_work">
-    <item msgid="389523503690414094">"Indisponibilă"</item>
-    <item msgid="8045580926543311193">"Dezactivată"</item>
-    <item msgid="4913460972266982499">"Activată"</item>
+    <item msgid="389523503690414094">"Indisponibil"</item>
+    <item msgid="8045580926543311193">"Dezactivat"</item>
+    <item msgid="4913460972266982499">"Activat"</item>
   </string-array>
   <string-array name="tile_states_cast">
     <item msgid="6032026038702435350">"Indisponibilă"</item>
@@ -127,9 +127,9 @@
     <item msgid="8031106212477483874">"Activată"</item>
   </string-array>
   <string-array name="tile_states_reduce_brightness">
-    <item msgid="1839836132729571766">"Indisponibilă"</item>
-    <item msgid="4572245614982283078">"Dezactivată"</item>
-    <item msgid="6536448410252185664">"Activată"</item>
+    <item msgid="1839836132729571766">"Indisponibil"</item>
+    <item msgid="4572245614982283078">"Dezactivat"</item>
+    <item msgid="6536448410252185664">"Activat"</item>
   </string-array>
   <string-array name="tile_states_cameratoggle">
     <item msgid="6680671247180519913">"Indisponibilă"</item>
@@ -147,9 +147,9 @@
     <item msgid="3422023746567004609">"Activată"</item>
   </string-array>
   <string-array name="tile_states_wallet">
-    <item msgid="4177615438710836341">"Indisponibilă"</item>
-    <item msgid="7571394439974244289">"Dezactivată"</item>
-    <item msgid="6866424167599381915">"Activată"</item>
+    <item msgid="4177615438710836341">"Indisponibil"</item>
+    <item msgid="7571394439974244289">"Dezactivat"</item>
+    <item msgid="6866424167599381915">"Activat"</item>
   </string-array>
   <string-array name="tile_states_alarm">
     <item msgid="4936533380177298776">"Indisponibilă"</item>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 7b4e829..30c757e 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -675,10 +675,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Расплачивайтесь через телефон быстро и безопасно."</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Показать все"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Разблокировать для оплаты"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Добавьте карту"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Обновление…"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Разблокировать для использования"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Не удалось получить информацию о картах. Повторите попытку позже."</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Настройки заблокированного экрана"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 94d29ed..79eb6ba 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"ඔබගේ දුරකථනය සමඟ වඩා වේගවත්, වඩා සුරක්ෂිත මිලදී ගැනීම් සිදු කිරීමට සූදානම් වන්න"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"සියල්ල පෙන්වන්න"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"ගෙවීමට අගුලු හරින්න"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"කාඩ්පතක් එක් කරන්න"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"යාවත්කාලීන වේ"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"භාවිත කිරීමට අගුලු හරින්න"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"ඔබගේ කාඩ්පත ලබා ගැනීමේ ගැටලුවක් විය, කරුණාකර පසුව නැවත උත්සාහ කරන්න"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"අගුලු තිර සැකසීම්"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"මෑත පණිවිඩ, මඟ හැරුණු ඇමතුම් සහ තත්ත්ව යාවත්කාලීන කිරීම් බලන්න"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"සංවාදය"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"බාධා නොකිරීම මගින් විරාම කර ඇත"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> පණිවිඩයක් එවා ඇත: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> රූපයක් යවන ලදී"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> හට තත්ත්ව යාවත්කාලීනයක් ඇත: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ඔබගේ බැටරි මනුව කියවීමේ දෝෂයකි"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"තවත් තොරතුරු සඳහා තට්ටු කරන්න"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"එලාම සකසා නැත"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 767dc7b..ddf054a 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -675,10 +675,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Nastavte si všetko potrebné na rýchlejšie a bezpečnejšie nákupy telefónom"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Zobraziť všetko"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Odomknúť a zaplatiť"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Pridať kartu"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Aktualizuje sa"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Odomknúť a použiť"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Pri načítavaní kariet sa vyskytol problém. Skúste to neskôr."</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Nastavenia uzamknutej obrazovky"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 69e0cf6..1af9e02 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -1158,11 +1158,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Ogled nedavnih sporočil, neodgovorjenih klicev in posodobitev stanj"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Pogovor"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"To je začasno zaustavil način »ne moti«."</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"Oseba <xliff:g id="NAME">%1$s</xliff:g> je poslala sporočilo: <xliff:g id="NOTIFICATION">%2$s</xliff:g>."</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"Oseba <xliff:g id="NAME">%1$s</xliff:g> je poslala sliko."</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"Oseba <xliff:g id="NAME">%1$s</xliff:g> je posodobila stanje: <xliff:g id="STATUS">%2$s</xliff:g>."</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Težava z branjem indikatorja stanja napolnjenosti baterije"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dotaknite se za več informacij"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ni nastavljenih alarmov"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index feb5c87..90cbdd1 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Konfiguro për të kryer pagesa më të shpejta dhe më të sigurta përmes telefonit"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Shfaqi të gjitha"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Shkyçe për të paguar"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Shto një kartë"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Po përditësohet"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Shkyçe për ta përdorur"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Pati një problem me marrjen e kartave të tua. Provo përsëri më vonë"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Cilësimet e ekranit të kyçjes"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 1b6f08d..e9fbb78 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -1152,11 +1152,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Погледајте недавне поруке, пропуштене позиве и ажурирања статуса"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Конверзација"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Паузирано режимом Не узнемиравај"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> је послао/ла поруку: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> шаље слику"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> има ажурирање статуса: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Проблем са очитавањем мерача батерије"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Додирните за више информација"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Аларм није подешен"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index cf63c43..bcead0b 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Lägg till en betalningsmetod för att betala snabbare och säkrare med telefonen"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Visa alla"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Lås upp för att betala"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Lägg till ett kort"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Uppdaterar"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Lås upp för att använda"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Det gick inte att hämta dina kort. Försök igen senare."</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Inställningar för låsskärm"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Se de senaste meddelandena, missade samtal och statusuppdateringar"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Konversation"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Pausad av Stör ej"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> skickade ett meddelande: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> skickade en bild"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> har gjort en statusuppdatering: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Batteriindikatorn visas inte"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Tryck för mer information"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Inget inställt alarm"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 8be37c23..8fa401a 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Angalia ujumbe wa hivi majuzi, simu ambazo hukujibu na taarifa za hali"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Mazungumzo"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Imesimamishwa na kipengele cha Usinisumbue"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ametuma ujumbe: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ametuma picha"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ana taarifa kuhusu hali: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Tatizo la kusoma mita ya betri yako"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Gusa ili upate maelezo zaidi"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Hujaweka kengele"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 32b1fe6..9c8ddca 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"மொபைல் மூலம் விரைவாகவும் பாதுகாப்பாகவும் பர்ச்சேஸ்கள் செய்ய பேமெண்ட் முறையை அமைக்கவும்"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"அனைத்தையும் காட்டு"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"பணம் செலுத்த அன்லாக் செய்க"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"கார்டைச் சேர்"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"புதுப்பிக்கிறது"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"பயன்படுத்துவதற்கு அன்லாக் செய்க"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"உங்கள் கார்டுகளின் விவரங்களைப் பெறுவதில் சிக்கல் ஏற்பட்டது, பிறகு முயலவும்"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"பூட்டுத் திரை அமைப்புகள்"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 1e6ae18..d4375a5 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -669,8 +669,7 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"మీ ఫోన్‌తో మరింత వేగంగా, సురక్షితంగా కొనుగోళ్లు చేయడానికి సెటప్ చేయండి"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"అన్నింటినీ చూపు"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"పే చేయడానికి అన్‌లాక్ చేయండి"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"కార్డ్‌ను జోడించండి"</string>
     <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"అప్‌డేట్ చేస్తోంది"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ఉపయోగించడానికి అన్‌లాక్ చేయండి"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"మీ కార్డ్‌లను పొందడంలో సమస్య ఉంది, దయచేసి తర్వాత మళ్లీ ట్రై చేయండి"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 8b28b0e..6ecb2b4 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -1007,8 +1007,8 @@
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8341216022442383954">"หลายแอปพลิเคชันใช้<xliff:g id="TYPES_LIST">%s</xliff:g>ของคุณอยู่"</string>
     <string name="ongoing_privacy_dialog_separator" msgid="1866222499727706187">", "</string>
     <string name="ongoing_privacy_dialog_last_separator" msgid="5615876114268009767">" และ "</string>
-    <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"ใช้อยู่โดย <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string>
-    <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"ใช้ล่าสุดโดย <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string>
+    <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"ใช้อยู่โดย<xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string>
+    <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"ใช้ล่าสุดโดย<xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_enterprise" msgid="3003314125311966061">"(ที่ทำงาน)"</string>
     <string name="ongoing_privacy_dialog_phonecall" msgid="4487370562589839298">"การโทร"</string>
     <string name="ongoing_privacy_dialog_attribution_text" msgid="4738795925380373994">"(ผ่านทาง <xliff:g id="APPLICATION_NAME_S_">%s</xliff:g>)"</string>
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"ดูข้อความล่าสุด สายที่ไม่ได้รับ และการอัปเดตสถานะ"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"การสนทนา"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"หยุดชั่วคราวโดยฟีเจอร์ห้ามรบกวน"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ส่งข้อความ: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ส่งรูปภาพ"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> มีการอัปเดตสถานะ: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"พบปัญหาในการอ่านเครื่องวัดแบตเตอรี่"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"แตะดูข้อมูลเพิ่มเติม"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ไม่มีการตั้งปลุก"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 0965816..cf38fa20 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Tingnan ang mga kamakailang mensahe, hindi nasagot na tawag, at update sa status"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Pag-uusap"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Na-pause ng Huwag Istorbohin"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"Nagpadala si <xliff:g id="NAME">%1$s</xliff:g> ng mensahe: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"Nagpadala si <xliff:g id="NAME">%1$s</xliff:g> ng larawan"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"May update sa status si <xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Nagkaproblema sa pagbabasa ng iyong battery meter"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"I-tap para sa higit pang impormasyon"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Walang alarm"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index ec213e4..7308785 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Telefonunuzla daha hızlı ve güvenli satın alma işlemleri gerçekleştirmek için gerekli ayarları yapın"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Tümünü göster"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Ödeme için kilidi aç"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Kart ekleyin"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Güncelleniyor"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Kullanmak için kilidi aç"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Kartlarınız alınırken bir sorun oluştu. Lütfen daha sonra tekrar deneyin"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Kilit ekranı ayarları"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Yeni mesajları, cevapsız aramaları ve durum güncellemelerini görün"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Görüşme"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Rahatsız Etmeyin özelliği tarafından duraklatıldı"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> bir mesaj gönderdi: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> bir resim gönderdi"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>, durumunu güncelledi: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Pil ölçeriniz okunurken sorun oluştu"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Daha fazla bilgi için dokunun"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Alarm ayarlanmadı"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index fe78c01..3910d4b 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -675,10 +675,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Швидше й безпечніше сплачуйте за покупки за допомогою телефона"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Показати все"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Розблокувати, щоб сплатити"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Додати картку"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Триває оновлення"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Розблокувати, щоб використовувати"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Не вдалось отримати ваші картки. Повторіть спробу пізніше."</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Параметри блокування екрана"</string>
@@ -1160,11 +1158,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Переглядайте останні повідомлення, пропущені виклики й оновлення статусу"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Розмова"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Призупинено функцією \"Не турбувати\""</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> надсилає повідомлення: \"<xliff:g id="NOTIFICATION">%2$s</xliff:g>\""</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> надсилає зображення"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> публікує новий статус: \"<xliff:g id="STATUS">%2$s</xliff:g>\""</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Не вдалось отримати дані лічильника акумулятора"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Натисніть, щоб дізнатися більше"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Немає будильників"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 0e508f2..0612014 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"اپنے فون سے تیز تر مزید محفوظ خریداریاں کرنے کے لیے، سیٹ اپ مکمل کریں"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"سبھی دکھائیں"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"ادائیگی کرنے کے لیے غیر مقفل کریں"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"کارڈ شامل کریں"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"اپ ڈیٹ ہو رہا ہے"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"استعمال کرنے کے لیے غیر مقفل کریں"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"آپ کے کارڈز حاصل کرنے میں ایک مسئلہ درپیش تھا، براہ کرم بعد میں دوبارہ کوشش کریں"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"مقفل اسکرین کی ترتیبات"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 02a6177..c544256 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -669,8 +669,7 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Telefonda tezroq va xavfsizroq xarid qilish uchun sozlang"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Hammasi"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Toʻlov uchun qulfdan chiqarish"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Karta kiritish"</string>
     <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Yangilanmoqda"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Foydalanish uchun qulfdan chiqarish"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Bildirgilarni yuklashda xatolik yuz berdi, keyinroq qaytadan urining"</string>
@@ -1147,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Oxirgi xabarlar, javobsiz chaqiruvlar va holat yangilanishlari"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Suhbat"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Bezovta qilinmasin rejimi pauza qildi"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> xabar yubordi: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> rasm yubordi"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ahvolini yangiladi: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Batareya quvvati aniqlanmadi"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Batafsil axborot olish uchun bosing"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Signal sozlanmagan"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 6f1931f..3cf2b55 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -669,8 +669,7 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Thiết lập để mua hàng nhanh hơn và an toàn hơn bằng điện thoại"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Hiện tất cả"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Mở khóa để thanh toán"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Thêm thẻ"</string>
     <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Đang cập nhật"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Mở khóa để sử dụng"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Đã xảy ra sự cố khi tải thẻ của bạn. Vui lòng thử lại sau"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 0e773a9..641c9b7 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -1146,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"查看最近的訊息、未接來電和狀態更新"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"對話"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"「請勿騷擾」已暫停通知"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g>傳送了訊息:<xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>傳送了圖片"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>有狀態更新:<xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"讀取電池計量器時發生問題"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"輕按即可瞭解詳情"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"未設定鬧鐘"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 68799e8..883c746 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -669,10 +669,8 @@
     <string name="wallet_empty_state_label" msgid="7776761245237530394">"Lungela ukuthenga ngokushesha, ngokuphepha ngefoni yakho"</string>
     <string name="wallet_app_button_label" msgid="7123784239111190992">"Bonisa konke"</string>
     <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Vula ukuze ukhokhele"</string>
-    <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) -->
-    <skip />
-    <!-- no translation found for wallet_secondary_label_updating (5726130686114928551) -->
-    <skip />
+    <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Engeza ikhadi"</string>
+    <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Iyabuyekeza"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Vula ukuze usebenzise"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Kube khona inkinga yokuthola amakhadi akho, sicela uzame futhi ngemuva kwesikhathi"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Amasethingi okukhiya isikrini"</string>
@@ -1148,11 +1146,9 @@
     <string name="people_tile_description" msgid="8154966188085545556">"Bona imiyalezo yakamuva, amakholi akuphuthile, nezibuyekezo zesimo"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Ingxoxo"</string>
     <string name="paused_by_dnd" msgid="7856941866433556428">"Kumiswe okuthi Ungaphazamisi"</string>
-    <!-- no translation found for new_notification_text_content_description (2915029960094389291) -->
-    <skip />
+    <string name="new_notification_text_content_description" msgid="2915029960094389291">"U-<xliff:g id="NAME">%1$s</xliff:g> uthumele umlayezo: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"U-<xliff:g id="NAME">%1$s</xliff:g> uthumele isithombe"</string>
-    <!-- no translation found for new_status_content_description (6046637888641308327) -->
-    <skip />
+    <string name="new_status_content_description" msgid="6046637888641308327">"U-<xliff:g id="NAME">%1$s</xliff:g> unesibuyekezo sesimo: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Kube khona inkinga ngokufunda imitha yakho yebhethri"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Thepha ukuze uthole olunye ulwazi"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Akukho alamu esethiwe"</string>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index e22bca7..d1ed2a8 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -523,9 +523,13 @@
      -->
     <string name="config_rounded_mask" translatable="false">"M8,0C3.6,0,0,3.6,0,8"</string>
 
-    <!-- Preferred refresh rate at keyguard, if supported by the display -->
+    <!-- Preferred refresh rate at keyguard, if supported by the display. Overrides
+         keyguardMaxRefreshRate. -->
     <integer name="config_keyguardRefreshRate">-1</integer>
 
+    <!-- Preferred max refresh rate at keyguard, if supported by the display. -->
+    <integer name="config_keyguardMaxRefreshRate">-1</integer>
+
     <!-- Whether or not to add a "people" notifications section -->
     <bool name="config_usePeopleFiltering">false</bool>
 
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/pip/PipSurfaceTransactionHelper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/pip/PipSurfaceTransactionHelper.java
index 42d628a..7d0fb5d 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/pip/PipSurfaceTransactionHelper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/pip/PipSurfaceTransactionHelper.java
@@ -43,16 +43,18 @@
     public PictureInPictureSurfaceTransaction scale(
             SurfaceControl.Transaction tx, SurfaceControl leash,
             Rect sourceBounds, Rect destinationBounds) {
+        float positionX = destinationBounds.left;
+        float positionY = destinationBounds.top;
         mTmpSourceRectF.set(sourceBounds);
         mTmpDestinationRectF.set(destinationBounds);
+        mTmpDestinationRectF.offsetTo(0, 0);
         mTmpTransform.setRectToRect(mTmpSourceRectF, mTmpDestinationRectF, Matrix.ScaleToFit.FILL);
         final float cornerRadius = getScaledCornerRadius(sourceBounds, destinationBounds);
         tx.setMatrix(leash, mTmpTransform, mTmpFloat9)
-                .setPosition(leash, mTmpDestinationRectF.left, mTmpDestinationRectF.top)
+                .setPosition(leash, positionX, positionY)
                 .setCornerRadius(leash, cornerRadius);
         return new PictureInPictureSurfaceTransaction(
-                mTmpDestinationRectF.left, mTmpDestinationRectF.top,
-                mTmpFloat9, 0 /* rotation */, cornerRadius, sourceBounds);
+                positionX, positionY, mTmpFloat9, 0 /* rotation */, cornerRadius, sourceBounds);
     }
 
     public PictureInPictureSurfaceTransaction scale(
@@ -61,6 +63,7 @@
             float degree, float positionX, float positionY) {
         mTmpSourceRectF.set(sourceBounds);
         mTmpDestinationRectF.set(destinationBounds);
+        mTmpDestinationRectF.offsetTo(0, 0);
         mTmpTransform.setRectToRect(mTmpSourceRectF, mTmpDestinationRectF, Matrix.ScaleToFit.FILL);
         mTmpTransform.postRotate(degree, 0, 0);
         final float cornerRadius = getScaledCornerRadius(sourceBounds, destinationBounds);
diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java
index 534f93e..9676a57 100644
--- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java
@@ -64,7 +64,7 @@
  */
 @SysUISingleton
 public class AppOpsControllerImpl extends BroadcastReceiver implements AppOpsController,
-        AppOpsManager.OnOpActiveChangedInternalListener,
+        AppOpsManager.OnOpActiveChangedListener,
         AppOpsManager.OnOpNotedListener, IndividualSensorPrivacyController.Callback,
         Dumpable {
 
@@ -359,11 +359,29 @@
         mBGHandler.post(() -> notifySuscribersWorker(code, uid, packageName, active));
     }
 
+    /**
+     * Required to override, delegate to other. Should not be called.
+     */
+    public void onOpActiveChanged(String op, int uid, String packageName, boolean active) {
+        onOpActiveChanged(op, uid, packageName, null, active,
+                AppOpsManager.ATTRIBUTION_FLAGS_NONE, AppOpsManager.ATTRIBUTION_CHAIN_ID_NONE);
+    }
+
+    // Get active app ops, and check if their attributions are trusted
     @Override
-    public void onOpActiveChanged(int code, int uid, String packageName, boolean active) {
+    public void onOpActiveChanged(String op, int uid, String packageName, String attributionTag,
+            boolean active, int attributionFlags, int attributionChainId) {
+        int code = AppOpsManager.strOpToOp(op);
         if (DEBUG) {
-            Log.w(TAG, String.format("onActiveChanged(%d,%d,%s,%s", code, uid, packageName,
-                    Boolean.toString(active)));
+            Log.w(TAG, String.format("onActiveChanged(%d,%d,%s,%s,%d,%d)", code, uid, packageName,
+                    Boolean.toString(active), attributionChainId, attributionFlags));
+        }
+        if (attributionChainId != AppOpsManager.ATTRIBUTION_CHAIN_ID_NONE
+                && attributionFlags != AppOpsManager.ATTRIBUTION_FLAGS_NONE
+                && (attributionFlags & AppOpsManager.ATTRIBUTION_FLAG_ACCESSOR) == 0
+                && (attributionFlags & AppOpsManager.ATTRIBUTION_FLAG_TRUSTED) == 0) {
+            // if this attribution chain isn't trusted, and this isn't the accessor, do not show it.
+            return;
         }
         boolean activeChanged = updateActives(code, uid, packageName, active);
         if (!activeChanged) return; // early return
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt
index 77cca2e..1df8ad5 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt
@@ -25,7 +25,6 @@
 import com.android.keyguard.KeyguardUpdateMonitorCallback
 import com.android.settingslib.Utils
 import com.android.systemui.statusbar.CircleReveal
-import com.android.systemui.statusbar.LiftReveal
 import com.android.systemui.statusbar.LightRevealEffect
 import com.android.systemui.statusbar.NotificationShadeWindowController
 import com.android.systemui.statusbar.commandline.Command
@@ -116,9 +115,6 @@
             /* end runnable */
             Runnable {
                 notificationShadeWindowController.setForcePluginOpen(false, this)
-                if (useCircleReveal) {
-                    lightRevealScrim?.revealEffect = LiftReveal
-                }
             },
             /* circleReveal */
             if (useCircleReveal) {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/AlwaysOnDisplayPolicy.java b/packages/SystemUI/src/com/android/systemui/doze/AlwaysOnDisplayPolicy.java
index 60ee806..735b3cd 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/AlwaysOnDisplayPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/AlwaysOnDisplayPolicy.java
@@ -60,6 +60,13 @@
     public int defaultDozeBrightness;
 
     /**
+     * Integer used to dim the screen just before the screen turns off.
+     *
+     * @see R.integer.config_screenBrightnessDim
+     */
+    public int dimBrightness;
+
+    /**
      * Integer array to map ambient brightness type to real screen brightness.
      *
      * @see Settings.Global#ALWAYS_ON_DISPLAY_CONSTANTS
@@ -175,6 +182,8 @@
                         DEFAULT_WALLPAPER_VISIBILITY_MS);
                 defaultDozeBrightness = resources.getInteger(
                         com.android.internal.R.integer.config_screenBrightnessDoze);
+                dimBrightness = resources.getInteger(
+                        com.android.internal.R.integer.config_screenBrightnessDim);
                 screenBrightnessArray = mParser.getIntArray(KEY_SCREEN_BRIGHTNESS_ARRAY,
                         resources.getIntArray(
                                 R.array.config_doze_brightness_sensor_to_brightness));
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
index 92494cf..470d2f3 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
@@ -24,6 +24,7 @@
 import android.hardware.SensorEventListener;
 import android.hardware.SensorManager;
 import android.os.Handler;
+import android.os.PowerManager;
 import android.os.SystemProperties;
 import android.os.Trace;
 import android.os.UserHandle;
@@ -33,6 +34,8 @@
 import com.android.systemui.doze.dagger.BrightnessSensor;
 import com.android.systemui.doze.dagger.DozeScope;
 import com.android.systemui.doze.dagger.WrappedService;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.statusbar.phone.DozeParameters;
 import com.android.systemui.util.sensors.AsyncSensorManager;
 
 import java.io.PrintWriter;
@@ -58,8 +61,11 @@
     private final Handler mHandler;
     private final SensorManager mSensorManager;
     private final Optional<Sensor> mLightSensorOptional;
+    private final WakefulnessLifecycle mWakefulnessLifecycle;
+    private final DozeParameters mDozeParameters;
     private final int[] mSensorToBrightness;
     private final int[] mSensorToScrimOpacity;
+    private final int mScreenBrightnessDim;
 
     private boolean mRegistered;
     private int mDefaultDozeBrightness;
@@ -79,15 +85,20 @@
     public DozeScreenBrightness(Context context, @WrappedService DozeMachine.Service service,
             AsyncSensorManager sensorManager,
             @BrightnessSensor Optional<Sensor> lightSensorOptional, DozeHost host, Handler handler,
-            AlwaysOnDisplayPolicy alwaysOnDisplayPolicy) {
+            AlwaysOnDisplayPolicy alwaysOnDisplayPolicy,
+            WakefulnessLifecycle wakefulnessLifecycle,
+            DozeParameters dozeParameters) {
         mContext = context;
         mDozeService = service;
         mSensorManager = sensorManager;
         mLightSensorOptional = lightSensorOptional;
+        mWakefulnessLifecycle = wakefulnessLifecycle;
+        mDozeParameters = dozeParameters;
         mDozeHost = host;
         mHandler = handler;
 
         mDefaultDozeBrightness = alwaysOnDisplayPolicy.defaultDozeBrightness;
+        mScreenBrightnessDim = alwaysOnDisplayPolicy.dimBrightness;
         mSensorToBrightness = alwaysOnDisplayPolicy.screenBrightnessArray;
         mSensorToScrimOpacity = alwaysOnDisplayPolicy.dimmingScrimArray;
     }
@@ -178,7 +189,9 @@
     }
 
     private void resetBrightnessToDefault() {
-        mDozeService.setDozeScreenBrightness(clampToUserSetting(mDefaultDozeBrightness));
+        mDozeService.setDozeScreenBrightness(
+                clampToDimBrightnessForScreenOff(
+                        clampToUserSetting(mDefaultDozeBrightness)));
         mDozeHost.setAodDimmingScrim(0f);
     }
     //TODO: brightnessfloat change usages to float.
@@ -189,6 +202,21 @@
         return Math.min(brightness, userSetting);
     }
 
+    /**
+     * Clamp the brightness to the dim brightness value used by PowerManagerService just before the
+     * device times out and goes to sleep, if we are sleeping from a timeout. This ensures that we
+     * don't raise the brightness back to the user setting before playing the screen off animation.
+     */
+    private int clampToDimBrightnessForScreenOff(int brightness) {
+        if (mDozeParameters.shouldControlUnlockedScreenOff()
+                && mWakefulnessLifecycle.getLastSleepReason()
+                == PowerManager.GO_TO_SLEEP_REASON_TIMEOUT) {
+            return Math.min(mScreenBrightnessDim, brightness);
+        } else {
+            return brightness;
+        }
+    }
+
     private void setLightSensorEnabled(boolean enabled) {
         if (enabled && !mRegistered && mLightSensorOptional.isPresent()) {
             // Wait until we get an event from the sensor until indicating ready.
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsInfoProvider.kt b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsInfoProvider.kt
index 17b532a..25837e3 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsInfoProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsInfoProvider.kt
@@ -24,7 +24,6 @@
 import android.util.Log
 import android.view.LayoutInflater
 import android.view.ViewGroup
-import android.widget.ImageView
 import android.widget.TextView
 import com.android.systemui.R
 import com.android.systemui.controls.controller.ControlsController
@@ -76,8 +75,7 @@
         val message = view.findViewById<TextView>(R.id.global_actions_change_message)
         message?.setText(context.getString(R.string.global_actions_change_description, walletTitle))
 
-        val button = view.findViewById<ImageView>(R.id.global_actions_change_button)
-        button.setOnClickListener { _ ->
+        view.setOnClickListener { _ ->
             dismissParent.run()
             activityStarter.postStartActivityDismissingKeyguard(pendingIntent)
         }
@@ -119,4 +117,4 @@
         val count = sharedPrefs.getInt(KEY_VIEW_COUNT, 0)
         sharedPrefs.edit().putInt(KEY_VIEW_COUNT, count + 1).apply()
     }
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
index 70837385..62b92cb 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
@@ -73,7 +73,7 @@
             "persist.wm.enable_remote_keyguard_animation";
 
     private static final int sEnableRemoteKeyguardAnimation =
-            SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1);
+            SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 0);
 
     /**
      * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
index cc9414c..2facf3d 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
@@ -12,10 +12,12 @@
 import android.view.ViewGroup
 import android.widget.LinearLayout
 import androidx.annotation.VisibleForTesting
+import com.android.systemui.Dumpable
 import com.android.systemui.R
 import com.android.systemui.classifier.FalsingCollector
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.dump.DumpManager
 import com.android.systemui.plugins.ActivityStarter
 import com.android.systemui.plugins.FalsingManager
 import com.android.systemui.qs.PageIndicator
@@ -27,6 +29,8 @@
 import com.android.systemui.util.animation.requiresRemeasuring
 import com.android.systemui.util.concurrency.DelayableExecutor
 import com.android.systemui.util.time.SystemClock
+import java.io.FileDescriptor
+import java.io.PrintWriter
 import java.util.TreeMap
 import javax.inject.Inject
 import javax.inject.Provider
@@ -51,8 +55,9 @@
     private val mediaManager: MediaDataManager,
     configurationController: ConfigurationController,
     falsingCollector: FalsingCollector,
-    falsingManager: FalsingManager
-) {
+    falsingManager: FalsingManager,
+    dumpManager: DumpManager
+) : Dumpable {
     /**
      * The current width of the carousel
      */
@@ -166,6 +171,7 @@
     lateinit var updateUserVisibility: () -> Unit
 
     init {
+        dumpManager.registerDumpable(TAG, this)
         mediaFrame = inflateMediaCarousel()
         mediaCarousel = mediaFrame.requireViewById(R.id.media_carousel_scroller)
         pageIndicator = mediaFrame.requireViewById(R.id.media_page_indicator)
@@ -421,7 +427,7 @@
         }
     }
 
-    private fun removePlayer(
+    fun removePlayer(
         key: String,
         dismissMediaData: Boolean = true,
         dismissRecommendation: Boolean = true
@@ -748,6 +754,15 @@
         }
         mediaManager.onSwipeToDismiss()
     }
+
+    override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
+        pw.apply {
+            println("keysNeedRemoval: $keysNeedRemoval")
+            println("playerKeys: ${MediaPlayerData.playerKeys()}")
+            println("smartspaceMediaData: ${MediaPlayerData.smartspaceMediaData}")
+            println("shouldPrioritizeSs: ${MediaPlayerData.shouldPrioritizeSs}")
+        }
+    }
 }
 
 @VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index a3d7a81..902e8c2 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -455,8 +455,12 @@
 
             if (mKey != null) {
                 closeGuts();
-                mMediaDataManagerLazy.get().dismissMediaData(mKey,
-                        MediaViewController.GUTS_ANIMATION_DURATION + 100);
+                if (!mMediaDataManagerLazy.get().dismissMediaData(mKey,
+                        MediaViewController.GUTS_ANIMATION_DURATION + 100)) {
+                    Log.w(TAG, "Manager failed to dismiss media " + mKey);
+                    // Remove directly from carousel to let user recover - TODO(b/190799184)
+                    mMediaCarouselController.removePlayer(key, false, false);
+                }
             } else {
                 Log.w(TAG, "Dismiss media with null notification. Token uid="
                         + data.getToken().getUid());
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
index df1b07f..0a28b47 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
@@ -430,7 +430,11 @@
         notifyMediaDataRemoved(key)
     }
 
-    fun dismissMediaData(key: String, delay: Long) {
+    /**
+     * Dismiss a media entry. Returns false if the key was not found.
+     */
+    fun dismissMediaData(key: String, delay: Long): Boolean {
+        val existed = mediaEntries[key] != null
         backgroundExecutor.execute {
             mediaEntries[key]?.let { mediaData ->
                 if (mediaData.isLocalSession) {
@@ -442,6 +446,7 @@
             }
         }
         foregroundExecutor.executeDelayed({ removeEntry(key) }, delay)
+        return existed
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index 68962b0..4cd4048 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -180,6 +180,7 @@
                     LayoutParams.WRAP_CONTENT);
             setLayoutParams(lp);
             setMaxColumns(4);
+            mLastRowPadding = true;
         }
 
         @Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index c58173b..03a2c84 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -78,7 +78,6 @@
     private TintedIconManager mTintedIconManager;
     private QSExpansionPathInterpolator mQSExpansionPathInterpolator;
 
-    private int mStatusBarPaddingTop = 0;
     private int mRoundedCornerPadding = 0;
     private int mWaterfallTopInset;
     private int mCutOutPaddingLeft;
@@ -205,7 +204,6 @@
 
         mRoundedCornerPadding = resources.getDimensionPixelSize(
                 R.dimen.rounded_corner_content_padding);
-        mStatusBarPaddingTop = resources.getDimensionPixelSize(R.dimen.status_bar_padding_top);
 
         int qsOffsetHeight = resources.getDimensionPixelSize(
                 com.android.internal.R.dimen.quick_qs_offset_height);
@@ -465,11 +463,11 @@
         }
 
         mDatePrivacyView.setPadding(paddingLeft,
-                mWaterfallTopInset + mStatusBarPaddingTop,
+                mWaterfallTopInset,
                 paddingRight,
                 0);
         mClockIconsView.setPadding(paddingLeft,
-                mWaterfallTopInset + mStatusBarPaddingTop,
+                mWaterfallTopInset,
                 paddingRight,
                 0);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
index 3e558a9..2b96a34 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
@@ -31,6 +31,7 @@
     protected int mCellMarginVertical;
     protected int mSidePadding;
     protected int mRows = 1;
+    protected boolean mLastRowPadding = false;
 
     protected final ArrayList<TileRecord> mRecords = new ArrayList<>();
     protected boolean mListening;
@@ -167,6 +168,10 @@
         }
 
         int height = (mCellHeight + mCellMarginVertical) * mRows;
+        if (!mLastRowPadding) {
+            height -= mCellMarginVertical;
+        }
+
         if (height < 0) height = 0;
 
         setMeasuredDimension(width, height);
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
index 35637f6..af0141c 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
@@ -80,6 +80,7 @@
     private View mSave;
     private View mEdit;
     private View mShare;
+    private View mDelete;
     private CropView mCropView;
     private MagnifierView mMagnifierView;
     private ScrollCaptureResponse mScrollCaptureResponse;
@@ -120,18 +121,24 @@
         mSave = requireViewById(R.id.save);
         mEdit = requireViewById(R.id.edit);
         mShare = requireViewById(R.id.share);
+        mDelete = requireViewById(R.id.delete);
         mCropView = requireViewById(R.id.crop_view);
         mMagnifierView = requireViewById(R.id.magnifier);
         mCropView.setCropInteractionListener(mMagnifierView);
         mTransitionView = requireViewById(R.id.transition);
         mEnterTransitionView = requireViewById(R.id.enter_transition);
 
-        requireViewById(R.id.cancel).setOnClickListener(v -> finishAndRemoveTask());
-
         mSave.setOnClickListener(this::onClicked);
         mEdit.setOnClickListener(this::onClicked);
         mShare.setOnClickListener(this::onClicked);
 
+        // Only show the delete button if we have something to delete (should typically be the case)
+        if (getIntent().getData() != null) {
+            mDelete.setOnClickListener(this::onClicked);
+        } else {
+            mDelete.setVisibility(View.GONE);
+        }
+
         mPreview.addOnLayoutChangeListener(
                 (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) ->
                         updateImageDimensions());
@@ -321,6 +328,7 @@
         mSave.setEnabled(enabled);
         mEdit.setEnabled(enabled);
         mShare.setEnabled(enabled);
+        mDelete.setEnabled(enabled);
     }
 
     private void doEdit(Uri uri) {
@@ -334,11 +342,18 @@
                 | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 
         mTransitionView.setImageBitmap(mOutputBitmap);
-        mTransitionView.setVisibility(View.VISIBLE);
         mTransitionView.setTransitionName(
                 ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME);
         // TODO: listen for transition completing instead of finishing onStop
         mTransitionStarted = true;
+        int[] locationOnScreen = new int[2];
+        mTransitionView.getLocationOnScreen(locationOnScreen);
+        int[] locationInWindow = new int[2];
+        mTransitionView.getLocationInWindow(locationInWindow);
+        int deltaX = locationOnScreen[0] - locationInWindow[0];
+        int deltaY = locationOnScreen[1] - locationInWindow[1];
+        mTransitionView.setX(mTransitionView.getX() - deltaX);
+        mTransitionView.setY(mTransitionView.getY() - deltaY);
         startActivity(intent,
                 ActivityOptions.makeSceneTransitionAnimation(this, mTransitionView,
                         ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME).toBundle());
@@ -368,6 +383,11 @@
         } else if (id == R.id.share) {
             mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_LONG_SCREENSHOT_SHARE);
             startExport(PendingAction.SHARE);
+        } else if (id == R.id.delete) {
+            mBackgroundExecutor.execute(() -> {
+                getContentResolver().delete(getIntent().getData(), null);
+                finishAndRemoveTask();
+            });
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
index ee9000f..52b393f 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
@@ -264,6 +264,7 @@
 
     private Animator mScreenshotAnimation;
     private RequestCallback mCurrentRequestCallback;
+    private Uri mLatestUriSaved;
 
     private final Handler mScreenshotHandler = new Handler(Looper.getMainLooper()) {
         @Override
@@ -546,7 +547,6 @@
             mAccessibilityManager.sendAccessibilityEvent(event);
         }
 
-
         if (mScreenshotView.isAttachedToWindow()) {
             // if we didn't already dismiss for another reason
             if (!mScreenshotView.isDismissing()) {
@@ -563,6 +563,7 @@
                 .getWindowInsets().getDisplayCutout());
 
         mScreenBitmap = screenshot;
+        mLatestUriSaved = null;
 
         if (!isUserSetupComplete()) {
             Log.w(TAG, "User setup not complete, displaying toast only");
@@ -700,6 +701,7 @@
                                                 longScreenshot));
 
                         final Intent intent = new Intent(mContext, LongScreenshotActivity.class);
+                        intent.setData(mLatestUriSaved);
                         intent.setFlags(
                                 Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
 
@@ -889,6 +891,8 @@
 
         resetTimeout();
 
+        mLatestUriSaved = imageData.uri;
+
         if (imageData.uri != null) {
             mScreenshotHandler.post(() -> {
                 if (mScreenshotAnimation != null && mScreenshotAnimation.isRunning()) {
@@ -936,10 +940,12 @@
      */
     private Supplier<ActionTransition> getActionTransitionSupplier() {
         return () -> {
+            View preview = mScreenshotView.getTransitionView();
+            preview.setX(preview.getX() - mScreenshotView.getStaticLeftMargin());
             Pair<ActivityOptions, ExitTransitionCoordinator> transition =
                     ActivityOptions.startSharedElementAnimation(
                             mWindow, new ScreenshotExitTransitionCallbacksSupplier(true).get(),
-                            null, Pair.create(mScreenshotView.getScreenshotPreview(),
+                            null, Pair.create(mScreenshotView.getTransitionView(),
                                     ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME));
             transition.second.startExit();
 
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
index 05e1bc0..e9e62f2 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
@@ -137,11 +137,13 @@
     private int mNavMode;
     private boolean mOrientationPortrait;
     private boolean mDirectionLTR;
+    private int mStaticLeftMargin;
 
     private ScreenshotSelectorView mScreenshotSelectorView;
     private ImageView mScrollingScrim;
     private View mScreenshotStatic;
     private ImageView mScreenshotPreview;
+    private View mTransitionView;
     private View mScreenshotPreviewBorder;
     private ImageView mScrollablePreview;
     private ImageView mScreenshotFlash;
@@ -337,6 +339,7 @@
         mScrollingScrim = requireNonNull(findViewById(R.id.screenshot_scrolling_scrim));
         mScreenshotStatic = requireNonNull(findViewById(R.id.global_screenshot_static));
         mScreenshotPreview = requireNonNull(findViewById(R.id.global_screenshot_preview));
+        mTransitionView = requireNonNull(findViewById(R.id.screenshot_transition_view));
         mScreenshotPreviewBorder = requireNonNull(
                 findViewById(R.id.global_screenshot_preview_border));
         mScreenshotPreview.setClipToOutline(true);
@@ -382,8 +385,12 @@
         requestFocus();
     }
 
-    View getScreenshotPreview() {
-        return mScreenshotPreview;
+    View getTransitionView() {
+        return mTransitionView;
+    }
+
+    int getStaticLeftMargin() {
+        return mStaticLeftMargin;
     }
 
     /**
@@ -424,6 +431,7 @@
                         Math.max(cutout.getSafeInsetRight(), waterfall.right), waterfall.bottom);
             }
         }
+        mStaticLeftMargin = p.leftMargin;
         mScreenshotStatic.setLayoutParams(p);
         mScreenshotStatic.requestLayout();
     }
@@ -860,7 +868,8 @@
             matrix.setScale(scale, scale);
             matrix.postTranslate(-scrollableArea.left * scale, -scrollableArea.top * scale);
 
-            mScrollablePreview.setTranslationX(scale * scrollableArea.left);
+            mScrollablePreview.setTranslationX(scale
+                    * (mDirectionLTR ? scrollableArea.left : scrollableArea.right - getWidth()));
             mScrollablePreview.setTranslationY(scale * scrollableArea.top);
             mScrollablePreview.setImageMatrix(matrix);
             mScrollablePreview.setImageBitmap(screenBitmap);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 5afdc38..08c90f1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -597,8 +597,8 @@
         if (mDozing && !TextUtils.isEmpty(mTransientIndication)) {
             // Make sure this doesn't get stuck and burns in. Acquire wakelock until its cleared.
             mWakeLock.setAcquired(true);
-            hideTransientIndicationDelayed(BaseKeyguardCallback.HIDE_DELAY_MS);
         }
+        hideTransientIndicationDelayed(BaseKeyguardCallback.HIDE_DELAY_MS);
 
         updateIndication(false);
     }
@@ -802,7 +802,6 @@
         } else if (mKeyguardUpdateMonitor.isScreenOn()) {
             showTransientIndication(mContext.getString(R.string.keyguard_unlock),
                     false /* isError */, true /* hideOnScreenOff */);
-            hideTransientIndicationDelayed(BaseKeyguardCallback.HIDE_DELAY_MS);
         }
     }
 
@@ -862,7 +861,6 @@
             if (mDozing) {
                 if (!wasPluggedIn && mPowerPluggedIn) {
                     showTransientIndication(computePowerIndication());
-                    hideTransientIndicationDelayed(HIDE_DELAY_MS);
                 } else if (wasPluggedIn && !mPowerPluggedIn) {
                     hideTransientIndication();
                 }
@@ -882,23 +880,19 @@
                 return;
             }
 
-            if (biometricSourceType == BiometricSourceType.FACE
-                    && shouldSuppressFaceMsgAndShowTryFingerprintMsg()) {
-                // suggest trying fingerprint
-                showTransientIndication(R.string.keyguard_try_fingerprint);
-                return;
-            }
-
             boolean showSwipeToUnlock =
                     msgId == KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_RECOGNIZED;
             if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
                 mStatusBarKeyguardViewManager.showBouncerMessage(helpString,
                         mInitialTextColorState);
             } else if (mKeyguardUpdateMonitor.isScreenOn()) {
-                showTransientIndication(helpString, false /* isError */, showSwipeToUnlock);
-                if (!showSwipeToUnlock) {
-                    hideTransientIndicationDelayed(TRANSIENT_BIOMETRIC_ERROR_TIMEOUT);
+                if (biometricSourceType == BiometricSourceType.FACE
+                        && shouldSuppressFaceMsgAndShowTryFingerprintMsg()) {
+                    // suggest trying fingerprint
+                    showTransientIndication(R.string.keyguard_try_fingerprint);
+                    return;
                 }
+                showTransientIndication(helpString, false /* isError */, showSwipeToUnlock);
             }
             if (showSwipeToUnlock) {
                 mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SWIPE_UP_TO_UNLOCK),
@@ -913,7 +907,9 @@
                 return;
             }
             if (biometricSourceType == BiometricSourceType.FACE
-                    && shouldSuppressFaceMsgAndShowTryFingerprintMsg()) {
+                    && shouldSuppressFaceMsgAndShowTryFingerprintMsg()
+                    && !mStatusBarKeyguardViewManager.isBouncerShowing()
+                    && mKeyguardUpdateMonitor.isScreenOn()) {
                 // suggest trying fingerprint
                 showTransientIndication(R.string.keyguard_try_fingerprint);
                 return;
@@ -935,8 +931,6 @@
             } else if (mKeyguardUpdateMonitor.isScreenOn()) {
                 showTransientIndication(errString, /* isError */ true,
                     /* hideOnScreenOff */ true);
-                // We want to keep this message around in case the screen was off
-                hideTransientIndicationDelayed(HIDE_DELAY_MS);
             } else {
                 mMessageToShowOnScreenOn = errString;
             }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
index f6b16b0..28bdd5f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
@@ -271,10 +271,6 @@
                 brightnessMirrorSpring.finishIfRunning()
             }
         }
-
-        override fun onDozeAmountChanged(linear: Float, eased: Float) {
-            wakeAndUnlockBlurRadius = blurUtils.blurRadiusOfRatio(eased)
-        }
     }
 
     init {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
index 467f27f..396d86b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
@@ -435,7 +435,8 @@
         final int N = mListContainer.getContainerChildCount();
 
         int visibleNotifications = 0;
-        boolean onKeyguard = mStatusBarStateController.getState() == StatusBarState.KEYGUARD;
+        boolean onKeyguard =
+                mStatusBarStateController.getCurrentOrUpcomingState() == StatusBarState.KEYGUARD;
         Stack<ExpandableNotificationRow> stack = new Stack<>();
         for (int i = N - 1; i >= 0; i--) {
             View child = mListContainer.getContainerChildAt(i);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
index f8a1ff8..0725bf9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
@@ -82,6 +82,7 @@
     private final UiEventLogger mUiEventLogger;
     private int mState;
     private int mLastState;
+    private int mUpcomingState;
     private boolean mLeaveOpenOnKeyguardHide;
     private boolean mKeyguardRequested;
 
@@ -169,6 +170,7 @@
             }
             mLastState = mState;
             mState = state;
+            mUpcomingState = state;
             mUiEventLogger.log(StatusBarStateEvent.fromState(mState));
             for (RankedListener rl : new ArrayList<>(mListeners)) {
                 rl.mListener.onStateChanged(mState);
@@ -184,6 +186,16 @@
     }
 
     @Override
+    public void setUpcomingState(int nextState) {
+        mUpcomingState = nextState;
+    }
+
+    @Override
+    public int getCurrentOrUpcomingState() {
+        return mUpcomingState;
+    }
+
+    @Override
     public boolean isDozing() {
         return mIsDozing;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
index 73f3d90..2520050 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
@@ -74,6 +74,20 @@
     boolean setState(int state, boolean force);
 
     /**
+     * Provides a hint that the status bar has started to transition to another
+     * {@link StatusBarState}. This suggests that a matching call to setState() with the same value
+     * will happen in the near future, although that may not happen if the animation is canceled,
+     * etc.
+     */
+    void setUpcomingState(int state);
+
+    /**
+     * If the status bar is in the process of transitioning to a new state, returns that state.
+     * Otherwise, returns the current state.
+     */
+    int getCurrentOrUpcomingState();
+
+    /**
      * Update the dozing state from {@link StatusBar}'s perspective
      * @param isDozing well, are we dozing?
      * @return {@code true} if the state changed, else {@code false}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FooterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FooterView.java
index 8e24890..86c90c7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FooterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FooterView.java
@@ -25,6 +25,7 @@
 
 import com.android.systemui.R;
 import com.android.systemui.statusbar.notification.stack.ExpandableViewState;
+import com.android.systemui.statusbar.notification.stack.ViewState;
 
 public class FooterView extends StackScrollerDecorView {
     private final int mClearAllTopPadding;
@@ -122,6 +123,14 @@
         public boolean hideContent;
 
         @Override
+        public void copyFrom(ViewState viewState) {
+            super.copyFrom(viewState);
+            if (viewState instanceof FooterViewState) {
+                hideContent = ((FooterViewState) viewState).hideContent;
+            }
+        }
+
+        @Override
         public void applyToView(View view) {
             super.applyToView(view);
             if (view instanceof FooterView) {
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 ba2f555..ead87a4 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
@@ -5268,6 +5268,8 @@
         mController.getNoticationRoundessManager()
                 .setViewsAffectedBySwipe(null, null, null,
                         getResources().getBoolean(R.bool.flag_notif_updates));
+        // Round bottom corners for notification right before shelf.
+        mShelf.updateAppearance();
     }
 
     void setTopHeadsUpEntry(NotificationEntry topEntry) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
index add6fda..3fc8b8d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
@@ -399,12 +399,15 @@
         if (view instanceof FooterView) {
             final boolean shadeClosed = !ambientState.isShadeExpanded();
             final boolean isShelfShowing = algorithmState.firstViewInShelf != null;
-
-            final float footerEnd = algorithmState.mCurrentExpandedYPosition
-                    + view.getIntrinsicHeight();
-            final boolean noSpaceForFooter = footerEnd > ambientState.getStackEndHeight();
-            ((FooterView.FooterViewState) viewState).hideContent =
-                    shadeClosed || isShelfShowing || noSpaceForFooter;
+            if (shadeClosed) {
+                viewState.hidden = true;
+            } else {
+                final float footerEnd = algorithmState.mCurrentExpandedYPosition
+                        + view.getIntrinsicHeight();
+                final boolean noSpaceForFooter = footerEnd > ambientState.getStackEndHeight();
+                ((FooterView.FooterViewState) viewState).hideContent =
+                        isShelfShowing || noSpaceForFooter;
+            }
         } else {
             if (view != ambientState.getTrackedHeadsUpRow()) {
                 if (ambientState.isExpansionChanging()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index fbf7b88..567318c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -181,6 +181,11 @@
     private static final boolean DEBUG = false;
 
     /**
+     * The parallax amount of the quick settings translation when dragging down the panel
+     */
+    private static final float QS_PARALLAX_AMOUNT = 0.175f;
+
+    /**
      * Fling expanding QS.
      */
     private static final int FLING_EXPAND = 0;
@@ -544,6 +549,11 @@
     private int mDistanceForQSFullShadeTransition;
 
     /**
+     * The translation amount for QS for the full shade transition
+     */
+    private float mQsTranslationForFullShadeTransition;
+
+    /**
      * The maximum overshoot allowed for the top padding for the full shade transition
      */
     private int mMaxOverscrollAmountForPulse;
@@ -589,6 +599,11 @@
      * The animator for the qs clipping bounds.
      */
     private ValueAnimator mQsClippingAnimation = null;
+
+    /**
+     * Is the current animator resetting the qs translation.
+     */
+    private boolean mIsQsTranslationResetAnimator;
     private final Rect mKeyguardStatusAreaClipBounds = new Rect();
     private final Region mQsInterceptRegion = new Region();
 
@@ -2247,8 +2262,7 @@
 
     private void updateQSExpansionEnabledAmbient() {
         final float scrollRangeToTop = mAmbientState.getTopPadding() - mQuickQsOffsetHeight;
-        mQsExpansionEnabledAmbient =
-                mAmbientState.getScrollY() <= scrollRangeToTop && !mAmbientState.isShadeOpening();
+        mQsExpansionEnabledAmbient = mAmbientState.getScrollY() <= scrollRangeToTop;
         setQsExpansionEnabled();
     }
 
@@ -2326,6 +2340,7 @@
                 @Override
                 public void onAnimationEnd(Animator animation) {
                     mQsClippingAnimation = null;
+                    mIsQsTranslationResetAnimator = false;
                 }
             });
             mQsClippingAnimation.start();
@@ -2349,7 +2364,18 @@
             statusBarClipTop = top - mKeyguardStatusBar.getTop();
         }
         if (mQs != null) {
-            mQs.setFancyClipping(top, bottom, radius, qsVisible
+            float qsTranslation = 0;
+            if (mTransitioningToFullShadeProgress > 0.0f || (mQsClippingAnimation != null
+                    && mIsQsTranslationResetAnimator)) {
+                qsTranslation = (top - mQs.getHeader().getHeight()) * QS_PARALLAX_AMOUNT;
+            }
+            mQsTranslationForFullShadeTransition = qsTranslation;
+            updateQsFrameTranslation();
+            float currentTranslation = mQsFrame.getTranslationY();
+            mQs.setFancyClipping((
+                    int) (top - currentTranslation),
+                    (int) (bottom - currentTranslation),
+                    radius, qsVisible
                     && !mShouldUseSplitNotificationShade);
         }
         mKeyguardStatusViewController.setClipBounds(
@@ -2486,6 +2512,7 @@
         if (animate && !mShouldUseSplitNotificationShade) {
             animateNextNotificationBounds(StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE,
                     delay);
+            mIsQsTranslationResetAnimator = mQsTranslationForFullShadeTransition > 0.0f;
         }
 
         float endPosition = 0;
@@ -2885,7 +2912,7 @@
         float startHeight = -mQsExpansionHeight;
         if (!mShouldUseSplitNotificationShade && mBarState == StatusBarState.SHADE) {
             // Small parallax as we pull down and clip QS
-            startHeight = -mQsExpansionHeight * 0.2f;
+            startHeight = -mQsExpansionHeight * QS_PARALLAX_AMOUNT;
         }
         if (mKeyguardBypassController.getBypassEnabled() && isOnKeyguard()) {
             if (mNotificationStackScrollLayoutController.isPulseExpanding()) {
@@ -3067,10 +3094,15 @@
         super.setOverExpansion(overExpansion);
         // Translating the quick settings by half the overexpansion to center it in the background
         // frame
-        mQsFrame.setTranslationY(overExpansion / 2f);
+        updateQsFrameTranslation();
         mNotificationStackScrollLayoutController.setOverExpansion(overExpansion);
     }
 
+    private void updateQsFrameTranslation() {
+        float translation = mOverExpansion / 2.0f + mQsTranslationForFullShadeTransition;
+        mQsFrame.setTranslationY(translation);
+    }
+
     @Override
     protected void onTrackingStarted() {
         mFalsingCollector.onTrackingStarted(!mKeyguardStateController.canDismissLockScreen());
@@ -4402,6 +4434,8 @@
      */
     public void showAodUi() {
         setDozing(true /* dozing */, false /* animate */, null);
+        mStatusBarStateController.setUpcomingState(KEYGUARD);
+        mEntryManager.updateNotifications("showAodUi");
         mStatusBarStateListener.onStateChanged(KEYGUARD);
         mStatusBarStateListener.onDozeAmountChanged(1f, 1f);
         setExpandedFraction(1f);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java
index 15b2da0..022faf78 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java
@@ -38,8 +38,10 @@
 import android.view.WindowManager;
 import android.view.WindowManager.LayoutParams;
 
+import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.systemui.Dumpable;
 import com.android.systemui.R;
+import com.android.systemui.biometrics.AuthController;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dump.DumpManager;
@@ -83,9 +85,11 @@
     private final LayoutParams mLpChanged;
     private final boolean mKeyguardScreenRotation;
     private final long mLockScreenDisplayTimeout;
-    private final float mKeyguardRefreshRate;
+    private final float mKeyguardPreferredRefreshRate; // takes precedence over max
+    private final float mKeyguardMaxRefreshRate;
     private final KeyguardViewMediator mKeyguardViewMediator;
     private final KeyguardBypassController mKeyguardBypassController;
+    private final AuthController mAuthController;
     private ViewGroup mNotificationShadeView;
     private LayoutParams mLp;
     private boolean mHasTopUi;
@@ -112,7 +116,8 @@
             SysuiColorExtractor colorExtractor,
             DumpManager dumpManager,
             KeyguardStateController keyguardStateController,
-            UnlockedScreenOffAnimationController unlockedScreenOffAnimationController) {
+            UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
+            AuthController authController) {
         mContext = context;
         mWindowManager = windowManager;
         mActivityManager = activityManager;
@@ -125,6 +130,7 @@
         mColorExtractor = colorExtractor;
         mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController;
         dumpManager.registerDumpable(getClass().getName(), this);
+        mAuthController = authController;
 
         mLockScreenDisplayTimeout = context.getResources()
                 .getInteger(R.integer.config_lockScreenDisplayTimeout);
@@ -133,13 +139,25 @@
                         SysuiStatusBarStateController.RANK_STATUS_BAR_WINDOW_CONTROLLER);
         configurationController.addCallback(this);
 
-        Display.Mode[] supportedModes = context.getDisplay().getSupportedModes();
-        Display.Mode currentMode = context.getDisplay().getMode();
+        float desiredPreferredRefreshRate = context.getResources()
+                .getInteger(R.integer.config_keyguardRefreshRate);
+        float actualPreferredRefreshRate = -1;
+        if (desiredPreferredRefreshRate > -1) {
+            for (Display.Mode displayMode : context.getDisplay().getSupportedModes()) {
+                if (Math.abs(displayMode.getRefreshRate() - desiredPreferredRefreshRate) <= .1) {
+                    actualPreferredRefreshRate = displayMode.getRefreshRate();
+                    break;
+                }
+            }
+        }
+
+        mKeyguardPreferredRefreshRate = actualPreferredRefreshRate;
+
         // Running on the highest frame rate available can be expensive.
         // Let's specify a preferred refresh rate, and allow higher FPS only when we
         // know that we're not falsing (because we unlocked.)
-        mKeyguardRefreshRate = context.getResources()
-                .getInteger(R.integer.config_keyguardRefreshRate);
+        mKeyguardMaxRefreshRate = context.getResources()
+                .getInteger(R.integer.config_keyguardMaxRefreshRate);
     }
 
     /**
@@ -274,12 +292,26 @@
             mLpChanged.privateFlags &= ~LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
         }
 
-        if (mKeyguardRefreshRate > 0) {
+        if (mKeyguardPreferredRefreshRate > 0) {
+            boolean onKeyguard = state.mStatusBarState == StatusBarState.KEYGUARD
+                    && !state.mKeyguardFadingAway && !state.mKeyguardGoingAway
+                    && !state.mDozing;
+            if (onKeyguard
+                    && mAuthController.isUdfpsEnrolled(KeyguardUpdateMonitor.getCurrentUser())) {
+                mLpChanged.preferredMaxDisplayRefreshRate = mKeyguardPreferredRefreshRate;
+                mLpChanged.preferredMinDisplayRefreshRate = mKeyguardPreferredRefreshRate;
+            } else {
+                mLpChanged.preferredMaxDisplayRefreshRate = 0;
+                mLpChanged.preferredMinDisplayRefreshRate = 0;
+            }
+            Trace.setCounter("display_set_preferred_refresh_rate",
+                    (long) mKeyguardPreferredRefreshRate);
+        } else if (mKeyguardMaxRefreshRate > 0) {
             boolean bypassOnKeyguard = mKeyguardBypassController.getBypassEnabled()
                     && state.mStatusBarState == StatusBarState.KEYGUARD
                     && !state.mKeyguardFadingAway && !state.mKeyguardGoingAway;
             if (state.mDozing || bypassOnKeyguard) {
-                mLpChanged.preferredMaxDisplayRefreshRate = mKeyguardRefreshRate;
+                mLpChanged.preferredMaxDisplayRefreshRate = mKeyguardMaxRefreshRate;
             } else {
                 mLpChanged.preferredMaxDisplayRefreshRate = 0;
             }
@@ -685,7 +717,8 @@
     @Override
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println(TAG + ":");
-        pw.println("  mKeyguardRefreshRate=" + mKeyguardRefreshRate);
+        pw.println("  mKeyguardMaxRefreshRate=" + mKeyguardMaxRefreshRate);
+        pw.println("  mKeyguardPreferredRefreshRate=" + mKeyguardPreferredRefreshRate);
         pw.println(mCurrentState);
         if (mNotificationShadeView != null && mNotificationShadeView.getViewRootImpl() != null) {
             mNotificationShadeView.getViewRootImpl().dump("  ", pw);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
index 7f4dabd..b5d9bd6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
@@ -26,6 +26,7 @@
 import android.os.SystemClock;
 import android.os.UserHandle;
 import android.provider.Settings;
+import android.util.Log;
 import android.view.GestureDetector;
 import android.view.InputDevice;
 import android.view.KeyEvent;
@@ -66,6 +67,7 @@
  * Controller for {@link NotificationShadeWindowView}.
  */
 public class NotificationShadeWindowViewController {
+    private static final String TAG = "NotifShadeWindowVC";
     private final InjectionInflationController mInjectionInflationController;
     private final NotificationWakeUpCoordinator mCoordinator;
     private final PulseExpansionHandler mPulseExpansionHandler;
@@ -213,6 +215,10 @@
         mView.setInteractionEventHandler(new NotificationShadeWindowView.InteractionEventHandler() {
             @Override
             public Boolean handleDispatchTouchEvent(MotionEvent ev) {
+                if (mStatusBarView == null) {
+                    Log.w(TAG, "Ignoring touch while statusBarView not yet set.");
+                    return false;
+                }
                 boolean isDown = ev.getActionMasked() == MotionEvent.ACTION_DOWN;
                 boolean isUp = ev.getActionMasked() == MotionEvent.ACTION_UP;
                 boolean isCancel = ev.getActionMasked() == MotionEvent.ACTION_CANCEL;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallChronometer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallChronometer.kt
index 6e27cae..bb7ba4c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallChronometer.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallChronometer.kt
@@ -20,6 +20,7 @@
 import android.util.AttributeSet
 
 import android.widget.Chronometer
+import androidx.annotation.UiThread
 
 /**
  * A [Chronometer] specifically for the ongoing call chip in the status bar.
@@ -46,10 +47,10 @@
 
     // Minimum width that the text view can be. Corresponds with the largest number width seen so
     // far.
-    var minimumTextWidth: Int = 0
+    private var minimumTextWidth: Int = 0
 
     // True if the text is too long for the space available, so the text should be hidden.
-    var shouldHideText: Boolean = false
+    private var shouldHideText: Boolean = false
 
     override fun setBase(base: Long) {
         // These variables may have changed during the previous call, so re-set them before the new
@@ -60,6 +61,13 @@
         super.setBase(base)
     }
 
+    /** Sets whether this view should hide its text or not. */
+    @UiThread
+    fun setShouldHideText(shouldHideText: Boolean) {
+        this.shouldHideText = shouldHideText
+        requestLayout()
+    }
+
     override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
         if (shouldHideText) {
             setMeasuredDimension(0, 0)
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 c20730e..16fa5da 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
@@ -172,10 +172,16 @@
             currentChipView?.findViewById<View>(R.id.ongoing_call_chip_background)
 
         if (currentChipView != null && timeView != null && backgroundView != null) {
-            timeView.base = currentCallNotificationInfo.callStartTime -
-                    System.currentTimeMillis() +
-                    systemClock.elapsedRealtime()
-            timeView.start()
+            if (currentCallNotificationInfo.hasValidStartTime()) {
+                timeView.setShouldHideText(false)
+                timeView.base = currentCallNotificationInfo.callStartTime -
+                        systemClock.currentTimeMillis() +
+                        systemClock.elapsedRealtime()
+                timeView.start()
+            } else {
+                timeView.setShouldHideText(true)
+                timeView.stop()
+            }
 
             currentCallNotificationInfo.intent?.let { intent ->
                 currentChipView.setOnClickListener {
@@ -260,7 +266,9 @@
     @VisibleForTesting
     fun tearDownChipView() = chipView?.getTimeView()?.stop()
 
-    private fun View.getTimeView(): Chronometer? = this.findViewById(R.id.ongoing_call_chip_time)
+    private fun View.getTimeView(): OngoingCallChronometer? {
+        return this.findViewById(R.id.ongoing_call_chip_time)
+    }
 
     private data class CallNotificationInfo(
         val key: String,
@@ -269,7 +277,13 @@
         val uid: Int,
         /** True if the call is currently ongoing (as opposed to incoming, screening, etc.). */
         val isOngoing: Boolean
-    )
+    ) {
+        /**
+         * Returns true if the notification information has a valid call start time.
+         * See b/192379214.
+         */
+        fun hasValidStartTime(): Boolean = callStartTime > 0
+    }
 }
 
 private fun isCallNotification(entry: NotificationEntry): Boolean {
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
index aa89984..2b4b49b 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
@@ -34,6 +34,7 @@
 
 import androidx.annotation.NonNull;
 
+import com.android.internal.logging.UiEventLogger;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.keyguard.KeyguardUpdateMonitorCallback;
 import com.android.settingslib.Utils;
@@ -70,6 +71,7 @@
     private final UserTracker mUserTracker;
     private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     private final StatusBarKeyguardViewManager mKeyguardViewManager;
+    private final UiEventLogger mUiEventLogger;
 
     private KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback;
     private WalletScreenController mWalletScreenController;
@@ -87,7 +89,8 @@
             FalsingCollector falsingCollector,
             UserTracker userTracker,
             KeyguardUpdateMonitor keyguardUpdateMonitor,
-            StatusBarKeyguardViewManager keyguardViewManager) {
+            StatusBarKeyguardViewManager keyguardViewManager,
+            UiEventLogger uiEventLogger) {
         mKeyguardStateController = keyguardStateController;
         mKeyguardDismissUtil = keyguardDismissUtil;
         mActivityStarter = activityStarter;
@@ -98,6 +101,7 @@
         mUserTracker = userTracker;
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mKeyguardViewManager = keyguardViewManager;
+        mUiEventLogger = uiEventLogger;
     }
 
     @Override
@@ -129,7 +133,8 @@
                 mUserTracker,
                 mFalsingManager,
                 mKeyguardUpdateMonitor,
-                mKeyguardStateController);
+                mKeyguardStateController,
+                mUiEventLogger);
         mKeyguardUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() {
             @Override
             public void onBiometricRunningStateChanged(
@@ -153,11 +158,14 @@
                     }
 
                     if (mKeyguardStateController.isUnlocked()) {
+                        mUiEventLogger.log(WalletUiEvent.QAW_SHOW_ALL);
                         mActivityStarter.startActivity(
                                 mWalletClient.createWalletIntent(), true);
                         finish();
                     } else {
+                        mUiEventLogger.log(WalletUiEvent.QAW_UNLOCK_FROM_SHOW_ALL_BUTTON);
                         mKeyguardDismissUtil.executeWhenUnlocked(() -> {
+                            mUiEventLogger.log(WalletUiEvent.QAW_SHOW_ALL);
                             mActivityStarter.startActivity(
                                     mWalletClient.createWalletIntent(), true);
                             finish();
@@ -175,6 +183,7 @@
                         return;
                     }
 
+                    mUiEventLogger.log(WalletUiEvent.QAW_UNLOCK_FROM_UNLOCK_BUTTON);
                     mKeyguardDismissUtil.executeWhenUnlocked(() -> false, false,
                             false);
                 });
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java
index ab8ad77..2e183b3 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java
@@ -39,6 +39,7 @@
 import androidx.annotation.NonNull;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.UiEventLogger;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.systemui.R;
 import com.android.systemui.plugins.ActivityStarter;
@@ -74,6 +75,7 @@
     private final WalletView mWalletView;
     private final WalletCardCarousel mCardCarousel;
     private final FalsingManager mFalsingManager;
+    private final UiEventLogger mUiEventLogger;
 
     @VisibleForTesting String mSelectedCardId;
     @VisibleForTesting boolean mIsDismissed;
@@ -88,7 +90,8 @@
             UserTracker userTracker,
             FalsingManager falsingManager,
             KeyguardUpdateMonitor keyguardUpdateMonitor,
-            KeyguardStateController keyguardStateController) {
+            KeyguardStateController keyguardStateController,
+            UiEventLogger uiEventLogger) {
         mContext = context;
         mWalletClient = walletClient;
         mActivityStarter = activityStarter;
@@ -97,6 +100,7 @@
         mFalsingManager = falsingManager;
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mKeyguardStateController = keyguardStateController;
+        mUiEventLogger = uiEventLogger;
         mPrefs = userTracker.getUserContext().getSharedPreferences(TAG, Context.MODE_PRIVATE);
         mWalletView = walletView;
         mWalletView.setMinimumHeight(getExpectedMinHeight());
@@ -147,6 +151,7 @@
                             isUdfpsEnabled);
                 }
             }
+            mUiEventLogger.log(WalletUiEvent.QAW_IMPRESSION);
             removeMinHeightAndRecordHeightOnLayout();
         });
     }
@@ -180,6 +185,9 @@
         if (mIsDismissed) {
             return;
         }
+        if (mSelectedCardId != null && !mSelectedCardId.equals(card.getCardId())) {
+            mUiEventLogger.log(WalletUiEvent.QAW_CHANGE_CARD);
+        }
         mSelectedCardId = card.getCardId();
         selectCard();
     }
@@ -209,6 +217,12 @@
                 || ((QAWalletCardViewInfo) cardInfo).mWalletCard.getPendingIntent() == null) {
             return;
         }
+
+        if (!mKeyguardStateController.isUnlocked()) {
+            mUiEventLogger.log(WalletUiEvent.QAW_UNLOCK_FROM_CARD_CLICK);
+        }
+        mUiEventLogger.log(WalletUiEvent.QAW_CLICK_CARD);
+
         mActivityStarter.startActivity(
                 ((QAWalletCardViewInfo) cardInfo).mWalletCard.getPendingIntent().getIntent(), true);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletUiEvent.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletUiEvent.java
new file mode 100644
index 0000000..da3a5c6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletUiEvent.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.wallet.ui;
+
+import com.android.internal.logging.UiEvent;
+import com.android.internal.logging.UiEventLogger;
+
+/**
+ * Ui events for the Quick Access Wallet.
+ */
+public enum WalletUiEvent implements UiEventLogger.UiEventEnum {
+    @UiEvent(doc = "The default payment app is opened to show all payment cards.")
+    QAW_SHOW_ALL(860),
+
+    @UiEvent(doc = "The Quick Access Wallet homescreen is unlocked.")
+    QAW_UNLOCK_FROM_CARD_CLICK(861),
+
+    @UiEvent(doc = "The Quick Access Wallet center card is changed")
+    QAW_CHANGE_CARD(863),
+
+    @UiEvent(doc = "The Quick Access Wallet is opened.")
+    QAW_IMPRESSION(864),
+
+    @UiEvent(doc = "The Quick Access Wallet card is clicked")
+    QAW_CLICK_CARD(865),
+
+    @UiEvent(doc = "The Quick Access Wallet homescreen is unlocked via clicking the unlock button")
+    QAW_UNLOCK_FROM_UNLOCK_BUTTON(866),
+
+    @UiEvent(
+            doc = "The Quick Access Wallet homescreen is unlocked via clicking the show all button")
+    QAW_UNLOCK_FROM_SHOW_ALL_BUTTON(867);
+
+    private final int mId;
+
+    WalletUiEvent(int id) {
+        mId = id;
+    }
+
+    @Override
+    public int getId() {
+        return mId;
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java
index 78c6717..61a6512 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java
@@ -77,6 +77,7 @@
     private static final int TEST_UID = UserHandle.getUid(0, 0);
     private static final int TEST_UID_OTHER = UserHandle.getUid(1, 0);
     private static final int TEST_UID_NON_USER_SENSITIVE = UserHandle.getUid(2, 0);
+    private static final int TEST_CHAIN_ID = 1;
 
     @Mock
     private AppOpsManager mAppOpsManager;
@@ -162,7 +163,7 @@
                 new int[]{AppOpsManager.OP_RECORD_AUDIO, AppOpsManager.OP_FINE_LOCATION},
                 mCallback);
         mController.onOpActiveChanged(
-                AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
         mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
                 TEST_ATTRIBUTION_NAME, AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
         mTestableLooper.processAllMessages();
@@ -174,7 +175,7 @@
     public void addCallback_notIncludedCode() {
         mController.addCallback(new int[]{AppOpsManager.OP_FINE_LOCATION}, mCallback);
         mController.onOpActiveChanged(
-                AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
         verify(mCallback, never()).onActiveStateChanged(
                 anyInt(), anyInt(), anyString(), anyBoolean());
@@ -185,7 +186,7 @@
         mController.addCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
         mController.removeCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
         mController.onOpActiveChanged(
-                AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
         verify(mCallback, never()).onActiveStateChanged(
                 anyInt(), anyInt(), anyString(), anyBoolean());
@@ -196,7 +197,7 @@
         mController.addCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
         mController.removeCallback(new int[]{AppOpsManager.OP_CAMERA}, mCallback);
         mController.onOpActiveChanged(
-                AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
         verify(mCallback).onActiveStateChanged(AppOpsManager.OP_RECORD_AUDIO,
                 TEST_UID, TEST_PACKAGE_NAME, true);
@@ -204,18 +205,18 @@
 
     @Test
     public void getActiveItems_sameDetails() {
-        mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_RECORD_AUDIO,
                 TEST_UID, TEST_PACKAGE_NAME, true);
-        mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_RECORD_AUDIO,
                 TEST_UID, TEST_PACKAGE_NAME, true);
         assertEquals(1, mController.getActiveAppOps().size());
     }
 
     @Test
     public void getActiveItems_differentDetails() {
-        mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_RECORD_AUDIO,
                 TEST_UID, TEST_PACKAGE_NAME, true);
-        mController.onOpActiveChanged(AppOpsManager.OP_CAMERA,
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_CAMERA,
                 TEST_UID, TEST_PACKAGE_NAME, true);
         mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION,
                 TEST_UID, TEST_PACKAGE_NAME, TEST_ATTRIBUTION_NAME,
@@ -225,9 +226,9 @@
 
     @Test
     public void getActiveItemsForUser() {
-        mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_RECORD_AUDIO,
                 TEST_UID, TEST_PACKAGE_NAME, true);
-        mController.onOpActiveChanged(AppOpsManager.OP_CAMERA,
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_CAMERA,
                 TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
         mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION,
                 TEST_UID, TEST_PACKAGE_NAME, TEST_ATTRIBUTION_NAME,
@@ -242,11 +243,11 @@
     public void systemAndExemptedRolesAreIgnored() {
         assumeFalse(mExemptedRolePkgName == null || mExemptedRolePkgName.equals(""));
 
-        mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_RECORD_AUDIO,
                 TEST_UID_NON_USER_SENSITIVE, mExemptedRolePkgName, true);
         assertEquals(0, mController.getActiveAppOpsForUser(
                 UserHandle.getUserId(TEST_UID_NON_USER_SENSITIVE), false).size());
-        mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_RECORD_AUDIO,
                 TEST_UID_NON_USER_SENSITIVE, SYSTEM_PKG, true);
         assertEquals(0, mController.getActiveAppOpsForUser(
                 UserHandle.getUserId(TEST_UID_NON_USER_SENSITIVE), false).size());
@@ -257,7 +258,7 @@
         assumeFalse(mExemptedRolePkgName == null || mExemptedRolePkgName.equals(""));
 
         mController.addCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
-        mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_RECORD_AUDIO,
                 TEST_UID_NON_USER_SENSITIVE, mExemptedRolePkgName, true);
 
         mTestableLooper.processAllMessages();
@@ -279,8 +280,8 @@
         mController.setBGHandler(mMockHandler);
 
         mController.setListening(true);
-        mController.onOpActiveChanged(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
-                true);
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_FINE_LOCATION, TEST_UID,
+                TEST_PACKAGE_NAME, true);
         mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
                 TEST_ATTRIBUTION_NAME, AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
         assertFalse(mController.getActiveAppOps().isEmpty());
@@ -321,6 +322,36 @@
     }
 
     @Test
+    public void testUntrustedChainUsagesDiscarded() {
+        assertTrue(mController.getActiveAppOps().isEmpty());
+        mController.setBGHandler(mMockHandler);
+
+        //untrusted receiver access
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID,
+                TEST_PACKAGE_NAME, TEST_ATTRIBUTION_NAME, true,
+                AppOpsManager.ATTRIBUTION_FLAG_RECEIVER, TEST_CHAIN_ID);
+        //untrusted intermediary access
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID,
+                TEST_PACKAGE_NAME, TEST_ATTRIBUTION_NAME, true,
+                AppOpsManager.ATTRIBUTION_FLAG_INTERMEDIARY, TEST_CHAIN_ID);
+        assertTrue(mController.getActiveAppOps().isEmpty());
+    }
+
+    @Test
+    public void testTrustedChainUsagesKept() {
+        //untrusted accessor access
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID,
+                TEST_PACKAGE_NAME, TEST_ATTRIBUTION_NAME, true,
+                AppOpsManager.ATTRIBUTION_FLAG_ACCESSOR, TEST_CHAIN_ID);
+        //trusted access
+        mController.onOpActiveChanged(AppOpsManager.OPSTR_CAMERA, TEST_UID,
+                TEST_PACKAGE_NAME, TEST_ATTRIBUTION_NAME, true,
+                AppOpsManager.ATTRIBUTION_FLAG_RECEIVER | AppOpsManager.ATTRIBUTION_FLAG_TRUSTED,
+                TEST_CHAIN_ID);
+        assertEquals(2, mController.getActiveAppOps().size());
+    }
+
+    @Test
     public void testActiveOpNotRemovedAfterNoted() throws InterruptedException {
         // Replaces the timeout delay with 5 ms
         TestHandler testHandler = new TestHandler(mTestableLooper.getLooper());
@@ -329,7 +360,7 @@
         mController.setBGHandler(testHandler);
 
         mController.onOpActiveChanged(
-                AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true);
 
         mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
                 TEST_ATTRIBUTION_NAME, AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
@@ -364,7 +395,7 @@
                 TEST_ATTRIBUTION_NAME, AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
 
         mController.onOpActiveChanged(
-                AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true);
 
         mTestableLooper.processAllMessages();
         List<AppOpItem> list = mController.getActiveAppOps();
@@ -375,7 +406,7 @@
         assertEquals(2, list.size());
 
         mController.onOpActiveChanged(
-                AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, false);
+                AppOpsManager.OPSTR_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, false);
 
         mTestableLooper.processAllMessages();
 
@@ -393,7 +424,7 @@
                 TEST_ATTRIBUTION_NAME, AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
 
         mController.onOpActiveChanged(
-                AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true);
 
         mTestableLooper.processAllMessages();
         verify(mCallback).onActiveStateChanged(
@@ -405,7 +436,7 @@
         mController.addCallback(new int[]{AppOpsManager.OP_FINE_LOCATION}, mCallback);
 
         mController.onOpActiveChanged(
-                AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true);
 
         mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
                 TEST_ATTRIBUTION_NAME, AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
@@ -421,7 +452,7 @@
         mTestableLooper.processAllMessages();
 
         mController.onOpActiveChanged(
-                AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
 
         verify(mCallback, never())
@@ -434,7 +465,7 @@
         mTestableLooper.processAllMessages();
 
         mController.onOpActiveChanged(
-                AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
 
         assertTrue(mController.getActiveAppOps().isEmpty());
@@ -446,7 +477,7 @@
         mTestableLooper.processAllMessages();
 
         mController.onOpActiveChanged(
-                AppOpsManager.OP_PHONE_CALL_MICROPHONE, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_PHONE_CALL_MICROPHONE, TEST_UID, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
 
         assertTrue(mController.getActiveAppOps().isEmpty());
@@ -461,7 +492,7 @@
         mTestableLooper.processAllMessages();
 
         mController.onOpActiveChanged(
-                AppOpsManager.OP_CAMERA, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_CAMERA, TEST_UID, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
 
         verify(mCallback).onActiveStateChanged(
@@ -477,7 +508,7 @@
         mController.addCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
         mTestableLooper.processAllMessages();
         mController.onOpActiveChanged(
-                AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
 
         mTestableLooper.processAllMessages();
         mRecordingCallback.onRecordingConfigChanged(Collections.emptyList());
@@ -493,7 +524,7 @@
         mController.addCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
         mTestableLooper.processAllMessages();
         mController.onOpActiveChanged(
-                AppOpsManager.OP_RECORD_AUDIO, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
 
         AudioRecordingConfiguration mockARC = mock(AudioRecordingConfiguration.class);
@@ -516,7 +547,7 @@
                 mCallback);
         mTestableLooper.processAllMessages();
         mController.onOpActiveChanged(
-                AppOpsManager.OP_RECORD_AUDIO, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
         List<AppOpItem> list = mController.getActiveAppOps();
         assertEquals(1, list.size());
@@ -526,7 +557,7 @@
         // Add a camera op, and disable the microphone. The camera op should be the only op returned
         mController.onSensorBlockedChanged(MICROPHONE, true);
         mController.onOpActiveChanged(
-                AppOpsManager.OP_CAMERA, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_CAMERA, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
         list = mController.getActiveAppOps();
         assertEquals(1, list.size());
@@ -550,7 +581,7 @@
                 mCallback);
         mTestableLooper.processAllMessages();
         mController.onOpActiveChanged(
-                AppOpsManager.OP_PHONE_CALL_MICROPHONE, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_PHONE_CALL_MICROPHONE, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
         List<AppOpItem> list = mController.getActiveAppOps();
         assertEquals(1, list.size());
@@ -560,7 +591,7 @@
         // Add a camera op, and disable the microphone. The camera op should be the only op returned
         mController.onSensorBlockedChanged(MICROPHONE, true);
         mController.onOpActiveChanged(
-                AppOpsManager.OP_CAMERA, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_CAMERA, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
         list = mController.getActiveAppOps();
         assertEquals(1, list.size());
@@ -583,7 +614,7 @@
                 mCallback);
         mTestableLooper.processAllMessages();
         mController.onOpActiveChanged(
-                AppOpsManager.OP_CAMERA, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_CAMERA, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
         List<AppOpItem> list = mController.getActiveAppOps();
         assertEquals(1, list.size());
@@ -593,7 +624,7 @@
         // Add an audio op, and disable the camera. The audio op should be the only op returned
         mController.onSensorBlockedChanged(CAMERA, true);
         mController.onOpActiveChanged(
-                AppOpsManager.OP_RECORD_AUDIO, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
         list = mController.getActiveAppOps();
         assertEquals(1, list.size());
@@ -616,7 +647,7 @@
                 mCallback);
         mTestableLooper.processAllMessages();
         mController.onOpActiveChanged(
-                AppOpsManager.OP_PHONE_CALL_CAMERA, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_PHONE_CALL_CAMERA, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
         List<AppOpItem> list = mController.getActiveAppOps();
         assertEquals(1, list.size());
@@ -626,7 +657,7 @@
         // Add an audio op, and disable the camera. The audio op should be the only op returned
         mController.onSensorBlockedChanged(CAMERA, true);
         mController.onOpActiveChanged(
-                AppOpsManager.OP_RECORD_AUDIO, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
+                AppOpsManager.OPSTR_RECORD_AUDIO, TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
         mTestableLooper.processAllMessages();
         list = mController.getActiveAppOps();
         assertEquals(1, list.size());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
index be0865d..4e8b59c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
@@ -35,6 +35,7 @@
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.content.Intent;
 import android.os.PowerManager;
@@ -46,6 +47,8 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.statusbar.phone.DozeParameters;
 import com.android.systemui.util.concurrency.FakeExecutor;
 import com.android.systemui.util.concurrency.FakeThreadFactory;
 import com.android.systemui.util.sensors.AsyncSensorManager;
@@ -65,6 +68,7 @@
 public class DozeScreenBrightnessTest extends SysuiTestCase {
 
     private static final int DEFAULT_BRIGHTNESS = 10;
+    private static final int DIM_BRIGHTNESS = 1;
     private static final int[] SENSOR_TO_BRIGHTNESS = new int[]{-1, 1, 2, 3, 4};
     private static final int[] SENSOR_TO_OPACITY = new int[]{-1, 10, 0, 0, 0};
 
@@ -74,6 +78,10 @@
     private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy;
     @Mock
     DozeHost mDozeHost;
+    @Mock
+    WakefulnessLifecycle mWakefulnessLifecycle;
+    @Mock
+    DozeParameters mDozeParameters;
     private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
     private FakeThreadFactory mFakeThreadFactory = new FakeThreadFactory(mFakeExecutor);
 
@@ -96,11 +104,12 @@
         mAlwaysOnDisplayPolicy = new AlwaysOnDisplayPolicy(mContext);
         mAlwaysOnDisplayPolicy.defaultDozeBrightness = DEFAULT_BRIGHTNESS;
         mAlwaysOnDisplayPolicy.screenBrightnessArray = SENSOR_TO_BRIGHTNESS;
+        mAlwaysOnDisplayPolicy.dimBrightness = DIM_BRIGHTNESS;
         mAlwaysOnDisplayPolicy.dimmingScrimArray = SENSOR_TO_OPACITY;
         mSensor = fakeSensorManager.getFakeLightSensor();
         mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
                 Optional.of(mSensor.getSensor()), mDozeHost, null /* handler */,
-                mAlwaysOnDisplayPolicy);
+                mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters);
 
         mScreen.onScreenState(Display.STATE_ON);
     }
@@ -166,7 +175,7 @@
     public void testPulsing_withoutLightSensor_setsAoDDimmingScrimTransparent() throws Exception {
         mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
                 Optional.empty() /* sensor */, mDozeHost, null /* handler */,
-                mAlwaysOnDisplayPolicy);
+                mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters);
         mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
         mScreen.transitionTo(INITIALIZED, DOZE);
         reset(mDozeHost);
@@ -207,7 +216,7 @@
     public void testNullSensor() throws Exception {
         mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
                 Optional.empty() /* sensor */, mDozeHost, null /* handler */,
-                mAlwaysOnDisplayPolicy);
+                mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters);
 
         mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
         mScreen.transitionTo(INITIALIZED, DOZE_AOD);
@@ -282,6 +291,47 @@
         verify(mDozeHost).setAodDimmingScrim(eq(0f));
     }
 
+    @Test
+    public void transitionToDoze_duringScreenOff_afterTimeout_clampsToDim() {
+        when(mWakefulnessLifecycle.getLastSleepReason()).thenReturn(
+                PowerManager.GO_TO_SLEEP_REASON_TIMEOUT);
+        when(mDozeParameters.shouldControlUnlockedScreenOff()).thenReturn(true);
+
+        mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
+        mScreen.transitionTo(INITIALIZED, DOZE);
+
+        // If we're dozing after a timeout, and playing the unlocked screen animation, we should
+        // stay at dim brightness, because the screen dims just before timeout.
+        assertEquals(mServiceFake.screenBrightness, DIM_BRIGHTNESS);
+    }
+
+    @Test
+    public void transitionToDoze_duringScreenOff_notAfterTimeout_doesNotClampToDim() {
+        when(mWakefulnessLifecycle.getLastSleepReason()).thenReturn(
+                PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON);
+        when(mDozeParameters.shouldControlUnlockedScreenOff()).thenReturn(true);
+
+        mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
+        mScreen.transitionTo(INITIALIZED, DOZE);
+
+        // If we're playing the unlocked screen off animation after a power button press, we should
+        // leave the brightness alone.
+        assertEquals(mServiceFake.screenBrightness, DEFAULT_BRIGHTNESS);
+    }
+
+    @Test
+    public void transitionToDoze_duringScreenOff_afterTimeout_noScreenOff_doesNotClampToDim() {
+        when(mWakefulnessLifecycle.getLastSleepReason()).thenReturn(
+                PowerManager.GO_TO_SLEEP_REASON_TIMEOUT);
+        when(mDozeParameters.shouldControlUnlockedScreenOff()).thenReturn(false);
+
+        mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
+        mScreen.transitionTo(INITIALIZED, DOZE);
+
+        // If we aren't controlling the screen off animation, we should leave the brightness alone.
+        assertEquals(mServiceFake.screenBrightness, DEFAULT_BRIGHTNESS);
+    }
+
     private void waitForSensorManager() {
         mFakeExecutor.runAllReady();
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
index c9d4190..b129fdd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
@@ -345,4 +345,22 @@
 
         assertThat(dismiss.isEnabled).isEqualTo(false)
     }
+
+    @Test
+    fun dismissButtonClick_notInManager() {
+        val mediaKey = "key for dismissal"
+        whenever(mediaDataManager.dismissMediaData(eq(mediaKey), anyLong())).thenReturn(false)
+
+        player.attachPlayer(holder)
+        val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
+                emptyList(), PACKAGE, session.getSessionToken(), null, null, true, null,
+                notificationKey = KEY)
+        player.bindPlayer(state, mediaKey)
+
+        assertThat(dismiss.isEnabled).isEqualTo(true)
+        dismiss.callOnClick()
+
+        verify(mediaDataManager).dismissMediaData(eq(mediaKey), anyLong())
+        verify(mediaCarouselController).removePlayer(eq(mediaKey), eq(false), eq(false))
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
index 5b4e124..ba6dfd3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
@@ -317,7 +317,8 @@
     fun testDismissMedia_listenerCalled() {
         mediaDataManager.onNotificationAdded(KEY, mediaNotification)
         mediaDataManager.onMediaDataLoaded(KEY, oldKey = null, data = mock(MediaData::class.java))
-        mediaDataManager.dismissMediaData(KEY, 0L)
+        val removed = mediaDataManager.dismissMediaData(KEY, 0L)
+        assertThat(removed).isTrue()
 
         foregroundExecutor.advanceClockToLast()
         foregroundExecutor.runAllReady()
@@ -326,6 +327,12 @@
     }
 
     @Test
+    fun testDismissMedia_keyDoesNotExist_returnsFalse() {
+        val removed = mediaDataManager.dismissMediaData(KEY, 0L)
+        assertThat(removed).isFalse()
+    }
+
+    @Test
     fun testBadArtwork_doesNotUse() {
         // WHEN notification has a too-small artwork
         val artwork = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java
index 0386456..ddd7854 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java
@@ -40,6 +40,7 @@
 
 import com.android.internal.colorextraction.ColorExtractor;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.biometrics.AuthController;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.keyguard.KeyguardViewMediator;
@@ -73,6 +74,7 @@
     @Mock private DumpManager mDumpManager;
     @Mock private KeyguardStateController mKeyguardStateController;
     @Mock private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
+    @Mock private AuthController mAuthController;
     @Captor private ArgumentCaptor<WindowManager.LayoutParams> mLayoutParameters;
 
     private NotificationShadeWindowControllerImpl mNotificationShadeWindowController;
@@ -87,7 +89,7 @@
                 mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
                 mConfigurationController, mKeyguardViewMediator, mKeyguardBypassController,
                 mColorExtractor, mDumpManager, mKeyguardStateController,
-                mUnlockedScreenOffAnimationController);
+                mUnlockedScreenOffAnimationController, mAuthController);
         mNotificationShadeWindowController.setScrimsVisibilityListener((visibility) -> {});
         mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallChronometerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallChronometerTest.kt
index e32af60..c3326b2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallChronometerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallChronometerTest.kt
@@ -132,6 +132,26 @@
         assertThat(textView.measuredWidth).isGreaterThan(0)
     }
 
+    @Test
+    fun setShouldHideText_true_textHidden() {
+        textView.setShouldHideText(true)
+        measureTextView()
+
+        assertThat(textView.measuredWidth).isEqualTo(0)
+    }
+
+    @Test
+    fun setShouldHideText_false_textShown() {
+        // First, set to true so that setting it to false will definitely have an effect.
+        textView.setShouldHideText(true)
+        measureTextView()
+
+        textView.setShouldHideText(false)
+        measureTextView()
+
+        assertThat(textView.measuredWidth).isGreaterThan(0)
+    }
+
     private fun setTextAndMeasure(text: String) {
         textView.text = text
         measureTextView()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
index c81d468..d36cb0b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
@@ -153,6 +153,37 @@
                 createCallNotifEntry(ongoingCallStyle, nullContentIntent = true))
     }
 
+    /** Regression test for b/192379214. */
+    @Test
+    fun onEntryUpdated_notificationWhenIsZero_timeHidden() {
+        val notification = NotificationEntryBuilder(createOngoingCallNotifEntry())
+        notification.modifyNotification(context).setWhen(0)
+
+        notifCollectionListener.onEntryUpdated(notification.build())
+        chipView.measure(
+                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
+                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
+        )
+
+        assertThat(chipView.findViewById<View>(R.id.ongoing_call_chip_time)?.measuredWidth)
+                .isEqualTo(0)
+    }
+
+    @Test
+    fun onEntryUpdated_notificationWhenIsValid_timeShown() {
+        val notification = NotificationEntryBuilder(createOngoingCallNotifEntry())
+        notification.modifyNotification(context).setWhen(clock.currentTimeMillis())
+
+        notifCollectionListener.onEntryUpdated(notification.build())
+        chipView.measure(
+                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
+                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
+        )
+
+        assertThat(chipView.findViewById<View>(R.id.ongoing_call_chip_time)?.measuredWidth)
+                .isGreaterThan(0)
+    }
+
     /**
      * If a call notification is never added before #onEntryRemoved is called, then the listener
      * should never be notified.
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
index 4a5770d..57198db 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
@@ -238,7 +238,7 @@
         mNetworkController.setNoNetworksAvailable(false);
         setWifiStateForVcn(true, testSsid);
         setWifiLevelForVcn(0);
-        verifyLastMobileDataIndicatorsForVcn(true, 0, TelephonyIcons.ICON_CWF, false);
+        verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][0]);
 
         mNetworkController.setNoNetworksAvailable(true);
         for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) {
@@ -246,11 +246,11 @@
 
             setConnectivityViaCallbackInNetworkControllerForVcn(
                     NetworkCapabilities.TRANSPORT_CELLULAR, true, true, mVcnTransportInfo);
-            verifyLastMobileDataIndicatorsForVcn(true, testLevel, TelephonyIcons.ICON_CWF, true);
+            verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
 
             setConnectivityViaCallbackInNetworkControllerForVcn(
                     NetworkCapabilities.TRANSPORT_CELLULAR, false, true, mVcnTransportInfo);
-            verifyLastMobileDataIndicatorsForVcn(true, testLevel, TelephonyIcons.ICON_CWF, false);
+            verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][testLevel]);
         }
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java
index 3018089..e3b07b3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java
@@ -22,6 +22,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -43,6 +44,7 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.internal.logging.UiEventLogger;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.plugins.ActivityStarter;
@@ -91,6 +93,8 @@
     KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     @Mock
     KeyguardStateController mKeyguardStateController;
+    @Mock
+    UiEventLogger mUiEventLogger;
     @Captor
     ArgumentCaptor<Intent> mIntentCaptor;
     @Captor
@@ -123,7 +127,8 @@
                 mUserTracker,
                 mFalsingManager,
                 mKeyguardUpdateMonitor,
-                mKeyguardStateController);
+                mKeyguardStateController,
+                mUiEventLogger);
     }
 
     @Test
@@ -172,6 +177,8 @@
         callback.onWalletCardsRetrieved(response);
         mTestableLooper.processAllMessages();
 
+        verify(mUiEventLogger).log(WalletUiEvent.QAW_IMPRESSION);
+
         assertEquals(VISIBLE, mWalletView.getCardCarouselContainer().getVisibility());
         assertEquals(VISIBLE, mWalletView.getActionButton().getVisibility());
     }
@@ -198,6 +205,8 @@
         assertEquals(VISIBLE, mWalletView.getCardCarouselContainer().getVisibility());
         assertEquals("Hold to reader", mWalletView.getCardLabel().getText().toString());
         assertEquals(GONE, mWalletView.getErrorView().getVisibility());
+
+        verify(mUiEventLogger, times(1)).log(WalletUiEvent.QAW_IMPRESSION);
     }
 
     @Test
@@ -352,6 +361,14 @@
     }
 
     @Test
+    public void logOnCardChanged() {
+        mController.onCardSelected(createCardViewInfo(createWalletCard(mContext)));
+        mController.onCardSelected(createCardViewInfo(createNonActiveWalletCard(mContext)));
+
+        verify(mUiEventLogger, times(1)).log(WalletUiEvent.QAW_CHANGE_CARD);
+    }
+
+    @Test
     public void onCardClicked_startIntent() {
         WalletCardViewInfo walletCardViewInfo = createCardViewInfo(createWalletCard(mContext));
 
@@ -361,6 +378,20 @@
 
         assertEquals(mWalletIntent.getAction(), mIntentCaptor.getValue().getAction());
         assertEquals(mWalletIntent.getComponent(), mIntentCaptor.getValue().getComponent());
+
+        verify(mUiEventLogger, times(1)).log(WalletUiEvent.QAW_CLICK_CARD);
+    }
+
+    @Test
+    public void onCardClicked_deviceLocked_logUnlockEvent() {
+        when(mKeyguardStateController.isUnlocked()).thenReturn(false);
+        WalletCardViewInfo walletCardViewInfo = createCardViewInfo(createWalletCard(mContext));
+
+        mController.onCardClicked(walletCardViewInfo);
+
+        verify(mUiEventLogger, times(1))
+                .log(WalletUiEvent.QAW_UNLOCK_FROM_CARD_CLICK);
+        verify(mUiEventLogger, times(1)).log(WalletUiEvent.QAW_CLICK_CARD);
     }
 
     @Test
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 eb9206d..f243077 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -39,7 +39,6 @@
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -73,6 +72,7 @@
 import com.android.internal.colorextraction.ColorExtractor;
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.biometrics.AuthController;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.keyguard.KeyguardViewMediator;
@@ -236,6 +236,8 @@
     private KeyguardStateController mKeyguardStateController;
     @Mock
     private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
+    @Mock
+    private AuthController mAuthController;
 
     private TestableBubblePositioner mPositioner;
 
@@ -259,7 +261,7 @@
                 mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
                 mConfigurationController, mKeyguardViewMediator, mKeyguardBypassController,
                 mColorExtractor, mDumpManager, mKeyguardStateController,
-                mUnlockedScreenOffAnimationController);
+                mUnlockedScreenOffAnimationController, mAuthController);
         mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
         mNotificationShadeWindowController.attach();
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
index 24a5b3a..e4c7800 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
@@ -59,6 +59,7 @@
 import com.android.internal.colorextraction.ColorExtractor;
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.biometrics.AuthController;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.keyguard.KeyguardViewMediator;
@@ -153,6 +154,8 @@
     private BubbleDataRepository mDataRepository;
     @Mock
     private NotificationShadeWindowView mNotificationShadeWindowView;
+    @Mock
+    private AuthController mAuthController;
 
     private SysUiState mSysUiState = new SysUiState();
 
@@ -222,7 +225,7 @@
                 mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
                 mConfigurationController, mKeyguardViewMediator, mKeyguardBypassController,
                 mColorExtractor, mDumpManager, mKeyguardStateController,
-                mUnlockedScreenOffAnimationController);
+                mUnlockedScreenOffAnimationController, mAuthController);
         mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
         mNotificationShadeWindowController.attach();
 
diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
index 406e866..67dfb80 100644
--- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
+++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
@@ -579,6 +579,9 @@
             }
         }
 
+        // Collect the latest low power stats without holding the mStats lock.
+        mStats.fillLowPowerStats();
+
         final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver);
         final BluetoothActivityEnergyInfo bluetoothInfo = awaitControllerInfo(bluetoothReceiver);
         ModemActivityInfo modemInfo = null;
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index de2c11b..503b3a9 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -1652,7 +1652,7 @@
         maybeScheduleTempAllowlistLocked(receiverUid, r, brOptions);
 
         // Report that a component is used for explicit broadcasts.
-        if (!r.intent.isExcludingStopped() && r.curComponent != null
+        if (r.intent.getComponent() != null && r.curComponent != null
                 && !TextUtils.equals(r.curComponent.getPackageName(), r.callerPackage)) {
             mService.mUsageStatsService.reportEvent(
                     r.curComponent.getPackageName(), r.userId, Event.APP_COMPONENT_USED);
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 5cb6fd9..d6bf8db 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -1574,8 +1574,9 @@
                 state.setSystemNoUi(false);
             }
             if (!state.isSystemNoUi()) {
-                if (mService.mWakefulness.get() == PowerManagerInternal.WAKEFULNESS_AWAKE) {
-                    // screen on, promote UI
+                if (mService.mWakefulness.get() == PowerManagerInternal.WAKEFULNESS_AWAKE
+                        || state.isRunningRemoteAnimation()) {
+                    // screen on or animating, promote UI
                     state.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT_UI);
                     state.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_TOP_APP);
                 } else {
diff --git a/services/core/java/com/android/server/app/GameManagerShellCommand.java b/services/core/java/com/android/server/app/GameManagerShellCommand.java
index 699f9e2..a0a83b1 100644
--- a/services/core/java/com/android/server/app/GameManagerShellCommand.java
+++ b/services/core/java/com/android/server/app/GameManagerShellCommand.java
@@ -36,7 +36,9 @@
 import android.app.IGameManagerService;
 import android.compat.Compatibility;
 import android.content.Context;
+import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.os.ServiceManager.ServiceNotFoundException;
 import android.os.ShellCommand;
 import android.util.ArraySet;
 
@@ -116,7 +118,7 @@
                         pw.println("Enable downscaling ratio for " + packageName + " to " + ratio);
                     }
 
-                    break;
+                    return 0;
                 }
                 case "mode": {
                     /** The "mode" command allows setting a package's current game mode outside of
@@ -128,65 +130,7 @@
                      *          <PACKAGE_NAME> <CONFIG_STRING>`
                      * see: {@link GameManagerServiceTests#mockDeviceConfigAll()}
                      */
-                    final String option = getNextOption();
-                    String userIdStr = null;
-                    if (option != null && option.equals("--user")) {
-                        userIdStr = getNextArgRequired();
-                    }
-
-                    final String gameMode = getNextArgRequired();
-                    final String packageName = getNextArgRequired();
-                    final IGameManagerService service = IGameManagerService.Stub.asInterface(
-                            ServiceManager.getServiceOrThrow(Context.GAME_SERVICE));
-                    boolean batteryModeSupported = false;
-                    boolean perfModeSupported = false;
-                    int[] modes = service.getAvailableGameModes(packageName);
-                    for (int mode : modes) {
-                        if (mode == GameManager.GAME_MODE_PERFORMANCE) {
-                            perfModeSupported = true;
-                        } else if (mode == GameManager.GAME_MODE_BATTERY) {
-                            batteryModeSupported = true;
-                        }
-                    }
-                    int userId = userIdStr != null ? Integer.parseInt(userIdStr)
-                            : ActivityManager.getCurrentUser();
-                    switch (gameMode.toLowerCase()) {
-                        case "1":
-                        case "standard":
-                            // Standard should only be available if other game modes are.
-                            if (batteryModeSupported || perfModeSupported) {
-                                service.setGameMode(packageName, GameManager.GAME_MODE_STANDARD,
-                                        userId);
-                            } else {
-                                pw.println("Game mode: " + gameMode + " not supported by "
-                                        + packageName);
-                            }
-                            break;
-                        case "2":
-                        case "performance":
-                            if (perfModeSupported) {
-                                service.setGameMode(packageName, GameManager.GAME_MODE_PERFORMANCE,
-                                        userId);
-                            } else {
-                                pw.println("Game mode: " + gameMode + " not supported by "
-                                        + packageName);
-                            }
-                            break;
-                        case "3":
-                        case "battery":
-                            if (batteryModeSupported) {
-                                service.setGameMode(packageName, GameManager.GAME_MODE_BATTERY,
-                                        userId);
-                            } else {
-                                pw.println("Game mode: " + gameMode + " not supported by "
-                                        + packageName);
-                            }
-                            break;
-                        default:
-                            pw.println("Invalid game mode: " + gameMode);
-                            break;
-                    }
-                    break;
+                    return runGameMode(pw);
                 }
                 default:
                     return handleDefaultCommands(cmd);
@@ -197,6 +141,71 @@
         return -1;
     }
 
+    private int runGameMode(PrintWriter pw) throws ServiceNotFoundException, RemoteException {
+        final String option = getNextOption();
+        String userIdStr = null;
+        if (option != null && option.equals("--user")) {
+            userIdStr = getNextArgRequired();
+        }
+
+        final String gameMode = getNextArgRequired();
+        final String packageName = getNextArgRequired();
+        final IGameManagerService service = IGameManagerService.Stub.asInterface(
+                ServiceManager.getServiceOrThrow(Context.GAME_SERVICE));
+        boolean batteryModeSupported = false;
+        boolean perfModeSupported = false;
+        int[] modes = service.getAvailableGameModes(packageName);
+        for (int mode : modes) {
+            if (mode == GameManager.GAME_MODE_PERFORMANCE) {
+                perfModeSupported = true;
+            } else if (mode == GameManager.GAME_MODE_BATTERY) {
+                batteryModeSupported = true;
+            }
+        }
+        int userId = userIdStr != null ? Integer.parseInt(userIdStr)
+                : ActivityManager.getCurrentUser();
+        switch (gameMode.toLowerCase()) {
+            case "1":
+            case "standard":
+                // Standard should only be available if other game modes are.
+                if (batteryModeSupported || perfModeSupported) {
+                    service.setGameMode(packageName, GameManager.GAME_MODE_STANDARD,
+                            userId);
+                } else {
+                    pw.println("Game mode: " + gameMode + " not supported by "
+                            + packageName);
+                    return -1;
+                }
+                break;
+            case "2":
+            case "performance":
+                if (perfModeSupported) {
+                    service.setGameMode(packageName, GameManager.GAME_MODE_PERFORMANCE,
+                            userId);
+                } else {
+                    pw.println("Game mode: " + gameMode + " not supported by "
+                            + packageName);
+                    return -1;
+                }
+                break;
+            case "3":
+            case "battery":
+                if (batteryModeSupported) {
+                    service.setGameMode(packageName, GameManager.GAME_MODE_BATTERY,
+                            userId);
+                } else {
+                    pw.println("Game mode: " + gameMode + " not supported by "
+                            + packageName);
+                    return -1;
+                }
+                break;
+            default:
+                pw.println("Invalid game mode: " + gameMode);
+                return -1;
+        }
+        return 0;
+    }
+
 
     @Override
     public void onHelp() {
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index e001b05..7789d60 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -20,6 +20,7 @@
 import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION;
 import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHONE;
 import static android.app.AppOpsManager.ATTRIBUTION_CHAIN_ID_NONE;
+import static android.app.AppOpsManager.ATTRIBUTION_FLAG_TRUSTED;
 import static android.app.AppOpsManager.CALL_BACK_ON_SWITCHED_OP;
 import static android.app.AppOpsManager.FILTER_BY_ATTRIBUTION_TAG;
 import static android.app.AppOpsManager.FILTER_BY_OP_NAMES;
@@ -3332,7 +3333,8 @@
         verifyIncomingPackage(proxiedPackageName, UserHandle.getUserId(proxiedUid));
         verifyIncomingPackage(proxyPackageName, UserHandle.getUserId(proxyUid));
 
-        skipProxyOperation = resolveSkipProxyOperation(skipProxyOperation, attributionSource);
+        skipProxyOperation = skipProxyOperation
+                && isCallerAndAttributionTrusted(attributionSource);
 
         String resolveProxyPackageName = AppOpsManager.resolvePackageName(proxyUid,
                 proxyPackageName);
@@ -3849,7 +3851,8 @@
         verifyIncomingPackage(proxyPackageName, UserHandle.getUserId(proxyUid));
         verifyIncomingPackage(proxiedPackageName, UserHandle.getUserId(proxiedUid));
 
-        skipProxyOperation = resolveSkipProxyOperation(skipProxyOperation, attributionSource);
+        boolean isCallerTrusted = isCallerAndAttributionTrusted(attributionSource);
+        skipProxyOperation = isCallerTrusted && skipProxyOperation;
 
         String resolvedProxyPackageName = AppOpsManager.resolvePackageName(proxyUid,
                 proxyPackageName);
@@ -3858,11 +3861,15 @@
                     proxiedPackageName);
         }
 
+        final boolean isChainTrusted = isCallerTrusted
+                && attributionChainId != ATTRIBUTION_CHAIN_ID_NONE
+                && ((proxyAttributionFlags & ATTRIBUTION_FLAG_TRUSTED) != 0
+                || (proxiedAttributionFlags & ATTRIBUTION_FLAG_TRUSTED) != 0);
         final boolean isSelfBlame = Binder.getCallingUid() == proxiedUid;
         final boolean isProxyTrusted = mContext.checkPermission(
                 Manifest.permission.UPDATE_APP_OPS_STATS, -1, proxyUid)
                 == PackageManager.PERMISSION_GRANTED || isSelfBlame
-                || attributionChainId != ATTRIBUTION_CHAIN_ID_NONE;
+                || isChainTrusted;
 
         String resolvedProxiedPackageName = AppOpsManager.resolvePackageName(proxiedUid,
                 proxiedPackageName);
@@ -4051,7 +4058,8 @@
         final String proxiedAttributionTag = attributionSource.getNextAttributionTag();
         final IBinder proxiedToken = attributionSource.getNextToken();
 
-        skipProxyOperation = resolveSkipProxyOperation(skipProxyOperation, attributionSource);
+        skipProxyOperation = skipProxyOperation
+                && isCallerAndAttributionTrusted(attributionSource);
 
         verifyIncomingProxyUid(attributionSource);
         verifyIncomingOp(code);
@@ -4334,11 +4342,7 @@
         }
     }
 
-    private boolean resolveSkipProxyOperation(boolean requestsSkipProxyOperation,
-            @NonNull AttributionSource attributionSource) {
-        if (!requestsSkipProxyOperation) {
-            return false;
-        }
+    private boolean isCallerAndAttributionTrusted(@NonNull AttributionSource attributionSource) {
         if (attributionSource.getUid() != Binder.getCallingUid()
                 && attributionSource.isTrusted(mContext)) {
             return true;
diff --git a/services/core/java/com/android/server/appop/DiscreteRegistry.java b/services/core/java/com/android/server/appop/DiscreteRegistry.java
index 0439660..b9cc992 100644
--- a/services/core/java/com/android/server/appop/DiscreteRegistry.java
+++ b/services/core/java/com/android/server/appop/DiscreteRegistry.java
@@ -19,6 +19,7 @@
 import static android.app.AppOpsManager.ATTRIBUTION_CHAIN_ID_NONE;
 import static android.app.AppOpsManager.ATTRIBUTION_FLAG_ACCESSOR;
 import static android.app.AppOpsManager.ATTRIBUTION_FLAG_RECEIVER;
+import static android.app.AppOpsManager.ATTRIBUTION_FLAG_TRUSTED;
 import static android.app.AppOpsManager.FILTER_BY_ATTRIBUTION_TAG;
 import static android.app.AppOpsManager.FILTER_BY_OP_NAMES;
 import static android.app.AppOpsManager.FILTER_BY_PACKAGE_NAME;
@@ -359,7 +360,8 @@
                         for (int opEventNum = 0; opEventNum < nOpEvents; opEventNum++) {
                             DiscreteOpEvent event = opEvents.get(opEventNum);
                             if (event == null
-                                    || event.mAttributionChainId == ATTRIBUTION_CHAIN_ID_NONE) {
+                                    || event.mAttributionChainId == ATTRIBUTION_CHAIN_ID_NONE
+                                    || (event.mAttributionFlags & ATTRIBUTION_FLAG_TRUSTED) == 0) {
                                 continue;
                             }
 
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 136916a..91283b9 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -95,8 +95,6 @@
 import android.media.IRingtonePlayer;
 import android.media.IStrategyPreferredDevicesDispatcher;
 import android.media.IVolumeController;
-import android.media.MediaExtractor;
-import android.media.MediaFormat;
 import android.media.MediaMetrics;
 import android.media.MediaRecorder.AudioSource;
 import android.media.PlayerBase;
@@ -163,7 +161,6 @@
 import com.android.server.wm.ActivityTaskManagerInternal;
 
 import java.io.FileDescriptor;
-import java.io.IOException;
 import java.io.PrintWriter;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -6305,23 +6302,10 @@
     }
 
     /**
-     * See AudioManager.hasHapticChannels(Uri).
+     * See AudioManager.hasHapticChannels(Context, Uri).
      */
     public boolean hasHapticChannels(Uri uri) {
-        MediaExtractor extractor = new MediaExtractor();
-        try {
-            extractor.setDataSource(mContext, uri, null);
-            for (int i = 0; i < extractor.getTrackCount(); i++) {
-                MediaFormat format = extractor.getTrackFormat(i);
-                if (format.containsKey(MediaFormat.KEY_HAPTIC_CHANNEL_COUNT)
-                        && format.getInteger(MediaFormat.KEY_HAPTIC_CHANNEL_COUNT) > 0) {
-                    return true;
-                }
-            }
-        } catch (IOException e) {
-            Log.e(TAG, "hasHapticChannels failure:" + e);
-        }
-        return false;
+        return AudioManager.hasHapticChannelsImpl(mContext, uri);
     }
 
     ///////////////////////////////////////////////////////////////////////////
diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java
index de6e494..a0a1b80 100644
--- a/services/core/java/com/android/server/compat/CompatConfig.java
+++ b/services/core/java/com/android/server/compat/CompatConfig.java
@@ -16,6 +16,8 @@
 
 package com.android.server.compat;
 
+import static android.content.pm.PackageManager.MATCH_ANY_USER;
+
 import android.annotation.Nullable;
 import android.app.compat.ChangeIdStateCache;
 import android.app.compat.PackageOverride;
@@ -693,7 +695,7 @@
     private Long getVersionCodeOrNull(String packageName) {
         try {
             ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo(
-                    packageName, 0);
+                    packageName, MATCH_ANY_USER);
             return applicationInfo.longVersionCode;
         } catch (PackageManager.NameNotFoundException e) {
             return null;
diff --git a/services/core/java/com/android/server/compat/OverrideValidatorImpl.java b/services/core/java/com/android/server/compat/OverrideValidatorImpl.java
index b500691..e3b6d03 100644
--- a/services/core/java/com/android/server/compat/OverrideValidatorImpl.java
+++ b/services/core/java/com/android/server/compat/OverrideValidatorImpl.java
@@ -17,6 +17,7 @@
 package com.android.server.compat;
 
 import static android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD;
+import static android.content.pm.PackageManager.MATCH_ANY_USER;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 
 import static com.android.internal.compat.OverrideAllowedState.ALLOWED;
@@ -116,7 +117,7 @@
         }
         ApplicationInfo applicationInfo;
         try {
-            applicationInfo = packageManager.getApplicationInfo(packageName, 0);
+            applicationInfo = packageManager.getApplicationInfo(packageName, MATCH_ANY_USER);
         } catch (NameNotFoundException e) {
             return new OverrideAllowedState(DEFERRED_VERIFICATION, -1, -1);
         }
diff --git a/services/core/java/com/android/server/compat/PlatformCompat.java b/services/core/java/com/android/server/compat/PlatformCompat.java
index 0d317f4..b32d1d7 100644
--- a/services/core/java/com/android/server/compat/PlatformCompat.java
+++ b/services/core/java/com/android/server/compat/PlatformCompat.java
@@ -81,7 +81,7 @@
 
     @VisibleForTesting
     PlatformCompat(Context context, CompatConfig compatConfig,
-                   AndroidBuildClassifier buildClassifier) {
+            AndroidBuildClassifier buildClassifier) {
         mContext = context;
         mChangeReporter = new ChangeReporter(ChangeReporter.SOURCE_SYSTEM_SERVER);
         mCompatConfig = compatConfig;
@@ -178,8 +178,8 @@
      *
      * <p>Does not perform costly permission check.
      *
-     * @param changeId the ID of the change in question
-     * @param packageName package name to check for
+     * @param changeId         the ID of the change in question
+     * @param packageName      package name to check for
      * @param targetSdkVersion target sdk version to check for
      * @return {@code true} if the change would be enabled for this package name.
      */
@@ -456,7 +456,7 @@
         }
         if (change.getEnableSinceTargetSdk() > 0) {
             return change.getEnableSinceTargetSdk() >= Build.VERSION_CODES.Q
-                && change.getEnableSinceTargetSdk() <= mBuildClassifier.platformTargetSdk();
+                    && change.getEnableSinceTargetSdk() <= mBuildClassifier.platformTargetSdk();
         }
         return true;
     }
@@ -508,7 +508,8 @@
         filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
         filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
         filter.addDataScheme("package");
-        context.registerReceiver(receiver, filter);
+        context.registerReceiverForAllUsers(receiver, filter, /* broadcastPermission= */
+                null, /* scheduler= */ null);
     }
 
     /**
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 7148bec..1acbde9 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -2527,6 +2527,8 @@
                     mConfig.dnsServers.clear();
                     mConfig.dnsServers.addAll(dnsAddrStrings);
 
+                    mConfig.underlyingNetworks = new Network[] {network};
+
                     networkAgent = mNetworkAgent;
 
                     // The below must be done atomically with the mConfig update, otherwise
@@ -2537,6 +2539,9 @@
                         }
                         agentConnect();
                         return; // Link properties are already sent.
+                    } else {
+                        // Underlying networks also set in agentConnect()
+                        networkAgent.setUnderlyingNetworks(Collections.singletonList(network));
                     }
 
                     lp = makeLinkProperties(); // Accesses VPN instance fields; must be locked
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index 1a07cb8..a4a5f96 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -68,6 +68,7 @@
     private static final int MSG_INVALIDATE_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;
 
     // Length of the ambient light horizon used to calculate the long term estimate of ambient
     // light.
@@ -360,6 +361,13 @@
         return mBrightnessMapper.getDefaultConfig();
     }
 
+    /**
+     * Force recalculate of the state of automatic brightness.
+     */
+    public void update() {
+        mHandler.sendEmptyMessage(MSG_RUN_UPDATE);
+    }
+
     private boolean setDisplayPolicy(int policy) {
         if (mDisplayPolicy == policy) {
             return false;
@@ -910,6 +918,10 @@
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
+                case MSG_RUN_UPDATE:
+                    updateAutoBrightness(true /*sendUpdate*/, false /*isManuallySet*/);
+                    break;
+
                 case MSG_UPDATE_AMBIENT_LUX:
                     updateAmbientLux();
                     break;
diff --git a/services/core/java/com/android/server/display/BrightnessSetting.java b/services/core/java/com/android/server/display/BrightnessSetting.java
index 8ce7b66..ca7b789 100644
--- a/services/core/java/com/android/server/display/BrightnessSetting.java
+++ b/services/core/java/com/android/server/display/BrightnessSetting.java
@@ -17,19 +17,14 @@
 package com.android.server.display;
 
 import android.annotation.NonNull;
-import android.content.Context;
-import android.database.ContentObserver;
-import android.net.Uri;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.os.PowerManager;
-import android.os.UserHandle;
-import android.provider.Settings;
 import android.util.Slog;
-import android.view.Display;
 
-import java.util.concurrent.CopyOnWriteArrayList;
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.concurrent.CopyOnWriteArraySet;
 
 /**
  * Saves brightness to a persistent data store, enabling each logical display to have its own
@@ -39,14 +34,11 @@
     private static final String TAG = "BrightnessSetting";
 
     private static final int MSG_BRIGHTNESS_CHANGED = 1;
-    private static final Uri BRIGHTNESS_FLOAT_URI =
-            Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FLOAT);
-    private final PersistentDataStore mPersistentDataStore;
 
-    private final boolean mIsDefaultDisplay;
-    private final Context mContext;
+    private final PersistentDataStore mPersistentDataStore;
+    private final DisplayManagerService.SyncRoot mSyncRoot;
+
     private final LogicalDisplay mLogicalDisplay;
-    private final Object mLock = new Object();
 
     private final Handler mHandler = new Handler(Looper.getMainLooper()) {
         @Override
@@ -58,37 +50,20 @@
         }
     };
 
-    private final ContentObserver mBrightnessSettingsObserver = new ContentObserver(mHandler) {
-        @Override
-        public void onChange(boolean selfChange, Uri uri) {
-            if (selfChange) {
-                return;
-            }
-            if (BRIGHTNESS_FLOAT_URI.equals(uri)) {
-                float brightness = getScreenBrightnessSettingFloat();
-                setBrightness(brightness, true);
-            }
-        }
-    };
+    private final CopyOnWriteArraySet<BrightnessSettingListener> mListeners =
+            new CopyOnWriteArraySet<>();
 
-    private final CopyOnWriteArrayList<BrightnessSettingListener> mListeners =
-            new CopyOnWriteArrayList<BrightnessSettingListener>();
-
+    @GuardedBy("mSyncRoot")
     private float mBrightness;
 
     BrightnessSetting(@NonNull PersistentDataStore persistentDataStore,
             @NonNull LogicalDisplay logicalDisplay,
-            @NonNull Context context) {
+            DisplayManagerService.SyncRoot syncRoot) {
         mPersistentDataStore = persistentDataStore;
         mLogicalDisplay = logicalDisplay;
-        mContext = context;
-        mIsDefaultDisplay = mLogicalDisplay.getDisplayIdLocked() == Display.DEFAULT_DISPLAY;
         mBrightness = mPersistentDataStore.getBrightness(
                 mLogicalDisplay.getPrimaryDisplayDeviceLocked());
-        if (mIsDefaultDisplay) {
-            mContext.getContentResolver().registerContentObserver(BRIGHTNESS_FLOAT_URI,
-                    false, mBrightnessSettingsObserver);
-        }
+        mSyncRoot = syncRoot;
     }
 
     /**
@@ -97,16 +72,19 @@
      * @return brightness for the current display
      */
     public float getBrightness() {
-        return mBrightness;
+        synchronized (mSyncRoot) {
+            return mBrightness;
+        }
     }
 
     /**
      * Registers listener for brightness setting change events.
      */
     public void registerListener(BrightnessSettingListener l) {
-        if (!mListeners.contains(l)) {
-            mListeners.add(l);
+        if (mListeners.contains(l)) {
+            Slog.wtf(TAG, "Duplicate Listener added");
         }
+        mListeners.add(l);
     }
 
     /**
@@ -119,27 +97,16 @@
     }
 
     void setBrightness(float brightness) {
-        setBrightness(brightness, false);
-    }
-
-    private void setBrightness(float brightness, boolean isFromSystemSetting) {
-        if (brightness == mBrightness) {
-            return;
-        }
         if (Float.isNaN(brightness)) {
             Slog.w(TAG, "Attempting to set invalid brightness");
             return;
         }
-        synchronized (mLock) {
+        synchronized (mSyncRoot) {
+            if (brightness == mBrightness) {
+                return;
+            }
 
             mBrightness = brightness;
-
-            // If it didn't come from us
-            if (mIsDefaultDisplay && !isFromSystemSetting) {
-                Settings.System.putFloatForUser(mContext.getContentResolver(),
-                        Settings.System.SCREEN_BRIGHTNESS_FLOAT, brightness,
-                        UserHandle.USER_CURRENT);
-            }
             mPersistentDataStore.setBrightness(mLogicalDisplay.getPrimaryDisplayDeviceLocked(),
                     brightness);
             int toSend = Float.floatToIntBits(mBrightness);
@@ -148,12 +115,6 @@
         }
     }
 
-    private float getScreenBrightnessSettingFloat() {
-        return Settings.System.getFloatForUser(mContext.getContentResolver(),
-                Settings.System.SCREEN_BRIGHTNESS_FLOAT, PowerManager.BRIGHTNESS_INVALID_FLOAT,
-                UserHandle.USER_CURRENT);
-    }
-
     private void notifyListeners(float brightness) {
         for (BrightnessSettingListener l : mListeners) {
             l.onBrightnessChanged(brightness);
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index 88f88a8..4c9d0f2 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -39,6 +39,7 @@
 import com.android.server.display.config.Point;
 import com.android.server.display.config.RefreshRateRange;
 import com.android.server.display.config.SensorDetails;
+import com.android.server.display.config.ThermalStatus;
 import com.android.server.display.config.XmlParser;
 
 import org.xmlpull.v1.XmlPullParserException;
@@ -657,6 +658,8 @@
             mHbmData.timeWindowMillis = hbmTiming.getTimeWindowSecs_all().longValue() * 1000;
             mHbmData.timeMaxMillis = hbmTiming.getTimeMaxSecs_all().longValue() * 1000;
             mHbmData.timeMinMillis = hbmTiming.getTimeMinSecs_all().longValue() * 1000;
+            mHbmData.thermalStatusLimit = convertThermalStatus(hbm.getThermalStatusLimit_all());
+            mHbmData.allowInLowPowerMode = hbm.getAllowInLowPowerMode_all();
             final RefreshRateRange rr = hbm.getRefreshRate_all();
             if (rr != null) {
                 final float min = rr.getMinimum().floatValue();
@@ -743,6 +746,31 @@
         }
     }
 
+    private @PowerManager.ThermalStatus int convertThermalStatus(ThermalStatus value) {
+        if (value == null) {
+            return PowerManager.THERMAL_STATUS_NONE;
+        }
+        switch (value) {
+            case none:
+                return PowerManager.THERMAL_STATUS_NONE;
+            case light:
+                return PowerManager.THERMAL_STATUS_LIGHT;
+            case moderate:
+                return PowerManager.THERMAL_STATUS_MODERATE;
+            case severe:
+                return PowerManager.THERMAL_STATUS_SEVERE;
+            case critical:
+                return PowerManager.THERMAL_STATUS_CRITICAL;
+            case emergency:
+                return PowerManager.THERMAL_STATUS_EMERGENCY;
+            case shutdown:
+                return PowerManager.THERMAL_STATUS_SHUTDOWN;
+            default:
+                Slog.wtf(TAG, "Unexpected Thermal Status: " + value);
+                return PowerManager.THERMAL_STATUS_NONE;
+        }
+    }
+
     static class SensorData {
         public String type;
         public String name;
@@ -781,6 +809,12 @@
         /** Brightness level at which we transition from normal to high-brightness. */
         public float transitionPoint;
 
+        /** Enable HBM only if the thermal status is not higher than this. */
+        public @PowerManager.ThermalStatus int thermalStatusLimit;
+
+        /** Whether HBM is allowed when {@code Settings.Global.LOW_POWER_MODE} is active. */
+        public boolean allowInLowPowerMode;
+
         /** Time window for HBM. */
         public long timeWindowMillis;
 
@@ -792,13 +826,16 @@
 
         HighBrightnessModeData() {}
 
-        HighBrightnessModeData(float minimumLux, float transitionPoint,
-                long timeWindowMillis, long timeMaxMillis, long timeMinMillis) {
+        HighBrightnessModeData(float minimumLux, float transitionPoint, long timeWindowMillis,
+                long timeMaxMillis, long timeMinMillis,
+                @PowerManager.ThermalStatus int thermalStatusLimit, boolean allowInLowPowerMode) {
             this.minimumLux = minimumLux;
             this.transitionPoint = transitionPoint;
             this.timeWindowMillis = timeWindowMillis;
             this.timeMaxMillis = timeMaxMillis;
             this.timeMinMillis = timeMinMillis;
+            this.thermalStatusLimit = thermalStatusLimit;
+            this.allowInLowPowerMode = allowInLowPowerMode;
         }
 
         /**
@@ -807,10 +844,12 @@
          */
         public void copyTo(@NonNull HighBrightnessModeData other) {
             other.minimumLux = minimumLux;
-            other.transitionPoint = transitionPoint;
             other.timeWindowMillis = timeWindowMillis;
             other.timeMaxMillis = timeMaxMillis;
             other.timeMinMillis = timeMinMillis;
+            other.transitionPoint = transitionPoint;
+            other.thermalStatusLimit = thermalStatusLimit;
+            other.allowInLowPowerMode = allowInLowPowerMode;
         }
 
         @Override
@@ -821,6 +860,8 @@
                     + ", timeWindow: " + timeWindowMillis + "ms"
                     + ", timeMax: " + timeMaxMillis + "ms"
                     + ", timeMin: " + timeMinMillis + "ms"
+                    + ", thermalStatusLimit: " + thermalStatusLimit
+                    + ", allowInLowPowerMode: " + allowInLowPowerMode
                     + "} ";
         }
     }
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 79ea108..9d8ca9a 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -399,9 +399,6 @@
     // Receives notifications about changes to Settings.
     private SettingsObserver mSettingsObserver;
 
-    // Received notifications of the device-state action (such as "fold", "unfold")
-    private DeviceStateManager mDeviceStateManager;
-
     private final boolean mAllowNonNativeRefreshRateOverride;
 
     private final BrightnessSynchronizer mBrightnessSynchronizer;
@@ -1236,13 +1233,6 @@
         adapter.registerLocked();
     }
 
-    @VisibleForTesting
-    void handleLogicalDisplayAdded(LogicalDisplay display) {
-        synchronized (mSyncRoot) {
-            handleLogicalDisplayAddedLocked(display);
-        }
-    }
-
     private void handleLogicalDisplayAddedLocked(LogicalDisplay display) {
         final DisplayDevice device = display.getPrimaryDisplayDeviceLocked();
         final int displayId = display.getDisplayIdLocked();
@@ -2107,7 +2097,7 @@
         }
 
         final BrightnessSetting brightnessSetting = new BrightnessSetting(mPersistentDataStore,
-                display, mContext);
+                display, mSyncRoot);
         final DisplayPowerController displayPowerController = new DisplayPowerController(
                 mContext, mDisplayPowerCallbacks, mPowerHandler, mSensorManager,
                 mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 555add4..20d364e 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -149,9 +149,6 @@
     private static final int REPORTED_TO_POLICY_SCREEN_ON = 2;
     private static final int REPORTED_TO_POLICY_SCREEN_TURNING_OFF = 3;
 
-    private static final Uri BRIGHTNESS_FLOAT_URI =
-            Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FLOAT);
-
     private final Object mLock = new Object();
 
     private final Context mContext;
@@ -393,7 +390,7 @@
 
     // The last brightness that was set by the user and not temporary. Set to
     // PowerManager.BRIGHTNESS_INVALID_FLOAT when a brightness has yet to be recorded.
-    private float mLastUserSetScreenBrightness;
+    private float mLastUserSetScreenBrightness = Float.NaN;
 
     // The screen brightness setting has changed but not taken effect yet. If this is different
     // from the current screen brightness setting then this is coming from something other than us
@@ -424,6 +421,14 @@
     // PowerManager.BRIGHTNESS_INVALID_FLOAT when there's no temporary adjustment set.
     private float mTemporaryAutoBrightnessAdjustment;
 
+    // Whether a reduce bright colors (rbc) change has been initiated by the user. We want to
+    // retain the current backlight level when rbc is toggled, since rbc additionally makes the
+    // screen appear dimmer using screen colors rather than backlight levels, and therefore we
+    // don't actually want to compensate for this by then in/decreasing the backlight when
+    // toggling this feature.
+    // This should be false during system start up.
+    private boolean mPendingUserRbcChange;
+
     // Animators.
     private ObjectAnimator mColorFadeOnAnimator;
     private ObjectAnimator mColorFadeOffAnimator;
@@ -555,24 +560,25 @@
             mCdsi = LocalServices.getService(ColorDisplayServiceInternal.class);
             boolean active = mCdsi.setReduceBrightColorsListener(new ReduceBrightColorsListener() {
                 @Override
-                public void onReduceBrightColorsActivationChanged(boolean activated) {
-                    applyReduceBrightColorsSplineAdjustment();
+                public void onReduceBrightColorsActivationChanged(boolean activated,
+                        boolean userInitiated) {
+                    applyReduceBrightColorsSplineAdjustment(userInitiated);
                 }
 
                 @Override
                 public void onReduceBrightColorsStrengthChanged(int strength) {
-                    applyReduceBrightColorsSplineAdjustment();
+                    applyReduceBrightColorsSplineAdjustment(/*userInitiated*/ false);
                 }
             });
             if (active) {
-                applyReduceBrightColorsSplineAdjustment();
+                applyReduceBrightColorsSplineAdjustment(/*userInitiated*/ false);
             }
         } else {
             mCdsi = null;
         }
     }
 
-    private void applyReduceBrightColorsSplineAdjustment() {
+    private void applyReduceBrightColorsSplineAdjustment(boolean userInitiated) {
         if (mBrightnessMapper == null) {
             Log.w(TAG, "No brightness mapping available to recalculate splines");
             return;
@@ -583,6 +589,8 @@
             adjustedNits[i] = mCdsi.getReduceBrightColorsAdjustedBrightnessNits(mNitsRange[i]);
         }
         mBrightnessMapper.recalculateSplines(mCdsi.isReduceBrightColorsActivated(), adjustedNits);
+        mPendingUserRbcChange = userInitiated;
+        sendUpdatePowerState();
     }
 
     /**
@@ -914,7 +922,7 @@
 
     private void reloadReduceBrightColours() {
         if (mCdsi != null && mCdsi.isReduceBrightColorsActivated()) {
-            applyReduceBrightColorsSplineAdjustment();
+            applyReduceBrightColorsSplineAdjustment(/*userInitiated*/ false);
         }
     }
 
@@ -1518,7 +1526,9 @@
                 () -> {
                     sendUpdatePowerStateLocked();
                     mHandler.post(mOnBrightnessChangeRunnable);
-                });
+                    // TODO(b/192258832): Switch the HBMChangeCallback to a listener pattern.
+                    mAutomaticBrightnessController.update();
+                }, mContext);
     }
 
     private void blockScreenOn() {
@@ -2040,15 +2050,21 @@
     }
 
     private boolean updateUserSetScreenBrightness() {
+        final boolean brightnessSplineChanged = mPendingUserRbcChange;
+        if (mPendingUserRbcChange && !Float.isNaN(mCurrentScreenBrightnessSetting)) {
+            mLastUserSetScreenBrightness = mCurrentScreenBrightnessSetting;
+        }
+        mPendingUserRbcChange = false;
+
         if ((Float.isNaN(mPendingScreenBrightnessSetting)
                 || mPendingScreenBrightnessSetting < 0.0f)) {
-            return false;
+            return brightnessSplineChanged;
         }
         if (BrightnessSynchronizer.floatEquals(
                 mCurrentScreenBrightnessSetting, mPendingScreenBrightnessSetting)) {
             mPendingScreenBrightnessSetting = PowerManager.BRIGHTNESS_INVALID_FLOAT;
             mTemporaryScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
-            return false;
+            return brightnessSplineChanged;
         }
         setCurrentScreenBrightness(mPendingScreenBrightnessSetting);
         mLastUserSetScreenBrightness = mPendingScreenBrightnessSetting;
diff --git a/services/core/java/com/android/server/display/HighBrightnessModeController.java b/services/core/java/com/android/server/display/HighBrightnessModeController.java
index 57a8c4b..d629422 100644
--- a/services/core/java/com/android/server/display/HighBrightnessModeController.java
+++ b/services/core/java/com/android/server/display/HighBrightnessModeController.java
@@ -16,11 +16,21 @@
 
 package com.android.server.display;
 
+import android.content.Context;
+import android.database.ContentObserver;
 import android.hardware.display.BrightnessInfo;
+import android.net.Uri;
 import android.os.Handler;
 import android.os.IBinder;
+import android.os.IThermalEventListener;
+import android.os.IThermalService;
 import android.os.PowerManager;
+import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.SystemClock;
+import android.os.Temperature;
+import android.os.UserHandle;
+import android.provider.Settings;
 import android.util.Slog;
 import android.util.TimeUtils;
 import android.view.SurfaceControlHdrLayerInfoListener;
@@ -52,6 +62,10 @@
     private final Runnable mHbmChangeCallback;
     private final Runnable mRecalcRunnable;
     private final Clock mClock;
+    private final SkinThermalStatusObserver mSkinThermalStatusObserver;
+    private final Context mContext;
+    private final SettingsObserver mSettingsObserver;
+    private final Injector mInjector;
 
     private SurfaceControlHdrLayerInfoListener mHdrListener;
     private HighBrightnessModeData mHbmData;
@@ -63,6 +77,8 @@
     private float mAutoBrightness;
     private int mHbmMode = BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF;
     private boolean mIsHdrLayerPresent = false;
+    private boolean mIsThermalStatusWithinLimit = true;
+    private boolean mIsBlockedByLowPowerMode = false;
 
     /**
      * If HBM is currently running, this is the start time for the current HBM session.
@@ -72,29 +88,33 @@
     /**
      * List of previous HBM-events ordered from most recent to least recent.
      * Meant to store only the events that fall into the most recent
-     * {@link mHbmData.timeWindowSecs}.
+     * {@link mHbmData.timeWindowMillis}.
      */
     private LinkedList<HbmEvent> mEvents = new LinkedList<>();
 
     HighBrightnessModeController(Handler handler, IBinder displayToken, float brightnessMin,
-            float brightnessMax, HighBrightnessModeData hbmData, Runnable hbmChangeCallback) {
-        this(SystemClock::uptimeMillis, handler, displayToken, brightnessMin, brightnessMax,
-                hbmData, hbmChangeCallback);
+            float brightnessMax, HighBrightnessModeData hbmData, Runnable hbmChangeCallback,
+            Context context) {
+        this(new Injector(), handler, displayToken, brightnessMin, brightnessMax,
+                hbmData, hbmChangeCallback, context);
     }
 
     @VisibleForTesting
-    HighBrightnessModeController(Clock clock, Handler handler, IBinder displayToken,
+    HighBrightnessModeController(Injector injector, Handler handler, IBinder displayToken,
             float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData,
-            Runnable hbmChangeCallback) {
-        mClock = clock;
+            Runnable hbmChangeCallback, Context context) {
+        mInjector = injector;
+        mClock = injector.getClock();
         mHandler = handler;
         mBrightnessMin = brightnessMin;
         mBrightnessMax = brightnessMax;
         mHbmChangeCallback = hbmChangeCallback;
+        mContext = context;
         mAutoBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
         mRecalcRunnable = this::recalculateTimeAllowance;
         mHdrListener = new HdrListener();
-
+        mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler);
+        mSettingsObserver = new SettingsObserver(mHandler);
         resetHbmData(displayToken, hbmData);
     }
 
@@ -178,14 +198,26 @@
 
     void stop() {
         registerHdrListener(null /*displayToken*/);
+        mSkinThermalStatusObserver.stopObserving();
+        mSettingsObserver.stopObserving();
     }
 
     void resetHbmData(IBinder displayToken, HighBrightnessModeData hbmData) {
         mHbmData = hbmData;
         unregisterHdrListener();
+        mSkinThermalStatusObserver.stopObserving();
+        mSettingsObserver.stopObserving();
         if (deviceSupportsHbm()) {
             registerHdrListener(displayToken);
             recalculateTimeAllowance();
+            if (mHbmData.thermalStatusLimit > PowerManager.THERMAL_STATUS_NONE) {
+                mIsThermalStatusWithinLimit = true;
+                mSkinThermalStatusObserver.startObserving();
+            }
+            if (!mHbmData.allowInLowPowerMode) {
+                mIsBlockedByLowPowerMode = false;
+                mSettingsObserver.startObserving();
+            }
         }
     }
 
@@ -208,6 +240,8 @@
         pw.println("  mBrightnessMin=" + mBrightnessMin);
         pw.println("  mBrightnessMax=" + mBrightnessMax);
         pw.println("  mRunningStartTimeMillis=" + TimeUtils.formatUptime(mRunningStartTimeMillis));
+        pw.println("  mIsThermalStatusWithinLimit=" + mIsThermalStatusWithinLimit);
+        pw.println("  mIsBlockedByLowPowerMode=" + mIsBlockedByLowPowerMode);
         pw.println("  mEvents=");
         final long currentTime = mClock.uptimeMillis();
         long lastStartTime = currentTime;
@@ -221,6 +255,8 @@
             }
             lastStartTime = dumpHbmEvent(pw, event);
         }
+
+        mSkinThermalStatusObserver.dump(pw);
     }
 
     private long dumpHbmEvent(PrintWriter pw, HbmEvent event) {
@@ -234,7 +270,8 @@
 
     private boolean isCurrentlyAllowed() {
         return mIsHdrLayerPresent
-                || (mIsAutoBrightnessEnabled && mIsTimeAvailable && mIsInAllowedAmbientRange);
+                || (mIsAutoBrightnessEnabled && mIsTimeAvailable && mIsInAllowedAmbientRange
+                && mIsThermalStatusWithinLimit && !mIsBlockedByLowPowerMode);
     }
 
     private boolean deviceSupportsHbm() {
@@ -327,6 +364,12 @@
                     + ", remainingAllowedTime: " + remainingTime
                     + ", isLuxHigh: " + mIsInAllowedAmbientRange
                     + ", isHBMCurrentlyAllowed: " + isCurrentlyAllowed()
+                    + ", isHdrLayerPresent: " + mIsHdrLayerPresent
+                    + ", isAutoBrightnessEnabled: " +  mIsAutoBrightnessEnabled
+                    + ", mIsTimeAvailable: " + mIsTimeAvailable
+                    + ", mIsInAllowedAmbientRange: " + mIsInAllowedAmbientRange
+                    + ", mIsThermalStatusWithinLimit: " + mIsThermalStatusWithinLimit
+                    + ", mIsBlockedByLowPowerMode: " + mIsBlockedByLowPowerMode
                     + ", brightness: " + mAutoBrightness
                     + ", RunningStartTimeMillis: " + mRunningStartTimeMillis
                     + ", nextTimeout: " + (nextTimeout != -1 ? (nextTimeout - currentTime) : -1)
@@ -337,8 +380,11 @@
             mHandler.removeCallbacks(mRecalcRunnable);
             mHandler.postAtTime(mRecalcRunnable, nextTimeout + 1);
         }
-
         // Update the state of the world
+        updateHbmMode();
+    }
+
+    private void updateHbmMode() {
         int newHbmMode = calculateHighBrightnessMode();
         if (mHbmMode != newHbmMode) {
             mHbmMode = newHbmMode;
@@ -409,4 +455,141 @@
             });
         }
     }
+
+    private final class SkinThermalStatusObserver extends IThermalEventListener.Stub {
+        private final Injector mInjector;
+        private final Handler mHandler;
+
+        private IThermalService mThermalService;
+        private boolean mStarted;
+
+        SkinThermalStatusObserver(Injector injector, Handler handler) {
+            mInjector = injector;
+            mHandler = handler;
+        }
+
+        @Override
+        public void notifyThrottling(Temperature temp) {
+            if (DEBUG) {
+                Slog.d(TAG, "New thermal throttling status "
+                        + ", current thermal status = " + temp.getStatus()
+                        + ", threshold = " + mHbmData.thermalStatusLimit);
+            }
+            mHandler.post(() -> {
+                mIsThermalStatusWithinLimit = temp.getStatus() <= mHbmData.thermalStatusLimit;
+                // This recalculates HbmMode and runs mHbmChangeCallback if the mode has changed
+                updateHbmMode();
+            });
+        }
+
+        void startObserving() {
+            if (mStarted) {
+                if (DEBUG) {
+                    Slog.d(TAG, "Thermal status observer already started");
+                }
+                return;
+            }
+            mThermalService = mInjector.getThermalService();
+            if (mThermalService == null) {
+                Slog.w(TAG, "Could not observe thermal status. Service not available");
+                return;
+            }
+            try {
+                // We get a callback immediately upon registering so there's no need to query
+                // for the current value.
+                mThermalService.registerThermalEventListenerWithType(this, Temperature.TYPE_SKIN);
+                mStarted = true;
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Failed to register thermal status listener", e);
+            }
+        }
+
+        void stopObserving() {
+            mIsThermalStatusWithinLimit = true;
+            if (!mStarted) {
+                if (DEBUG) {
+                    Slog.d(TAG, "Stop skipped because thermal status observer not started");
+                }
+                return;
+            }
+            try {
+                mThermalService.unregisterThermalEventListener(this);
+                mStarted = false;
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Failed to unregister thermal status listener", e);
+            }
+            mThermalService = null;
+        }
+
+        void dump(PrintWriter writer) {
+            writer.println("  SkinThermalStatusObserver:");
+            writer.println("    mStarted: " + mStarted);
+            if (mThermalService != null) {
+                writer.println("    ThermalService available");
+            } else {
+                writer.println("    ThermalService not available");
+            }
+        }
+    }
+
+    private final class SettingsObserver extends ContentObserver {
+        private final Uri mLowPowerModeSetting = Settings.Global.getUriFor(
+                Settings.Global.LOW_POWER_MODE);
+        private boolean mStarted;
+
+        SettingsObserver(Handler handler) {
+            super(handler);
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            updateLowPower();
+        }
+
+        void startObserving() {
+            if (!mStarted) {
+                mContext.getContentResolver().registerContentObserver(mLowPowerModeSetting,
+                        false /*notifyForDescendants*/, this, UserHandle.USER_ALL);
+                mStarted = true;
+                updateLowPower();
+            }
+        }
+
+        void stopObserving() {
+            mIsBlockedByLowPowerMode = false;
+            if (mStarted) {
+                mContext.getContentResolver().unregisterContentObserver(this);
+                mStarted = false;
+            }
+        }
+
+        private void updateLowPower() {
+            final boolean isLowPowerMode = isLowPowerMode();
+            if (isLowPowerMode == mIsBlockedByLowPowerMode) {
+                return;
+            }
+            if (DEBUG) {
+                Slog.d(TAG, "Settings.Global.LOW_POWER_MODE enabled: " + isLowPowerMode);
+            }
+            mIsBlockedByLowPowerMode = isLowPowerMode;
+            // this recalculates HbmMode and runs mHbmChangeCallback if the mode has changed
+            updateHbmMode();
+        }
+
+        private boolean isLowPowerMode() {
+            return Settings.Global.getInt(
+                    mContext.getContentResolver(), Settings.Global.LOW_POWER_MODE, 0) != 0;
+        }
+    }
+
+    public static class Injector {
+        public Clock getClock() {
+            return SystemClock::uptimeMillis;
+        }
+
+        public IThermalService getThermalService() {
+            return IThermalService.Stub.asInterface(
+                    ServiceManager.getService(Context.THERMAL_SERVICE));
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/display/color/ColorDisplayService.java b/services/core/java/com/android/server/display/color/ColorDisplayService.java
index 7fa0b21..bccd4c4 100644
--- a/services/core/java/com/android/server/display/color/ColorDisplayService.java
+++ b/services/core/java/com/android/server/display/color/ColorDisplayService.java
@@ -355,7 +355,7 @@
                                 updateDisplayWhiteBalanceStatus();
                                 break;
                             case Secure.REDUCE_BRIGHT_COLORS_ACTIVATED:
-                                onReduceBrightColorsActivationChanged();
+                                onReduceBrightColorsActivationChanged(/*userInitiated*/ true);
                                 mHandler.sendEmptyMessage(MSG_APPLY_REDUCE_BRIGHT_COLORS);
                                 break;
                             case Secure.REDUCE_BRIGHT_COLORS_LEVEL:
@@ -437,7 +437,7 @@
             onReduceBrightColorsStrengthLevelChanged();
             final boolean reset = resetReduceBrightColors();
             if (!reset) {
-                onReduceBrightColorsActivationChanged();
+                onReduceBrightColorsActivationChanged(/*userInitiated*/ false);
                 mHandler.sendEmptyMessage(MSG_APPLY_REDUCE_BRIGHT_COLORS);
             }
         }
@@ -614,7 +614,7 @@
                 isAccessiblityInversionEnabled() ? MATRIX_INVERT_COLOR : null);
     }
 
-    private void onReduceBrightColorsActivationChanged() {
+    private void onReduceBrightColorsActivationChanged(boolean userInitiated) {
         if (mCurrentUser == UserHandle.USER_NULL) {
             return;
         }
@@ -622,7 +622,8 @@
                 Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 0, mCurrentUser) == 1;
         mReduceBrightColorsTintController.setActivated(activated);
         if (mReduceBrightColorsListener != null) {
-            mReduceBrightColorsListener.onReduceBrightColorsActivationChanged(activated);
+            mReduceBrightColorsListener.onReduceBrightColorsActivationChanged(activated,
+                    userInitiated);
         }
     }
 
@@ -1551,7 +1552,7 @@
         /**
          * Notify that the reduce bright colors activation status has changed.
          */
-        void onReduceBrightColorsActivationChanged(boolean activated);
+        void onReduceBrightColorsActivationChanged(boolean activated, boolean userInitiated);
 
         /**
          * Notify that the reduce bright colors strength has changed.
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 457c94e..fd0f1c3 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -157,13 +157,8 @@
 import com.android.internal.inputmethod.CallbackUtils;
 import com.android.internal.inputmethod.IBooleanResultCallback;
 import com.android.internal.inputmethod.IIInputContentUriTokenResultCallback;
-import com.android.internal.inputmethod.IInputBindResultResultCallback;
 import com.android.internal.inputmethod.IInputContentUriToken;
-import com.android.internal.inputmethod.IInputMethodInfoListResultCallback;
 import com.android.internal.inputmethod.IInputMethodPrivilegedOperations;
-import com.android.internal.inputmethod.IInputMethodSubtypeListResultCallback;
-import com.android.internal.inputmethod.IInputMethodSubtypeResultCallback;
-import com.android.internal.inputmethod.IIntResultCallback;
 import com.android.internal.inputmethod.IVoidResultCallback;
 import com.android.internal.inputmethod.InputMethodDebug;
 import com.android.internal.inputmethod.SoftInputShowHideReason;
@@ -213,7 +208,6 @@
 import java.util.WeakHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.Supplier;
 
 /**
  * This class provides a system service that manages input methods.
@@ -1895,51 +1889,45 @@
     }
 
     @Override
-    public void getInputMethodList(@UserIdInt int userId,
-            IInputMethodInfoListResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            if (UserHandle.getCallingUserId() != userId) {
-                mContext.enforceCallingPermission(
-                        Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
+    public List<InputMethodInfo> getInputMethodList(@UserIdInt int userId) {
+        if (UserHandle.getCallingUserId() != userId) {
+            mContext.enforceCallingPermission(
+                    Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
+        }
+        synchronized (mMethodMap) {
+            final int[] resolvedUserIds = InputMethodUtils.resolveUserId(userId,
+                    mSettings.getCurrentUserId(), null);
+            if (resolvedUserIds.length != 1) {
+                return Collections.emptyList();
             }
-            synchronized (mMethodMap) {
-                final int[] resolvedUserIds = InputMethodUtils.resolveUserId(userId,
-                        mSettings.getCurrentUserId(), null);
-                if (resolvedUserIds.length != 1) {
-                    return Collections.emptyList();
-                }
-                final long ident = Binder.clearCallingIdentity();
-                try {
-                    return getInputMethodListLocked(resolvedUserIds[0]);
-                } finally {
-                    Binder.restoreCallingIdentity(ident);
-                }
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                return getInputMethodListLocked(resolvedUserIds[0]);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
             }
-        });
+        }
     }
 
     @Override
-    public void getEnabledInputMethodList(@UserIdInt int userId,
-            IInputMethodInfoListResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            if (UserHandle.getCallingUserId() != userId) {
-                mContext.enforceCallingPermission(
-                        Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
+    public List<InputMethodInfo> getEnabledInputMethodList(@UserIdInt int userId) {
+        if (UserHandle.getCallingUserId() != userId) {
+            mContext.enforceCallingPermission(
+                    Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
+        }
+        synchronized (mMethodMap) {
+            final int[] resolvedUserIds = InputMethodUtils.resolveUserId(userId,
+                    mSettings.getCurrentUserId(), null);
+            if (resolvedUserIds.length != 1) {
+                return Collections.emptyList();
             }
-            synchronized (mMethodMap) {
-                final int[] resolvedUserIds = InputMethodUtils.resolveUserId(userId,
-                        mSettings.getCurrentUserId(), null);
-                if (resolvedUserIds.length != 1) {
-                    return Collections.emptyList();
-                }
-                final long ident = Binder.clearCallingIdentity();
-                try {
-                    return getEnabledInputMethodListLocked(resolvedUserIds[0]);
-                } finally {
-                    Binder.restoreCallingIdentity(ident);
-                }
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                return getEnabledInputMethodListLocked(resolvedUserIds[0]);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
             }
-        });
+        }
     }
 
     @GuardedBy("mMethodMap")
@@ -2097,29 +2085,25 @@
      * @param imiId if null, returns enabled subtypes for the current {@link InputMethodInfo}.
      * @param allowsImplicitlySelectedSubtypes {@code true} to return the implicitly selected
      *                                         subtypes.
-     * @param resultCallback to callback the result.
      */
     @Override
-    public void getEnabledInputMethodSubtypeList(String imiId,
-            boolean allowsImplicitlySelectedSubtypes,
-            IInputMethodSubtypeListResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            final int callingUserId = UserHandle.getCallingUserId();
-            synchronized (mMethodMap) {
-                final int[] resolvedUserIds = InputMethodUtils.resolveUserId(callingUserId,
-                        mSettings.getCurrentUserId(), null);
-                if (resolvedUserIds.length != 1) {
-                    return Collections.emptyList();
-                }
-                final long ident = Binder.clearCallingIdentity();
-                try {
-                    return getEnabledInputMethodSubtypeListLocked(imiId,
-                            allowsImplicitlySelectedSubtypes, resolvedUserIds[0]);
-                } finally {
-                    Binder.restoreCallingIdentity(ident);
-                }
+    public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(String imiId,
+            boolean allowsImplicitlySelectedSubtypes) {
+        final int callingUserId = UserHandle.getCallingUserId();
+        synchronized (mMethodMap) {
+            final int[] resolvedUserIds = InputMethodUtils.resolveUserId(callingUserId,
+                    mSettings.getCurrentUserId(), null);
+            if (resolvedUserIds.length != 1) {
+                return Collections.emptyList();
             }
-        });
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                return getEnabledInputMethodSubtypeListLocked(imiId,
+                        allowsImplicitlySelectedSubtypes, resolvedUserIds[0]);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
     }
 
     @GuardedBy("mMethodMap")
@@ -3067,44 +3051,41 @@
     }
 
     @Override
-    public void showSoftInput(IInputMethodClient client, IBinder windowToken, int flags,
-            ResultReceiver resultReceiver, @SoftInputShowHideReason int reason,
-            IBooleanResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.showSoftInput");
-            int uid = Binder.getCallingUid();
-            ImeTracing.getInstance().triggerManagerServiceDump(
-                    "InputMethodManagerService#showSoftInput");
-            synchronized (mMethodMap) {
-                if (!calledFromValidUserLocked()) {
-                    return false;
-                }
-                final long ident = Binder.clearCallingIdentity();
-                try {
-                    if (mCurClient == null || client == null
-                            || mCurClient.client.asBinder() != client.asBinder()) {
-                        // We need to check if this is the current client with
-                        // focus in the window manager, to allow this call to
-                        // be made before input is started in it.
-                        final ClientState cs = mClients.get(client.asBinder());
-                        if (cs == null) {
-                            throw new IllegalArgumentException(
-                                    "unknown client " + client.asBinder());
-                        }
-                        if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid,
-                                cs.selfReportedDisplayId)) {
-                            Slog.w(TAG, "Ignoring showSoftInput of uid " + uid + ": " + client);
-                            return false;
-                        }
-                    }
-                    if (DEBUG) Slog.v(TAG, "Client requesting input be shown");
-                    return showCurrentInputLocked(windowToken, flags, resultReceiver, reason);
-                } finally {
-                    Binder.restoreCallingIdentity(ident);
-                    Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
-                }
+    public boolean showSoftInput(IInputMethodClient client, IBinder windowToken, int flags,
+            ResultReceiver resultReceiver, @SoftInputShowHideReason int reason) {
+        Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.showSoftInput");
+        int uid = Binder.getCallingUid();
+        ImeTracing.getInstance().triggerManagerServiceDump(
+                "InputMethodManagerService#showSoftInput");
+        synchronized (mMethodMap) {
+            if (!calledFromValidUserLocked()) {
+                return false;
             }
-        });
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                if (mCurClient == null || client == null
+                        || mCurClient.client.asBinder() != client.asBinder()) {
+                    // We need to check if this is the current client with
+                    // focus in the window manager, to allow this call to
+                    // be made before input is started in it.
+                    final ClientState cs = mClients.get(client.asBinder());
+                    if (cs == null) {
+                        throw new IllegalArgumentException(
+                                "unknown client " + client.asBinder());
+                    }
+                    if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid,
+                            cs.selfReportedDisplayId)) {
+                        Slog.w(TAG, "Ignoring showSoftInput of uid " + uid + ": " + client);
+                        return false;
+                    }
+                }
+                if (DEBUG) Slog.v(TAG, "Client requesting input be shown");
+                return showCurrentInputLocked(windowToken, flags, resultReceiver, reason);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+                Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+            }
+        }
     }
 
     @BinderThread
@@ -3186,49 +3167,46 @@
     }
 
     @Override
-    public void hideSoftInput(IInputMethodClient client, IBinder windowToken, int flags,
-            ResultReceiver resultReceiver, @SoftInputShowHideReason int reason,
-            IBooleanResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            int uid = Binder.getCallingUid();
-            ImeTracing.getInstance().triggerManagerServiceDump(
-                    "InputMethodManagerService#hideSoftInput");
-            synchronized (mMethodMap) {
-                if (!InputMethodManagerService.this.calledFromValidUserLocked()) {
-                    return false;
-                }
-                final long ident = Binder.clearCallingIdentity();
-                try {
-                    Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.hideSoftInput");
-                    if (mCurClient == null || client == null
-                            || mCurClient.client.asBinder() != client.asBinder()) {
-                        // We need to check if this is the current client with
-                        // focus in the window manager, to allow this call to
-                        // be made before input is started in it.
-                        final ClientState cs = mClients.get(client.asBinder());
-                        if (cs == null) {
-                            throw new IllegalArgumentException(
-                                    "unknown client " + client.asBinder());
-                        }
-                        if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid,
-                                cs.selfReportedDisplayId)) {
-                            if (DEBUG) {
-                                Slog.w(TAG,
-                                        "Ignoring hideSoftInput of uid " + uid + ": " + client);
-                            }
-                            return false;
-                        }
-                    }
-
-                    if (DEBUG) Slog.v(TAG, "Client requesting input be hidden");
-                    return InputMethodManagerService.this.hideCurrentInputLocked(windowToken,
-                            flags, resultReceiver, reason);
-                } finally {
-                    Binder.restoreCallingIdentity(ident);
-                    Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
-                }
+    public boolean hideSoftInput(IInputMethodClient client, IBinder windowToken, int flags,
+            ResultReceiver resultReceiver, @SoftInputShowHideReason int reason) {
+        int uid = Binder.getCallingUid();
+        ImeTracing.getInstance().triggerManagerServiceDump(
+                "InputMethodManagerService#hideSoftInput");
+        synchronized (mMethodMap) {
+            if (!InputMethodManagerService.this.calledFromValidUserLocked()) {
+                return false;
             }
-        });
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.hideSoftInput");
+                if (mCurClient == null || client == null
+                        || mCurClient.client.asBinder() != client.asBinder()) {
+                    // We need to check if this is the current client with
+                    // focus in the window manager, to allow this call to
+                    // be made before input is started in it.
+                    final ClientState cs = mClients.get(client.asBinder());
+                    if (cs == null) {
+                        throw new IllegalArgumentException(
+                                "unknown client " + client.asBinder());
+                    }
+                    if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid,
+                            cs.selfReportedDisplayId)) {
+                        if (DEBUG) {
+                            Slog.w(TAG,
+                                    "Ignoring hideSoftInput of uid " + uid + ": " + client);
+                        }
+                        return false;
+                    }
+                }
+
+                if (DEBUG) Slog.v(TAG, "Client requesting input be hidden");
+                return InputMethodManagerService.this.hideCurrentInputLocked(windowToken,
+                        flags, resultReceiver, reason);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+                Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+            }
+        }
     }
 
     boolean hideCurrentInputLocked(IBinder windowToken, int flags, ResultReceiver resultReceiver,
@@ -3280,38 +3258,14 @@
 
     @NonNull
     @Override
-    public void reportWindowGainedFocusAsync(
-            boolean nextFocusHasConnection, IInputMethodClient client, IBinder windowToken,
-            @StartInputFlags int startInputFlags, @SoftInputModeFlags int softInputMode,
-            int windowFlags, int unverifiedTargetSdkVersion) {
-        final int startInputReason = nextFocusHasConnection
-                ? StartInputReason.WINDOW_FOCUS_GAIN_REPORT_WITH_CONNECTION
-                : StartInputReason.WINDOW_FOCUS_GAIN_REPORT_WITHOUT_CONNECTION;
-        try {
-            startInputOrWindowGainedFocusInternal(startInputReason, client, windowToken,
-                    startInputFlags, softInputMode, windowFlags, null /* attribute */,
-                    null /* inputContext */, 0 /* missingMethods */, unverifiedTargetSdkVersion);
-        } catch (Throwable t) {
-            if (client != null) {
-                try {
-                    client.throwExceptionFromSystem(t.getMessage());
-                } catch (RemoteException ignore) { }
-            }
-        }
-    }
-
-    @NonNull
-    @Override
-    public void startInputOrWindowGainedFocus(
+    public InputBindResult startInputOrWindowGainedFocus(
             @StartInputReason int startInputReason, IInputMethodClient client, IBinder windowToken,
             @StartInputFlags int startInputFlags, @SoftInputModeFlags int softInputMode,
             int windowFlags, @Nullable EditorInfo attribute, IInputContext inputContext,
-            @MissingMethodFlags int missingMethods, int unverifiedTargetSdkVersion,
-            IInputBindResultResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, (Supplier<InputBindResult>) () ->
-                startInputOrWindowGainedFocusInternal(startInputReason, client, windowToken,
+            @MissingMethodFlags int missingMethods, int unverifiedTargetSdkVersion) {
+        return startInputOrWindowGainedFocusInternal(startInputReason, client, windowToken,
                 startInputFlags, softInputMode, windowFlags, attribute, inputContext,
-                missingMethods, unverifiedTargetSdkVersion));
+                missingMethods, unverifiedTargetSdkVersion);
     }
 
     @NonNull
@@ -3671,54 +3625,47 @@
     }
 
     @Override
-    public void showInputMethodPickerFromClient(IInputMethodClient client, int auxiliarySubtypeMode,
-            IVoidResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            synchronized (mMethodMap) {
-                if (!calledFromValidUserLocked()) {
-                    return;
-                }
-                if (!canShowInputMethodPickerLocked(client)) {
-                    Slog.w(TAG, "Ignoring showInputMethodPickerFromClient of uid "
-                            + Binder.getCallingUid() + ": " + client);
-                    return;
-                }
-
-                // Always call subtype picker, because subtype picker is a superset of input method
-                // picker.
-                mHandler.sendMessage(mCaller.obtainMessageII(
-                        MSG_SHOW_IM_SUBTYPE_PICKER, auxiliarySubtypeMode,
-                        (mCurClient != null) ? mCurClient.selfReportedDisplayId : DEFAULT_DISPLAY));
+    public void showInputMethodPickerFromClient(IInputMethodClient client,
+            int auxiliarySubtypeMode) {
+        synchronized (mMethodMap) {
+            if (!calledFromValidUserLocked()) {
+                return;
             }
-        });
+            if (!canShowInputMethodPickerLocked(client)) {
+                Slog.w(TAG, "Ignoring showInputMethodPickerFromClient of uid "
+                        + Binder.getCallingUid() + ": " + client);
+                return;
+            }
+
+            // Always call subtype picker, because subtype picker is a superset of input method
+            // picker.
+            mHandler.sendMessage(mCaller.obtainMessageII(
+                    MSG_SHOW_IM_SUBTYPE_PICKER, auxiliarySubtypeMode,
+                    (mCurClient != null) ? mCurClient.selfReportedDisplayId : DEFAULT_DISPLAY));
+        }
     }
 
     @Override
     public void showInputMethodPickerFromSystem(IInputMethodClient client, int auxiliarySubtypeMode,
-            int displayId, IVoidResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            if (mContext.checkCallingPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
-                    != PackageManager.PERMISSION_GRANTED) {
-                throw new SecurityException(
-                        "showInputMethodPickerFromSystem requires WRITE_SECURE_SETTINGS "
-                                + "permission");
-            }
-            // Always call subtype picker, because subtype picker is a superset of input method
-            // picker.
-            mHandler.sendMessage(mCaller.obtainMessageII(
-                    MSG_SHOW_IM_SUBTYPE_PICKER, auxiliarySubtypeMode, displayId));
-        });
+            int displayId) {
+        if (mContext.checkCallingPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+                != PackageManager.PERMISSION_GRANTED) {
+            throw new SecurityException(
+                    "showInputMethodPickerFromSystem requires WRITE_SECURE_SETTINGS "
+                            + "permission");
+        }
+        // Always call subtype picker, because subtype picker is a superset of input method
+        // picker.
+        mHandler.sendMessage(mCaller.obtainMessageII(
+                MSG_SHOW_IM_SUBTYPE_PICKER, auxiliarySubtypeMode, displayId));
     }
 
     /**
      * A test API for CTS to make sure that the input method menu is showing.
-     *
-     * @param resultCallback {@code true} while the input method menu is showing UI.
      */
-    public void isInputMethodPickerShownForTest(IBooleanResultCallback resultCallback) {
+    public boolean isInputMethodPickerShownForTest() {
         synchronized(mMethodMap) {
-            CallbackUtils.onResult(
-                    resultCallback, mMenuController::isisInputMethodPickerShownForTestLocked);
+            return mMenuController.isisInputMethodPickerShownForTestLocked();
         }
     }
 
@@ -3751,17 +3698,15 @@
 
     @Override
     public void showInputMethodAndSubtypeEnablerFromClient(
-            IInputMethodClient client, String inputMethodId, IVoidResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            synchronized (mMethodMap) {
-                // TODO(yukawa): Should we verify the display ID?
-                if (!calledFromValidUserLocked()) {
-                    return;
-                }
-                executeOrSendMessage(mCurMethod, mCaller.obtainMessageO(
-                        MSG_SHOW_IM_SUBTYPE_ENABLER, inputMethodId));
+            IInputMethodClient client, String inputMethodId) {
+        synchronized (mMethodMap) {
+            // TODO(yukawa): Should we verify the display ID?
+            if (!calledFromValidUserLocked()) {
+                return;
             }
-        });
+            executeOrSendMessage(mCurMethod, mCaller.obtainMessageO(
+                    MSG_SHOW_IM_SUBTYPE_ENABLER, inputMethodId));
+        }
     }
 
     @BinderThread
@@ -3869,89 +3814,83 @@
     }
 
     @Override
-    public void getLastInputMethodSubtype(IInputMethodSubtypeResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            synchronized (mMethodMap) {
-                if (!calledFromValidUserLocked()) {
-                    return null;
-                }
-                final Pair<String, String> lastIme = mSettings.getLastInputMethodAndSubtypeLocked();
-                // TODO: Handle the case of the last IME with no subtypes
-                if (lastIme == null || TextUtils.isEmpty(lastIme.first)
-                        || TextUtils.isEmpty(lastIme.second)) return null;
-                final InputMethodInfo lastImi = mMethodMap.get(lastIme.first);
-                if (lastImi == null) return null;
-                try {
-                    final int lastSubtypeHash = Integer.parseInt(lastIme.second);
-                    final int lastSubtypeId =
-                            InputMethodUtils.getSubtypeIdFromHashCode(lastImi, lastSubtypeHash);
-                    if (lastSubtypeId < 0 || lastSubtypeId >= lastImi.getSubtypeCount()) {
-                        return null;
-                    }
-                    return lastImi.getSubtypeAt(lastSubtypeId);
-                } catch (NumberFormatException e) {
-                    return null;
-                }
+    public InputMethodSubtype getLastInputMethodSubtype() {
+        synchronized (mMethodMap) {
+            if (!calledFromValidUserLocked()) {
+                return null;
             }
-        });
+            final Pair<String, String> lastIme = mSettings.getLastInputMethodAndSubtypeLocked();
+            // TODO: Handle the case of the last IME with no subtypes
+            if (lastIme == null || TextUtils.isEmpty(lastIme.first)
+                    || TextUtils.isEmpty(lastIme.second)) return null;
+            final InputMethodInfo lastImi = mMethodMap.get(lastIme.first);
+            if (lastImi == null) return null;
+            try {
+                final int lastSubtypeHash = Integer.parseInt(lastIme.second);
+                final int lastSubtypeId =
+                        InputMethodUtils.getSubtypeIdFromHashCode(lastImi, lastSubtypeHash);
+                if (lastSubtypeId < 0 || lastSubtypeId >= lastImi.getSubtypeCount()) {
+                    return null;
+                }
+                return lastImi.getSubtypeAt(lastSubtypeId);
+            } catch (NumberFormatException e) {
+                return null;
+            }
+        }
     }
 
     @Override
-    public void setAdditionalInputMethodSubtypes(String imiId, InputMethodSubtype[] subtypes,
-            IVoidResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            // By this IPC call, only a process which shares the same uid with the IME can add
-            // additional input method subtypes to the IME.
-            if (TextUtils.isEmpty(imiId) || subtypes == null) return;
-            final ArrayList<InputMethodSubtype> toBeAdded = new ArrayList<>();
-            for (InputMethodSubtype subtype : subtypes) {
-                if (!toBeAdded.contains(subtype)) {
-                    toBeAdded.add(subtype);
-                } else {
-                    Slog.w(TAG, "Duplicated subtype definition found: "
-                            + subtype.getLocale() + ", " + subtype.getMode());
-                }
+    public void setAdditionalInputMethodSubtypes(String imiId, InputMethodSubtype[] subtypes) {
+        // By this IPC call, only a process which shares the same uid with the IME can add
+        // additional input method subtypes to the IME.
+        if (TextUtils.isEmpty(imiId) || subtypes == null) return;
+        final ArrayList<InputMethodSubtype> toBeAdded = new ArrayList<>();
+        for (InputMethodSubtype subtype : subtypes) {
+            if (!toBeAdded.contains(subtype)) {
+                toBeAdded.add(subtype);
+            } else {
+                Slog.w(TAG, "Duplicated subtype definition found: "
+                        + subtype.getLocale() + ", " + subtype.getMode());
             }
-            synchronized (mMethodMap) {
-                if (!calledFromValidUserLocked()) {
-                    return;
-                }
-                if (!mSystemReady) {
-                    return;
-                }
-                final InputMethodInfo imi = mMethodMap.get(imiId);
-                if (imi == null) return;
-                final String[] packageInfos;
-                try {
-                    packageInfos = mIPackageManager.getPackagesForUid(Binder.getCallingUid());
-                } catch (RemoteException e) {
-                    Slog.e(TAG, "Failed to get package infos");
-                    return;
-                }
-                if (packageInfos != null) {
-                    final int packageNum = packageInfos.length;
-                    for (int i = 0; i < packageNum; ++i) {
-                        if (packageInfos[i].equals(imi.getPackageName())) {
-                            if (subtypes.length > 0) {
-                                mAdditionalSubtypeMap.put(imi.getId(), toBeAdded);
-                            } else {
-                                mAdditionalSubtypeMap.remove(imi.getId());
-                            }
-                            AdditionalSubtypeUtils.save(mAdditionalSubtypeMap, mMethodMap,
-                                    mSettings.getCurrentUserId());
-                            final long ident = Binder.clearCallingIdentity();
-                            try {
-                                buildInputMethodListLocked(false /* resetDefaultEnabledIme */);
-                            } finally {
-                                Binder.restoreCallingIdentity(ident);
-                            }
-                            return;
+        }
+        synchronized (mMethodMap) {
+            if (!calledFromValidUserLocked()) {
+                return;
+            }
+            if (!mSystemReady) {
+                return;
+            }
+            final InputMethodInfo imi = mMethodMap.get(imiId);
+            if (imi == null) return;
+            final String[] packageInfos;
+            try {
+                packageInfos = mIPackageManager.getPackagesForUid(Binder.getCallingUid());
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Failed to get package infos");
+                return;
+            }
+            if (packageInfos != null) {
+                final int packageNum = packageInfos.length;
+                for (int i = 0; i < packageNum; ++i) {
+                    if (packageInfos[i].equals(imi.getPackageName())) {
+                        if (subtypes.length > 0) {
+                            mAdditionalSubtypeMap.put(imi.getId(), toBeAdded);
+                        } else {
+                            mAdditionalSubtypeMap.remove(imi.getId());
                         }
+                        AdditionalSubtypeUtils.save(mAdditionalSubtypeMap, mMethodMap,
+                                mSettings.getCurrentUserId());
+                        final long ident = Binder.clearCallingIdentity();
+                        try {
+                            buildInputMethodListLocked(false /* resetDefaultEnabledIme */);
+                        } finally {
+                            Binder.restoreCallingIdentity(ident);
+                        }
+                        return;
                     }
                 }
             }
-            return;
-        });
+        }
     }
 
     /**
@@ -3963,19 +3902,15 @@
      * @return {@link WindowManagerInternal#getInputMethodWindowVisibleHeight(int)}
      */
     @Override
-    public void getInputMethodWindowVisibleHeight(IIntResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            // TODO(yukawa): Should we verify the display ID?
-            return mWindowManagerInternal.getInputMethodWindowVisibleHeight(mCurTokenDisplayId);
-        });
+    public int getInputMethodWindowVisibleHeight() {
+        // TODO(yukawa): Should we verify the display ID?
+        return mWindowManagerInternal.getInputMethodWindowVisibleHeight(mCurTokenDisplayId);
     }
 
     @Override
-    public void removeImeSurface(IVoidResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            mContext.enforceCallingPermission(Manifest.permission.INTERNAL_SYSTEM_WINDOW, null);
-            mHandler.sendMessage(mHandler.obtainMessage(MSG_REMOVE_IME_SURFACE));
-        });
+    public void removeImeSurface() {
+        mContext.enforceCallingPermission(Manifest.permission.INTERNAL_SYSTEM_WINDOW, null);
+        mHandler.sendMessage(mHandler.obtainMessage(MSG_REMOVE_IME_SURFACE));
     }
 
     @Override
@@ -3992,100 +3927,93 @@
      */
     @BinderThread
     @Override
-    public void startProtoDump(byte[] protoDump, int source, String where,
-            IVoidResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            if (protoDump == null && source != IME_TRACING_FROM_IMMS) {
-                // Dump not triggered from IMMS, but no proto information provided.
-                return;
-            }
-            ImeTracing tracingInstance = ImeTracing.getInstance();
-            if (!tracingInstance.isAvailable() || !tracingInstance.isEnabled()) {
-                return;
-            }
+    public void startProtoDump(byte[] protoDump, int source, String where) {
+        if (protoDump == null && source != IME_TRACING_FROM_IMMS) {
+            // Dump not triggered from IMMS, but no proto information provided.
+            return;
+        }
+        ImeTracing tracingInstance = ImeTracing.getInstance();
+        if (!tracingInstance.isAvailable() || !tracingInstance.isEnabled()) {
+            return;
+        }
 
-            ProtoOutputStream proto = new ProtoOutputStream();
-            switch (source) {
-                case ImeTracing.IME_TRACING_FROM_CLIENT:
-                    final long client_token = proto.start(InputMethodClientsTraceFileProto.ENTRY);
-                    proto.write(InputMethodClientsTraceProto.ELAPSED_REALTIME_NANOS,
-                            SystemClock.elapsedRealtimeNanos());
-                    proto.write(InputMethodClientsTraceProto.WHERE, where);
-                    proto.write(InputMethodClientsTraceProto.CLIENT, protoDump);
-                    proto.end(client_token);
-                    break;
-                case ImeTracing.IME_TRACING_FROM_IMS:
-                    final long service_token = proto.start(InputMethodServiceTraceFileProto.ENTRY);
-                    proto.write(InputMethodServiceTraceProto.ELAPSED_REALTIME_NANOS,
-                            SystemClock.elapsedRealtimeNanos());
-                    proto.write(InputMethodServiceTraceProto.WHERE, where);
-                    proto.write(InputMethodServiceTraceProto.INPUT_METHOD_SERVICE, protoDump);
-                    proto.end(service_token);
-                    break;
-                case IME_TRACING_FROM_IMMS:
-                    final long managerservice_token =
-                            proto.start(InputMethodManagerServiceTraceFileProto.ENTRY);
-                    proto.write(InputMethodManagerServiceTraceProto.ELAPSED_REALTIME_NANOS,
-                            SystemClock.elapsedRealtimeNanos());
-                    proto.write(InputMethodManagerServiceTraceProto.WHERE, where);
-                    dumpDebug(proto,
-                            InputMethodManagerServiceTraceProto.INPUT_METHOD_MANAGER_SERVICE);
-                    proto.end(managerservice_token);
-                    break;
-                default:
-                    // Dump triggered by a source not recognised.
-                    return;
-            }
-            tracingInstance.addToBuffer(proto, source);
-        });
+        ProtoOutputStream proto = new ProtoOutputStream();
+        switch (source) {
+            case ImeTracing.IME_TRACING_FROM_CLIENT:
+                final long client_token = proto.start(InputMethodClientsTraceFileProto.ENTRY);
+                proto.write(InputMethodClientsTraceProto.ELAPSED_REALTIME_NANOS,
+                        SystemClock.elapsedRealtimeNanos());
+                proto.write(InputMethodClientsTraceProto.WHERE, where);
+                proto.write(InputMethodClientsTraceProto.CLIENT, protoDump);
+                proto.end(client_token);
+                break;
+            case ImeTracing.IME_TRACING_FROM_IMS:
+                final long service_token = proto.start(InputMethodServiceTraceFileProto.ENTRY);
+                proto.write(InputMethodServiceTraceProto.ELAPSED_REALTIME_NANOS,
+                        SystemClock.elapsedRealtimeNanos());
+                proto.write(InputMethodServiceTraceProto.WHERE, where);
+                proto.write(InputMethodServiceTraceProto.INPUT_METHOD_SERVICE, protoDump);
+                proto.end(service_token);
+                break;
+            case IME_TRACING_FROM_IMMS:
+                final long managerservice_token =
+                        proto.start(InputMethodManagerServiceTraceFileProto.ENTRY);
+                proto.write(InputMethodManagerServiceTraceProto.ELAPSED_REALTIME_NANOS,
+                        SystemClock.elapsedRealtimeNanos());
+                proto.write(InputMethodManagerServiceTraceProto.WHERE, where);
+                dumpDebug(proto,
+                        InputMethodManagerServiceTraceProto.INPUT_METHOD_MANAGER_SERVICE);
+                proto.end(managerservice_token);
+                break;
+            default:
+                // Dump triggered by a source not recognised.
+                return;
+        }
+        tracingInstance.addToBuffer(proto, source);
     }
 
     @BinderThread
     @Override
-    public void isImeTraceEnabled(IBooleanResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> ImeTracing.getInstance().isEnabled());
+    public boolean isImeTraceEnabled() {
+        return ImeTracing.getInstance().isEnabled();
     }
 
     @BinderThread
     @Override
-    public void startImeTrace(IVoidResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            ImeTracing.getInstance().startTrace(null /* printwriter */);
-            ArrayMap<IBinder, ClientState> clients;
-            synchronized (mMethodMap) {
-                clients = new ArrayMap<>(mClients);
-            }
-            for (ClientState state : clients.values()) {
-                if (state != null) {
-                    try {
-                        state.client.setImeTraceEnabled(true /* enabled */);
-                    } catch (RemoteException e) {
-                        Slog.e(TAG, "Error while trying to enable ime trace on client window", e);
-                    }
+    public void startImeTrace() {
+        ImeTracing.getInstance().startTrace(null /* printwriter */);
+        ArrayMap<IBinder, ClientState> clients;
+        synchronized (mMethodMap) {
+            clients = new ArrayMap<>(mClients);
+        }
+        for (ClientState state : clients.values()) {
+            if (state != null) {
+                try {
+                    state.client.setImeTraceEnabled(true /* enabled */);
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Error while trying to enable ime trace on client window", e);
                 }
             }
-        });
+        }
     }
 
     @BinderThread
     @Override
-    public void stopImeTrace(IVoidResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            ImeTracing.getInstance().stopTrace(null /* printwriter */);
-            ArrayMap<IBinder, ClientState> clients;
-            synchronized (mMethodMap) {
-                clients = new ArrayMap<>(mClients);
-            }
-            for (ClientState state : clients.values()) {
-                if (state != null) {
-                    try {
-                        state.client.setImeTraceEnabled(false /* enabled */);
-                    } catch (RemoteException e) {
-                        Slog.e(TAG, "Error while trying to disable ime trace on client window", e);
-                    }
+    public void stopImeTrace() {
+        ImeTracing.getInstance().stopTrace(null /* printwriter */);
+        ArrayMap<IBinder, ClientState> clients;
+        synchronized (mMethodMap) {
+            clients = new ArrayMap<>(mClients);
+        }
+        for (ClientState state : clients.values()) {
+            if (state != null) {
+                try {
+                    state.client.setImeTraceEnabled(false /* enabled */);
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Error while trying to disable ime trace on client window", e);
                 }
             }
-        });
+        }
     }
 
     private void dumpDebug(ProtoOutputStream proto, long fieldId) {
@@ -4888,20 +4816,16 @@
 
     /**
      * Gets the current subtype of this input method.
-     *
-     * @param resultCallback to callback the result.
      */
     @Override
-    public void getCurrentInputMethodSubtype(IInputMethodSubtypeResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, () -> {
-            synchronized (mMethodMap) {
-                // TODO: Make this work even for non-current users?
-                if (!calledFromValidUserLocked()) {
-                    return null;
-                }
-                return getCurrentInputMethodSubtypeLocked();
+    public InputMethodSubtype getCurrentInputMethodSubtype() {
+        synchronized (mMethodMap) {
+            // TODO: Make this work even for non-current users?
+            if (!calledFromValidUserLocked()) {
+                return null;
             }
-        });
+            return getCurrentInputMethodSubtypeLocked();
+        }
     }
 
     InputMethodSubtype getCurrentInputMethodSubtypeLocked() {
diff --git a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java
index c97338a..ce195e6 100644
--- a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java
@@ -72,17 +72,9 @@
 import com.android.internal.R;
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.inputmethod.CallbackUtils;
-import com.android.internal.inputmethod.IBooleanResultCallback;
-import com.android.internal.inputmethod.IInputBindResultResultCallback;
-import com.android.internal.inputmethod.IInputMethodInfoListResultCallback;
-import com.android.internal.inputmethod.IInputMethodSubtypeListResultCallback;
-import com.android.internal.inputmethod.IInputMethodSubtypeResultCallback;
-import com.android.internal.inputmethod.IIntResultCallback;
 import com.android.internal.inputmethod.IMultiClientInputMethod;
 import com.android.internal.inputmethod.IMultiClientInputMethodPrivilegedOperations;
 import com.android.internal.inputmethod.IMultiClientInputMethodSession;
-import com.android.internal.inputmethod.IVoidResultCallback;
 import com.android.internal.inputmethod.SoftInputShowHideReason;
 import com.android.internal.inputmethod.StartInputFlags;
 import com.android.internal.inputmethod.StartInputReason;
@@ -112,7 +104,6 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.WeakHashMap;
-import java.util.function.Supplier;
 
 /**
  * Actual implementation of multi-client InputMethodManagerService.
@@ -1467,49 +1458,41 @@
 
         @BinderThread
         @Override
-        public void getInputMethodList(@UserIdInt int userId,
-                IInputMethodInfoListResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback, () -> {
-                if (UserHandle.getCallingUserId() != userId) {
-                    mContext.enforceCallingPermission(INTERACT_ACROSS_USERS_FULL, null);
-                }
-                return mInputMethodInfoMap.getAsList(userId);
-            });
+        public List<InputMethodInfo> getInputMethodList(@UserIdInt int userId) {
+            if (UserHandle.getCallingUserId() != userId) {
+                mContext.enforceCallingPermission(INTERACT_ACROSS_USERS_FULL, null);
+            }
+            return mInputMethodInfoMap.getAsList(userId);
         }
 
         @BinderThread
         @Override
-        public void getEnabledInputMethodList(@UserIdInt int userId,
-                IInputMethodInfoListResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback, () -> {
-                if (UserHandle.getCallingUserId() != userId) {
-                    mContext.enforceCallingPermission(INTERACT_ACROSS_USERS_FULL, null);
-                }
-                return mInputMethodInfoMap.getAsList(userId);
-            });
+        public List<InputMethodInfo> getEnabledInputMethodList(@UserIdInt int userId) {
+            if (UserHandle.getCallingUserId() != userId) {
+                mContext.enforceCallingPermission(INTERACT_ACROSS_USERS_FULL, null);
+            }
+            return mInputMethodInfoMap.getAsList(userId);
         }
 
         @BinderThread
         @Override
-        public void getEnabledInputMethodSubtypeList(String imiId,
-                boolean allowsImplicitlySelectedSubtypes,
-                IInputMethodSubtypeListResultCallback resultCallback) {
+        public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(String imiId,
+                boolean allowsImplicitlySelectedSubtypes) {
             reportNotSupported();
-            CallbackUtils.onResult(resultCallback, Collections::emptyList);
+            return Collections.emptyList();
         }
 
         @BinderThread
         @Override
-        public void getLastInputMethodSubtype(IInputMethodSubtypeResultCallback resultCallback) {
+        public InputMethodSubtype getLastInputMethodSubtype() {
             reportNotSupported();
-            CallbackUtils.onResult(resultCallback, () -> null);
+            return null;
         }
 
         @BinderThread
         @Override
-        public void removeImeSurface(IVoidResultCallback resultCallback) {
+        public void removeImeSurface() {
             reportNotSupported();
-            CallbackUtils.onResult(resultCallback, () -> { });
         }
 
         @BinderThread
@@ -1520,11 +1503,10 @@
 
         @BinderThread
         @Override
-        public void showSoftInput(
+        public boolean showSoftInput(
                 IInputMethodClient client, IBinder token, int flags, ResultReceiver resultReceiver,
-                @SoftInputShowHideReason int reason, IBooleanResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback,
-                    () -> showSoftInputInternal(client, token, flags, resultReceiver));
+                @SoftInputShowHideReason int reason) {
+            return showSoftInputInternal(client, token, flags, resultReceiver);
         }
 
         @BinderThread
@@ -1575,13 +1557,10 @@
 
         @BinderThread
         @Override
-        public void hideSoftInput(
+        public boolean hideSoftInput(
                 IInputMethodClient client, IBinder windowToken, int flags,
-                ResultReceiver resultReceiver, @SoftInputShowHideReason int reason,
-                IBooleanResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback,
-                    () -> hideSoftInputInternal(client, windowToken, flags, resultReceiver));
-
+                ResultReceiver resultReceiver, @SoftInputShowHideReason int reason) {
+            return hideSoftInputInternal(client, windowToken, flags, resultReceiver);
         }
 
         @BinderThread
@@ -1628,34 +1607,7 @@
 
         @BinderThread
         @Override
-        public void reportWindowGainedFocusAsync(
-                boolean nextFocusHasConnection,
-                @Nullable IInputMethodClient client,
-                @Nullable IBinder windowToken,
-                @StartInputFlags int startInputFlags,
-                @SoftInputModeFlags int softInputMode,
-                int windowFlags,
-                int unverifiedTargetSdkVersion) {
-            final int startInputReason = nextFocusHasConnection
-                    ? StartInputReason.WINDOW_FOCUS_GAIN_REPORT_WITH_CONNECTION
-                    : StartInputReason.WINDOW_FOCUS_GAIN_REPORT_WITHOUT_CONNECTION;
-            try {
-                startInputOrWindowGainedFocusInternal(startInputReason, client, windowToken,
-                        startInputFlags, softInputMode, windowFlags, null /* editorInfo */,
-                        null /* inputContext */, 0 /* missingMethods */,
-                        unverifiedTargetSdkVersion);
-            } catch (Throwable t) {
-                if (client != null) {
-                    try {
-                        client.throwExceptionFromSystem(t.getMessage());
-                    } catch (RemoteException ignore) { }
-                }
-            }
-        }
-
-        @BinderThread
-        @Override
-        public void startInputOrWindowGainedFocus(
+        public InputBindResult startInputOrWindowGainedFocus(
                 @StartInputReason int startInputReason,
                 @Nullable IInputMethodClient client,
                 @Nullable IBinder windowToken,
@@ -1665,12 +1617,10 @@
                 @Nullable EditorInfo editorInfo,
                 @Nullable IInputContext inputContext,
                 @MissingMethodFlags int missingMethods,
-                int unverifiedTargetSdkVersion,
-                IInputBindResultResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback, (Supplier<InputBindResult>) () ->
-                    startInputOrWindowGainedFocusInternal(startInputReason, client, windowToken,
+                int unverifiedTargetSdkVersion) {
+            return startInputOrWindowGainedFocusInternal(startInputReason, client, windowToken,
                     startInputFlags, softInputMode, windowFlags, editorInfo, inputContext,
-                    missingMethods, unverifiedTargetSdkVersion));
+                    missingMethods, unverifiedTargetSdkVersion);
         }
 
         @BinderThread
@@ -1812,54 +1762,49 @@
         @BinderThread
         @Override
         public void showInputMethodPickerFromClient(IInputMethodClient client,
-                int auxiliarySubtypeMode, IVoidResultCallback resultCallback) {
+                int auxiliarySubtypeMode) {
             reportNotSupported();
-            CallbackUtils.onResult(resultCallback, () -> { });
         }
 
         @BinderThread
         @Override
         public void showInputMethodPickerFromSystem(IInputMethodClient client,
-                int auxiliarySubtypeMode, int displayId, IVoidResultCallback resultCallback) {
+                int auxiliarySubtypeMode, int displayId) {
             reportNotSupported();
-            CallbackUtils.onResult(resultCallback, () -> { });
         }
 
         @BinderThread
         @Override
         public void showInputMethodAndSubtypeEnablerFromClient(IInputMethodClient client,
-                String inputMethodId, IVoidResultCallback resultCallback) {
+                String inputMethodId) {
             reportNotSupported();
-            CallbackUtils.onResult(resultCallback, () -> { });
         }
 
         @BinderThread
         @Override
-        public void isInputMethodPickerShownForTest(IBooleanResultCallback resultCallback) {
+        public boolean isInputMethodPickerShownForTest() {
             reportNotSupported();
-            CallbackUtils.onResult(resultCallback, () -> false);
+            return false;
         }
 
         @BinderThread
         @Override
-        public void getCurrentInputMethodSubtype(IInputMethodSubtypeResultCallback resultCallback) {
+        public InputMethodSubtype getCurrentInputMethodSubtype() {
             reportNotSupported();
-            CallbackUtils.onResult(resultCallback, () -> null);
+            return null;
         }
 
         @BinderThread
         @Override
-        public void setAdditionalInputMethodSubtypes(String imiId, InputMethodSubtype[] subtypes,
-                IVoidResultCallback resultCallback) {
+        public void setAdditionalInputMethodSubtypes(String imiId, InputMethodSubtype[] subtypes) {
             reportNotSupported();
-            CallbackUtils.onResult(resultCallback, () -> { });
         }
 
         @BinderThread
         @Override
-        public void getInputMethodWindowVisibleHeight(IIntResultCallback resultCallback) {
+        public int getInputMethodWindowVisibleHeight() {
             reportNotSupported();
-            CallbackUtils.onResult(resultCallback, () -> 0);
+            return 0;
         }
 
         @BinderThread
@@ -1891,27 +1836,23 @@
 
         @BinderThread
         @Override
-        public void startProtoDump(byte[] clientProtoDump, int source, String where,
-                IVoidResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback, () -> { });
+        public void startProtoDump(byte[] clientProtoDump, int source, String where) {
         }
 
         @BinderThread
         @Override
-        public void isImeTraceEnabled(IBooleanResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback, () -> false);
+        public boolean isImeTraceEnabled() {
+            return false;
         }
 
         @BinderThread
         @Override
-        public void startImeTrace(IVoidResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback, () -> { });
+        public void startImeTrace() {
         }
 
         @BinderThread
         @Override
-        public void stopImeTrace(IVoidResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback, () -> { });
+        public void stopImeTrace() {
         }
     }
 }
diff --git a/services/core/java/com/android/server/locksettings/RebootEscrowManager.java b/services/core/java/com/android/server/locksettings/RebootEscrowManager.java
index b714c6d..4d525da 100644
--- a/services/core/java/com/android/server/locksettings/RebootEscrowManager.java
+++ b/services/core/java/com/android/server/locksettings/RebootEscrowManager.java
@@ -37,6 +37,7 @@
 import android.net.Network;
 import android.net.NetworkCapabilities;
 import android.os.Handler;
+import android.os.PowerManager;
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.os.UserManager;
@@ -119,6 +120,8 @@
      */
     private static final int DEFAULT_LOAD_ESCROW_DATA_RETRY_COUNT = 3;
     private static final int DEFAULT_LOAD_ESCROW_DATA_RETRY_INTERVAL_SECONDS = 30;
+    // 3 minutes. It's enough for the default 3 retries with 30 seconds interval
+    private static final int DEFAULT_WAKE_LOCK_TIMEOUT_MILLIS = 180_000;
 
     @IntDef(prefix = {"ERROR_"}, value = {
             ERROR_NONE,
@@ -187,6 +190,9 @@
 
     private final RebootEscrowKeyStoreManager mKeyStoreManager;
 
+    PowerManager.WakeLock mWakeLock;
+
+
     interface Callbacks {
         boolean isUserSecure(int userId);
 
@@ -279,6 +285,11 @@
             return mRebootEscrowProvider;
         }
 
+        PowerManager.WakeLock getWakeLock() {
+            final PowerManager pm = mContext.getSystemService(PowerManager.class);
+            return pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "RebootEscrowManager");
+        }
+
         public RebootEscrowProviderInterface getRebootEscrowProvider() {
             return mRebootEscrowProvider;
         }
@@ -365,6 +376,13 @@
             return;
         }
 
+        // Acquire the wake lock to make sure our scheduled task will run.
+        mWakeLock = mInjector.getWakeLock();
+        if (mWakeLock != null) {
+            mWakeLock.setReferenceCounted(false);
+            mWakeLock.acquire(DEFAULT_WAKE_LOCK_TIMEOUT_MILLIS);
+        }
+
         mInjector.post(retryHandler, () -> loadRebootEscrowDataWithRetry(
                 retryHandler, 0, users, rebootEscrowUsers));
     }
@@ -519,6 +537,10 @@
         // Clear the saved reboot escrow provider
         mInjector.clearRebootEscrowProvider();
         clearMetricsStorage();
+
+        if (mWakeLock != null) {
+            mWakeLock.release();
+        }
     }
 
     private RebootEscrowKey getAndClearRebootEscrowKey(SecretKey kk) throws IOException {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index addcd0f..1bd5e72 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -11073,8 +11073,6 @@
             String logcatMessage =
                     "Indirect notification activity start (trampoline) from " + packageName;
             if (blockTrampoline(uid)) {
-                // Post toast() call to mHandler to offload PM lookup from the activity start path
-                mHandler.post(() -> toast(packageName, uid));
                 Slog.e(TAG, logcatMessage + " blocked");
                 return false;
             } else {
@@ -11098,19 +11096,5 @@
             return tokens.contains(ALLOWLIST_TOKEN)
                     && !CompatChanges.isChangeEnabled(NOTIFICATION_TRAMPOLINE_BLOCK, uid);
         }
-
-        private void toast(String packageName, int uid) {
-            final CharSequence label;
-            try {
-                label = mPackageManagerClient.getApplicationLabel(
-                        mPackageManager.getApplicationInfo(packageName, 0,
-                                UserHandle.getUserId(uid)));
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Unexpected exception obtaining app label from PackageManager", e);
-                return;
-            }
-            mUiHandler.post(() -> Toast.makeText(getUiContext(),
-                    label + " launch blocked\ng.co/dev/trampolines", Toast.LENGTH_LONG).show());
-        }
     }
 }
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 30eccca..30ddbb6 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -20,7 +20,10 @@
 import static android.Manifest.permission.CAPTURE_AUDIO_HOTWORD;
 import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
 import static android.Manifest.permission.RECORD_AUDIO;
+import static android.Manifest.permission.UPDATE_APP_OPS_STATS;
 import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
+import static android.app.AppOpsManager.ATTRIBUTION_CHAIN_ID_NONE;
+import static android.app.AppOpsManager.ATTRIBUTION_FLAGS_NONE;
 import static android.app.AppOpsManager.MODE_ALLOWED;
 import static android.app.AppOpsManager.MODE_ERRORED;
 import static android.app.AppOpsManager.MODE_IGNORED;
@@ -1381,12 +1384,16 @@
 
         final AndroidPackage pkg = mPackageManagerInt.getPackage(packageName);
         final int callingUid = Binder.getCallingUid();
-        final int packageUid = UserHandle.getUid(userId, pkg.getUid());
+        if (mPackageManagerInt.filterAppAccess(packageName, callingUid, userId)) {
+            return false;
+        }
 
         if (!checkAutoRevokeAccess(pkg, callingUid)) {
             return false;
         }
 
+        final int packageUid = UserHandle.getUid(userId, pkg.getUid());
+
         final long identity = Binder.clearCallingIdentity();
         try {
             return mAppOpsManager.checkOpNoThrow(
@@ -5601,13 +5608,14 @@
         @PermissionCheckerManager.PermissionResult
         public int checkOp(int op, AttributionSourceState attributionSource,
                 String message, boolean forDataDelivery, boolean startDataDelivery) {
-            int result = checkOp(mContext, op, new AttributionSource(attributionSource), message,
-                    forDataDelivery, startDataDelivery);
+            int result = checkOp(mContext, op, mPermissionManagerServiceInternal,
+                    new AttributionSource(attributionSource), message, forDataDelivery,
+                    startDataDelivery);
             if (result != PermissionChecker.PERMISSION_GRANTED && startDataDelivery) {
                 // Finish any started op if some step in the attribution chain failed.
                 finishDataDelivery(op, attributionSource, /*fromDatasource*/ false);
             }
-            return  result;
+            return result;
         }
 
         @PermissionCheckerManager.PermissionResult
@@ -5731,8 +5739,14 @@
             final int op = AppOpsManager.permissionToOpCode(permission);
             final int attributionChainId =
                     getAttributionChainId(startDataDelivery, attributionSource);
+            final boolean hasChain = attributionChainId != ATTRIBUTION_CHAIN_ID_NONE;
             AttributionSource current = attributionSource;
             AttributionSource next = null;
+            // We consider the chain trusted if the start node has UPDATE_APP_OPS_STATS, and
+            // every attributionSource in the chain is registered with the system.
+            final boolean isChainStartTrusted = !hasChain || checkPermission(context,
+                    permissionManagerServiceInt, UPDATE_APP_OPS_STATS, current.getUid(),
+                    current.getRenouncedPermissions());
 
             while (true) {
                 final boolean skipCurrentChecks = (fromDatasource || next != null);
@@ -5777,13 +5791,17 @@
                         && current.equals(attributionSource)
                         && next != null && next.getNext() == null);
                 final boolean selfAccess = singleReceiverFromDatasource || next == null;
+                final boolean isLinkTrusted = isChainStartTrusted
+                        && (current.isTrusted(context) || current.equals(attributionSource))
+                        && (next == null || next.isTrusted(context));
 
-                final int proxyAttributionFlags = (!skipCurrentChecks)
+                final int proxyAttributionFlags = (!skipCurrentChecks && hasChain)
                         ? resolveProxyAttributionFlags(attributionSource, current, fromDatasource,
-                                startDataDelivery, selfAccess)
-                        : AppOpsManager.ATTRIBUTION_FLAGS_NONE;
-                final int proxiedAttributionFlags = resolveProxiedAttributionFlags(
-                        attributionSource, next, fromDatasource, startDataDelivery, selfAccess);
+                                startDataDelivery, selfAccess, isLinkTrusted)
+                        : ATTRIBUTION_FLAGS_NONE;
+                final int proxiedAttributionFlags = hasChain ? resolveProxiedAttributionFlags(
+                        attributionSource, next, fromDatasource, startDataDelivery, selfAccess,
+                        isLinkTrusted) : ATTRIBUTION_FLAGS_NONE;
 
                 final int opMode = performOpTransaction(context, op, current, message,
                         forDataDelivery, startDataDelivery, skipCurrentChecks, selfAccess,
@@ -5838,48 +5856,52 @@
         private static @AttributionFlags int resolveProxyAttributionFlags(
                 @NonNull AttributionSource attributionChain,
                 @NonNull AttributionSource current, boolean fromDatasource,
-                boolean startDataDelivery, boolean selfAccess) {
+                boolean startDataDelivery, boolean selfAccess, boolean isTrusted) {
             return resolveAttributionFlags(attributionChain, current, fromDatasource,
-                    startDataDelivery, selfAccess, /*flagsForProxy*/ true);
+                    startDataDelivery, selfAccess, isTrusted, /*flagsForProxy*/ true);
         }
 
         private static @AttributionFlags int resolveProxiedAttributionFlags(
                 @NonNull AttributionSource attributionChain,
                 @NonNull AttributionSource current, boolean fromDatasource,
-                boolean startDataDelivery, boolean selfAccess) {
+                boolean startDataDelivery, boolean selfAccess, boolean isTrusted) {
             return resolveAttributionFlags(attributionChain, current, fromDatasource,
-                    startDataDelivery, selfAccess, /*flagsForProxy*/ false);
+                    startDataDelivery, selfAccess, isTrusted, /*flagsForProxy*/ false);
         }
 
         private static @AttributionFlags int resolveAttributionFlags(
                 @NonNull AttributionSource attributionChain,
                 @NonNull AttributionSource current, boolean fromDatasource,
-                boolean startDataDelivery, boolean selfAccess, boolean flagsForProxy) {
+                boolean startDataDelivery, boolean selfAccess, boolean isTrusted,
+                boolean flagsForProxy) {
             if (current == null || !startDataDelivery) {
                 return AppOpsManager.ATTRIBUTION_FLAGS_NONE;
             }
+            int trustedFlag = isTrusted
+                    ? AppOpsManager.ATTRIBUTION_FLAG_TRUSTED : AppOpsManager.ATTRIBUTION_FLAGS_NONE;
             if (flagsForProxy) {
                 if (selfAccess) {
-                    return AppOpsManager.ATTRIBUTION_FLAG_ACCESSOR;
+                    return trustedFlag | AppOpsManager.ATTRIBUTION_FLAG_ACCESSOR;
                 } else if (!fromDatasource && current.equals(attributionChain)) {
-                    return AppOpsManager.ATTRIBUTION_FLAG_ACCESSOR;
+                    return trustedFlag | AppOpsManager.ATTRIBUTION_FLAG_ACCESSOR;
                 }
             } else {
                 if (selfAccess) {
-                    return AppOpsManager.ATTRIBUTION_FLAG_RECEIVER;
+                    return trustedFlag | AppOpsManager.ATTRIBUTION_FLAG_RECEIVER;
                 } else if (fromDatasource && current.equals(attributionChain.getNext())) {
-                    return AppOpsManager.ATTRIBUTION_FLAG_ACCESSOR;
+                    return trustedFlag | AppOpsManager.ATTRIBUTION_FLAG_ACCESSOR;
                 } else if (current.getNext() == null) {
-                    return AppOpsManager.ATTRIBUTION_FLAG_RECEIVER;
+                    return trustedFlag | AppOpsManager.ATTRIBUTION_FLAG_RECEIVER;
                 }
             }
             if (fromDatasource && current.equals(attributionChain)) {
                 return AppOpsManager.ATTRIBUTION_FLAGS_NONE;
             }
-            return AppOpsManager.ATTRIBUTION_FLAG_INTERMEDIARY;
+            return trustedFlag | AppOpsManager.ATTRIBUTION_FLAG_INTERMEDIARY;
         }
 
         private static int checkOp(@NonNull Context context, @NonNull int op,
+                @NonNull PermissionManagerServiceInternal permissionManagerServiceInt,
                 @NonNull AttributionSource attributionSource, @Nullable String message,
                 boolean forDataDelivery, boolean startDataDelivery) {
             if (op < 0 || attributionSource.getPackageName() == null) {
@@ -5888,10 +5910,17 @@
 
             final int attributionChainId =
                     getAttributionChainId(startDataDelivery, attributionSource);
+            final boolean hasChain = attributionChainId != ATTRIBUTION_CHAIN_ID_NONE;
 
             AttributionSource current = attributionSource;
             AttributionSource next = null;
 
+            // We consider the chain trusted if the start node has UPDATE_APP_OPS_STATS, and
+            // every attributionSource in the chain is registered with the system.
+            final boolean isChainStartTrusted = !hasChain || checkPermission(context,
+                    permissionManagerServiceInt, UPDATE_APP_OPS_STATS, current.getUid(),
+                    current.getRenouncedPermissions());
+
             while (true) {
                 final boolean skipCurrentChecks = (next != null);
                 next = current.getNext();
@@ -5904,14 +5933,17 @@
 
                 // The access is for oneself if this is the single attribution source in the chain.
                 final boolean selfAccess = (next == null);
+                final boolean isLinkTrusted = isChainStartTrusted
+                        && (current.isTrusted(context) || current.equals(attributionSource))
+                        && (next == null || next.isTrusted(context));
 
-                final int proxyAttributionFlags = (!skipCurrentChecks)
+                final int proxyAttributionFlags = (!skipCurrentChecks && hasChain)
                         ? resolveProxyAttributionFlags(attributionSource, current,
-                                /*fromDatasource*/ false, startDataDelivery, selfAccess)
-                        : AppOpsManager.ATTRIBUTION_FLAGS_NONE;
-                final int proxiedAttributionFlags = resolveProxiedAttributionFlags(
+                                /*fromDatasource*/ false, startDataDelivery, selfAccess,
+                        isLinkTrusted) : ATTRIBUTION_FLAGS_NONE;
+                final int proxiedAttributionFlags = hasChain ? resolveProxiedAttributionFlags(
                         attributionSource, next, /*fromDatasource*/ false, startDataDelivery,
-                        selfAccess);
+                        selfAccess, isLinkTrusted) : ATTRIBUTION_FLAGS_NONE;
 
                 final int opMode = performOpTransaction(context, op, current, message,
                         forDataDelivery, startDataDelivery, skipCurrentChecks, selfAccess,
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 fc7628c..6014d0c 100644
--- a/services/core/java/com/android/server/power/hint/HintManagerService.java
+++ b/services/core/java/com/android/server/power/hint/HintManagerService.java
@@ -17,6 +17,7 @@
 package com.android.server.power.hint;
 
 import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
 import android.app.IUidObserver;
 import android.content.Context;
 import android.os.Binder;
@@ -33,12 +34,16 @@
 import com.android.internal.util.DumpUtils;
 import com.android.internal.util.Preconditions;
 import com.android.server.FgThread;
+import com.android.server.LocalServices;
 import com.android.server.SystemService;
 import com.android.server.utils.Slogf;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
 
 /** An hint service implementation that runs in System Server process. */
 public final class HintManagerService extends SystemService {
@@ -56,6 +61,8 @@
 
     private final NativeWrapper mNativeWrapper;
 
+    private final ActivityManagerInternal mAmInternal;
+
     @VisibleForTesting final IHintManager.Stub mService = new BinderService();
 
     public HintManagerService(Context context) {
@@ -70,6 +77,8 @@
         mNativeWrapper.halInit();
         mHintSessionPreferredRate = mNativeWrapper.halGetHintSessionPreferredRate();
         mUidObserver = new UidObserver();
+        mAmInternal = Objects.requireNonNull(
+                LocalServices.getService(ActivityManagerInternal.class));
     }
 
     @VisibleForTesting
@@ -85,7 +94,7 @@
 
     @Override
     public void onStart() {
-        publishBinderService(Context.PERFORMANCE_HINT_SERVICE, mService, /* allowIsolated= */ true);
+        publishBinderService(Context.PERFORMANCE_HINT_SERVICE, mService);
     }
 
     @Override
@@ -243,12 +252,30 @@
         return mService;
     }
 
-    private boolean checkTidValid(int tgid, int [] tids) {
-        // Make sure all tids belongs to the same process.
+    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 = mAmInternal.getIsolatedProcesses(uid);
+        if (eligiblePids == null) {
+            eligiblePids = new ArrayList<>();
+        }
+        eligiblePids.add(tgid);
+
         for (int threadId : tids) {
-            if (!Process.isThreadInProcess(tgid, threadId)) {
-                return false;
+            final String[] procStatusKeys = new String[] {
+                    "Uid:",
+                    "Tgid:"
+            };
+            long[] output = new long[procStatusKeys.length];
+            Process.readProcLines("/proc/" + threadId + "/status", procStatusKeys, output);
+            int uidOfThreadId = (int) output[0];
+            int pidOfThreadId = (int) output[1];
+
+            // use PID check for isolated processes, use UID check for non-isolated processes.
+            if (eligiblePids.contains(pidOfThreadId) || uidOfThreadId == uid) {
+                continue;
             }
+            return false;
         }
         return true;
     }
@@ -264,27 +291,25 @@
             Preconditions.checkArgument(tids.length != 0, "tids should"
                     + " not be empty.");
 
-            int uid = Binder.getCallingUid();
-            int tid = Binder.getCallingPid();
-            int pid = Process.getThreadGroupLeader(tid);
-
+            final int callingUid = Binder.getCallingUid();
+            final int callingTgid = Process.getThreadGroupLeader(Binder.getCallingPid());
             final long identity = Binder.clearCallingIdentity();
             try {
-                if (!checkTidValid(pid, tids)) {
-                    throw new SecurityException("Some tid doesn't belong to the process");
+                if (!checkTidValid(callingUid, callingTgid, tids)) {
+                    throw new SecurityException("Some tid doesn't belong to the application");
                 }
 
-                long halSessionPtr = mNativeWrapper.halCreateHintSession(pid, uid, tids,
-                        durationNanos);
+                long halSessionPtr = mNativeWrapper.halCreateHintSession(callingTgid, callingUid,
+                        tids, durationNanos);
                 if (halSessionPtr == 0) return null;
 
-                AppHintSession hs = new AppHintSession(uid, pid, tids, token,
+                AppHintSession hs = new AppHintSession(callingUid, callingTgid, tids, token,
                         halSessionPtr, durationNanos);
                 synchronized (mLock) {
-                    ArrayMap<IBinder, AppHintSession> tokenMap = mActiveSessions.get(uid);
+                    ArrayMap<IBinder, AppHintSession> tokenMap = mActiveSessions.get(callingUid);
                     if (tokenMap == null) {
                         tokenMap = new ArrayMap<>(1);
-                        mActiveSessions.put(uid, tokenMap);
+                        mActiveSessions.put(callingUid, tokenMap);
                     }
                     tokenMap.put(token, hs);
                     return hs;
diff --git a/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java b/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java
index 264ef87..f7950aa 100644
--- a/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java
+++ b/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java
@@ -29,6 +29,7 @@
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.permission.PermissionManager;
 import android.speech.IRecognitionListener;
 import android.speech.IRecognitionService;
 import android.speech.IRecognitionServiceManagerCallback;
@@ -139,6 +140,10 @@
                                 @NonNull AttributionSource attributionSource)
                                         throws RemoteException {
                             attributionSource.enforceCallingUid();
+                            if (!attributionSource.isTrusted(mMaster.getContext())) {
+                                mMaster.getContext().getSystemService(PermissionManager.class)
+                                        .registerAttributionSource(attributionSource);
+                            }
                             service.startListening(recognizerIntent, listener, attributionSource);
                         }
 
diff --git a/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java b/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java
index ee7bf5f..7ddd135 100644
--- a/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java
+++ b/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java
@@ -409,7 +409,7 @@
     }
 
     private void reevaluateNetworks() {
-        if (mRouteSelectionCallback == null) {
+        if (mIsQuitting || mRouteSelectionCallback == null) {
             return; // UnderlyingNetworkTracker has quit.
         }
 
@@ -460,6 +460,10 @@
         private final Map<Network, UnderlyingNetworkRecord.Builder>
                 mUnderlyingNetworkRecordBuilders = new ArrayMap<>();
 
+        UnderlyingNetworkListener() {
+            super(NetworkCallback.FLAG_INCLUDE_LOCATION_INFO);
+        }
+
         private TreeSet<UnderlyingNetworkRecord> getSortedUnderlyingNetworks() {
             TreeSet<UnderlyingNetworkRecord> sorted =
                     new TreeSet<>(
diff --git a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
index c6f3f73..3842769 100644
--- a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
+++ b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
@@ -75,6 +75,7 @@
 import android.os.ParcelUuid;
 import android.os.PowerManager;
 import android.os.PowerManager.WakeLock;
+import android.os.Process;
 import android.os.SystemClock;
 import android.util.ArraySet;
 import android.util.Slog;
@@ -97,6 +98,7 @@
 import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
@@ -937,6 +939,14 @@
 
     private WakeupMessage createScheduledAlarm(
             @NonNull String cmdName, Message delayedMessage, long delay) {
+        final Handler handler = getHandler();
+        if (handler == null) {
+            logWarn(
+                    "Attempted to schedule alarm after StateMachine has quit",
+                    new IllegalStateException());
+            return null; // StateMachine has already quit.
+        }
+
         // WakeupMessage uses Handler#dispatchMessage() to immediately handle the specified Runnable
         // at the scheduled time. dispatchMessage() immediately executes and there may be queued
         // events that resolve the scheduled alarm pending in the queue. So, use the Runnable to
@@ -945,7 +955,7 @@
         final WakeupMessage alarm =
                 mDeps.newWakeupMessage(
                         mVcnContext,
-                        getHandler(),
+                        handler,
                         cmdName,
                         () -> sendMessageAndAcquireWakeLock(delayedMessage));
         alarm.schedule(mDeps.getElapsedRealTime() + delay);
@@ -1572,6 +1582,9 @@
 
             agent.sendNetworkCapabilities(caps);
             agent.sendLinkProperties(lp);
+
+            agent.setUnderlyingNetworks(
+                    mUnderlying == null ? null : Collections.singletonList(mUnderlying.network));
         }
 
         protected VcnNetworkAgent buildNetworkAgent(
@@ -1613,6 +1626,10 @@
                                 teardownAsynchronously();
                             } /* networkUnwantedCallback */,
                             (status) -> {
+                                if (mIsQuitting) {
+                                    return; // Ignore; VcnGatewayConnection quitting or already quit
+                                }
+
                                 switch (status) {
                                     case NetworkAgent.VALIDATION_STATUS_VALID:
                                         clearFailedAttemptCounterAndSafeModeAlarm();
@@ -1632,6 +1649,8 @@
                             } /* validationStatusCallback */);
 
             agent.register();
+            agent.setUnderlyingNetworks(
+                    mUnderlying == null ? null : Collections.singletonList(mUnderlying.network));
             agent.markConnected();
 
             return agent;
@@ -1972,7 +1991,7 @@
             final int[] underlyingAdminUids = underlyingCaps.getAdministratorUids();
             Arrays.sort(underlyingAdminUids); // Sort to allow contains check below.
 
-            final int[] adminUids;
+            int[] adminUids;
             if (underlyingCaps.getOwnerUid() > 0 // No owner UID specified
                     && 0 > Arrays.binarySearch(// Owner UID not found in admin UID list.
                             underlyingAdminUids, underlyingCaps.getOwnerUid())) {
@@ -1982,6 +2001,11 @@
             } else {
                 adminUids = underlyingAdminUids;
             }
+
+            // Set owner & administrator UID
+            builder.setOwnerUid(Process.myUid());
+            adminUids = Arrays.copyOf(adminUids, adminUids.length + 1);
+            adminUids[adminUids.length - 1] = Process.myUid();
             builder.setAdministratorUids(adminUids);
 
             builder.setLinkUpstreamBandwidthKbps(underlyingCaps.getLinkUpstreamBandwidthKbps());
@@ -2170,6 +2194,16 @@
         LOCAL_LOG.log(getLogPrefix() + "DBG: " + msg + tr);
     }
 
+    private void logWarn(String msg) {
+        Slog.w(TAG, getLogPrefix() + msg);
+        LOCAL_LOG.log(getLogPrefix() + "WARN: " + msg);
+    }
+
+    private void logWarn(String msg, Throwable tr) {
+        Slog.w(TAG, getLogPrefix() + msg, tr);
+        LOCAL_LOG.log(getLogPrefix() + "WARN: " + msg + tr);
+    }
+
     private void logErr(String msg) {
         Slog.e(TAG, getLogPrefix() + msg);
         LOCAL_LOG.log(getLogPrefix() + "ERR: " + msg);
@@ -2547,6 +2581,11 @@
             mImpl.sendLinkProperties(lp);
         }
 
+        /** Sends new NetworkCapabilities for the underlying NetworkAgent */
+        public void setUnderlyingNetworks(@Nullable List<Network> underlyingNetworks) {
+            mImpl.setUnderlyingNetworks(underlyingNetworks);
+        }
+
         /** Retrieves the Network for the underlying NetworkAgent */
         @Nullable
         public Network getNetwork() {
diff --git a/services/core/java/com/android/server/vibrator/VibrationSettings.java b/services/core/java/com/android/server/vibrator/VibrationSettings.java
index c0a1d92..4f48442 100644
--- a/services/core/java/com/android/server/vibrator/VibrationSettings.java
+++ b/services/core/java/com/android/server/vibrator/VibrationSettings.java
@@ -99,16 +99,24 @@
     private boolean mLowPowerMode;
 
     VibrationSettings(Context context, Handler handler) {
+        this(context, handler,
+                context.getResources().getInteger(
+                        com.android.internal.R.integer.config_vibrationWaveformRampDownDuration),
+                context.getResources().getInteger(
+                        com.android.internal.R.integer.config_vibrationWaveformRampStepDuration));
+    }
+
+    @VisibleForTesting
+    VibrationSettings(Context context, Handler handler, int rampDownDuration,
+            int rampStepDuration) {
         mContext = context;
         mSettingObserver = new SettingsObserver(handler);
         mUidObserver = new UidObserver();
         mUserReceiver = new UserObserver();
 
         // TODO(b/191150049): move these to vibrator static config file
-        mRampStepDuration = context.getResources().getInteger(
-                com.android.internal.R.integer.config_vibrationWaveformRampStepDuration);
-        mRampDownDuration = context.getResources().getInteger(
-                com.android.internal.R.integer.config_vibrationWaveformRampDownDuration);
+        mRampDownDuration = rampDownDuration;
+        mRampStepDuration = rampStepDuration;
 
         VibrationEffect clickEffect = createEffectFromResource(
                 com.android.internal.R.array.config_virtualKeyVibePattern);
diff --git a/services/core/java/com/android/server/vibrator/VibrationThread.java b/services/core/java/com/android/server/vibrator/VibrationThread.java
index 45d5111..0386372 100644
--- a/services/core/java/com/android/server/vibrator/VibrationThread.java
+++ b/services/core/java/com/android/server/vibrator/VibrationThread.java
@@ -61,6 +61,9 @@
      */
     private static final long CALLBACKS_EXTRA_TIMEOUT = 100;
 
+    /** Threshold to prevent the ramp off steps from trying to set extremely low amplitudes. */
+    private static final float RAMP_OFF_AMPLITUDE_MIN = 1e-3f;
+
     /** Fixed large duration used to note repeating vibrations to {@link IBatteryStats}. */
     private static final long BATTERY_STATS_REPEATING_VIBRATION_DURATION = 5_000;
 
@@ -87,26 +90,33 @@
         /** Callback triggered to cancel a prepared synced vibration. */
         void cancelSyncedVibration();
 
-        /** Callback triggered when vibration thread is complete. */
-        void onVibrationEnded(long vibrationId, Vibration.Status status);
+        /** Callback triggered when the vibration is complete. */
+        void onVibrationCompleted(long vibrationId, Vibration.Status status);
+
+        /** Callback triggered when the vibrators are released after the thread is complete. */
+        void onVibratorsReleased();
     }
 
     private final Object mLock = new Object();
     private final WorkSource mWorkSource = new WorkSource();
     private final PowerManager.WakeLock mWakeLock;
     private final IBatteryStats mBatteryStatsService;
+    private final VibrationSettings mVibrationSettings;
     private final DeviceVibrationEffectAdapter mDeviceEffectAdapter;
     private final Vibration mVibration;
     private final VibrationCallbacks mCallbacks;
     private final SparseArray<VibratorController> mVibrators = new SparseArray<>();
     private final StepQueue mStepQueue = new StepQueue();
 
+    private volatile boolean mStop;
     private volatile boolean mForceStop;
 
-    VibrationThread(Vibration vib, DeviceVibrationEffectAdapter effectAdapter,
+    VibrationThread(Vibration vib, VibrationSettings vibrationSettings,
+            DeviceVibrationEffectAdapter effectAdapter,
             SparseArray<VibratorController> availableVibrators, PowerManager.WakeLock wakeLock,
             IBatteryStats batteryStatsService, VibrationCallbacks callbacks) {
         mVibration = vib;
+        mVibrationSettings = vibrationSettings;
         mDeviceEffectAdapter = effectAdapter;
         mCallbacks = callbacks;
         mWakeLock = wakeLock;
@@ -145,8 +155,8 @@
         mWakeLock.acquire();
         try {
             mVibration.token.linkToDeath(this, 0);
-            Vibration.Status status = playVibration();
-            mCallbacks.onVibrationEnded(mVibration.id, status);
+            playVibration();
+            mCallbacks.onVibratorsReleased();
         } catch (RemoteException e) {
             Slog.e(TAG, "Error linking vibration to token death", e);
         } finally {
@@ -155,9 +165,13 @@
         }
     }
 
-    /** Cancel current vibration and shuts down the thread gracefully. */
+    /** Cancel current vibration and ramp down the vibrators gracefully. */
     public void cancel() {
-        mForceStop = true;
+        if (mStop) {
+            // Already cancelled, running clean-up steps.
+            return;
+        }
+        mStop = true;
         synchronized (mLock) {
             if (DEBUG) {
                 Slog.d(TAG, "Vibration cancelled");
@@ -166,6 +180,21 @@
         }
     }
 
+    /** Cancel current vibration and shuts off the vibrators immediately. */
+    public void cancelImmediately() {
+        if (mForceStop) {
+            // Already forced the thread to stop, wait for it to finish.
+            return;
+        }
+        mStop = mForceStop = true;
+        synchronized (mLock) {
+            if (DEBUG) {
+                Slog.d(TAG, "Vibration cancelled immediately");
+            }
+            mLock.notify();
+        }
+    }
+
     /** Notify current vibration that a synced step has completed. */
     public void syncedVibrationComplete() {
         synchronized (mLock) {
@@ -190,17 +219,18 @@
         }
     }
 
-    private Vibration.Status playVibration() {
+    private void playVibration() {
         Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "playVibration");
         try {
-            CombinedVibration.Sequential effect = toSequential(mVibration.getEffect());
-            mStepQueue.offer(new StartVibrateStep(effect));
+            CombinedVibration.Sequential sequentialEffect = toSequential(mVibration.getEffect());
+            final int sequentialEffectSize = sequentialEffect.getEffects().size();
+            mStepQueue.offer(new StartVibrateStep(sequentialEffect));
 
-            int stepsPlayed = 0;
+            Vibration.Status status = null;
             while (!mStepQueue.isEmpty()) {
                 long waitTime = mStepQueue.calculateWaitTime();
                 if (waitTime <= 0) {
-                    stepsPlayed += mStepQueue.consumeNext();
+                    mStepQueue.consumeNext();
                 } else {
                     synchronized (mLock) {
                         try {
@@ -209,17 +239,33 @@
                         }
                     }
                 }
+                Vibration.Status currentStatus = mStop ? Vibration.Status.CANCELLED
+                        : mStepQueue.calculateVibrationStatus(sequentialEffectSize);
+                if (status == null && currentStatus != Vibration.Status.RUNNING) {
+                    // First time vibration stopped running, start clean-up tasks and notify
+                    // callback immediately.
+                    status = currentStatus;
+                    mCallbacks.onVibrationCompleted(mVibration.id, status);
+                    if (status == Vibration.Status.CANCELLED) {
+                        mStepQueue.cancel();
+                    }
+                }
                 if (mForceStop) {
-                    mStepQueue.cancel();
-                    return Vibration.Status.CANCELLED;
+                    // Cancel every step and stop playing them right away, even clean-up steps.
+                    mStepQueue.cancelImmediately();
+                    break;
                 }
             }
 
-            // Some effects might be ignored because the specified vibrator don't exist or doesn't
-            // support the effect. We only report ignored here if nothing was played besides the
-            // StartVibrateStep (which means every attempt to turn on the vibrator was ignored).
-            return stepsPlayed > effect.getEffects().size()
-                    ? Vibration.Status.FINISHED : Vibration.Status.IGNORED_UNSUPPORTED;
+            if (status == null) {
+                status = mStepQueue.calculateVibrationStatus(sequentialEffectSize);
+                if (status == Vibration.Status.RUNNING) {
+                    Slog.w(TAG, "Something went wrong, step queue completed but vibration status"
+                            + " is still RUNNING for vibration " + mVibration.id);
+                    status = Vibration.Status.FINISHED;
+                }
+                mCallbacks.onVibrationCompleted(mVibration.id, status);
+            }
         } finally {
             Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
         }
@@ -260,12 +306,9 @@
             segmentIndex = effect.getRepeatIndex();
         }
         if (segmentIndex < 0) {
-            if (vibratorOffTimeout > SystemClock.uptimeMillis()) {
-                // No more segments to play, last step is to wait for the vibrator to complete
-                return new OffStep(vibratorOffTimeout, controller);
-            } else {
-                return null;
-            }
+            // No more segments to play, last step is to complete the vibration on this vibrator.
+            return new CompleteStep(startTime, /* cancelled= */ false, controller,
+                    vibratorOffTimeout);
         }
 
         VibrationEffectSegment segment = effect.getSegments().get(segmentIndex);
@@ -299,8 +342,18 @@
         @GuardedBy("mLock")
         private final Queue<Step> mPendingOnVibratorCompleteSteps = new LinkedList<>();
 
+        @GuardedBy("mLock")
+        private int mPendingVibrateSteps;
+        @GuardedBy("mLock")
+        private int mConsumedStartVibrateSteps;
+        @GuardedBy("mLock")
+        private int mSuccessfulVibratorOnSteps;
+
         public void offer(@NonNull Step step) {
             synchronized (mLock) {
+                if (!step.isCleanUp()) {
+                    mPendingVibrateSteps++;
+                }
                 mNextSteps.offer(step);
             }
         }
@@ -311,6 +364,24 @@
             }
         }
 
+        /**
+         * Calculate the {@link Vibration.Status} based on the current queue state and the expected
+         * number of {@link StartVibrateStep} to be played.
+         */
+        public Vibration.Status calculateVibrationStatus(int expectedStartVibrateSteps) {
+            synchronized (mLock) {
+                if (mPendingVibrateSteps > 0
+                        || mConsumedStartVibrateSteps < expectedStartVibrateSteps) {
+                    return Vibration.Status.RUNNING;
+                }
+                if (mSuccessfulVibratorOnSteps > 0) {
+                    return Vibration.Status.FINISHED;
+                }
+                // If no step was able to turn the vibrator ON successfully.
+                return Vibration.Status.IGNORED_UNSUPPORTED;
+            }
+        }
+
         /** Returns the time in millis to wait before calling {@link #consumeNext()}. */
         public long calculateWaitTime() {
             Step nextStep;
@@ -330,18 +401,28 @@
          *
          * @return the number of steps played
          */
-        public int consumeNext() {
+        public void consumeNext() {
             Step nextStep = pollNext();
             if (nextStep != null) {
                 // This might turn on the vibrator and have a HAL latency. Execute this outside any
                 // lock to avoid blocking other interactions with the thread.
                 List<Step> nextSteps = nextStep.play();
                 synchronized (mLock) {
+                    if (nextStep.getVibratorOnDuration() > 0) {
+                        mSuccessfulVibratorOnSteps++;
+                    }
+                    if (nextStep instanceof StartVibrateStep) {
+                        mConsumedStartVibrateSteps++;
+                    }
+                    if (!nextStep.isCleanUp()) {
+                        mPendingVibrateSteps--;
+                    }
+                    for (int i = 0; i < nextSteps.size(); i++) {
+                        mPendingVibrateSteps += nextSteps.get(i).isCleanUp() ? 0 : 1;
+                    }
                     mNextSteps.addAll(nextSteps);
                 }
-                return 1;
             }
-            return 0;
         }
 
         /**
@@ -368,16 +449,38 @@
         }
 
         /**
-         * Cancel the current queue, clearing all remaining steps.
+         * Cancel the current queue, replacing all remaining steps with respective clean-up steps.
          *
-         * <p>This will remove and trigger {@link Step#cancel()} in all steps, in order.
+         * <p>This will remove all steps and replace them with respective
+         * {@link Step#cancel()}.
          */
         public void cancel() {
+            List<Step> cleanUpSteps = new ArrayList<>();
+            Step step;
+            while ((step = pollNext()) != null) {
+                cleanUpSteps.addAll(step.cancel());
+            }
+            synchronized (mLock) {
+                // All steps generated by Step.cancel() should be clean-up steps.
+                mPendingVibrateSteps = 0;
+                mNextSteps.addAll(cleanUpSteps);
+            }
+        }
+
+        /**
+         * Cancel the current queue immediately, clearing all remaining steps and skipping clean-up.
+         *
+         * <p>This will remove and trigger {@link Step#cancelImmediately()} in all steps, in order.
+         */
+        public void cancelImmediately() {
             Step step;
             while ((step = pollNext()) != null) {
                 // This might turn off the vibrator and have a HAL latency. Execute this outside
                 // any lock to avoid blocking other interactions with the thread.
-                step.cancel();
+                step.cancelImmediately();
+            }
+            synchronized (mLock) {
+                mPendingVibrateSteps = 0;
             }
         }
 
@@ -406,12 +509,37 @@
             this.startTime = startTime;
         }
 
+        /**
+         * Returns true if this step is a clean up step and not part of a {@link VibrationEffect} or
+         * {@link CombinedVibration}.
+         */
+        public boolean isCleanUp() {
+            return false;
+        }
+
         /** Play this step, returning a (possibly empty) list of next steps. */
         @NonNull
         public abstract List<Step> play();
 
-        /** Cancel this pending step. */
-        public void cancel() {
+        /**
+         * Cancel this pending step and return a (possibly empty) list of clean-up steps that should
+         * be played to gracefully cancel this step.
+         */
+        @NonNull
+        public abstract List<Step> cancel();
+
+        /** Cancel this pending step immediately, skipping any clean-up. */
+        public abstract void cancelImmediately();
+
+        /**
+         * Return the duration the vibrator was turned on when this step was played.
+         *
+         * @return A positive duration that the vibrator was turned on for by this step;
+         * Zero if the segment is not supported, the step was not played yet or vibrator was never
+         * turned on by this step; A negative value if the vibrator call has failed.
+         */
+        public long getVibratorOnDuration() {
+            return 0;
         }
 
         /**
@@ -452,6 +580,8 @@
         public final CombinedVibration.Sequential sequentialEffect;
         public final int currentIndex;
 
+        private long mVibratorsOnMaxDuration;
+
         StartVibrateStep(CombinedVibration.Sequential effect) {
             this(SystemClock.uptimeMillis() + effect.getDelays().get(0), effect, /* index= */ 0);
         }
@@ -463,10 +593,15 @@
         }
 
         @Override
+        public long getVibratorOnDuration() {
+            return mVibratorsOnMaxDuration;
+        }
+
+        @Override
         public List<Step> play() {
             Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "StartVibrateStep");
             List<Step> nextSteps = new ArrayList<>();
-            long duration = -1;
+            mVibratorsOnMaxDuration = -1;
             try {
                 if (DEBUG) {
                     Slog.d(TAG, "StartVibrateStep for effect #" + currentIndex);
@@ -478,25 +613,33 @@
                     return nextSteps;
                 }
 
-                duration = startVibrating(effectMapping, nextSteps);
-                noteVibratorOn(duration);
+                mVibratorsOnMaxDuration = startVibrating(effectMapping, nextSteps);
+                noteVibratorOn(mVibratorsOnMaxDuration);
             } finally {
-                if (duration < 0) {
-                    // Something failed while playing this step so stop playing this sequence.
-                    return EMPTY_STEP_LIST;
-                }
-                // It least one vibrator was started then add a finish step to wait for all
-                // active vibrators to finish their individual steps before going to the next.
-                // Otherwise this step was ignored so just go to the next one.
-                Step nextStep = duration > 0 ? new FinishVibrateStep(this) : nextStep();
-                if (nextStep != null) {
-                    nextSteps.add(nextStep);
+                if (mVibratorsOnMaxDuration >= 0) {
+                    // It least one vibrator was started then add a finish step to wait for all
+                    // active vibrators to finish their individual steps before going to the next.
+                    // Otherwise this step was ignored so just go to the next one.
+                    Step nextStep =
+                            mVibratorsOnMaxDuration > 0 ? new FinishVibrateStep(this) : nextStep();
+                    if (nextStep != null) {
+                        nextSteps.add(nextStep);
+                    }
                 }
                 Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
             }
             return nextSteps;
         }
 
+        @Override
+        public List<Step> cancel() {
+            return EMPTY_STEP_LIST;
+        }
+
+        @Override
+        public void cancelImmediately() {
+        }
+
         /**
          * Create the next {@link StartVibrateStep} to play this sequential effect, starting at the
          * time this method is called, or null if sequence is complete.
@@ -593,7 +736,7 @@
                         // Some vibrator failed without being prepared so other vibrators might be
                         // active. Cancel and remove every pending step from output list.
                         for (int i = nextSteps.size() - 1; i >= 0; i--) {
-                            nextSteps.remove(i).cancel();
+                            nextSteps.remove(i).cancelImmediately();
                         }
                     }
                 }
@@ -627,6 +770,12 @@
         }
 
         @Override
+        public boolean isCleanUp() {
+            // This step only notes that all the vibrators has been turned off.
+            return true;
+        }
+
+        @Override
         public List<Step> play() {
             Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "FinishVibrateStep");
             try {
@@ -642,7 +791,13 @@
         }
 
         @Override
-        public void cancel() {
+        public List<Step> cancel() {
+            cancelImmediately();
+            return EMPTY_STEP_LIST;
+        }
+
+        @Override
+        public void cancelImmediately() {
             noteVibratorOff();
         }
     }
@@ -658,6 +813,7 @@
         public final long vibratorOffTimeout;
 
         long mVibratorOnResult;
+        boolean mVibratorCallbackReceived;
 
         /**
          * @param startTime          The time to schedule this step in the {@link StepQueue}.
@@ -678,27 +834,28 @@
             this.vibratorOffTimeout = vibratorOffTimeout;
         }
 
-        /**
-         * Return the duration the vibrator was turned on when this step was played.
-         *
-         * @return A positive duration that the vibrator was turned on for by this step;
-         * Zero if the segment is not supported, the step was not played yet or vibrator was never
-         * turned on by this step; A negative value if the vibrator call has failed.
-         */
+        @Override
         public long getVibratorOnDuration() {
             return mVibratorOnResult;
         }
 
         @Override
         public boolean shouldPlayWhenVibratorComplete(int vibratorId) {
+            boolean isSameVibrator = controller.getVibratorInfo().getId() == vibratorId;
+            mVibratorCallbackReceived |= isSameVibrator;
             // Only anticipate this step if a timeout was set to wait for the vibration to complete,
             // otherwise we are waiting for the correct time to play the next step.
-            return (controller.getVibratorInfo().getId() == vibratorId)
-                    && (vibratorOffTimeout > SystemClock.uptimeMillis());
+            return isSameVibrator && (vibratorOffTimeout > SystemClock.uptimeMillis());
         }
 
         @Override
-        public void cancel() {
+        public List<Step> cancel() {
+            return Arrays.asList(new CompleteStep(SystemClock.uptimeMillis(),
+                    /* cancelled= */ true, controller, vibratorOffTimeout));
+        }
+
+        @Override
+        public void cancelImmediately() {
             if (vibratorOffTimeout > SystemClock.uptimeMillis()) {
                 // Vibrator might be running from previous steps, so turn it off while canceling.
                 stopVibrating();
@@ -712,6 +869,14 @@
             controller.off();
         }
 
+        void changeAmplitude(float amplitude) {
+            if (DEBUG) {
+                Slog.d(TAG, "Amplitude changed on vibrator " + controller.getVibratorInfo().getId()
+                        + " to " + amplitude);
+            }
+            controller.setAmplitude(amplitude);
+        }
+
         /** Return the {@link #nextVibrateStep} with same timings, only jumping the segments. */
         public List<Step> skipToNextSteps(int segmentsSkipped) {
             return nextSteps(startTime, vibratorOffTimeout, segmentsSkipped);
@@ -938,6 +1103,140 @@
     }
 
     /**
+     * Represents a step to complete a {@link VibrationEffect}.
+     *
+     * <p>This runs right at the time the vibration is considered to end and will update the pending
+     * vibrators count. This can turn off the vibrator or slowly ramp it down to zero amplitude.
+     */
+    private final class CompleteStep extends SingleVibratorStep {
+        private final boolean mCancelled;
+
+        CompleteStep(long startTime, boolean cancelled, VibratorController controller,
+                long vibratorOffTimeout) {
+            super(startTime, controller, /* effect= */ null, /* index= */ -1, vibratorOffTimeout);
+            mCancelled = cancelled;
+        }
+
+        @Override
+        public boolean isCleanUp() {
+            // If the vibration was cancelled then this is just a clean up to ramp off the vibrator.
+            // Otherwise this step is part of the vibration.
+            return mCancelled;
+        }
+
+        @Override
+        public List<Step> cancel() {
+            if (mCancelled) {
+                // Double cancelling will just turn off the vibrator right away.
+                return Arrays.asList(new OffStep(SystemClock.uptimeMillis(), controller));
+            }
+            return super.cancel();
+        }
+
+        @Override
+        public List<Step> play() {
+            Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "CompleteStep");
+            try {
+                if (DEBUG) {
+                    Slog.d(TAG, "Running " + (mCancelled ? "cancel" : "complete") + " vibration"
+                            + " step on vibrator " + controller.getVibratorInfo().getId());
+                }
+                if (mVibratorCallbackReceived) {
+                    // Vibration completion callback was received by this step, just turn if off
+                    // and skip any clean-up.
+                    stopVibrating();
+                    return EMPTY_STEP_LIST;
+                }
+
+                float currentAmplitude = controller.getCurrentAmplitude();
+                long remainingOnDuration =
+                        vibratorOffTimeout - CALLBACKS_EXTRA_TIMEOUT - SystemClock.uptimeMillis();
+                long rampDownDuration =
+                        Math.min(remainingOnDuration, mVibrationSettings.getRampDownDuration());
+                long stepDownDuration = mVibrationSettings.getRampStepDuration();
+                if (currentAmplitude < RAMP_OFF_AMPLITUDE_MIN
+                        || rampDownDuration <= stepDownDuration) {
+                    // No need to ramp down the amplitude, just wait to turn it off.
+                    if (mCancelled) {
+                        // Vibration is completing because it was cancelled, turn off right away.
+                        stopVibrating();
+                        return EMPTY_STEP_LIST;
+                    } else {
+                        return Arrays.asList(new OffStep(vibratorOffTimeout, controller));
+                    }
+                }
+
+                if (DEBUG) {
+                    Slog.d(TAG, "Ramping down vibrator " + controller.getVibratorInfo().getId()
+                            + " from amplitude " + currentAmplitude
+                            + " for " + rampDownDuration + "ms");
+                }
+                float amplitudeDelta = currentAmplitude / (rampDownDuration / stepDownDuration);
+                float amplitudeTarget = currentAmplitude - amplitudeDelta;
+                long newVibratorOffTimeout = mCancelled ? rampDownDuration : vibratorOffTimeout;
+                return Arrays.asList(new RampOffStep(startTime, amplitudeTarget, amplitudeDelta,
+                        controller, newVibratorOffTimeout));
+            } finally {
+                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+            }
+        }
+    }
+
+    /** Represents a step to ramp down the vibrator amplitude before turning it off. */
+    private final class RampOffStep extends SingleVibratorStep {
+        private final float mAmplitudeTarget;
+        private final float mAmplitudeDelta;
+
+        RampOffStep(long startTime, float amplitudeTarget, float amplitudeDelta,
+                VibratorController controller, long vibratorOffTimeout) {
+            super(startTime, controller, /* effect= */ null, /* index= */ -1, vibratorOffTimeout);
+            mAmplitudeTarget = amplitudeTarget;
+            mAmplitudeDelta = amplitudeDelta;
+        }
+
+        @Override
+        public boolean isCleanUp() {
+            return true;
+        }
+
+        @Override
+        public List<Step> cancel() {
+            return Arrays.asList(new OffStep(SystemClock.uptimeMillis(), controller));
+        }
+
+        @Override
+        public List<Step> play() {
+            Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "RampOffStep");
+            try {
+                if (DEBUG) {
+                    long latency = SystemClock.uptimeMillis() - startTime;
+                    Slog.d(TAG, "Ramp down the vibrator amplitude, step with "
+                            + latency + "ms latency.");
+                }
+                if (mVibratorCallbackReceived) {
+                    // Vibration completion callback was received by this step, just turn if off
+                    // and skip the rest of the steps to ramp down the vibrator amplitude.
+                    stopVibrating();
+                    return EMPTY_STEP_LIST;
+                }
+
+                changeAmplitude(mAmplitudeTarget);
+
+                float newAmplitudeTarget = mAmplitudeTarget - mAmplitudeDelta;
+                if (newAmplitudeTarget < RAMP_OFF_AMPLITUDE_MIN) {
+                    // Vibrator amplitude cannot go further down, just turn it off.
+                    return Arrays.asList(new OffStep(vibratorOffTimeout, controller));
+                }
+                return Arrays.asList(new RampOffStep(
+                        startTime + mVibrationSettings.getRampStepDuration(), newAmplitudeTarget,
+                        mAmplitudeDelta, controller, vibratorOffTimeout));
+            } finally {
+                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+            }
+        }
+    }
+
+    /**
      * Represents a step to turn the vibrator off.
      *
      * <p>This runs after a timeout on the expected time the vibrator should have finished playing,
@@ -950,6 +1249,21 @@
         }
 
         @Override
+        public boolean isCleanUp() {
+            return true;
+        }
+
+        @Override
+        public List<Step> cancel() {
+            return Arrays.asList(new OffStep(SystemClock.uptimeMillis(), controller));
+        }
+
+        @Override
+        public void cancelImmediately() {
+            stopVibrating();
+        }
+
+        @Override
         public List<Step> play() {
             Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "OffStep");
             try {
@@ -1044,14 +1358,6 @@
             return controller.on(duration, mVibration.id);
         }
 
-        private void changeAmplitude(float amplitude) {
-            if (DEBUG) {
-                Slog.d(TAG, "Amplitude changed on vibrator " + controller.getVibratorInfo().getId()
-                        + " to " + amplitude);
-            }
-            controller.setAmplitude(amplitude);
-        }
-
         /**
          * Get the duration the vibrator will be on for a waveform, starting at {@code startIndex}
          * until the next time it's vibrating amplitude is zero or a different type of segment is
@@ -1080,6 +1386,11 @@
                     return 1000;
                 }
             }
+            if (i == segmentCount && effect.getRepeatIndex() < 0) {
+                // Vibration ending at non-zero amplitude, add extra timings to ramp down after
+                // vibration is complete.
+                timing += mVibrationSettings.getRampDownDuration();
+            }
             return timing;
         }
     }
diff --git a/services/core/java/com/android/server/vibrator/VibratorController.java b/services/core/java/com/android/server/vibrator/VibratorController.java
index 001d5c4..69cc90bf 100644
--- a/services/core/java/com/android/server/vibrator/VibratorController.java
+++ b/services/core/java/com/android/server/vibrator/VibratorController.java
@@ -54,6 +54,8 @@
     private boolean mIsVibrating;
     @GuardedBy("mLock")
     private boolean mIsUnderExternalControl;
+    @GuardedBy("mLock")
+    private float mCurrentAmplitude;
 
     /** Listener for vibration completion callbacks from native. */
     public interface OnVibrationCompleteListener {
@@ -131,6 +133,23 @@
         }
     }
 
+    /**
+     * Returns the current amplitude the device is vibrating.
+     *
+     * <p>This value is set to 1 by the method {@link #on(long, long)}, and can be updated via
+     * {@link #setAmplitude(float)} if called while the device is vibrating.
+     *
+     * <p>If the device is vibrating via any other {@link #on} method then the current amplitude is
+     * unknown and this will return -1.
+     *
+     * <p>If {@link #isVibrating()} is false then this will be zero.
+     */
+    public float getCurrentAmplitude() {
+        synchronized (mLock) {
+            return mCurrentAmplitude;
+        }
+    }
+
     /** Return {@code true} if this vibrator is under external control, false otherwise. */
     public boolean isUnderExternalControl() {
         synchronized (mLock) {
@@ -192,6 +211,9 @@
             if (mVibratorInfo.hasCapability(IVibrator.CAP_AMPLITUDE_CONTROL)) {
                 mNativeWrapper.setAmplitude(amplitude);
             }
+            if (mIsVibrating) {
+                mCurrentAmplitude = amplitude;
+            }
         }
     }
 
@@ -208,6 +230,7 @@
         synchronized (mLock) {
             long duration = mNativeWrapper.on(milliseconds, vibrationId);
             if (duration > 0) {
+                mCurrentAmplitude = -1;
                 notifyVibratorOnLocked();
             }
             return duration;
@@ -228,6 +251,7 @@
             long duration = mNativeWrapper.perform(prebaked.getEffectId(),
                     prebaked.getEffectStrength(), vibrationId);
             if (duration > 0) {
+                mCurrentAmplitude = -1;
                 notifyVibratorOnLocked();
             }
             return duration;
@@ -250,6 +274,7 @@
         synchronized (mLock) {
             long duration = mNativeWrapper.compose(primitives, vibrationId);
             if (duration > 0) {
+                mCurrentAmplitude = -1;
                 notifyVibratorOnLocked();
             }
             return duration;
@@ -272,6 +297,7 @@
             int braking = mVibratorInfo.getDefaultBraking();
             long duration = mNativeWrapper.composePwle(primitives, braking, vibrationId);
             if (duration > 0) {
+                mCurrentAmplitude = -1;
                 notifyVibratorOnLocked();
             }
             return duration;
@@ -282,19 +308,23 @@
     public void off() {
         synchronized (mLock) {
             mNativeWrapper.off();
+            mCurrentAmplitude = 0;
             notifyVibratorOffLocked();
         }
     }
 
     @Override
     public String toString() {
-        return "VibratorController{"
-                + "mVibratorInfo=" + mVibratorInfo
-                + ", mIsVibrating=" + mIsVibrating
-                + ", mIsUnderExternalControl=" + mIsUnderExternalControl
-                + ", mVibratorStateListeners count="
-                + mVibratorStateListeners.getRegisteredCallbackCount()
-                + '}';
+        synchronized (mLock) {
+            return "VibratorController{"
+                    + "mVibratorInfo=" + mVibratorInfo
+                    + ", mIsVibrating=" + mIsVibrating
+                    + ", mCurrentAmplitude=" + mCurrentAmplitude
+                    + ", mIsUnderExternalControl=" + mIsUnderExternalControl
+                    + ", mVibratorStateListeners count="
+                    + mVibratorStateListeners.getRegisteredCallbackCount()
+                    + '}';
+        }
     }
 
     @GuardedBy("mLock")
diff --git a/services/core/java/com/android/server/vibrator/VibratorManagerService.java b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
index 644e451..fb8498e 100644
--- a/services/core/java/com/android/server/vibrator/VibratorManagerService.java
+++ b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
@@ -514,8 +514,9 @@
                 return Vibration.Status.FORWARDED_TO_INPUT_DEVICES;
             }
 
-            VibrationThread vibThread = new VibrationThread(vib, mDeviceVibrationEffectAdapter,
-                    mVibrators, mWakeLock, mBatteryStatsService, mVibrationCallbacks);
+            VibrationThread vibThread = new VibrationThread(vib, mVibrationSettings,
+                    mDeviceVibrationEffectAdapter, mVibrators, mWakeLock, mBatteryStatsService,
+                    mVibrationCallbacks);
 
             if (mCurrentVibration == null) {
                 return startVibrationThreadLocked(vibThread);
@@ -569,7 +570,6 @@
         Trace.asyncTraceEnd(Trace.TRACE_TAG_VIBRATOR, "vibration", 0);
         try {
             Vibration vib = mCurrentVibration.getVibration();
-            mCurrentVibration = null;
             endVibrationLocked(vib, status);
             finishAppOpModeLocked(vib.uid, vib.opPkg);
         } finally {
@@ -613,7 +613,7 @@
             // Repeating vibrations always take precedence.
             return null;
         }
-        if (mCurrentVibration != null) {
+        if (mCurrentVibration != null && !mCurrentVibration.getVibration().hasEnded()) {
             if (mCurrentVibration.getVibration().attrs.getUsage()
                     == VibrationAttributes.USAGE_ALARM) {
                 if (DEBUG) {
@@ -1003,20 +1003,29 @@
         }
 
         @Override
-        public void onVibrationEnded(long vibrationId, Vibration.Status status) {
+        public void onVibrationCompleted(long vibrationId, Vibration.Status status) {
             if (DEBUG) {
-                Slog.d(TAG, "Vibration " + vibrationId + " thread finished with status " + status);
+                Slog.d(TAG, "Vibration " + vibrationId + " finished with status " + status);
             }
             synchronized (mLock) {
                 if (mCurrentVibration != null
                         && mCurrentVibration.getVibration().id == vibrationId) {
                     reportFinishedVibrationLocked(status);
+                }
+            }
+        }
 
-                    if (mNextVibration != null) {
-                        VibrationThread vibThread = mNextVibration;
-                        mNextVibration = null;
-                        startVibrationThreadLocked(vibThread);
-                    }
+        @Override
+        public void onVibratorsReleased() {
+            if (DEBUG) {
+                Slog.d(TAG, "Vibrators released after finished vibration");
+            }
+            synchronized (mLock) {
+                mCurrentVibration = null;
+                if (mNextVibration != null) {
+                    VibrationThread vibThread = mNextVibration;
+                    mNextVibration = null;
+                    startVibrationThreadLocked(vibThread);
                 }
             }
         }
@@ -1337,7 +1346,7 @@
                     // vibration that may be playing and ready the vibrator for external control.
                     if (mCurrentVibration != null) {
                         mNextVibration = null;
-                        mCurrentVibration.cancel();
+                        mCurrentVibration.cancelImmediately();
                         cancelingVibration = mCurrentVibration;
                     }
                 } else {
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index d551f66..64b5fc7 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -257,6 +257,7 @@
 import android.content.LocusId;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
 import android.content.res.CompatibilityInfo;
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -1929,12 +1930,23 @@
         final TaskSnapshot snapshot =
                 mWmService.mTaskSnapshotController.getSnapshot(task.mTaskId, task.mUserId,
                         false /* restoreFromDisk */, false /* isLowResolution */);
-        final int typeParameter = mWmService.mStartingSurfaceController
-                .makeStartingWindowTypeParameter(newTask, taskSwitch, processRunning,
-                        allowTaskSnapshot, activityCreated, useEmpty);
         final int type = getStartingWindowType(newTask, taskSwitch, processRunning,
                 allowTaskSnapshot, activityCreated, snapshot);
 
+        //TODO(191787740) Remove for T
+        final boolean useLegacy = type == STARTING_WINDOW_TYPE_SPLASH_SCREEN
+                && mWmService.mStartingSurfaceController.isExceptionApp(packageName, mTargetSdk,
+                    () -> {
+                        ActivityInfo activityInfo = intent.resolveActivityInfo(
+                                mAtmService.mContext.getPackageManager(),
+                                PackageManager.GET_META_DATA);
+                        return activityInfo != null ? activityInfo.applicationInfo : null;
+                    });
+
+        final int typeParameter = mWmService.mStartingSurfaceController
+                .makeStartingWindowTypeParameter(newTask, taskSwitch, processRunning,
+                        allowTaskSnapshot, activityCreated, useEmpty, useLegacy);
+
         if (type == STARTING_WINDOW_TYPE_SNAPSHOT) {
             if (isActivityTypeHome()) {
                 // The snapshot of home is only used once because it won't be updated while screen
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 680937b..090a01a 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -302,6 +302,12 @@
     // started or finished.
     static final long ACTIVITY_BG_START_GRACE_PERIOD_MS = 10 * 1000;
 
+    /**
+     * The duration to keep a process in animating state (top scheduling group) when the
+     * wakefulness is changing from awake to doze or sleep.
+     */
+    private static final long DOZE_ANIMATING_STATE_RETAIN_TIME_MS = 2000;
+
     /** Used to indicate that an app transition should be animated. */
     static final boolean ANIMATE = true;
 
@@ -2758,12 +2764,35 @@
         });
     }
 
+    // The caller MUST NOT hold the global lock.
     public void onScreenAwakeChanged(boolean isAwake) {
         mH.post(() -> {
             for (int i = mScreenObservers.size() - 1; i >= 0; i--) {
                 mScreenObservers.get(i).onAwakeStateChanged(isAwake);
             }
         });
+
+        if (isAwake) {
+            return;
+        }
+        // If the device is going to sleep, keep a higher priority temporarily for potential
+        // animation of system UI. Even if AOD is not enabled, it should be no harm.
+        final WindowProcessController proc;
+        synchronized (mGlobalLockWithoutBoost) {
+            final WindowState notificationShade = mRootWindowContainer.getDefaultDisplay()
+                    .getDisplayPolicy().getNotificationShade();
+            proc = notificationShade != null
+                    ? mProcessMap.getProcess(notificationShade.mSession.mPid) : null;
+        }
+        if (proc == null) {
+            return;
+        }
+        // Set to activity manager directly to make sure the state can be seen by the subsequent
+        // update of scheduling group.
+        proc.setRunningAnimationUnsafe();
+        mH.removeMessages(H.UPDATE_PROCESS_ANIMATING_STATE, proc);
+        mH.sendMessageDelayed(mH.obtainMessage(H.UPDATE_PROCESS_ANIMATING_STATE, proc),
+                DOZE_ANIMATING_STATE_RETAIN_TIME_MS);
     }
 
     @Override
@@ -5028,7 +5057,7 @@
 
     final class H extends Handler {
         static final int REPORT_TIME_TRACKER_MSG = 1;
-
+        static final int UPDATE_PROCESS_ANIMATING_STATE = 2;
 
         static final int FIRST_ACTIVITY_TASK_MSG = 100;
         static final int FIRST_SUPERVISOR_TASK_MSG = 200;
@@ -5045,6 +5074,13 @@
                     tracker.deliverResult(mContext);
                 }
                 break;
+                case UPDATE_PROCESS_ANIMATING_STATE: {
+                    final WindowProcessController proc = (WindowProcessController) msg.obj;
+                    synchronized (mGlobalLock) {
+                        proc.updateRunningRemoteOrRecentsAnimation();
+                    }
+                }
+                break;
             }
         }
     }
diff --git a/services/core/java/com/android/server/wm/RefreshRatePolicy.java b/services/core/java/com/android/server/wm/RefreshRatePolicy.java
index 6bc42af..b63843d 100644
--- a/services/core/java/com/android/server/wm/RefreshRatePolicy.java
+++ b/services/core/java/com/android/server/wm/RefreshRatePolicy.java
@@ -89,18 +89,13 @@
     }
 
     int getPreferredModeId(WindowState w) {
-
         // If app is animating, it's not able to control refresh rate because we want the animation
         // to run in default refresh rate.
         if (w.isAnimating(TRANSITION | PARENTS)) {
             return 0;
         }
 
-        if (w.mAttrs.preferredRefreshRate != 0 || w.mAttrs.preferredDisplayModeId != 0) {
-            return w.mAttrs.preferredDisplayModeId;
-        }
-
-        return 0;
+        return w.mAttrs.preferredDisplayModeId;
     }
 
     /**
@@ -134,12 +129,9 @@
             return 0;
         }
 
-        final String packageName = w.getOwningPackage();
-        if (mHighRefreshRateDenylist.isDenylisted(packageName)) {
-            return mLowRefreshRateMode.getRefreshRate();
-        }
-
-        final int preferredModeId = getPreferredModeId(w);
+        // If the app set a preferredDisplayModeId, the preferred refresh rate is the refresh rate
+        // of that mode id.
+        final int preferredModeId = w.mAttrs.preferredDisplayModeId;
         if (preferredModeId > 0) {
             DisplayInfo info = w.getDisplayInfo();
             if (info != null) {
@@ -151,6 +143,17 @@
             }
         }
 
+        if (w.mAttrs.preferredRefreshRate > 0) {
+            return w.mAttrs.preferredRefreshRate;
+        }
+
+        // If the app didn't set a preferred mode id or refresh rate, but it is part of the deny
+        // list, we return the low refresh rate as the preferred one.
+        final String packageName = w.getOwningPackage();
+        if (mHighRefreshRateDenylist.isDenylisted(packageName)) {
+            return mLowRefreshRateMode.getRefreshRate();
+        }
+
         return 0;
     }
 
@@ -161,11 +164,6 @@
             return 0;
         }
 
-        // If app requests a certain refresh rate or mode, don't override it.
-        if (w.mAttrs.preferredDisplayModeId != 0) {
-            return 0;
-        }
-
         return w.mAttrs.preferredMinDisplayRefreshRate;
     }
 
@@ -176,11 +174,6 @@
             return 0;
         }
 
-        // If app requests a certain refresh rate or mode, don't override it.
-        if (w.mAttrs.preferredDisplayModeId != 0) {
-            return 0;
-        }
-
         if (w.mAttrs.preferredMaxDisplayRefreshRate > 0) {
             return w.mAttrs.preferredMaxDisplayRefreshRate;
         }
diff --git a/services/core/java/com/android/server/wm/StartingSurfaceController.java b/services/core/java/com/android/server/wm/StartingSurfaceController.java
index da25747..45b53a1 100644
--- a/services/core/java/com/android/server/wm/StartingSurfaceController.java
+++ b/services/core/java/com/android/server/wm/StartingSurfaceController.java
@@ -18,6 +18,7 @@
 
 import static android.window.StartingWindowInfo.TYPE_PARAMETER_ACTIVITY_CREATED;
 import static android.window.StartingWindowInfo.TYPE_PARAMETER_ALLOW_TASK_SNAPSHOT;
+import static android.window.StartingWindowInfo.TYPE_PARAMETER_LEGACY_SPLASH_SCREEN;
 import static android.window.StartingWindowInfo.TYPE_PARAMETER_NEW_TASK;
 import static android.window.StartingWindowInfo.TYPE_PARAMETER_PROCESS_RUNNING;
 import static android.window.StartingWindowInfo.TYPE_PARAMETER_TASK_SWITCH;
@@ -85,7 +86,7 @@
 
     int makeStartingWindowTypeParameter(boolean newTask, boolean taskSwitch,
             boolean processRunning, boolean allowTaskSnapshot, boolean activityCreated,
-            boolean useEmpty) {
+            boolean useEmpty, boolean useLegacy) {
         int parameter = 0;
         if (newTask) {
             parameter |= TYPE_PARAMETER_NEW_TASK;
@@ -105,6 +106,9 @@
         if (useEmpty) {
             parameter |= TYPE_PARAMETER_USE_EMPTY_SPLASH_SCREEN;
         }
+        if (useLegacy) {
+            parameter |= TYPE_PARAMETER_LEGACY_SPLASH_SCREEN;
+        }
         return parameter;
     }
 
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 1075806..1ec9187 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -445,7 +445,7 @@
             "persist.wm.enable_remote_keyguard_animation";
 
     private static final int sEnableRemoteKeyguardAnimation =
-            SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1);
+            SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 0);
 
     /**
      * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 26cfbdf..1c57aef 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -1594,14 +1594,18 @@
         updateRunningRemoteOrRecentsAnimation();
     }
 
-    private void updateRunningRemoteOrRecentsAnimation() {
-
+    void updateRunningRemoteOrRecentsAnimation() {
         // Posting on handler so WM lock isn't held when we call into AM.
         mAtm.mH.sendMessage(PooledLambda.obtainMessage(
                 WindowProcessListener::setRunningRemoteAnimation, mListener,
                 mRunningRecentsAnimation || mRunningRemoteAnimation));
     }
 
+    /** Adjusts scheduling group for animation. This method MUST NOT be called inside WM lock. */
+    void setRunningAnimationUnsafe() {
+        mListener.setRunningRemoteAnimation(true);
+    }
+
     @Override
     public String toString() {
         return mOwner != null ? mOwner.toString() : null;
diff --git a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
index 7513512..3d4f866 100644
--- a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
+++ b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
@@ -131,28 +131,6 @@
     return android::base::WriteFully(fd, &command, sizeof(command));
 }
 
-static int waitForDataOrSignal(int fd, int event_fd) {
-    struct pollfd pfds[2] = {{fd, POLLIN, 0}, {event_fd, POLLIN, 0}};
-    // Wait until either data is ready or stop signal is received
-    int res = poll(pfds, 2, PollTimeoutMs);
-    if (res == -1 && errno == EINTR) {
-        // Treat it the same as timeout and allow the caller to retry.
-        return 0;
-    }
-    if (res <= 0) {
-        return res;
-    }
-    // First check if there is a stop signal
-    if (pfds[1].revents == POLLIN) {
-        return event_fd;
-    }
-    // Otherwise check if incoming data is ready
-    if (pfds[0].revents == POLLIN) {
-        return fd;
-    }
-    return -1;
-}
-
 static bool readChunk(int fd, std::vector<uint8_t>& data) {
     int32_t size;
     if (!android::base::ReadFully(fd, &size, sizeof(size))) {
@@ -382,7 +360,12 @@
 class PMSCDataLoader : public android::dataloader::DataLoader {
 public:
     PMSCDataLoader(JavaVM* jvm) : mJvm(jvm) { CHECK(mJvm); }
-    ~PMSCDataLoader() { onTraceChanged().unregisterCallback(this); }
+    ~PMSCDataLoader() {
+        onTraceChanged().unregisterCallback(this);
+        if (mReceiverThread.joinable()) {
+            mReceiverThread.join();
+        }
+    }
 
     void updateReadLogsState(const bool enabled) {
         if (enabled != mReadLogsEnabled.exchange(enabled)) {
@@ -417,11 +400,7 @@
             mReceiverThread.join();
         }
     }
-    void onDestroy() final {
-        onTraceChanged().unregisterCallback(this);
-        // Make sure the receiver thread stopped.
-        CHECK(!mReceiverThread.joinable());
-    }
+    void onDestroy() final {}
 
     // Installation.
     bool onPrepareImage(dataloader::DataLoaderInstallationFiles addedFiles) final {
@@ -573,6 +552,60 @@
         return true;
     }
 
+    enum class WaitResult {
+        DataAvailable,
+        Timeout,
+        Failure,
+        StopRequested,
+    };
+
+    WaitResult waitForData(int fd) {
+        using Clock = std::chrono::steady_clock;
+        using Milliseconds = std::chrono::milliseconds;
+
+        auto pollTimeoutMs = PollTimeoutMs;
+        const auto waitEnd = Clock::now() + Milliseconds(pollTimeoutMs);
+        while (!mStopReceiving) {
+            struct pollfd pfds[2] = {{fd, POLLIN, 0}, {mEventFd, POLLIN, 0}};
+            // Wait until either data is ready or stop signal is received
+            int res = poll(pfds, std::size(pfds), pollTimeoutMs);
+
+            if (res < 0) {
+                if (errno == EINTR) {
+                    pollTimeoutMs = std::chrono::duration_cast<Milliseconds>(waitEnd - Clock::now())
+                                            .count();
+                    if (pollTimeoutMs < 0) {
+                        return WaitResult::Timeout;
+                    }
+                    continue;
+                }
+                ALOGE("Failed to poll. Error %d", errno);
+                return WaitResult::Failure;
+            }
+
+            if (res == 0) {
+                return WaitResult::Timeout;
+            }
+
+            // First check if there is a stop signal
+            if (pfds[1].revents == POLLIN) {
+                ALOGE("DataLoader requested to stop.");
+                return WaitResult::StopRequested;
+            }
+            // Otherwise check if incoming data is ready
+            if (pfds[0].revents == POLLIN) {
+                return WaitResult::DataAvailable;
+            }
+
+            // Invalid case, just fail.
+            ALOGE("Failed to poll. Result %d", res);
+            return WaitResult::Failure;
+        }
+
+        ALOGE("DataLoader requested to stop.");
+        return WaitResult::StopRequested;
+    }
+
     // Streaming.
     bool initStreaming(unique_fd inout, MetadataMode mode) {
         mEventFd.reset(eventfd(0, EFD_CLOEXEC));
@@ -582,6 +615,11 @@
         }
 
         // Awaiting adb handshake.
+        if (waitForData(inout) != WaitResult::DataAvailable) {
+            ALOGE("Failure waiting for the handshake.");
+            return false;
+        }
+
         char okay_buf[OKAY.size()];
         if (!android::base::ReadFully(inout, okay_buf, OKAY.size())) {
             ALOGE("Failed to receive OKAY. Abort. Error %d", errno);
@@ -601,8 +639,14 @@
             }
         }
 
+        if (mStopReceiving) {
+            ALOGE("DataLoader requested to stop.");
+            return false;
+        }
+
         mReceiverThread = std::thread(
                 [this, io = std::move(inout), mode]() mutable { receiver(std::move(io), mode); });
+
         ALOGI("Started streaming...");
         return true;
     }
@@ -750,17 +794,16 @@
         std::vector<IncFsDataBlock> instructions;
         std::unordered_map<FileIdx, unique_fd> writeFds;
         while (!mStopReceiving) {
-            const int res = waitForDataOrSignal(inout, mEventFd);
-            if (res == 0) {
+            const auto res = waitForData(inout);
+            if (res == WaitResult::Timeout) {
                 continue;
             }
-            if (res < 0) {
-                ALOGE("Failed to poll. Abort. Error %d", res);
+            if (res == WaitResult::Failure) {
                 mStatusListener->reportStatus(DATA_LOADER_UNRECOVERABLE);
                 break;
             }
-            if (res == mEventFd) {
-                ALOGE("DataLoader requested to stop. Sending EXIT to server.");
+            if (res == WaitResult::StopRequested) {
+                ALOGE("Sending EXIT to server.");
                 sendRequest(inout, EXIT);
                 break;
             }
diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd
index 82aaa61..429edf1 100644
--- a/services/core/xsd/display-device-config/display-device-config.xsd
+++ b/services/core/xsd/display-device-config/display-device-config.xsd
@@ -81,6 +81,16 @@
                 <xs:annotation name="nullable"/>
                 <xs:annotation name="final"/>
             </xs:element>
+            <!-- The highest (most severe) thermal status at which high-brightness-mode is allowed
+                 to operate. -->
+            <xs:element name="thermalStatusLimit" type="thermalStatus" minOccurs="0" maxOccurs="1">
+                <xs:annotation name="nonnull"/>
+                <xs:annotation name="final"/>
+            </xs:element>
+            <xs:element name="allowInLowPowerMode" type="xs:boolean" minOccurs="0" maxOccurs="1">
+                <xs:annotation name="nonnull"/>
+                <xs:annotation name="final"/>
+            </xs:element>
         </xs:all>
         <xs:attribute name="enabled" type="xs:boolean" use="optional"/>
     </xs:complexType>
@@ -102,6 +112,19 @@
         </xs:all>
     </xs:complexType>
 
+    <!-- Maps to PowerManager.THERMAL_STATUS_* values. -->
+    <xs:simpleType name="thermalStatus">
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="none"/>
+            <xs:enumeration value="light"/>
+            <xs:enumeration value="moderate"/>
+            <xs:enumeration value="severe"/>
+            <xs:enumeration value="critical"/>
+            <xs:enumeration value="emergency"/>
+            <xs:enumeration value="shutdown"/>
+        </xs:restriction>
+    </xs:simpleType>
+
     <xs:complexType name="nitsMap">
         <xs:sequence>
             <xs:element name="point" type="point" maxOccurs="unbounded" minOccurs="2">
diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt
index 6e2e362..ad18602 100644
--- a/services/core/xsd/display-device-config/schema/current.txt
+++ b/services/core/xsd/display-device-config/schema/current.txt
@@ -42,14 +42,18 @@
 
   public class HighBrightnessMode {
     ctor public HighBrightnessMode();
+    method @NonNull public final boolean getAllowInLowPowerMode_all();
     method public boolean getEnabled();
     method @NonNull public final java.math.BigDecimal getMinimumLux_all();
     method @Nullable public final com.android.server.display.config.RefreshRateRange getRefreshRate_all();
+    method @NonNull public final com.android.server.display.config.ThermalStatus getThermalStatusLimit_all();
     method public com.android.server.display.config.HbmTiming getTiming_all();
     method @NonNull public final java.math.BigDecimal getTransitionPoint_all();
+    method public final void setAllowInLowPowerMode_all(@NonNull boolean);
     method public void setEnabled(boolean);
     method public final void setMinimumLux_all(@NonNull java.math.BigDecimal);
     method public final void setRefreshRate_all(@Nullable com.android.server.display.config.RefreshRateRange);
+    method public final void setThermalStatusLimit_all(@NonNull com.android.server.display.config.ThermalStatus);
     method public void setTiming_all(com.android.server.display.config.HbmTiming);
     method public final void setTransitionPoint_all(@NonNull java.math.BigDecimal);
   }
@@ -85,6 +89,17 @@
     method public final void setType(@Nullable String);
   }
 
+  public enum ThermalStatus {
+    method public String getRawName();
+    enum_constant public static final com.android.server.display.config.ThermalStatus critical;
+    enum_constant public static final com.android.server.display.config.ThermalStatus emergency;
+    enum_constant public static final com.android.server.display.config.ThermalStatus light;
+    enum_constant public static final com.android.server.display.config.ThermalStatus moderate;
+    enum_constant public static final com.android.server.display.config.ThermalStatus none;
+    enum_constant public static final com.android.server.display.config.ThermalStatus severe;
+    enum_constant public static final com.android.server.display.config.ThermalStatus shutdown;
+  }
+
   public class XmlParser {
     ctor public XmlParser();
     method public static com.android.server.display.config.DisplayConfiguration read(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 2bacc44..e553075 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -14991,6 +14991,7 @@
     }
 
     private void setNetworkLoggingActiveInternal(boolean active) {
+        final boolean[] shouldSendNotification = new boolean[] {false};
         synchronized (getLockObject()) {
             mInjector.binderWithCleanCallingIdentity(() -> {
                 if (active) {
@@ -15007,17 +15008,23 @@
                                 + " service not being available yet.");
                     }
                     maybePauseDeviceWideLoggingLocked();
-                    sendNetworkLoggingNotificationLocked();
+                    shouldSendNotification[0] = shouldSendNetworkLoggingNotificationLocked();
                 } else {
                     if (mNetworkLogger != null && !mNetworkLogger.stopNetworkLogging()) {
                         Slogf.wtf(LOG_TAG, "Network logging could not be stopped due to the logging"
                                 + " service not being available yet.");
                     }
                     mNetworkLogger = null;
-                    mInjector.getNotificationManager().cancel(SystemMessage.NOTE_NETWORK_LOGGING);
                 }
             });
         }
+        if (active) {
+            if (shouldSendNotification[0]) {
+                sendNetworkLoggingNotification();
+            }
+        } else {
+            mInjector.getNotificationManager().cancel(SystemMessage.NOTE_NETWORK_LOGGING);
+        }
     }
 
     private @UserIdInt int getNetworkLoggingAffectedUser() {
@@ -15175,20 +15182,25 @@
         }
     }
 
-    private void sendNetworkLoggingNotificationLocked() {
+    /**
+     * Returns whether it's time to post another network logging notification. When returning true,
+     * this method has the side-effect of updating the recorded last network logging notification
+     * time to now.
+     */
+    private boolean shouldSendNetworkLoggingNotificationLocked() {
         ensureLocked();
         // Send a network logging notification if the admin is a device owner, not profile owner.
         final ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
         if (deviceOwner == null || !deviceOwner.isNetworkLoggingEnabled) {
-            return;
+            return false;
         }
         if (deviceOwner.numNetworkLoggingNotifications
                 >= ActiveAdmin.DEF_MAXIMUM_NETWORK_LOGGING_NOTIFICATIONS_SHOWN) {
-            return;
+            return false;
         }
         final long now = System.currentTimeMillis();
         if (now - deviceOwner.lastNetworkLoggingNotificationTimeMs < MS_PER_DAY) {
-            return;
+            return false;
         }
         deviceOwner.numNetworkLoggingNotifications++;
         if (deviceOwner.numNetworkLoggingNotifications
@@ -15197,6 +15209,11 @@
         } else {
             deviceOwner.lastNetworkLoggingNotificationTimeMs = now;
         }
+        saveSettingsLocked(deviceOwner.getUserHandle().getIdentifier());
+        return true;
+    }
+
+    private void sendNetworkLoggingNotification() {
         final PackageManagerInternal pm = mInjector.getPackageManagerInternal();
         final Intent intent = new Intent(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG);
         intent.setPackage(pm.getSystemUiServiceComponent().getPackageName());
@@ -15215,7 +15232,6 @@
                         .bigText(mContext.getString(R.string.network_logging_notification_text)))
                 .build();
         mInjector.getNotificationManager().notify(SystemMessage.NOTE_NETWORK_LOGGING, notification);
-        saveSettingsLocked(deviceOwner.getUserHandle().getIdentifier());
     }
 
     /**
diff --git a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java
index 8e4cdc9..fbcf53d 100644
--- a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java
@@ -20,22 +20,43 @@
 import static android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
+import android.content.Context;
+import android.content.ContextWrapper;
 import android.os.Binder;
 import android.os.Handler;
+import android.os.IThermalEventListener;
+import android.os.IThermalService;
 import android.os.Message;
+import android.os.PowerManager;
+import android.os.Temperature;
+import android.os.Temperature.ThrottlingStatus;
 import android.os.test.TestLooper;
 import android.platform.test.annotations.Presubmit;
+import android.test.mock.MockContentResolver;
 
+import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.internal.util.test.FakeSettingsProviderRule;
 import com.android.server.display.DisplayDeviceConfig.HighBrightnessModeData;
+import com.android.server.display.HighBrightnessModeController.Injector;
 import com.android.server.testutils.OffsettableClock;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 
 @SmallTest
 @Presubmit
@@ -47,6 +68,8 @@
     private static final long TIME_WINDOW_MILLIS = 55 * 1000;
     private static final long TIME_ALLOWED_IN_WINDOW_MILLIS = 12 * 1000;
     private static final long TIME_MINIMUM_AVAILABLE_TO_ENABLE_MILLIS = 5 * 1000;
+    private static final int THERMAL_STATUS_LIMIT = PowerManager.THERMAL_STATUS_SEVERE;
+    private static final boolean ALLOW_IN_LOW_POWER_MODE = false;
 
     private static final float DEFAULT_MIN = 0.01f;
     private static final float DEFAULT_MAX = 0.80f;
@@ -57,22 +80,30 @@
     private TestLooper mTestLooper;
     private Handler mHandler;
     private Binder mDisplayToken;
+    private Context mContextSpy;
+
+    @Rule
+    public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
+
+    @Mock IThermalService mThermalServiceMock;
+    @Mock Injector mInjectorMock;
+
+    @Captor ArgumentCaptor<IThermalEventListener> mThermalEventListenerCaptor;
 
     private static final HighBrightnessModeData DEFAULT_HBM_DATA =
             new HighBrightnessModeData(MINIMUM_LUX, TRANSITION_POINT, TIME_WINDOW_MILLIS,
-                    TIME_ALLOWED_IN_WINDOW_MILLIS, TIME_MINIMUM_AVAILABLE_TO_ENABLE_MILLIS);
+                    TIME_ALLOWED_IN_WINDOW_MILLIS, TIME_MINIMUM_AVAILABLE_TO_ENABLE_MILLIS,
+                    THERMAL_STATUS_LIMIT, ALLOW_IN_LOW_POWER_MODE);
 
     @Before
     public void setUp() {
-        mClock = new OffsettableClock.Stopped();
-        mTestLooper = new TestLooper(mClock::now);
+        MockitoAnnotations.initMocks(this);
         mDisplayToken = null;
-        mHandler = new Handler(mTestLooper.getLooper(), new Handler.Callback() {
-            @Override
-            public boolean handleMessage(Message msg) {
-                return true;
-            }
-        });
+        mContextSpy = spy(new ContextWrapper(ApplicationProvider.getApplicationContext()));
+        final MockContentResolver resolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
+        when(mContextSpy.getContentResolver()).thenReturn(resolver);
+
+        when(mInjectorMock.getThermalService()).thenReturn(mThermalServiceMock);
     }
 
     /////////////////
@@ -81,15 +112,19 @@
 
     @Test
     public void testNoHbmData() {
+        initHandler(null);
         final HighBrightnessModeController hbmc = new HighBrightnessModeController(
-                mClock::now, mHandler, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, null, () -> {});
+                mInjectorMock, mHandler, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, null,
+                () -> {}, mContextSpy);
         assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
     }
 
     @Test
     public void testNoHbmData_Enabled() {
+        initHandler(null);
         final HighBrightnessModeController hbmc = new HighBrightnessModeController(
-                mClock::now, mHandler, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, null, () -> {});
+                mInjectorMock, mHandler, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, null,
+                () -> {}, mContextSpy);
         hbmc.setAutoBrightnessEnabled(true);
         hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range
         assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
@@ -258,6 +293,54 @@
         assertState(hbmc, DEFAULT_MIN, TRANSITION_POINT, HIGH_BRIGHTNESS_MODE_OFF);
     }
 
+    @Test
+    public void testNoHbmInHighThermalState() throws Exception {
+        final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());
+
+        verify(mThermalServiceMock).registerThermalEventListenerWithType(
+                mThermalEventListenerCaptor.capture(), eq(Temperature.TYPE_SKIN));
+        final IThermalEventListener listener = mThermalEventListenerCaptor.getValue();
+
+        // Set the thermal status too high.
+        listener.notifyThrottling(getSkinTemp(Temperature.THROTTLING_CRITICAL));
+
+        // Try to go into HBM mode but fail
+        hbmc.setAutoBrightnessEnabled(true);
+        hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
+        advanceTime(10);
+
+        assertEquals(HIGH_BRIGHTNESS_MODE_OFF, hbmc.getHighBrightnessMode());
+    }
+
+    @Test
+    public void testHbmTurnsOffInHighThermalState() throws Exception {
+        final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());
+
+        verify(mThermalServiceMock).registerThermalEventListenerWithType(
+                mThermalEventListenerCaptor.capture(), eq(Temperature.TYPE_SKIN));
+        final IThermalEventListener listener = mThermalEventListenerCaptor.getValue();
+
+        // Set the thermal status tolerable
+        listener.notifyThrottling(getSkinTemp(Temperature.THROTTLING_LIGHT));
+
+        // Try to go into HBM mode
+        hbmc.setAutoBrightnessEnabled(true);
+        hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
+        advanceTime(1);
+
+        assertEquals(HIGH_BRIGHTNESS_MODE_SUNLIGHT, hbmc.getHighBrightnessMode());
+
+        // Set the thermal status too high and verify we're off.
+        listener.notifyThrottling(getSkinTemp(Temperature.THROTTLING_CRITICAL));
+        advanceTime(10);
+        assertEquals(HIGH_BRIGHTNESS_MODE_OFF, hbmc.getHighBrightnessMode());
+
+        // Set the thermal status low again and verify we're back on.
+        listener.notifyThrottling(getSkinTemp(Temperature.THROTTLING_SEVERE));
+        advanceTime(1);
+        assertEquals(HIGH_BRIGHTNESS_MODE_SUNLIGHT, hbmc.getHighBrightnessMode());
+    }
+
     private void assertState(HighBrightnessModeController hbmc,
             float brightnessMin, float brightnessMax, int hbmMode) {
         assertEquals(brightnessMin, hbmc.getCurrentBrightnessMin(), EPSILON);
@@ -265,14 +348,35 @@
         assertEquals(hbmMode, hbmc.getHighBrightnessMode());
     }
 
-    // Creates instance with standard initialization values.
     private HighBrightnessModeController createDefaultHbm() {
-        return new HighBrightnessModeController(mClock::now, mHandler, mDisplayToken, DEFAULT_MIN,
-                DEFAULT_MAX, DEFAULT_HBM_DATA, () -> {});
+        return createDefaultHbm(null);
+    }
+
+    // Creates instance with standard initialization values.
+    private HighBrightnessModeController createDefaultHbm(OffsettableClock clock) {
+        initHandler(clock);
+        return new HighBrightnessModeController(mInjectorMock, mHandler, mDisplayToken, DEFAULT_MIN,
+                DEFAULT_MAX, DEFAULT_HBM_DATA, () -> {}, mContextSpy);
+    }
+
+    private void initHandler(OffsettableClock clock) {
+        mClock = clock != null ? clock : new OffsettableClock.Stopped();
+        when(mInjectorMock.getClock()).thenReturn(mClock::now);
+        mTestLooper = new TestLooper(mClock::now);
+        mHandler = new Handler(mTestLooper.getLooper(), new Handler.Callback() {
+            @Override
+            public boolean handleMessage(Message msg) {
+                return true;
+            }
+        });
     }
 
     private void advanceTime(long timeMs) {
         mClock.fastForward(timeMs);
         mTestLooper.dispatchAll();
     }
+
+    private Temperature getSkinTemp(@ThrottlingStatus int status) {
+        return new Temperature(30.0f, Temperature.TYPE_SKIN, "test_skin_temp", status);
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
index aaf40d7..397770b 100644
--- a/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
@@ -26,6 +26,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeFalse;
 import static org.junit.Assume.assumeTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.anyLong;
@@ -36,6 +37,7 @@
 import static org.mockito.Mockito.when;
 
 import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
 import android.content.Context;
 import android.os.Binder;
 import android.os.IBinder;
@@ -43,6 +45,7 @@
 import android.os.Process;
 
 import com.android.server.FgThread;
+import com.android.server.LocalServices;
 import com.android.server.power.hint.HintManagerService.AppHintSession;
 import com.android.server.power.hint.HintManagerService.Injector;
 import com.android.server.power.hint.HintManagerService.NativeWrapper;
@@ -74,6 +77,7 @@
 
     @Mock private Context mContext;
     @Mock private HintManagerService.NativeWrapper mNativeWrapperMock;
+    @Mock private ActivityManagerInternal mAmInternalMock;
 
     private HintManagerService mService;
 
@@ -86,6 +90,9 @@
               eq(DEFAULT_TARGET_DURATION))).thenReturn(1L);
         when(mNativeWrapperMock.halCreateHintSession(eq(TGID), eq(UID), eq(SESSION_TIDS_B),
               eq(DEFAULT_TARGET_DURATION))).thenReturn(2L);
+        when(mAmInternalMock.getIsolatedProcesses(anyInt())).thenReturn(null);
+        LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+        LocalServices.addService(ActivityManagerInternal.class, mAmInternalMock);
     }
 
     private HintManagerService createService() {
@@ -105,6 +112,17 @@
     }
 
     @Test
+    public void testCreateHintSessionInvalidPid() throws Exception {
+        HintManagerService service = createService();
+        IBinder token = new Binder();
+        // Make sure we throw exception when adding a TID doesn't belong to the processes
+        // In this case, we add `init` PID into the list.
+        assertThrows(SecurityException.class,
+                () -> service.getBinderServiceInstance().createHintSession(token,
+                        new int[]{TID, 1}, DEFAULT_TARGET_DURATION));
+    }
+
+    @Test
     public void testCreateHintSession() throws Exception {
         HintManagerService service = createService();
         IBinder token = new Binder();
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
index 6d25e8c..1596483 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
@@ -27,6 +27,7 @@
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -86,6 +87,7 @@
     private static final int VIBRATOR_ID = 1;
     private static final String PACKAGE_NAME = "package";
     private static final VibrationAttributes ATTRS = new VibrationAttributes.Builder().build();
+    private static final int TEST_RAMP_STEP_DURATION = 5;
 
     @Rule
     public MockitoRule mMockitoRule = MockitoJUnit.rule();
@@ -100,6 +102,7 @@
     private IBatteryStats mIBatteryStatsMock;
 
     private final Map<Integer, FakeVibratorControllerProvider> mVibratorProviders = new HashMap<>();
+    private VibrationSettings mVibrationSettings;
     private DeviceVibrationEffectAdapter mEffectAdapter;
     private PowerManager.WakeLock mWakeLock;
     private TestLooper mTestLooper;
@@ -109,9 +112,9 @@
         mTestLooper = new TestLooper();
 
         Context context = InstrumentationRegistry.getContext();
-        VibrationSettings vibrationSettings = new VibrationSettings(context,
-                new Handler(mTestLooper.getLooper()));
-        mEffectAdapter = new DeviceVibrationEffectAdapter(vibrationSettings);
+        mVibrationSettings = new VibrationSettings(context, new Handler(mTestLooper.getLooper()),
+                /* rampDownDuration= */ 0, TEST_RAMP_STEP_DURATION);
+        mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
         mWakeLock = context.getSystemService(
                 PowerManager.class).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*vibrator*");
 
@@ -128,8 +131,7 @@
         waitForCompletion(thread);
 
         verify(mControllerCallbacks, never()).onComplete(anyInt(), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId),
-                eq(Vibration.Status.IGNORED_UNSUPPORTED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.IGNORED_UNSUPPORTED);
     }
 
     @Test
@@ -143,8 +145,7 @@
         waitForCompletion(thread);
 
         verify(mControllerCallbacks, never()).onComplete(anyInt(), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId),
-                eq(Vibration.Status.IGNORED_UNSUPPORTED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.IGNORED_UNSUPPORTED);
     }
 
     @Test
@@ -159,7 +160,7 @@
         verify(mIBatteryStatsMock).noteVibratorOn(eq(UID), eq(10L));
         verify(mIBatteryStatsMock).noteVibratorOff(eq(UID));
         verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
 
         assertEquals(Arrays.asList(expectedOneShot(10)),
@@ -178,7 +179,7 @@
         verify(mIBatteryStatsMock).noteVibratorOn(eq(UID), eq(10L));
         verify(mIBatteryStatsMock).noteVibratorOff(eq(UID));
         verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
 
         assertEquals(Arrays.asList(expectedOneShot(10)),
@@ -200,7 +201,7 @@
         verify(mIBatteryStatsMock).noteVibratorOn(eq(UID), eq(15L));
         verify(mIBatteryStatsMock).noteVibratorOff(eq(UID));
         verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
 
         assertEquals(Arrays.asList(expectedOneShot(15)),
@@ -232,7 +233,7 @@
 
         verify(mIBatteryStatsMock).noteVibratorOn(eq(UID), anyLong());
         verify(mIBatteryStatsMock).noteVibratorOff(eq(UID));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.CANCELLED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.CANCELLED);
         assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
 
         List<Float> playedAmplitudes = fakeVibrator.getAmplitudes();
@@ -269,7 +270,7 @@
         waitForCompletion(vibrationThread, /* timeout= */ 50);
         waitForCompletion(cancellingThread);
 
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.CANCELLED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.CANCELLED);
         assertFalse(vibrationThread.getVibrators().get(VIBRATOR_ID).isVibrating());
     }
 
@@ -294,7 +295,7 @@
         waitForCompletion(vibrationThread, /* timeout= */ 50);
         waitForCompletion(cancellingThread);
 
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.CANCELLED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.CANCELLED);
         assertFalse(vibrationThread.getVibrators().get(VIBRATOR_ID).isVibrating());
     }
 
@@ -310,7 +311,7 @@
         verify(mIBatteryStatsMock).noteVibratorOn(eq(UID), eq(20L));
         verify(mIBatteryStatsMock).noteVibratorOff(eq(UID));
         verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
 
         assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_THUD)),
@@ -333,7 +334,7 @@
         verify(mIBatteryStatsMock).noteVibratorOn(eq(UID), eq(10L));
         verify(mIBatteryStatsMock).noteVibratorOff(eq(UID));
         verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
 
         assertEquals(Arrays.asList(expectedOneShot(10)),
@@ -352,8 +353,7 @@
         verify(mIBatteryStatsMock, never()).noteVibratorOn(eq(UID), anyLong());
         verify(mIBatteryStatsMock, never()).noteVibratorOff(eq(UID));
         verify(mControllerCallbacks, never()).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId),
-                eq(Vibration.Status.IGNORED_UNSUPPORTED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.IGNORED_UNSUPPORTED);
         assertTrue(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments().isEmpty());
     }
 
@@ -373,7 +373,7 @@
         verify(mIBatteryStatsMock).noteVibratorOn(eq(UID), eq(40L));
         verify(mIBatteryStatsMock).noteVibratorOff(eq(UID));
         verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
         assertEquals(Arrays.asList(
                 expectedPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 0),
@@ -393,8 +393,7 @@
         verify(mIBatteryStatsMock, never()).noteVibratorOn(eq(UID), anyLong());
         verify(mIBatteryStatsMock, never()).noteVibratorOff(eq(UID));
         verify(mControllerCallbacks, never()).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId),
-                eq(Vibration.Status.IGNORED_UNSUPPORTED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.IGNORED_UNSUPPORTED);
         assertTrue(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments().isEmpty());
     }
 
@@ -413,7 +412,7 @@
         VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
         waitForCompletion(thread);
 
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         // Vibrator compose called twice.
         verify(mControllerCallbacks, times(2)).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
         assertEquals(3, fakeVibrator.getEffectSegments().size());
@@ -443,7 +442,7 @@
         verify(mIBatteryStatsMock).noteVibratorOn(eq(UID), eq(10L));
         verify(mIBatteryStatsMock).noteVibratorOff(eq(UID));
         verify(mControllerCallbacks, times(4)).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
         assertEquals(Arrays.asList(
                 expectedOneShot(10),
@@ -479,7 +478,7 @@
         verify(mIBatteryStatsMock).noteVibratorOn(eq(UID), eq(100L));
         verify(mIBatteryStatsMock).noteVibratorOff(eq(UID));
         verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
         assertEquals(Arrays.asList(
                 expectedRamp(/* amplitude= */ 1, /* frequency= */ 150, /* duration= */ 10),
@@ -512,7 +511,7 @@
         VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
         waitForCompletion(thread);
 
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         // Vibrator compose called twice.
         verify(mControllerCallbacks, times(2)).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
         assertEquals(4, fakeVibrator.getEffectSegments().size());
@@ -537,7 +536,7 @@
         waitForCompletion(thread);
         assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
 
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.CANCELLED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.CANCELLED);
     }
 
     @Test
@@ -545,10 +544,10 @@
         mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
 
         long vibrationId = 1;
-        waitForCompletion(startThreadAndDispatcher(vibrationId++,
+        waitForCompletion(startThreadAndDispatcher(vibrationId,
                 VibrationEffect.createOneShot(10, 100)));
 
-        verify(mThreadCallbacks).onVibrationEnded(anyLong(), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         verify(mThreadCallbacks, never()).prepareSyncedVibration(anyLong(), any());
         verify(mThreadCallbacks, never()).triggerSyncedVibration(anyLong());
         verify(mThreadCallbacks, never()).cancelSyncedVibration();
@@ -571,7 +570,7 @@
         verify(mIBatteryStatsMock).noteVibratorOff(eq(UID));
         verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
         verify(mControllerCallbacks, never()).onComplete(eq(2), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
 
         assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_TICK)),
@@ -596,7 +595,7 @@
         verify(mControllerCallbacks).onComplete(eq(1), eq(vibrationId));
         verify(mControllerCallbacks).onComplete(eq(2), eq(vibrationId));
         verify(mControllerCallbacks).onComplete(eq(3), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(1).isVibrating());
         assertFalse(thread.getVibrators().get(2).isVibrating());
         assertFalse(thread.getVibrators().get(3).isVibrating());
@@ -635,7 +634,7 @@
         verify(mControllerCallbacks).onComplete(eq(2), eq(vibrationId));
         verify(mControllerCallbacks).onComplete(eq(3), eq(vibrationId));
         verify(mControllerCallbacks).onComplete(eq(4), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(1).isVibrating());
         assertFalse(thread.getVibrators().get(2).isVibrating());
         assertFalse(thread.getVibrators().get(3).isVibrating());
@@ -686,7 +685,7 @@
         batterVerifier.verify(mIBatteryStatsMock).noteVibratorOn(eq(UID), eq(20L));
         batterVerifier.verify(mIBatteryStatsMock).noteVibratorOff(eq(UID));
 
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(1).isVibrating());
         assertFalse(thread.getVibrators().get(2).isVibrating());
         assertFalse(thread.getVibrators().get(3).isVibrating());
@@ -727,7 +726,7 @@
         verify(mThreadCallbacks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
         verify(mThreadCallbacks).triggerSyncedVibration(eq(vibrationId));
         verify(mThreadCallbacks, never()).cancelSyncedVibration();
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
 
         VibrationEffectSegment expected = expectedPrimitive(
                 VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 100);
@@ -767,7 +766,7 @@
         verify(mThreadCallbacks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
         verify(mThreadCallbacks).triggerSyncedVibration(eq(vibrationId));
         verify(mThreadCallbacks, never()).cancelSyncedVibration();
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
     }
 
     @Test
@@ -858,7 +857,7 @@
         verify(mControllerCallbacks).onComplete(eq(1), eq(vibrationId));
         verify(mControllerCallbacks).onComplete(eq(2), eq(vibrationId));
         verify(mControllerCallbacks).onComplete(eq(3), eq(vibrationId));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.FINISHED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
         assertFalse(thread.getVibrators().get(1).isVibrating());
         assertFalse(thread.getVibrators().get(2).isVibrating());
         assertFalse(thread.getVibrators().get(3).isVibrating());
@@ -935,7 +934,7 @@
 
         // After the vibrator call ends the vibration is cancelled and the vibrator is turned off.
         waitForCompletion(vibrationThread, /* timeout= */ latency + TEST_TIMEOUT_MILLIS);
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.CANCELLED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.CANCELLED);
         assertFalse(vibrationThread.getVibrators().get(VIBRATOR_ID).isVibrating());
     }
 
@@ -968,7 +967,7 @@
         waitForCompletion(vibrationThread, /* timeout= */ 50);
         waitForCompletion(cancellingThread);
 
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.CANCELLED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.CANCELLED);
         assertFalse(vibrationThread.getVibrators().get(1).isVibrating());
         assertFalse(vibrationThread.getVibrators().get(2).isVibrating());
     }
@@ -1000,7 +999,7 @@
         waitForCompletion(vibrationThread, /* timeout= */ 50);
         waitForCompletion(cancellingThread);
 
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.CANCELLED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.CANCELLED);
         assertFalse(vibrationThread.getVibrators().get(1).isVibrating());
         assertFalse(vibrationThread.getVibrators().get(2).isVibrating());
     }
@@ -1020,11 +1019,179 @@
 
         verify(mVibrationToken).linkToDeath(same(thread), eq(0));
         verify(mVibrationToken).unlinkToDeath(same(thread), eq(0));
-        verify(mThreadCallbacks).onVibrationEnded(eq(vibrationId), eq(Vibration.Status.CANCELLED));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.CANCELLED);
         assertFalse(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments().isEmpty());
         assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
     }
 
+    @Test
+    public void vibrate_waveformWithRampDown_addsRampDownAfterVibrationCompleted() {
+        int rampDownDuration = 15;
+        mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
+                new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+        mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
+        mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
+
+        long vibrationId = 1;
+        VibrationEffect effect = VibrationEffect.createWaveform(
+                new long[]{5, 5, 5}, new int[]{60, 120, 240}, -1);
+        VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
+        waitForCompletion(thread);
+
+        verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
+
+        // Duration extended for 5 + 5 + 5 + 15.
+        assertEquals(Arrays.asList(expectedOneShot(30)),
+                mVibratorProviders.get(VIBRATOR_ID).getEffectSegments());
+        List<Float> amplitudes = mVibratorProviders.get(VIBRATOR_ID).getAmplitudes();
+        assertTrue(amplitudes.size() > 3);
+        assertEquals(expectedAmplitudes(60, 120, 240), amplitudes.subList(0, 3));
+        for (int i = 3; i < amplitudes.size(); i++) {
+            assertTrue(amplitudes.get(i) < amplitudes.get(i - 1));
+        }
+    }
+
+    @Test
+    public void vibrate_waveformWithRampDown_triggersCallbackWhenOriginalVibrationEnds() {
+        int rampDownDuration = 10_000;
+        mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
+                new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+        mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
+        mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
+
+        long vibrationId = 1;
+        VibrationEffect effect = VibrationEffect.createOneShot(10, 200);
+        VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
+
+        // Vibration completed but vibrator not yet released.
+        verify(mThreadCallbacks, timeout(TEST_TIMEOUT_MILLIS)).onVibrationCompleted(eq(vibrationId),
+                eq(Vibration.Status.FINISHED));
+        verify(mThreadCallbacks, never()).onVibratorsReleased();
+
+        // Thread still running ramp down.
+        assertTrue(thread.isAlive());
+
+        // Duration extended for 10 + 10000.
+        assertEquals(Arrays.asList(expectedOneShot(10_010)),
+                mVibratorProviders.get(VIBRATOR_ID).getEffectSegments());
+
+        // Will stop the ramp down right away.
+        thread.cancelImmediately();
+        waitForCompletion(thread);
+
+        // Does not cancel already finished vibration, but releases vibrator.
+        verify(mThreadCallbacks, never()).onVibrationCompleted(eq(vibrationId),
+                eq(Vibration.Status.CANCELLED));
+        verify(mThreadCallbacks).onVibratorsReleased();
+    }
+
+    @Test
+    public void vibrate_waveformCancelledWithRampDown_addsRampDownAfterVibrationCancelled()
+            throws Exception {
+        int rampDownDuration = 15;
+        mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
+                new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+        mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
+        mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
+
+        long vibrationId = 1;
+        VibrationEffect effect = VibrationEffect.createOneShot(10_000, 240);
+        VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
+        assertTrue(waitUntil(t -> t.getVibrators().get(VIBRATOR_ID).isVibrating(), thread,
+                TEST_TIMEOUT_MILLIS));
+        thread.cancel();
+        waitForCompletion(thread);
+
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.CANCELLED);
+
+        // Duration extended for 10000 + 15.
+        assertEquals(Arrays.asList(expectedOneShot(10_015)),
+                mVibratorProviders.get(VIBRATOR_ID).getEffectSegments());
+        List<Float> amplitudes = mVibratorProviders.get(VIBRATOR_ID).getAmplitudes();
+        assertTrue(amplitudes.size() > 1);
+        for (int i = 1; i < amplitudes.size(); i++) {
+            assertTrue(amplitudes.get(i) < amplitudes.get(i - 1));
+        }
+    }
+
+    @Test
+    public void vibrate_predefinedWithRampDown_doesNotAddRampDown() {
+        int rampDownDuration = 15;
+        mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
+                new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+        mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
+        mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
+        mVibratorProviders.get(VIBRATOR_ID).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
+
+        long vibrationId = 1;
+        VibrationEffect effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
+        VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
+        waitForCompletion(thread);
+
+        verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
+
+        assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
+                mVibratorProviders.get(VIBRATOR_ID).getEffectSegments());
+        assertTrue(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes().isEmpty());
+    }
+
+    @Test
+    public void vibrate_composedWithRampDown_doesNotAddRampDown() {
+        int rampDownDuration = 15;
+        mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
+                new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+        mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
+        mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL,
+                IVibrator.CAP_COMPOSE_EFFECTS);
+        mVibratorProviders.get(VIBRATOR_ID).setSupportedPrimitives(
+                VibrationEffect.Composition.PRIMITIVE_CLICK);
+
+        long vibrationId = 1;
+        VibrationEffect effect = VibrationEffect.startComposition()
+                .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK)
+                .compose();
+        VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
+        waitForCompletion(thread);
+
+        verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
+
+        assertEquals(
+                Arrays.asList(expectedPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 0)),
+                mVibratorProviders.get(VIBRATOR_ID).getEffectSegments());
+        assertTrue(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes().isEmpty());
+    }
+
+    @Test
+    public void vibrate_pwleWithRampDown_doesNotAddRampDown() {
+        int rampDownDuration = 15;
+        mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
+                new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+        mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
+        FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(VIBRATOR_ID);
+        fakeVibrator.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL,
+                IVibrator.CAP_COMPOSE_PWLE_EFFECTS);
+        fakeVibrator.setMinFrequency(100);
+        fakeVibrator.setResonantFrequency(150);
+        fakeVibrator.setFrequencyResolution(50);
+        fakeVibrator.setMaxAmplitudes(1, 1, 1);
+        fakeVibrator.setPwleSizeMax(2);
+
+        long vibrationId = 1;
+        VibrationEffect effect = VibrationEffect.startWaveform().addRamp(1, 1).build();
+        VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
+        waitForCompletion(thread);
+
+        verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibrationId));
+        verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
+
+        assertEquals(Arrays.asList(expectedRamp(0, 1, 150, 150, 1)),
+                fakeVibrator.getEffectSegments());
+        assertTrue(fakeVibrator.getAmplitudes().isEmpty());
+    }
+
     private void mockVibrators(int... vibratorIds) {
         for (int vibratorId : vibratorIds) {
             mVibratorProviders.put(vibratorId,
@@ -1042,7 +1209,7 @@
     }
 
     private VibrationThread startThreadAndDispatcher(Vibration vib) {
-        VibrationThread thread = new VibrationThread(vib, mEffectAdapter,
+        VibrationThread thread = new VibrationThread(vib, mVibrationSettings, mEffectAdapter,
                 createVibratorControllers(), mWakeLock, mIBatteryStatsMock, mThreadCallbacks);
         doAnswer(answer -> {
             thread.vibratorComplete(answer.getArgument(0));
@@ -1117,4 +1284,9 @@
                 .mapToObj(amplitude -> amplitude / 255f)
                 .collect(Collectors.toList());
     }
+
+    private void verifyCallbacksTriggered(long vibrationId, Vibration.Status expectedStatus) {
+        verify(mThreadCallbacks).onVibrationCompleted(eq(vibrationId), eq(expectedStatus));
+        verify(mThreadCallbacks).onVibratorsReleased();
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
index 9117ae6..77003b2 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
@@ -67,6 +67,7 @@
 import android.os.test.TestLooper;
 import android.os.vibrator.PrebakedSegment;
 import android.os.vibrator.PrimitiveSegment;
+import android.os.vibrator.VibrationEffectSegment;
 import android.platform.test.annotations.Presubmit;
 import android.provider.Settings;
 import android.view.InputDevice;
@@ -470,13 +471,14 @@
         mockVibrators(1);
         FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(1);
         mVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM);
-        fakeVibrator.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
+        fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK,
+                VibrationEffect.EFFECT_HEAVY_CLICK, VibrationEffect.EFFECT_DOUBLE_CLICK);
 
         setRingerMode(AudioManager.RINGER_MODE_NORMAL);
         setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
         setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 0);
         VibratorManagerService service = createSystemReadyService();
-        vibrate(service, VibrationEffect.createOneShot(1, 1), RINGTONE_ATTRS);
+        vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_CLICK), RINGTONE_ATTRS);
         // Wait before checking it never played.
         assertFalse(waitUntil(s -> !fakeVibrator.getEffectSegments().isEmpty(),
                 service, /* timeout= */ 50));
@@ -484,43 +486,52 @@
         setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
         setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 1);
         service = createSystemReadyService();
-        vibrate(service, VibrationEffect.createOneShot(1, 10), RINGTONE_ATTRS);
+        vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_HEAVY_CLICK), RINGTONE_ATTRS);
         assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 1,
                 service, TEST_TIMEOUT_MILLIS));
 
         setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
         setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 0);
         service = createSystemReadyService();
-        vibrate(service, VibrationEffect.createOneShot(1, 100), RINGTONE_ATTRS);
+        vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK), RINGTONE_ATTRS);
         assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 2,
                 service, TEST_TIMEOUT_MILLIS));
 
-        assertEquals(Arrays.asList(10 / 255f, 100 / 255f),
-                mVibratorProviders.get(1).getAmplitudes());
+        assertEquals(
+                Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_HEAVY_CLICK),
+                        expectedPrebaked(VibrationEffect.EFFECT_DOUBLE_CLICK)),
+                mVibratorProviders.get(1).getEffectSegments());
     }
 
     @Test
     public void vibrate_withPowerMode_usesPowerModeState() throws Exception {
         mockVibrators(1);
         FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(1);
-        fakeVibrator.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
+        fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_TICK, VibrationEffect.EFFECT_CLICK,
+                VibrationEffect.EFFECT_HEAVY_CLICK, VibrationEffect.EFFECT_DOUBLE_CLICK);
         VibratorManagerService service = createSystemReadyService();
         mRegisteredPowerModeListener.onLowPowerModeChanged(LOW_POWER_STATE);
-        vibrate(service, VibrationEffect.createOneShot(1, 1), HAPTIC_FEEDBACK_ATTRS);
-        vibrate(service, VibrationEffect.createOneShot(2, 2), RINGTONE_ATTRS);
+        vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_TICK), HAPTIC_FEEDBACK_ATTRS);
+        vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_CLICK), RINGTONE_ATTRS);
         assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 1,
                 service, TEST_TIMEOUT_MILLIS));
 
         mRegisteredPowerModeListener.onLowPowerModeChanged(NORMAL_POWER_STATE);
-        vibrate(service, VibrationEffect.createOneShot(3, 3), /* attributes= */ null);
+        vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_HEAVY_CLICK),
+                /* attrs= */ null);
         assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 2,
                 service, TEST_TIMEOUT_MILLIS));
 
-        vibrate(service, VibrationEffect.createOneShot(4, 4), NOTIFICATION_ATTRS);
+        vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK),
+                NOTIFICATION_ATTRS);
         assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 3,
                 service, TEST_TIMEOUT_MILLIS));
 
-        assertEquals(Arrays.asList(2 / 255f, 3 / 255f, 4 / 255f), fakeVibrator.getAmplitudes());
+        assertEquals(
+                Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK),
+                        expectedPrebaked(VibrationEffect.EFFECT_HEAVY_CLICK),
+                        expectedPrebaked(VibrationEffect.EFFECT_DOUBLE_CLICK)),
+                mVibratorProviders.get(1).getEffectSegments());
     }
 
     @Test
@@ -836,7 +847,6 @@
         vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_CLICK), RINGTONE_ATTRS);
 
         assertEquals(4, fakeVibrator.getEffectSegments().size());
-        assertEquals(1, fakeVibrator.getAmplitudes().size());
 
         // Notification vibrations will be scaled with SCALE_VERY_HIGH.
         assertTrue(0.6 < fakeVibrator.getAmplitudes().get(0));
@@ -957,6 +967,10 @@
         assertTrue(waitUntil(s -> !s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
     }
 
+    private VibrationEffectSegment expectedPrebaked(int effectId) {
+        return new PrebakedSegment(effectId, false, VibrationEffect.EFFECT_STRENGTH_MEDIUM);
+    }
+
     private void mockCapabilities(long... capabilities) {
         when(mNativeWrapperMock.getCapabilities()).thenReturn(
                 Arrays.stream(capabilities).reduce(0, (a, b) -> a | b));
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index b7713a9..a1f1610 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -46,6 +46,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
 import static android.view.WindowManager.TRANSIT_CLOSE;
 import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_OPEN;
+import static android.window.StartingWindowInfo.TYPE_PARAMETER_LEGACY_SPLASH_SCREEN;
 
 import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
 
@@ -111,11 +112,13 @@
 import android.content.res.Resources;
 import android.graphics.Point;
 import android.graphics.Rect;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.PersistableBundle;
 import android.os.Process;
 import android.os.RemoteException;
 import android.platform.test.annotations.Presubmit;
+import android.provider.DeviceConfig;
 import android.util.MergedConfiguration;
 import android.util.MutableBoolean;
 import android.view.DisplayInfo;
@@ -135,6 +138,7 @@
 import com.android.internal.R;
 import com.android.server.wm.Task.ActivityState;
 
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -2457,6 +2461,40 @@
         assertNoStartingWindow(activity);
     }
 
+    private void testLegacySplashScreen(int targetSdk, int verifyType) {
+        final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build();
+        activity.mTargetSdk = targetSdk;
+        activity.addStartingWindow(mPackageName,
+                android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true,
+                false, false);
+        waitUntilHandlersIdle();
+        assertHasStartingWindow(activity);
+        assertEquals(activity.mStartingData.mTypeParams & TYPE_PARAMETER_LEGACY_SPLASH_SCREEN,
+                verifyType);
+        activity.removeStartingWindow();
+        waitUntilHandlersIdle();
+        assertNoStartingWindow(activity);
+    }
+
+    @Test
+    public void testCreateRemoveLegacySplashScreenWindow() {
+        registerTestStartingWindowOrganizer();
+        DeviceConfig.Properties properties = DeviceConfig.getProperties(
+                DeviceConfig.NAMESPACE_WINDOW_MANAGER);
+        try {
+            DeviceConfig.setProperty(DeviceConfig.NAMESPACE_WINDOW_MANAGER,
+                    "splash_screen_exception_list", DEFAULT_COMPONENT_PACKAGE_NAME, false);
+            testLegacySplashScreen(Build.VERSION_CODES.R, TYPE_PARAMETER_LEGACY_SPLASH_SCREEN);
+            testLegacySplashScreen(Build.VERSION_CODES.S, 0);
+        } finally {
+            try {
+                DeviceConfig.setProperties(properties);
+            } catch (DeviceConfig.BadConfigException e) {
+                Assert.fail(e.getMessage());
+            }
+        }
+    }
+
     @Test
     public void testTransferStartingWindow() {
         registerTestStartingWindowOrganizer();
diff --git a/services/tests/wmtests/src/com/android/server/wm/FrameRateSelectionPriorityTests.java b/services/tests/wmtests/src/com/android/server/wm/FrameRateSelectionPriorityTests.java
index e6348a5..13ebc93 100644
--- a/services/tests/wmtests/src/com/android/server/wm/FrameRateSelectionPriorityTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/FrameRateSelectionPriorityTests.java
@@ -228,7 +228,7 @@
     }
 
     @Test
-    public void testPreferredRefreshRate() {
+    public void testDenyListPreferredRefreshRate() {
         final WindowState appWindow = createWindow("appWindow");
         assertNotNull("Window state is created", appWindow);
         when(appWindow.getDisplayContent().getDisplayPolicy()).thenReturn(mDisplayPolicy);
@@ -281,4 +281,32 @@
         verify(appWindow.getPendingTransaction(), never()).setFrameRate(
                 any(SurfaceControl.class), anyInt(), anyInt(), anyInt());
     }
+
+    @Test
+    public void testAppPreferredRefreshRate() {
+        final WindowState appWindow = createWindow("appWindow");
+        assertNotNull("Window state is created", appWindow);
+        when(appWindow.getDisplayContent().getDisplayPolicy()).thenReturn(mDisplayPolicy);
+
+        appWindow.mAttrs.packageName = "com.android.test";
+        appWindow.mAttrs.preferredRefreshRate = 60;
+
+        assertEquals(0, mRefreshRatePolicy.getPreferredModeId(appWindow));
+        assertEquals(60, mRefreshRatePolicy.getPreferredRefreshRate(appWindow), FLOAT_TOLERANCE);
+
+        appWindow.updateFrameRateSelectionPriorityIfNeeded();
+        assertEquals(RefreshRatePolicy.LAYER_PRIORITY_UNSET, appWindow.mFrameRateSelectionPriority);
+        assertEquals(60, appWindow.mAppPreferredFrameRate, FLOAT_TOLERANCE);
+
+        // Call the function a few times.
+        appWindow.updateFrameRateSelectionPriorityIfNeeded();
+        appWindow.updateFrameRateSelectionPriorityIfNeeded();
+
+        // Since nothing changed in the priority state, the transaction should not be updating.
+        verify(appWindow.getPendingTransaction(), never()).setFrameRateSelectionPriority(
+                any(SurfaceControl.class), anyInt());
+        verify(appWindow.getPendingTransaction(), times(1)).setFrameRate(
+                appWindow.getSurfaceControl(), 60,
+                Surface.FRAME_RATE_COMPATIBILITY_EXACT, Surface.CHANGE_FRAME_RATE_ALWAYS);
+    }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
index b41872b..c4cccf0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
@@ -27,7 +27,6 @@
 import android.os.Parcel;
 import android.platform.test.annotations.Presubmit;
 import android.view.Display.Mode;
-import android.view.DisplayInfo;
 import android.view.WindowManager.LayoutParams;
 
 import androidx.test.filters.FlakyTest;
@@ -47,7 +46,14 @@
 @FlakyTest
 public class RefreshRatePolicyTest extends WindowTestsBase {
     private static final float FLOAT_TOLERANCE = 0.01f;
+    private static final int HI_MODE_ID = 1;
+    private static final float HI_REFRESH_RATE = 90;
+
+    private static final int MID_MODE_ID = 2;
+    private static final float MID_REFRESH_RATE = 70;
+
     private static final int LOW_MODE_ID = 3;
+    private static final float LOW_REFRESH_RATE = 60;
 
     private RefreshRatePolicy mPolicy;
     private HighRefreshRateDenylist mDenylist = mock(HighRefreshRateDenylist.class);
@@ -64,22 +70,31 @@
 
     @Before
     public void setUp() {
-        DisplayInfo di = new DisplayInfo(mDisplayInfo);
-        Mode defaultMode = di.getDefaultMode();
-        di.supportedModes = new Mode[] {
-                new Mode(1, defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(), 90),
-                new Mode(2, defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(), 70),
+        Mode defaultMode = mDisplayInfo.getDefaultMode();
+        mDisplayInfo.supportedModes = new Mode[] {
+                new Mode(HI_MODE_ID,
+                        defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(),
+                        HI_REFRESH_RATE),
+                new Mode(MID_MODE_ID,
+                        defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(),
+                        MID_REFRESH_RATE),
                 new Mode(LOW_MODE_ID,
-                        defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(), 60),
+                        defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(),
+                        LOW_REFRESH_RATE),
         };
-        di.defaultModeId = 1;
-        mPolicy = new RefreshRatePolicy(mWm, di, mDenylist);
+        mDisplayInfo.defaultModeId = HI_MODE_ID;
+        mPolicy = new RefreshRatePolicy(mWm, mDisplayInfo, mDenylist);
+    }
+
+    WindowState createWindow(String name) {
+        WindowState window = createWindow(null, TYPE_BASE_APPLICATION, name);
+        when(window.getDisplayInfo()).thenReturn(mDisplayInfo);
+        return window;
     }
 
     @Test
     public void testCamera() {
-        final WindowState cameraUsingWindow = createWindow(null, TYPE_BASE_APPLICATION,
-                "cameraUsingWindow");
+        final WindowState cameraUsingWindow = createWindow("cameraUsingWindow");
         cameraUsingWindow.mAttrs.packageName = "com.android.test";
         parcelLayoutParams(cameraUsingWindow);
         assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
@@ -90,60 +105,101 @@
         assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
         assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
         assertEquals(0, mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
-        assertEquals(60, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
+        assertEquals(LOW_REFRESH_RATE,
+                mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
         mPolicy.removeNonHighRefreshRatePackage("com.android.test");
         assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
         assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
     }
 
     @Test
     public void testDenyList() {
-        final WindowState denylistedWindow = createWindow(null, TYPE_BASE_APPLICATION,
-                "denylistedWindow");
+        final WindowState denylistedWindow = createWindow("denylistedWindow");
         denylistedWindow.mAttrs.packageName = "com.android.test";
         parcelLayoutParams(denylistedWindow);
         when(mDenylist.isDenylisted("com.android.test")).thenReturn(true);
         assertEquals(0, mPolicy.getPreferredModeId(denylistedWindow));
-        assertEquals(60, mPolicy.getPreferredRefreshRate(denylistedWindow), FLOAT_TOLERANCE);
+        assertEquals(LOW_REFRESH_RATE,
+                mPolicy.getPreferredRefreshRate(denylistedWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMinRefreshRate(denylistedWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMaxRefreshRate(denylistedWindow), FLOAT_TOLERANCE);
     }
 
     @Test
-    public void testAppOverride_blacklist() {
-        final WindowState overrideWindow = createWindow(null, TYPE_BASE_APPLICATION,
-                "overrideWindow");
+    public void testAppOverridePreferredModeId_denylist() {
+        final WindowState overrideWindow = createWindow("overrideWindow");
         overrideWindow.mAttrs.packageName = "com.android.test";
-        overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
+        overrideWindow.mAttrs.preferredDisplayModeId = HI_MODE_ID;
         parcelLayoutParams(overrideWindow);
         when(mDenylist.isDenylisted("com.android.test")).thenReturn(true);
-        assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
-        assertEquals(60, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
-    }
-
-    @Test
-    public void testAppOverride_camera() {
-        final WindowState overrideWindow = createWindow(null, TYPE_BASE_APPLICATION,
-                "overrideWindow");
-        overrideWindow.mAttrs.packageName = "com.android.test";
-        overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
-        parcelLayoutParams(overrideWindow);
-        mPolicy.addNonHighRefreshRatePackage("com.android.test");
-        assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
-        assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(HI_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
+        assertEquals(HI_REFRESH_RATE,
+                mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
         assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
         assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
     }
 
     @Test
-    public void testAnimatingAppOverride() {
-        final WindowState overrideWindow = createWindow(null, TYPE_BASE_APPLICATION,
-                "overrideWindow");
+    public void testAppOverridePreferredRefreshRate_denylist() {
+        final WindowState overrideWindow = createWindow("overrideWindow");
+        overrideWindow.mAttrs.packageName = "com.android.test";
+        overrideWindow.mAttrs.preferredRefreshRate = HI_REFRESH_RATE;
+        parcelLayoutParams(overrideWindow);
+        when(mDenylist.isDenylisted("com.android.test")).thenReturn(true);
+        assertEquals(0, mPolicy.getPreferredModeId(overrideWindow));
+        assertEquals(HI_REFRESH_RATE,
+                mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+    }
+
+    @Test
+    public void testAppOverridePreferredModeId_camera() {
+        final WindowState overrideWindow = createWindow("overrideWindow");
+        overrideWindow.mAttrs.packageName = "com.android.test";
+        overrideWindow.mAttrs.preferredDisplayModeId = HI_MODE_ID;
+        parcelLayoutParams(overrideWindow);
+        mPolicy.addNonHighRefreshRatePackage("com.android.test");
+        assertEquals(HI_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
+        assertEquals(HI_REFRESH_RATE,
+                mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(LOW_REFRESH_RATE,
+                mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+    }
+
+    @Test
+    public void testAppOverridePreferredRefreshRate_camera() {
+        final WindowState overrideWindow = createWindow("overrideWindow");
+        overrideWindow.mAttrs.packageName = "com.android.test";
+        overrideWindow.mAttrs.preferredRefreshRate = HI_REFRESH_RATE;
+        parcelLayoutParams(overrideWindow);
+        mPolicy.addNonHighRefreshRatePackage("com.android.test");
+        assertEquals(0, mPolicy.getPreferredModeId(overrideWindow));
+        assertEquals(HI_REFRESH_RATE,
+                mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(LOW_REFRESH_RATE,
+                mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+    }
+
+    @Test
+    public void testAnimatingAppOverridePreferredModeId() {
+        final WindowState overrideWindow = createWindow("overrideWindow");
         overrideWindow.mAttrs.packageName = "com.android.test";
         overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
         parcelLayoutParams(overrideWindow);
+        assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
+        assertEquals(LOW_REFRESH_RATE,
+                mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+
         overrideWindow.mActivityRecord.mSurfaceAnimator.startAnimation(
                 overrideWindow.getPendingTransaction(), mock(AnimationAdapter.class),
                 false /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
-        mPolicy.addNonHighRefreshRatePackage("com.android.test");
         assertEquals(0, mPolicy.getPreferredModeId(overrideWindow));
         assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
         assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
@@ -151,9 +207,50 @@
     }
 
     @Test
+    public void testAnimatingAppOverridePreferredRefreshRate() {
+        final WindowState overrideWindow = createWindow("overrideWindow");
+        overrideWindow.mAttrs.packageName = "com.android.test";
+        overrideWindow.mAttrs.preferredRefreshRate = LOW_REFRESH_RATE;
+        parcelLayoutParams(overrideWindow);
+        assertEquals(0, mPolicy.getPreferredModeId(overrideWindow));
+        assertEquals(LOW_REFRESH_RATE,
+                mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+
+        overrideWindow.mActivityRecord.mSurfaceAnimator.startAnimation(
+                overrideWindow.getPendingTransaction(), mock(AnimationAdapter.class),
+                false /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
+        assertEquals(0, mPolicy.getPreferredModeId(overrideWindow));
+        assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
+    }
+
+    @Test
+    public void testAnimatingDenylist() {
+        final WindowState window = createWindow("overrideWindow");
+        window.mAttrs.packageName = "com.android.test";
+        parcelLayoutParams(window);
+        when(mDenylist.isDenylisted("com.android.test")).thenReturn(true);
+        assertEquals(0, mPolicy.getPreferredModeId(window));
+        assertEquals(LOW_REFRESH_RATE,
+                mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
+
+        window.mActivityRecord.mSurfaceAnimator.startAnimation(
+                window.getPendingTransaction(), mock(AnimationAdapter.class),
+                false /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
+        assertEquals(0, mPolicy.getPreferredModeId(window));
+        assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
+    }
+
+    @Test
     public void testAnimatingCamera() {
-        final WindowState cameraUsingWindow = createWindow(null, TYPE_BASE_APPLICATION,
-                "cameraUsingWindow");
+        final WindowState cameraUsingWindow = createWindow("cameraUsingWindow");
         cameraUsingWindow.mAttrs.packageName = "com.android.test";
         parcelLayoutParams(cameraUsingWindow);
 
@@ -161,7 +258,8 @@
         assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
         assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
         assertEquals(0, mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
-        assertEquals(60, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
+        assertEquals(LOW_REFRESH_RATE,
+                mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
 
         cameraUsingWindow.mActivityRecord.mSurfaceAnimator.startAnimation(
                 cameraUsingWindow.getPendingTransaction(), mock(AnimationAdapter.class),
@@ -174,13 +272,13 @@
 
     @Test
     public void testAppMaxRefreshRate() {
-        final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, "window");
-        window.mAttrs.preferredMaxDisplayRefreshRate = 60f;
+        final WindowState window = createWindow("window");
+        window.mAttrs.preferredMaxDisplayRefreshRate = LOW_REFRESH_RATE;
         parcelLayoutParams(window);
         assertEquals(0, mPolicy.getPreferredModeId(window));
         assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
         assertEquals(0, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
-        assertEquals(60, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
+        assertEquals(LOW_REFRESH_RATE, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
 
         window.mActivityRecord.mSurfaceAnimator.startAnimation(
                 window.getPendingTransaction(), mock(AnimationAdapter.class),
@@ -193,12 +291,12 @@
 
     @Test
     public void testAppMinRefreshRate() {
-        final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, "window");
-        window.mAttrs.preferredMinDisplayRefreshRate = 60f;
+        final WindowState window = createWindow("window");
+        window.mAttrs.preferredMinDisplayRefreshRate = LOW_REFRESH_RATE;
         parcelLayoutParams(window);
         assertEquals(0, mPolicy.getPreferredModeId(window));
         assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
-        assertEquals(60, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
+        assertEquals(LOW_REFRESH_RATE, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
         assertEquals(0, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
 
         window.mActivityRecord.mSurfaceAnimator.startAnimation(
@@ -206,16 +304,17 @@
                 false /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
         assertEquals(0, mPolicy.getPreferredModeId(window));
         assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
+        assertEquals(0, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
         assertEquals(0, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
     }
 
     @Test
     public void testAppPreferredRefreshRate() {
-        final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, "window");
-        window.mAttrs.preferredRefreshRate = 60f;
+        final WindowState window = createWindow("window");
+        window.mAttrs.preferredRefreshRate = LOW_REFRESH_RATE;
         parcelLayoutParams(window);
         assertEquals(0, mPolicy.getPreferredModeId(window));
-        assertEquals(60, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
+        assertEquals(LOW_REFRESH_RATE, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
         assertEquals(0, mPolicy.getPreferredMinRefreshRate(window), FLOAT_TOLERANCE);
         assertEquals(0, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
     }
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
index 8ba41f3..666265e 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
@@ -92,6 +92,7 @@
     private final ScheduledExecutorService mScheduledExecutorService =
             Executors.newSingleThreadScheduledExecutor();
     private final AtomicBoolean mUpdateStateAfterStartFinished = new AtomicBoolean(false);
+    private final IBinder.DeathRecipient mAudioServerDeathRecipient = this::audioServerDied;
     private final @NonNull ServiceConnectionFactory mServiceConnectionFactory;
 
     final Object mLock;
@@ -113,6 +114,7 @@
     @GuardedBy("mLock")
     private boolean mPerformingSoftwareHotwordDetection;
     private @NonNull ServiceConnection mRemoteHotwordDetectionService;
+    private IBinder mAudioFlinger;
 
     HotwordDetectionConnection(Object lock, Context context, int voiceInteractionServiceUid,
             ComponentName serviceName, int userId, boolean bindInstantServiceAllowed,
@@ -125,10 +127,11 @@
         mUser = userId;
         final Intent intent = new Intent(HotwordDetectionService.SERVICE_INTERFACE);
         intent.setComponent(mDetectionComponentName);
+        initAudioFlingerLocked();
 
         mServiceConnectionFactory = new ServiceConnectionFactory(intent, bindInstantServiceAllowed);
 
-        mRemoteHotwordDetectionService = mServiceConnectionFactory.create();
+        mRemoteHotwordDetectionService = mServiceConnectionFactory.createLocked();
 
         if (callback == null) {
             updateStateLocked(options, sharedMemory);
@@ -152,6 +155,37 @@
         }, 30, 30, TimeUnit.MINUTES);
     }
 
+    private void initAudioFlingerLocked() {
+        if (DEBUG) {
+            Slog.d(TAG, "initAudioFlingerLocked");
+        }
+        mAudioFlinger = ServiceManager.waitForService("media.audio_flinger");
+        if (mAudioFlinger == null) {
+            throw new IllegalStateException("Service media.audio_flinger wasn't found.");
+        }
+        if (DEBUG) {
+            Slog.d(TAG, "Obtained audio_flinger binder.");
+        }
+        try {
+            mAudioFlinger.linkToDeath(mAudioServerDeathRecipient, /* flags= */ 0);
+        } catch (RemoteException e) {
+            Slog.w(TAG, "Audio server died before we registered a DeathRecipient; retrying init.",
+                    e);
+            initAudioFlingerLocked();
+        }
+    }
+
+    private void audioServerDied() {
+        Slog.w(TAG, "Audio server died; restarting the HotwordDetectionService.");
+        synchronized (mLock) {
+            // TODO: Check if this needs to be scheduled on a different thread.
+            initAudioFlingerLocked();
+            // We restart the process instead of simply sending over the new binder, to avoid race
+            // conditions with audio reading in the service.
+            restartProcessLocked();
+        }
+    }
+
     private void updateStateAfterProcessStart(
             PersistableBundle options, SharedMemory sharedMemory) {
         if (DEBUG) {
@@ -164,15 +198,7 @@
                 public void sendResult(Bundle bundle) throws RemoteException {
                     if (DEBUG) {
                         Slog.d(TAG, "updateState finish");
-                        Slog.d(TAG, "updating hotword UID " + Binder.getCallingUid());
                     }
-                    // TODO: Do this earlier than this callback and have the provider point to the
-                    // current state stored in VoiceInteractionManagerServiceImpl.
-                    final int uid = Binder.getCallingUid();
-                    LocalServices.getService(PermissionManagerServiceInternal.class)
-                            .setHotwordDetectionServiceProvider(() -> uid);
-                    mIdentity =
-                            new HotwordDetectionServiceIdentity(uid, mVoiceInteractionServiceUid);
                     future.complete(null);
                     if (mUpdateStateAfterStartFinished.getAndSet(true)) {
                         Slog.w(TAG, "call callback after timeout");
@@ -238,6 +264,9 @@
             mIdentity = null;
         }
         mCancellationTaskFuture.cancel(/* may interrupt */ true);
+        if (mAudioFlinger != null) {
+            mAudioFlinger.unlinkToDeath(mAudioServerDeathRecipient, /* flags= */ 0);
+        }
     }
 
     void updateStateLocked(PersistableBundle options, SharedMemory sharedMemory) {
@@ -499,7 +528,7 @@
         mLastRestartInstant = Instant.now();
 
         // Recreate connection to reset the cache.
-        mRemoteHotwordDetectionService = mServiceConnectionFactory.create();
+        mRemoteHotwordDetectionService = mServiceConnectionFactory.createLocked();
 
         if (DEBUG) {
             Slog.i(TAG, "Started the new process, issuing #onProcessRestarted");
@@ -687,14 +716,15 @@
             mBindingFlags = bindInstantServiceAllowed ? Context.BIND_ALLOW_INSTANT : 0;
         }
 
-        ServiceConnection create() {
+        ServiceConnection createLocked() {
             ServiceConnection connection =
                     new ServiceConnection(mContext, mIntent, mBindingFlags, mUser,
                             IHotwordDetectionService.Stub::asInterface, ++mRestartCount);
             connection.connect();
 
-            updateAudioFlinger(connection);
+            updateAudioFlinger(connection, mAudioFlinger);
             updateContentCaptureManager(connection);
+            updateServiceIdentity(connection);
             return connection;
         }
     }
@@ -802,24 +832,37 @@
         return Pair.create(fileDescriptors[0], fileDescriptors[1]);
     }
 
-    private static void updateAudioFlinger(ServiceConnection connection) {
+    private static void updateAudioFlinger(ServiceConnection connection, IBinder audioFlinger) {
         // TODO: Consider using a proxy that limits the exposed API surface.
-        IBinder audioFlinger = ServiceManager.getService("media.audio_flinger");
-        if (audioFlinger == null) {
-            throw new IllegalStateException("Service media.audio_flinger wasn't found.");
-        }
-        connection.post(service -> service.updateAudioFlinger(audioFlinger));
+        connection.run(service -> service.updateAudioFlinger(audioFlinger));
     }
 
     private static void updateContentCaptureManager(ServiceConnection connection) {
         IBinder b = ServiceManager
                 .getService(Context.CONTENT_CAPTURE_MANAGER_SERVICE);
         IContentCaptureManager binderService = IContentCaptureManager.Stub.asInterface(b);
-        connection.post(
+        connection.run(
                 service -> service.updateContentCaptureManager(binderService,
                         new ContentCaptureOptions(null)));
     }
 
+    private void updateServiceIdentity(ServiceConnection connection) {
+        connection.run(service -> service.ping(new IRemoteCallback.Stub() {
+            @Override
+            public void sendResult(Bundle bundle) throws RemoteException {
+                if (DEBUG) {
+                    Slog.d(TAG, "updating hotword UID " + Binder.getCallingUid());
+                }
+                // TODO: Have the provider point to the current state stored in
+                // VoiceInteractionManagerServiceImpl.
+                final int uid = Binder.getCallingUid();
+                LocalServices.getService(PermissionManagerServiceInternal.class)
+                        .setHotwordDetectionServiceProvider(() -> uid);
+                mIdentity = new HotwordDetectionServiceIdentity(uid, mVoiceInteractionServiceUid);
+            }
+        }));
+    }
+
     private static void bestEffortClose(Closeable closeable) {
         try {
             closeable.close();
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 30403f4..759afd7 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -671,6 +671,14 @@
     public @interface AudioCodec {}
 
     /**
+     * Contains the same value as {@link #getCallerNumberVerificationStatus()}, except will be
+     * present in the {@link #getExtras()} using this key.
+     * @hide
+     */
+    public static final String EXTRA_CALLER_NUMBER_VERIFICATION_STATUS =
+            "android.telecom.extra.CALLER_NUMBER_VERIFICATION_STATUS";
+
+    /**
      * Connection extra key used to store the last forwarded number associated with the current
      * connection.  Used to communicate to the user interface that the connection was forwarded via
      * the specified number.
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index e03e74c..9954de2 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -3523,6 +3523,30 @@
             "nr_advanced_capable_pco_id_int";
 
     /**
+     * This configuration allows the framework to use user data communication to detect RRC state,
+     * and this is used on the 5G icon.
+     *
+     * There is a new way for for RRC state detection at Android 12. If
+     * {@link android.telephony.TelephonyManager#isRadioInterfaceCapabilitySupported}(
+     * {@link TelephonyManager#CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED}) returns true,
+     * then framework can use PHYSICAL_CHANNEL_CONFIG for RRC state detection. Based on this
+     * condition, some carriers want to use the legacy behavior that way is using user data
+     * communication to detect the RRC state. Therefore, this configuration allows the framework
+     * to use user data communication to detect RRC state.
+     *
+     * The precondition is
+     * {@link android.telephony.TelephonyManager#isRadioInterfaceCapabilitySupported}(
+     * {@link TelephonyManager#CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED}) returns true,
+     * otherwise this config is not working.
+     * If this is true, framework uses the user data communication for RRC state detection.
+     * If this is false, framework uses the PHYSICAL_CHANNEL_CONFIG for RRC state detection.
+     *
+     * @hide
+     */
+    public static final String KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL =
+            "lte_endc_using_user_data_for_rrc_detection_bool";
+
+    /**
      * Controls time in milliseconds until DcTracker reevaluates 5G connection state.
      * @hide
      */
@@ -5500,6 +5524,7 @@
         sDefaults.putLong(KEY_5G_WATCHDOG_TIME_MS_LONG, 3600000);
         sDefaults.putIntArray(KEY_ADDITIONAL_NR_ADVANCED_BANDS_INT_ARRAY, new int[0]);
         sDefaults.putInt(KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0);
+        sDefaults.putBoolean(KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL, false);
         sDefaults.putBoolean(KEY_UNMETERED_NR_NSA_BOOL, false);
         sDefaults.putBoolean(KEY_UNMETERED_NR_NSA_MMWAVE_BOOL, false);
         sDefaults.putBoolean(KEY_UNMETERED_NR_NSA_SUB6_BOOL, false);
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index a096c1f..018dabf 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -2388,6 +2388,11 @@
      */
     String getContactFromEab(String contact);
 
+    /**
+     * Get the EAB capability from the EAB database.
+     */
+    String getCapabilityFromEab(String contact);
+
     /*
      * Check whether the device supports RCS User Capability Exchange or not.
      */
diff --git a/tests/PlatformCompatGating/src/com/android/tests/gating/PlatformCompatPermissionsTest.java b/tests/PlatformCompatGating/src/com/android/tests/gating/PlatformCompatPermissionsTest.java
index 9b9e581..060133d 100644
--- a/tests/PlatformCompatGating/src/com/android/tests/gating/PlatformCompatPermissionsTest.java
+++ b/tests/PlatformCompatGating/src/com/android/tests/gating/PlatformCompatPermissionsTest.java
@@ -16,6 +16,7 @@
 
 package com.android.tests.gating;
 
+import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
 import static android.Manifest.permission.LOG_COMPAT_CHANGE;
 import static android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG;
 import static android.Manifest.permission.READ_COMPAT_CHANGE_CONFIG;
@@ -261,13 +262,15 @@
     public void clearOverrides_noOverridesPermission_throwsSecurityException()
             throws Throwable {
         thrown.expect(SecurityException.class);
+        mUiAutomation.adoptShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL);
 
         mPlatformCompat.clearOverrides("foo.bar");
     }
     @Test
     public void clearOverrides_overridesPermission_noThrow()
             throws Throwable {
-        mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG);
+        mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG,
+                INTERACT_ACROSS_USERS_FULL);
 
         mPlatformCompat.clearOverrides("foo.bar");
     }
@@ -276,13 +279,15 @@
     public void clearOverridesForTest_noOverridesPermission_throwsSecurityException()
             throws Throwable {
         thrown.expect(SecurityException.class);
+        mUiAutomation.adoptShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL);
 
         mPlatformCompat.clearOverridesForTest("foo.bar");
     }
     @Test
     public void clearOverridesForTest_overridesPermission_noThrow()
             throws Throwable {
-        mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG);
+        mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG,
+                INTERACT_ACROSS_USERS_FULL);
 
         mPlatformCompat.clearOverridesForTest("foo.bar");
     }
@@ -291,13 +296,15 @@
     public void clearOverride_noOverridesPermission_throwsSecurityException()
             throws Throwable {
         thrown.expect(SecurityException.class);
+        mUiAutomation.adoptShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL);
 
         mPlatformCompat.clearOverride(1, "foo.bar");
     }
     @Test
     public void clearOverride_overridesPermission_noThrow()
             throws Throwable {
-        mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG);
+        mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG,
+                INTERACT_ACROSS_USERS_FULL);
 
         mPlatformCompat.clearOverride(1, "foo.bar");
     }
diff --git a/tests/UpdatableSystemFontTest/testdata/Android.bp b/tests/UpdatableSystemFontTest/testdata/Android.bp
index 0f01be0..426464e 100644
--- a/tests/UpdatableSystemFontTest/testdata/Android.bp
+++ b/tests/UpdatableSystemFontTest/testdata/Android.bp
@@ -21,6 +21,13 @@
     default_applicable_licenses: ["frameworks_base_license"],
 }
 
+// An existing module name is reused to avoid merge conflicts.
+// TODO: fix the font and module name.
+filegroup {
+    name: "NotoColorEmojiTtf",
+    srcs: ["NotoColorEmoji.ttf"],
+}
+
 filegroup {
     name: "UpdatableSystemFontTestKeyPem",
     srcs: ["UpdatableSystemFontTestKey.pem"],
diff --git a/tests/UpdatableSystemFontTest/testdata/NotoColorEmoji.ttf b/tests/UpdatableSystemFontTest/testdata/NotoColorEmoji.ttf
new file mode 100644
index 0000000..f71f52c
--- /dev/null
+++ b/tests/UpdatableSystemFontTest/testdata/NotoColorEmoji.ttf
Binary files differ
diff --git a/tests/UpdatableSystemFontTest/testdata/NotoColorEmoji.ttx b/tests/UpdatableSystemFontTest/testdata/NotoColorEmoji.ttx
new file mode 100644
index 0000000..6540c58
--- /dev/null
+++ b/tests/UpdatableSystemFontTest/testdata/NotoColorEmoji.ttx
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+  <GlyphOrder>
+    <GlyphID id="0" name=".notdef"/>
+    <GlyphID id="1" name="a"/>
+    <GlyphID id="2" name="u1F972"/>
+  </GlyphOrder>
+
+  <head>
+    <tableVersion value="1.0"/>
+    <!-- Currently NotoColorEmoji.ttf's fontRevision is 2.xxx.
+         100.0 will be sufficiently larger than that. -->
+    <fontRevision value="100.0"/>
+    <checkSumAdjustment value="0x640cdb2f"/>
+    <magicNumber value="0x5f0f3cf5"/>
+    <flags value="00000000 00000011"/>
+    <unitsPerEm value="1000"/>
+    <created value="Fri Jun 25 12:00:00 2021"/>
+    <macStyle value="00000000 00000000"/>
+    <lowestRecPPEM value="7"/>
+    <fontDirectionHint value="2"/>
+    <glyphDataFormat value="0"/>
+  </head>
+
+  <hhea>
+    <tableVersion value="0x00010000"/>
+    <ascent value="1000"/>
+    <descent value="-200"/>
+    <lineGap value="0"/>
+    <caretSlopeRise value="1"/>
+    <caretSlopeRun value="0"/>
+    <caretOffset value="0"/>
+    <reserved0 value="0"/>
+    <reserved1 value="0"/>
+    <reserved2 value="0"/>
+    <reserved3 value="0"/>
+    <metricDataFormat value="0"/>
+  </hhea>
+
+  <maxp>
+    <tableVersion value="0x10000"/>
+    <maxZones value="0"/>
+    <maxTwilightPoints value="0"/>
+    <maxStorage value="0"/>
+    <maxFunctionDefs value="0"/>
+    <maxInstructionDefs value="0"/>
+    <maxStackElements value="0"/>
+    <maxSizeOfInstructions value="0"/>
+    <maxComponentElements value="0"/>
+  </maxp>
+
+  <OS_2>
+    <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+         will be recalculated by the compiler -->
+    <version value="3"/>
+    <xAvgCharWidth value="594"/>
+    <usWeightClass value="400"/>
+    <usWidthClass value="5"/>
+    <fsType value="00000000 00001000"/>
+    <ySubscriptXSize value="650"/>
+    <ySubscriptYSize value="600"/>
+    <ySubscriptXOffset value="0"/>
+    <ySubscriptYOffset value="75"/>
+    <ySuperscriptXSize value="650"/>
+    <ySuperscriptYSize value="600"/>
+    <ySuperscriptXOffset value="0"/>
+    <ySuperscriptYOffset value="350"/>
+    <yStrikeoutSize value="50"/>
+    <yStrikeoutPosition value="300"/>
+    <sFamilyClass value="0"/>
+    <panose>
+      <bFamilyType value="0"/>
+      <bSerifStyle value="0"/>
+      <bWeight value="5"/>
+      <bProportion value="0"/>
+      <bContrast value="0"/>
+      <bStrokeVariation value="0"/>
+      <bArmStyle value="0"/>
+      <bLetterForm value="0"/>
+      <bMidline value="0"/>
+      <bXHeight value="0"/>
+    </panose>
+    <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+    <achVendID value="UKWN"/>
+    <fsSelection value="00000000 01000000"/>
+    <usFirstCharIndex value="32"/>
+    <usLastCharIndex value="122"/>
+    <sTypoAscender value="800"/>
+    <sTypoDescender value="-200"/>
+    <sTypoLineGap value="200"/>
+    <usWinAscent value="1000"/>
+    <usWinDescent value="200"/>
+    <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+    <sxHeight value="500"/>
+    <sCapHeight value="700"/>
+    <usDefaultChar value="0"/>
+    <usBreakChar value="32"/>
+    <usMaxContext value="0"/>
+  </OS_2>
+
+  <hmtx>
+    <mtx name=".notdef" width="500" lsb="93"/>
+    <mtx name="a" width="3000" lsb="93"/>  <!-- 3em -->
+    <mtx name="u1F972" width="3000" lsb="93"/>  <!-- 3em -->
+  </hmtx>
+
+  <cmap>
+    <tableVersion version="0"/>
+    <!-- length will be calculated by the compiler. -->
+    <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="0" language="0" nGroups="1">
+      <!-- The font must support at least one of the characters used
+           in OtfFontFileParser to validate the font. -->
+      <map code="0x61" name="a" />
+      <map code="0x1F972" name="u1F972" />
+    </cmap_format_12>
+  </cmap>
+
+  <loca>
+    <!-- The 'loca' table will be calculated by the compiler -->
+  </loca>
+
+  <glyf>
+    <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+    <TTGlyph name="a" xMin="0" yMin="0" xMax="300" yMax="300">
+      <contour>
+        <pt x="0" y="0" on="1" />
+        <pt x="0" y="300" on="1" />
+        <pt x="300" y="300" on="1" />
+        <pt x="300" y="0" on="1" />
+      </contour>
+      <instructions />
+    </TTGlyph>
+    <TTGlyph name="u1F972" xMin="0" yMin="0" xMax="300" yMax="300">
+      <contour>
+        <pt x="0" y="0" on="1" />
+        <pt x="0" y="300" on="1" />
+        <pt x="300" y="300" on="1" />
+        <pt x="300" y="0" on="1" />
+      </contour>
+      <instructions />
+    </TTGlyph>
+  </glyf>
+
+  <name>
+    <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+      Copyright (C) 2021 The Android Open Source Project
+    </namerecord>
+    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+      Sample Font
+    </namerecord>
+    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+      Regular
+    </namerecord>
+    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+      Sample Font
+    </namerecord>
+    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+      <!-- Android identifies the target font to be updated by PostScript name.
+           To test updating NotoColorEmoji.ttf, the PostScript needs to be
+           the same as NotoColorEmoji.ttf here. -->
+      NotoColorEmoji
+    </namerecord>
+    <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+    </namerecord>
+    <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+      http://www.apache.org/licenses/LICENSE-2.0
+    </namerecord>
+  </name>
+
+  <post>
+    <formatType value="3.0"/>
+    <italicAngle value="0.0"/>
+    <underlinePosition value="-75"/>
+    <underlineThickness value="50"/>
+    <isFixedPitch value="0"/>
+    <minMemType42 value="0"/>
+    <maxMemType42 value="0"/>
+    <minMemType1 value="0"/>
+    <maxMemType1 value="0"/>
+  </post>
+
+</ttFont>
diff --git a/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java b/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java
index f91575b..5af69b5 100644
--- a/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java
+++ b/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java
@@ -476,5 +476,16 @@
         verifyNoMoreInteractions(mNetworkTrackerCb);
     }
 
+    @Test
+    public void testRecordTrackerCallbackNotifiedAfterTeardown() {
+        UnderlyingNetworkListener cb = verifyRegistrationOnAvailableAndGetCallback();
+        mUnderlyingNetworkTracker.teardown();
+
+        cb.onCapabilitiesChanged(mNetwork, UPDATED_NETWORK_CAPABILITIES);
+
+        // Verify that the only call was during onAvailable()
+        verify(mNetworkTrackerCb, times(1)).onSelectedUnderlyingNetworkChanged(any());
+    }
+
     // TODO (b/187991063): Add tests for network prioritization
 }
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
index 9c93f81..6bfbfb1 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
@@ -48,6 +48,8 @@
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+import static java.util.Collections.singletonList;
+
 import android.net.ConnectivityManager;
 import android.net.LinkAddress;
 import android.net.LinkProperties;
@@ -233,6 +235,8 @@
         verify(mNetworkAgent).sendLinkProperties(
                 argThat(lp -> expectedMtu == lp.getMtu()
                         && TEST_TCP_BUFFER_SIZES_2.equals(lp.getTcpBufferSizes())));
+        verify(mNetworkAgent)
+                .setUnderlyingNetworks(eq(singletonList(TEST_UNDERLYING_NETWORK_RECORD_2.network)));
     }
 
     private void triggerChildOpened() {
@@ -293,6 +297,8 @@
                         any(),
                         any());
         verify(mNetworkAgent).register();
+        verify(mNetworkAgent)
+                .setUnderlyingNetworks(eq(singletonList(TEST_UNDERLYING_NETWORK_RECORD_1.network)));
         verify(mNetworkAgent).markConnected();
 
         verify(mIpSecSvc)
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java
index 83610e0..a700171 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java
@@ -68,7 +68,7 @@
 @RunWith(AndroidJUnit4.class)
 @SmallTest
 public class VcnGatewayConnectionTest extends VcnGatewayConnectionTestBase {
-    private static final int TEST_UID = Process.myUid();
+    private static final int TEST_UID = Process.myUid() + 1;
 
     private static final ParcelUuid TEST_PARCEL_UUID = new ParcelUuid(UUID.randomUUID());
     private static final int TEST_SIM_SLOT_INDEX = 1;
@@ -137,7 +137,7 @@
             }
         }
 
-        assertArrayEquals(new int[] {TEST_UID}, vcnCaps.getAdministratorUids());
+        assertArrayEquals(new int[] {Process.myUid(), TEST_UID}, vcnCaps.getAdministratorUids());
         assertTrue(vcnCaps.getTransportInfo() instanceof VcnTransportInfo);
         assertEquals(TEST_UPSTREAM_BANDWIDTH, vcnCaps.getLinkUpstreamBandwidthKbps());
         assertEquals(TEST_DOWNSTREAM_BANDWIDTH, vcnCaps.getLinkDownstreamBandwidthKbps());